Jean LE QUELLEC 3 лет назад
Родитель
Сommit
3818684755
1 измененных файлов с 100 добавлено и 106 удалено
  1. 100 106
      i2ctools.c

+ 100 - 106
i2ctools.c

@@ -22,7 +22,7 @@
 #define SEND_MENU_Y 34
 
 #define PLAY_MENU_TEXT "Play"
-#define PLAY_MENU_X 70
+#define PLAY_MENU_X 75
 #define PLAY_MENU_Y 48
 
 // Sniffer Pins
@@ -43,16 +43,6 @@ typedef enum {
     MENU_SIZE
 } i2cToolsMainMenu;
 
-/*
-// Menu
-typedef struct {
-    uint8_t idx;
-    char* name;
-    void* cb;
-    Icon* icon;
-} i2cMenu;
-*/
-
 // Bus Sniffer
 typedef enum { I2C_BUS_IDLE, I2C_BUS_STARTED } i2cBusStates;
 
@@ -79,13 +69,15 @@ typedef struct {
     uint8_t addresses[MAX_I2C_ADDR + 1];
     uint8_t found;
     uint8_t menu_index;
+    bool scanned;
 } _scanner;
 
 // Sender
 typedef struct {
-    uint8_t address;
+    uint8_t address_idx;
     uint8_t value;
-    uint8_t recv[MAX_FRAMES];
+    uint8_t recv[2];
+    bool must_send;
     bool sended;
     bool error;
 } _sender;
