Jean LE QUELLEC 3 лет назад
Родитель
Сommit
a17f2a4a3b
6 измененных файлов с 97 добавлено и 36 удалено
  1. 2 0
      i2csniffer.c
  2. 1 0
      i2csniffer.h
  3. 43 5
      i2ctools.c
  4. 3 3
      views/main_view.h
  5. 2 2
      views/scanner_view.c
  6. 46 26
      views/sniffer_view.c

+ 2 - 0
i2csniffer.c

@@ -86,6 +86,8 @@ void SCLcallback(void* _i2c_sniffer) {
 i2cSniffer* i2c_sniffer_alloc() {
     i2cSniffer* i2c_sniffer = malloc(sizeof(i2cSniffer));
     i2c_sniffer->started = false;
+    i2c_sniffer->row_index = 0;
+    i2c_sniffer->menu_index = 0;
     clear_sniffer_buffers(i2c_sniffer);
     return i2c_sniffer;
 }

+ 1 - 0
i2csniffer.h

@@ -33,6 +33,7 @@ typedef struct {
     i2cFrame frames[MAX_RECORDS];
     uint8_t frame_index;
     uint8_t menu_index;
+    uint8_t row_index;
 } i2cSniffer;
 
 void clear_sniffer_buffers(i2cSniffer* i2c_sniffer);

+ 43 - 5
i2ctools.c

@@ -68,6 +68,7 @@ int32_t i2ctools_app(void* p) {
     i2ctools->sender->scanner = i2ctools->scanner;
 
     while(furi_message_queue_get(event_queue, &event, FuriWaitForever) == FuriStatusOk) {
+        // Back
         if(event.key == InputKeyBack && event.type == InputTypeRelease) {
             if(i2ctools->main_view->current_view == MAIN_VIEW) {
                 break;
@@ -79,7 +80,9 @@ int32_t i2ctools_app(void* p) {
                 }
                 i2ctools->main_view->current_view = MAIN_VIEW;
             }
-        } else if(event.key == InputKeyUp && event.type == InputTypeRelease) {
+        }
+        // Up
+        else if(event.key == InputKeyUp && event.type == InputTypeRelease) {
             if(i2ctools->main_view->current_view == MAIN_VIEW) {
                 if((i2ctools->main_view->menu_index > SCAN_VIEW)) {
                     i2ctools->main_view->menu_index--;
@@ -88,22 +91,40 @@ int32_t i2ctools_app(void* p) {
                 if(i2ctools->scanner->menu_index > 0) {
                     i2ctools->scanner->menu_index--;
                 }
+            } else if(i2ctools->main_view->current_view == SNIFF_VIEW) {
+                if(i2ctools->sniffer->row_index > 0) {
+                    i2ctools->sniffer->row_index--;
+                }
             } else if(i2ctools->main_view->current_view == SEND_VIEW) {
                 if(i2ctools->sender->value < 0xFF) {
                     i2ctools->sender->value++;
                     i2ctools->sender->sended = false;
                 }
             }
-        } else if(
+        }
+        // Long Up
+        else if(
             event.key == InputKeyUp &&
             (event.type == InputTypeLong || event.type == InputTypeRepeat)) {
-            if(i2ctools->main_view->current_view == SEND_VIEW) {
+            if(i2ctools->main_view->current_view == SCAN_VIEW) {
+                if(i2ctools->scanner->menu_index > 5) {
+                    i2ctools->scanner->menu_index -= 5;
+                }
+            } else if(i2ctools->main_view->current_view == SEND_VIEW) {
                 if(i2ctools->sender->value < 0xF9) {
                     i2ctools->sender->value += 5;
                     i2ctools->sender->sended = false;
                 }
+            } else if(i2ctools->main_view->current_view == SNIFF_VIEW) {
+                if(i2ctools->sniffer->row_index > 5) {
+                    i2ctools->sniffer->row_index -= 5;
+                } else {
+                    i2ctools->sniffer->row_index = 0;
+                }
             }
-        } else if(event.key == InputKeyDown && event.type == InputTypeRelease) {
+        }
+        // Down
+        else if(event.key == InputKeyDown && event.type == InputTypeRelease) {
             if(i2ctools->main_view->current_view == MAIN_VIEW) {
                 if(i2ctools->main_view->menu_index < MENU_SIZE - 1) {
                     i2ctools->main_view->menu_index++;
@@ -112,17 +133,32 @@ int32_t i2ctools_app(void* p) {
                 if(i2ctools->scanner->menu_index < ((int)i2ctools->scanner->nb_found / 3)) {
                     i2ctools->scanner->menu_index++;
                 }
+            } else if(i2ctools->main_view->current_view == SNIFF_VIEW) {
+                if((i2ctools->sniffer->row_index + 3) <
+                   (int)i2ctools->sniffer->frames[i2ctools->sniffer->menu_index].data_index) {
+                    i2ctools->sniffer->row_index++;
+                }
             } else if(i2ctools->main_view->current_view == SEND_VIEW) {
                 if(i2ctools->sender->value > 0x00) {
                     i2ctools->sender->value--;
                     i2ctools->sender->sended = false;
                 }
             }
-        } else if(event.key == InputKeyDown && event.type == InputTypeLong) {
+        }
+        // Long Down
+        else if(event.key == InputKeyDown && event.type == InputTypeLong) {
             if(i2ctools->main_view->current_view == SEND_VIEW) {
                 if(i2ctools->sender->value > 0x05) {
                     i2ctools->sender->value -= 5;
                     i2ctools->sender->sended = false;
+                } else {
+                    i2ctools->sender->value = 0;
+                    i2ctools->sender->sended = false;
+                }
+            } else if(i2ctools->main_view->current_view == SNIFF_VIEW) {
+                if((i2ctools->sniffer->row_index + 8) <
+                   (int)i2ctools->sniffer->frames[i2ctools->sniffer->menu_index].data_index) {
+                    i2ctools->sniffer->row_index += 5;
                 }
             }
 
@@ -153,6 +189,7 @@ int32_t i2ctools_app(void* p) {
             } else if(i2ctools->main_view->current_view == SNIFF_VIEW) {
                 if(i2ctools->sniffer->menu_index < i2ctools->sniffer->frame_index) {
                     i2ctools->sniffer->menu_index++;
+                    i2ctools->sniffer->row_index = 0;
                 }
             }
         } else if(event.key == InputKeyLeft && event.type == InputTypeRelease) {
@@ -164,6 +201,7 @@ int32_t i2ctools_app(void* p) {
             } else if(i2ctools->main_view->current_view == SNIFF_VIEW) {
                 if(i2ctools->sniffer->menu_index > 0) {
                     i2ctools->sniffer->menu_index--;
+                    i2ctools->sniffer->row_index = 0;
                 }
             }
         }

+ 3 - 3
views/main_view.h

@@ -6,15 +6,15 @@
 
 #define SCAN_MENU_TEXT "Scan"
 #define SCAN_MENU_X 90
-#define SCAN_MENU_Y 6
+#define SCAN_MENU_Y 13
 
 #define SNIFF_MENU_TEXT "Sniff"
 #define SNIFF_MENU_X 90
-#define SNIFF_MENU_Y 20
+#define SNIFF_MENU_Y 27
 
 #define SEND_MENU_TEXT "Send"
 #define SEND_MENU_X 90
-#define SEND_MENU_Y 34
+#define SEND_MENU_Y 41
 
 // Menu
 typedef enum {

+ 2 - 2
views/scanner_view.c

@@ -43,6 +43,6 @@ void draw_scanner_view(Canvas* canvas, i2cScanner* i2c_scanner) {
     canvas_draw_rbox(canvas, 45, 48, 45, 13, 3);
     canvas_set_color(canvas, ColorWhite);
     canvas_draw_icon(canvas, 50, 50, &I_Ok_btn_9x9);
-    canvas_set_font(canvas, FontPrimary);
-    canvas_draw_str_aligned(canvas, 62, 50, AlignLeft, AlignTop, "Scan");
+    //canvas_set_font(canvas, FontPrimary);
+    canvas_draw_str_aligned(canvas, 62, 51, AlignLeft, AlignTop, "Scan");
 }

+ 46 - 26
views/sniffer_view.c

@@ -4,73 +4,93 @@ void draw_sniffer_view(Canvas* canvas, i2cSniffer* i2c_sniffer) {
     canvas_clear(canvas);
     canvas_set_color(canvas, ColorBlack);
     canvas_draw_rframe(canvas, 0, 0, 128, 64, 3);
-    canvas_draw_icon(canvas, 2, 13, &I_passport_happy2_46x49);
+    //canvas_draw_icon(canvas, 2, 13, &I_passport_happy2_46x49);
 
-    canvas_set_font(canvas, FontPrimary);
-    canvas_draw_str_aligned(canvas, 3, 3, AlignLeft, AlignTop, SNIFF_TEXT);
+    //canvas_set_font(canvas, FontPrimary);
+    //canvas_draw_str_aligned(canvas, 3, 3, AlignLeft, AlignTop, SNIFF_TEXT);
     canvas_set_font(canvas, FontSecondary);
 
     // Button
-    canvas_draw_rbox(canvas, 70, 48, 45, 13, 3);
+    canvas_draw_rbox(canvas, 40, 48, 45, 13, 3);
     canvas_set_color(canvas, ColorWhite);
-    canvas_draw_icon(canvas, 75, 50, &I_Ok_btn_9x9);
+    canvas_draw_icon(canvas, 45, 50, &I_Ok_btn_9x9);
     if(!i2c_sniffer->started) {
-        canvas_draw_str_aligned(canvas, 85, 51, AlignLeft, AlignTop, "Start");
+        canvas_draw_str_aligned(canvas, 57, 51, AlignLeft, AlignTop, "Start");
     } else {
-        canvas_draw_str_aligned(canvas, 85, 51, AlignLeft, AlignTop, "Stop");
+        canvas_draw_str_aligned(canvas, 57, 51, AlignLeft, AlignTop, "Stop");
     }
     canvas_set_color(canvas, ColorBlack);
     if(i2c_sniffer->first) {
-        canvas_draw_str_aligned(canvas, 50, 3, AlignLeft, AlignTop, "Nothing Recorded");
+        canvas_draw_str_aligned(canvas, 30, 3, AlignLeft, AlignTop, "Nothing Recorded");
         return;
     }
-    char text_buffer[8];
+    char text_buffer[10];
     // nbFrame text
-    canvas_draw_str_aligned(canvas, 50, 3, AlignLeft, AlignTop, "Frame: ");
-    snprintf(text_buffer, sizeof(text_buffer), "%d", (int)i2c_sniffer->menu_index + 1);
-    canvas_draw_str_aligned(canvas, 85, 3, AlignLeft, AlignTop, text_buffer);
-    canvas_draw_str_aligned(canvas, 100, 3, AlignLeft, AlignTop, "/");
-    snprintf(text_buffer, sizeof(text_buffer), "%d", (int)i2c_sniffer->frame_index + 1);
-    canvas_draw_str_aligned(canvas, 110, 3, AlignLeft, AlignTop, text_buffer);
+    canvas_draw_str_aligned(canvas, 3, 3, AlignLeft, AlignTop, "Frame: ");
+    snprintf(
+        text_buffer,
+        sizeof(text_buffer),
+        "%d/%d",
+        (int)i2c_sniffer->menu_index + 1,
+        (int)i2c_sniffer->frame_index + 1);
+    canvas_draw_str_aligned(canvas, 38, 3, AlignLeft, AlignTop, text_buffer);
     // Address text
     snprintf(
         text_buffer,
         sizeof(text_buffer),
         "0x%02x",
         (int)(i2c_sniffer->frames[i2c_sniffer->menu_index].data[0] >> 1));
-    canvas_draw_str_aligned(canvas, 50, 13, AlignLeft, AlignTop, "Addr: ");
-    canvas_draw_str_aligned(canvas, 75, 13, AlignLeft, AlignTop, text_buffer);
+    canvas_draw_str_aligned(canvas, 3, 13, AlignLeft, AlignTop, "Addr: ");
+    canvas_draw_str_aligned(canvas, 30, 13, AlignLeft, AlignTop, text_buffer);
     // R/W
     if((int)(i2c_sniffer->frames[i2c_sniffer->menu_index].data[0]) % 2 == 0) {
-        canvas_draw_str_aligned(canvas, 105, 13, AlignLeft, AlignTop, "W");
+        canvas_draw_str_aligned(canvas, 58, 13, AlignLeft, AlignTop, "Write");
+    } else {
+        canvas_draw_str_aligned(canvas, 58, 13, AlignLeft, AlignTop, "Read");
+    }
+    // ACK
+    if(i2c_sniffer->frames[i2c_sniffer->menu_index].ack[0]) {
+        canvas_draw_str_aligned(canvas, 90, 13, AlignLeft, AlignTop, "ACK");
     } else {
-        canvas_draw_str_aligned(canvas, 105, 13, AlignLeft, AlignTop, "R");
+        canvas_draw_str_aligned(canvas, 90, 13, AlignLeft, AlignTop, "NACK");
     }
     // Frames content
-    const uint8_t x_min = 50;
+    const uint8_t x_min = 3;
     const uint8_t y_min = 23;
     uint8_t x_pos = 0;
     uint8_t y_pos = 0;
     uint8_t row = 1;
     uint8_t column = 1;
-    for(uint8_t i = 1; i < i2c_sniffer->frames[i2c_sniffer->menu_index].data_index; i++) {
+    uint8_t frame_size = i2c_sniffer->frames[i2c_sniffer->menu_index].data_index;
+    uint8_t offset = i2c_sniffer->row_index;
+    if(i2c_sniffer->row_index > 0) {
+        offset += 1;
+    }
+    canvas_draw_str_aligned(canvas, x_min, y_min, AlignLeft, AlignTop, "Data:");
+    for(uint8_t i = 1 + offset; i < frame_size; i++) {
         snprintf(
             text_buffer,
             sizeof(text_buffer),
             "0x%02x",
             (int)i2c_sniffer->frames[i2c_sniffer->menu_index].data[i]);
         x_pos = x_min + (column - 1) * 35;
-        y_pos = y_min + (row - 1) * 10;
-        column++;
-        if(column > 2) {
-            column = 1;
-            row++;
+        if(row == 1) {
+            x_pos += 30;
         }
+        y_pos = y_min + (row - 1) * 10;
         canvas_draw_str_aligned(canvas, x_pos, y_pos, AlignLeft, AlignTop, text_buffer);
         if(i2c_sniffer->frames[i2c_sniffer->menu_index].ack[i]) {
             canvas_draw_str_aligned(canvas, x_pos + 24, y_pos, AlignLeft, AlignTop, "A");
         } else {
             canvas_draw_str_aligned(canvas, x_pos + 24, y_pos, AlignLeft, AlignTop, "N");
         }
+        column++;
+        if((row > 1 && column > 3) || (row == 1 && column > 2)) {
+            column = 1;
+            row++;
+        }
+        if(row > 2) {
+            break;
+        }
     }
 }