@@ -103,9 +95,9 @@ typedef struct {
 
 void scan_i2c_bus(i2cToolsData* data) {
     data->scanner.found = 0;
+    data->scanner.scanned = true;
     furi_hal_i2c_acquire(I2C_BUS);
     // scan
-    printf("scan\r\n");
     for(uint8_t addr = 0x01; addr < MAX_I2C_ADDR; addr++) {
         // Check for peripherals
         if(furi_hal_i2c_is_device_ready(I2C_BUS, addr, 2)) {
@@ -116,8 +108,6 @@ void scan_i2c_bus(i2cToolsData* data) {
             // convert addr to 7-bits
             data->scanner.addresses[data->scanner.found] = addr >> 1;
             data->scanner.found++;
-            printf("%#4x", addr >> 1);
-            printf("\r\n");
         }
     }
     furi_hal_i2c_release(I2C_BUS);
@@ -263,31 +253,21 @@ static void SCLcallback(void* ctx) {
     }
 }
 
-void i2ctools_draw_sniff_view(Canvas* canvas, i2cToolsData* data) {
-    if(!data->sniffer.started) {
-        // Add Rise Interrupt on SCL pin
-        furi_hal_gpio_init(pinSCL, GpioModeInterruptRise, GpioPullNo, GpioSpeedHigh);
-        furi_hal_gpio_add_int_callback(pinSCL, SCLcallback, data);
-
-        // Add Rise and Fall Interrupt on SDA pin
-        furi_hal_gpio_init(pinSDA, GpioModeInterruptRiseFall, GpioPullNo, GpioSpeedHigh);
-        furi_hal_gpio_add_int_callback(pinSDA, SDAcallback, data);
+void start_interrupts(i2cToolsData* data) {
+    furi_hal_gpio_init(pinSCL, GpioModeInterruptRise, GpioPullNo, GpioSpeedHigh);
+    furi_hal_gpio_add_int_callback(pinSCL, SCLcallback, data);
 
-        data->sniffer.started = true;
-    }
-    if(data->sniffer.frame_index == 0) {
-        data->sniffer.menu_index = 0;
-        /*
-        canvas_set_color(canvas, ColorBlack);
-        canvas_draw_rframe(canvas, 0, 0, 128, 64, 3);
-        canvas_draw_icon(canvas, 2, 13, &I_passport_happy2_46x49);
+    // Add Rise and Fall Interrupt on SDA pin
+    furi_hal_gpio_init(pinSDA, GpioModeInterruptRiseFall, GpioPullNo, GpioSpeedHigh);
+    furi_hal_gpio_add_int_callback(pinSDA, SDAcallback, data);
+}
 
-        canvas_set_font(canvas, FontPrimary);
-        canvas_draw_str_aligned(canvas, 3, 3, AlignLeft, AlignTop, SNIFF_MENU_TEXT);
-        */
-        return;
-    }
+void stop_interrupts() {
+    furi_hal_gpio_remove_int_callback(pinSCL);
+    furi_hal_gpio_remove_int_callback(pinSDA);
+}
 
+void i2ctools_draw_sniff_view(Canvas* canvas, i2cToolsData* data) {
     canvas_clear(canvas);
     canvas_set_color(canvas, ColorBlack);
     canvas_draw_rframe(canvas, 0, 0, 128, 64, 3);
@@ -295,8 +275,18 @@ void i2ctools_draw_sniff_view(Canvas* canvas, i2cToolsData* data) {
 
     canvas_set_font(canvas, FontPrimary);
     canvas_draw_str_aligned(canvas, 3, 3, AlignLeft, AlignTop, SNIFF_MENU_TEXT);
-
     canvas_set_font(canvas, FontSecondary);
+
+    // Button
+    canvas_draw_rbox(canvas, 70, 48, 45, 13, 3);
+    canvas_set_color(canvas, ColorWhite);
+    canvas_draw_icon(canvas, 75, 50, &I_Ok_btn_9x9);
+    if(!data->sniffer.started) {
+        canvas_draw_str_aligned(canvas, 85, 51, AlignLeft, AlignTop, "Start");
+    } else {
+        canvas_draw_str_aligned(canvas, 85, 51, AlignLeft, AlignTop, "Stop");
+    }
+    canvas_set_color(canvas, ColorBlack);
     // Address text
     char addr_text[8];
     snprintf(
@@ -356,15 +346,13 @@ void i2ctools_draw_send_view(Canvas* canvas, i2cToolsData* data) {
     canvas_draw_icon(canvas, 2, 13, &I_passport_happy2_46x49);
     canvas_set_font(canvas, FontPrimary);
     canvas_draw_str_aligned(canvas, 3, 3, AlignLeft, AlignTop, SEND_MENU_TEXT);
-    UNUSED(data);
-    /*
-     if(!data->scanned) {
-        get_available_i2c(data);
+
+    if(!data->scanner.scanned) {
+        scan_i2c_bus(data);
     }
 
-    
     canvas_set_font(canvas, FontSecondary);
-    if(data->nb_available <= 0) {
+    if(data->scanner.found <= 0) {
         canvas_draw_str_aligned(canvas, 60, 5, AlignLeft, AlignTop, "No peripherals");
         canvas_draw_str_aligned(canvas, 60, 15, AlignLeft, AlignTop, "Found");
         return;
@@ -381,41 +369,41 @@ void i2ctools_draw_send_view(Canvas* canvas, i2cToolsData* data) {
     snprintf(
         addr_text,
         sizeof(addr_text),
-        "%#04x",
-        (int)data->available_addr[data->send_view_addr_index]);
+        "0x%02x",
+        (int)data->scanner.addresses[data->sender.address_idx]);
     canvas_draw_str_aligned(canvas, 90, 5, AlignLeft, AlignTop, addr_text);
     canvas_draw_str_aligned(canvas, 50, 15, AlignLeft, AlignTop, "Value: ");
 
     canvas_draw_icon(canvas, 80, 17, &I_ButtonUp_7x4);
     canvas_draw_icon(canvas, 115, 17, &I_ButtonDown_7x4);
-    snprintf(addr_text, sizeof(addr_text), "%#04x", (int)data->send_view_to_send);
+    snprintf(addr_text, sizeof(addr_text), "0x%02x", (int)data->sender.value);
     canvas_draw_str_aligned(canvas, 90, 15, AlignLeft, AlignTop, addr_text);
-    if(data->send_view_must_send) {
+    if(data->sender.must_send) {
         furi_hal_i2c_acquire(&furi_hal_i2c_handle_external);
-        data->send_get_return = furi_hal_i2c_trx(
+        data->sender.error = furi_hal_i2c_trx(
             &furi_hal_i2c_handle_external,
-            data->available_addr[data->send_view_addr_index] << 1,
-            &data->send_view_to_send,
+            data->scanner.addresses[data->sender.address_idx] << 1,
+            &data->sender.value,
             1,
-            data->send_last_recv,
-            sizeof(data->send_last_recv),
+            data->sender.recv,
+            sizeof(data->sender.recv),
             3);
         furi_hal_i2c_release(&furi_hal_i2c_handle_external);
-        data->send_view_must_send = false;
-        data->send_started = true;
+        data->sender.must_send = false;
+        data->sender.sended = true;
     }
     canvas_draw_str_aligned(canvas, 50, 25, AlignLeft, AlignTop, "Result: ");
-    if(data->send_started) {
-        if(data->send_get_return) {
-            for(uint8_t i = 0; i < sizeof(data->send_last_recv); i++) {
-                snprintf(addr_text, sizeof(addr_text), "%#04x", (int)data->send_last_recv[i]);
-                canvas_draw_str_aligned(canvas, 90, 25 + (i * 10), AlignLeft, AlignTop, addr_text);
-            }
+    if(data->sender.sended) {
+        //if(data->sender.error) {
+        for(uint8_t i = 0; i < sizeof(data->sender.recv); i++) {
+            snprintf(addr_text, sizeof(addr_text), "0x%02x", (int)data->sender.recv[i]);
+            canvas_draw_str_aligned(canvas, 90, 25 + (i * 10), AlignLeft, AlignTop, addr_text);
+        }
+        /*
         } else {
             canvas_draw_str_aligned(canvas, 90, 25, AlignLeft, AlignTop, "Error");
-        }
+        }*/
     }
-    */
 }
 
 void i2ctools_draw_scan_view(Canvas* canvas, i2cToolsData* data) {
@@ -440,7 +428,7 @@ void i2ctools_draw_scan_view(Canvas* canvas, i2cToolsData* data) {
             break;
         }
         snprintf(
-            count_text, sizeof(count_text), "%#04x ", (int)data->scanner.addresses[idx_to_print]);
+            count_text, sizeof(count_text), "0x%02x ", (int)data->scanner.addresses[idx_to_print]);
         if(i < 3) {
             x_pos = 50 + (i * 26);
             y_pos = 15;
@@ -464,6 +452,12 @@ void i2ctools_draw_scan_view(Canvas* canvas, i2cToolsData* data) {
     // Right cursor
     y_pos = 14 + data->scanner.menu_index;
     canvas_draw_rbox(canvas, 125, y_pos, 3, 10, 1);
+
+    // Button
+    canvas_draw_rbox(canvas, 70, 48, 45, 13, 3);
+    canvas_set_color(canvas, ColorWhite);
+    canvas_draw_icon(canvas, 75, 50, &I_Ok_btn_9x9);
+    canvas_draw_str_aligned(canvas, 85, 51, AlignLeft, AlignTop, "Scan");
 }
 
 void i2ctools_draw_callback(Canvas* canvas, void* ctx) {
@@ -529,14 +523,17 @@ int32_t i2ctools_app(void* p) {
     i2caddrs->sniffer.menu_index = 0;
 
     i2caddrs->scanner.menu_index = 0;
+    i2caddrs->scanner.scanned = false;
+
+    i2caddrs->sender.must_send = false;
+    i2caddrs->sender.sended = false;
     while(furi_message_queue_get(event_queue, &event, FuriWaitForever) == FuriStatusOk) {
         if(event.key == InputKeyBack && event.type == InputTypeRelease) {
             if(i2caddrs->current_menu == MAIN_VIEW) {
                 break;
             } else {
                 if(i2caddrs->current_menu == SNIFF_VIEW) {
-                    furi_hal_gpio_remove_int_callback(pinSCL);
-                    furi_hal_gpio_remove_int_callback(pinSDA);
+                    stop_interrupts();
                     i2caddrs->sniffer.started = false;
                     i2caddrs->sniffer.state = I2C_BUS_IDLE;
                 }
@@ -551,28 +548,23 @@ int32_t i2ctools_app(void* p) {
                 if(i2caddrs->scanner.menu_index > 0) {
                     i2caddrs->scanner.menu_index--;
                 }
-            } /* else if(i2caddrs->current_menu == SEND_VIEW) {
-                if(i2caddrs->send_view_to_send < 0xFF) {
-                    i2caddrs->send_view_to_send++;
-                    i2caddrs->send_started = false;
+            } else if(i2caddrs->current_menu == SEND_VIEW) {
+                if(i2caddrs->sender.value < 0xFF) {
+                    i2caddrs->sender.value++;
+                    i2caddrs->sender.sended = false;
                 }
             }
-            */
-
-        }
-        /*
-        else if(
+        } else if(
             event.key == InputKeyUp &&
             (event.type == InputTypeLong || event.type == InputTypeRepeat)) {
             if(i2caddrs->current_menu == SEND_VIEW) {
-                if(i2caddrs->send_view_to_send < 0xF9) {
-                    i2caddrs->send_view_to_send += 5;
-                    i2caddrs->send_started = false;
+                if(i2caddrs->sender.value < 0xF9) {
+                    i2caddrs->sender.value += 5;
+                    i2caddrs->sender.sended = false;
                 }
             }
 
-        } */
-        else if(event.key == InputKeyDown && event.type == InputTypeRelease) {
+        } else if(event.key == InputKeyDown && event.type == InputTypeRelease) {
             if(i2caddrs->current_menu == MAIN_VIEW) {
                 if(i2caddrs->main_menu_index < 3) {
                     i2caddrs->main_menu_index++;
@@ -581,25 +573,21 @@ int32_t i2ctools_app(void* p) {
                 if(i2caddrs->scanner.menu_index < ((int)i2caddrs->scanner.found / 3)) {
                     i2caddrs->scanner.menu_index++;
                 }
-            } /*else if(i2caddrs->current_menu == SEND_VIEW) {
-                if(i2caddrs->send_view_to_send > 0x00) {
-                    i2caddrs->send_view_to_send--;
-                    i2caddrs->send_started = false;
+            } else if(i2caddrs->current_menu == SEND_VIEW) {
+                if(i2caddrs->sender.value > 0x00) {
+                    i2caddrs->sender.value--;
+                    i2caddrs->sender.sended = false;
                 }
-            }*/
-        }
-        /*
-        else if(event.key == InputKeyDown && event.type == InputTypeLong) {
+            }
+        } else if(event.key == InputKeyDown && event.type == InputTypeLong) {
             if(i2caddrs->current_menu == SEND_VIEW) {
-                if(i2caddrs->send_view_to_send > 0x05) {
-                    i2caddrs->send_view_to_send -= 5;
-                    i2caddrs->send_started = false;
+                if(i2caddrs->sender.value > 0x05) {
+                    i2caddrs->sender.value -= 5;
+                    i2caddrs->sender.sended = false;
                 }
             }
 
-        } 
-        */
-        else if(event.key == InputKeyOk && event.type == InputTypeRelease) {
+        } else if(event.key == InputKeyOk && event.type == InputTypeRelease) {
             if(i2caddrs->current_menu == MAIN_VIEW) {
                 if(i2caddrs->main_menu_index == 0) {
                     scan_i2c_bus(i2caddrs);
@@ -614,16 +602,24 @@ int32_t i2ctools_app(void* p) {
             } else if(i2caddrs->current_menu == SCAN_VIEW) {
                 scan_i2c_bus(i2caddrs);
             } else if(i2caddrs->current_menu == SEND_VIEW) {
-                //i2caddrs->send_view_must_send = true;
+                i2caddrs->sender.must_send = true;
+            } else if(i2caddrs->current_menu == SNIFF_VIEW) {
+                if(i2caddrs->sniffer.started) {
+                    stop_interrupts();
+                    i2caddrs->sniffer.started = false;
+                    i2caddrs->sniffer.state = I2C_BUS_IDLE;
+                } else {
+                    start_interrupts(i2caddrs);
+                    i2caddrs->sniffer.started = true;
+                    i2caddrs->sniffer.state = I2C_BUS_IDLE;
+                }
             }
         } else if(event.key == InputKeyRight && event.type == InputTypeRelease) {
             if(i2caddrs->current_menu == SEND_VIEW) {
-                /*
-                if(i2caddrs->send_view_addr_index < (i2caddrs->nb_available - 1)) {
-                    i2caddrs->send_view_addr_index++;
-                    i2caddrs->send_started = false;
+                if(i2caddrs->sender.address_idx < (i2caddrs->scanner.found - 1)) {
+                    i2caddrs->sender.address_idx++;
+                    i2caddrs->sender.sended = false;
                 }
-                */
             } else if(i2caddrs->current_menu == SNIFF_VIEW) {
                 if(i2caddrs->sniffer.menu_index < i2caddrs->sniffer.frame_index) {
                     i2caddrs->sniffer.menu_index++;
@@ -631,12 +627,10 @@ int32_t i2ctools_app(void* p) {
             }
         } else if(event.key == InputKeyLeft && event.type == InputTypeRelease) {
             if(i2caddrs->current_menu == SEND_VIEW) {
-                /*
-                if(i2caddrs->send_view_addr_index > 0) {
-                    i2caddrs->send_view_addr_index--;
-                    i2caddrs->send_started = false;
+                if(i2caddrs->sender.address_idx > 0) {
+                    i2caddrs->sender.address_idx--;
+                    i2caddrs->sender.sended = false;
                 }
-            */
             } else if(i2caddrs->current_menu == SNIFF_VIEW) {
                 if(i2caddrs->sniffer.menu_index > 0) {
                     i2caddrs->sniffer.menu_index--;