22
22
#define SEND_MENU_Y 34
23
23
24
24
#define PLAY_MENU_TEXT "Play"
25
- #define PLAY_MENU_X 70
25
+ #define PLAY_MENU_X 75
26
26
#define PLAY_MENU_Y 48
27
27
28
28
// Sniffer Pins
@@ -43,16 +43,6 @@ typedef enum {
43
43
MENU_SIZE
44
44
} i2cToolsMainMenu ;
45
45
46
- /*
47
- // Menu
48
- typedef struct {
49
- uint8_t idx;
50
- char* name;
51
- void* cb;
52
- Icon* icon;
53
- } i2cMenu;
54
- */
55
-
56
46
// Bus Sniffer
57
47
typedef enum { I2C_BUS_IDLE , I2C_BUS_STARTED } i2cBusStates ;
58
48
@@ -79,13 +69,15 @@ typedef struct {
79
69
uint8_t addresses [MAX_I2C_ADDR + 1 ];
80
70
uint8_t found ;
81
71
uint8_t menu_index ;
72
+ bool scanned ;
82
73
} _scanner ;
83
74
84
75
// Sender
85
76
typedef struct {
86
- uint8_t address ;
77
+ uint8_t address_idx ;
87
78
uint8_t value ;
88
- uint8_t recv [MAX_FRAMES ];
79
+ uint8_t recv [2 ];
80
+ bool must_send ;
89
81
bool sended ;
90
82
bool error ;
91
83
} _sender ;
@@ -103,9 +95,9 @@ typedef struct {
103
95
104
96
void scan_i2c_bus (i2cToolsData * data ) {
105
97
data -> scanner .found = 0 ;
98
+ data -> scanner .scanned = true;
106
99
furi_hal_i2c_acquire (I2C_BUS );
107
100
// scan
108
- printf ("scan\r\n" );
109
101
for (uint8_t addr = 0x01 ; addr < MAX_I2C_ADDR ; addr ++ ) {
110
102
// Check for peripherals
111
103
if (furi_hal_i2c_is_device_ready (I2C_BUS , addr , 2 )) {
@@ -116,8 +108,6 @@ void scan_i2c_bus(i2cToolsData* data) {
116
108
// convert addr to 7-bits
117
109
data -> scanner .addresses [data -> scanner .found ] = addr >> 1 ;
118
110
data -> scanner .found ++ ;
119
- printf ("%#4x" , addr >> 1 );
120
- printf ("\r\n" );
121
111
}
122
112
}
123
113
furi_hal_i2c_release (I2C_BUS );
@@ -263,40 +253,40 @@ static void SCLcallback(void* ctx) {
263
253
}
264
254
}
265
255
266
- void i2ctools_draw_sniff_view (Canvas * canvas , i2cToolsData * data ) {
267
- if (!data -> sniffer .started ) {
268
- // Add Rise Interrupt on SCL pin
269
- furi_hal_gpio_init (pinSCL , GpioModeInterruptRise , GpioPullNo , GpioSpeedHigh );
270
- furi_hal_gpio_add_int_callback (pinSCL , SCLcallback , data );
271
-
272
- // Add Rise and Fall Interrupt on SDA pin
273
- furi_hal_gpio_init (pinSDA , GpioModeInterruptRiseFall , GpioPullNo , GpioSpeedHigh );
274
- furi_hal_gpio_add_int_callback (pinSDA , SDAcallback , data );
256
+ void start_interrupts (i2cToolsData * data ) {
257
+ furi_hal_gpio_init (pinSCL , GpioModeInterruptRise , GpioPullNo , GpioSpeedHigh );
258
+ furi_hal_gpio_add_int_callback (pinSCL , SCLcallback , data );
275
259
276
- data -> sniffer .started = true;
277
- }
278
- if (data -> sniffer .frame_index == 0 ) {
279
- data -> sniffer .menu_index = 0 ;
280
- /*
281
- canvas_set_color(canvas, ColorBlack);
282
- canvas_draw_rframe(canvas, 0, 0, 128, 64, 3);
283
- canvas_draw_icon(canvas, 2, 13, &I_passport_happy2_46x49);
260
+ // Add Rise and Fall Interrupt on SDA pin
261
+ furi_hal_gpio_init (pinSDA , GpioModeInterruptRiseFall , GpioPullNo , GpioSpeedHigh );
262
+ furi_hal_gpio_add_int_callback (pinSDA , SDAcallback , data );
263
+ }
284
264
285
- canvas_set_font(canvas, FontPrimary);
286
- canvas_draw_str_aligned(canvas, 3, 3, AlignLeft, AlignTop, SNIFF_MENU_TEXT);
287
- */
288
- return ;
289
- }
265
+ void stop_interrupts () {
266
+ furi_hal_gpio_remove_int_callback (pinSCL );
267
+ furi_hal_gpio_remove_int_callback (pinSDA );
268
+ }
290
269
270
+ void i2ctools_draw_sniff_view (Canvas * canvas , i2cToolsData * data ) {
291
271
canvas_clear (canvas );
292
272
canvas_set_color (canvas , ColorBlack );
293
273
canvas_draw_rframe (canvas , 0 , 0 , 128 , 64 , 3 );
294
274
canvas_draw_icon (canvas , 2 , 13 , & I_passport_happy2_46x49 );
295
275
296
276
canvas_set_font (canvas , FontPrimary );
297
277
canvas_draw_str_aligned (canvas , 3 , 3 , AlignLeft , AlignTop , SNIFF_MENU_TEXT );
298
-
299
278
canvas_set_font (canvas , FontSecondary );
279
+
280
+ // Button
281
+ canvas_draw_rbox (canvas , 70 , 48 , 45 , 13 , 3 );
282
+ canvas_set_color (canvas , ColorWhite );
283
+ canvas_draw_icon (canvas , 75 , 50 , & I_Ok_btn_9x9 );
284
+ if (!data -> sniffer .started ) {
285
+ canvas_draw_str_aligned (canvas , 85 , 51 , AlignLeft , AlignTop , "Start" );
286
+ } else {
287
+ canvas_draw_str_aligned (canvas , 85 , 51 , AlignLeft , AlignTop , "Stop" );
288
+ }
289
+ canvas_set_color (canvas , ColorBlack );
300
290
// Address text
301
291
char addr_text [8 ];
302
292
snprintf (
@@ -356,15 +346,13 @@ void i2ctools_draw_send_view(Canvas* canvas, i2cToolsData* data) {
356
346
canvas_draw_icon (canvas , 2 , 13 , & I_passport_happy2_46x49 );
357
347
canvas_set_font (canvas , FontPrimary );
358
348
canvas_draw_str_aligned (canvas , 3 , 3 , AlignLeft , AlignTop , SEND_MENU_TEXT );
359
- UNUSED (data );
360
- /*
361
- if(!data->scanned) {
362
- get_available_i2c(data);
349
+
350
+ if (!data -> scanner .scanned ) {
351
+ scan_i2c_bus (data );
363
352
}
364
353
365
-
366
354
canvas_set_font (canvas , FontSecondary );
367
- if(data->nb_available <= 0) {
355
+ if (data -> scanner . found <= 0 ) {
368
356
canvas_draw_str_aligned (canvas , 60 , 5 , AlignLeft , AlignTop , "No peripherals" );
369
357
canvas_draw_str_aligned (canvas , 60 , 15 , AlignLeft , AlignTop , "Found" );
370
358
return ;
@@ -381,41 +369,41 @@ void i2ctools_draw_send_view(Canvas* canvas, i2cToolsData* data) {
381
369
snprintf (
382
370
addr_text ,
383
371
sizeof (addr_text ),
384
- "%#04x ",
385
- (int)data->available_addr [data->send_view_addr_index ]);
372
+ "0x%02x " ,
373
+ (int )data -> scanner . addresses [data -> sender . address_idx ]);
386
374
canvas_draw_str_aligned (canvas , 90 , 5 , AlignLeft , AlignTop , addr_text );
387
375
canvas_draw_str_aligned (canvas , 50 , 15 , AlignLeft , AlignTop , "Value: " );
388
376
389
377
canvas_draw_icon (canvas , 80 , 17 , & I_ButtonUp_7x4 );
390
378
canvas_draw_icon (canvas , 115 , 17 , & I_ButtonDown_7x4 );
391
- snprintf(addr_text, sizeof(addr_text), "%#04x ", (int)data->send_view_to_send );
379
+ snprintf (addr_text , sizeof (addr_text ), "0x%02x " , (int )data -> sender . value );
392
380
canvas_draw_str_aligned (canvas , 90 , 15 , AlignLeft , AlignTop , addr_text );
393
- if(data->send_view_must_send ) {
381
+ if (data -> sender . must_send ) {
394
382
furi_hal_i2c_acquire (& furi_hal_i2c_handle_external );
395
- data->send_get_return = furi_hal_i2c_trx(
383
+ data -> sender . error = furi_hal_i2c_trx (
396
384
& furi_hal_i2c_handle_external ,
397
- data->available_addr [data->send_view_addr_index ] << 1,
398
- &data->send_view_to_send ,
385
+ data -> scanner . addresses [data -> sender . address_idx ] << 1 ,
386
+ & data -> sender . value ,
399
387
1 ,
400
- data->send_last_recv ,
401
- sizeof(data->send_last_recv ),
388
+ data -> sender . recv ,
389
+ sizeof (data -> sender . recv ),
402
390
3 );
403
391
furi_hal_i2c_release (& furi_hal_i2c_handle_external );
404
- data->send_view_must_send = false;
405
- data->send_started = true;
392
+ data -> sender . must_send = false;
393
+ data -> sender . sended = true;
406
394
}
407
395
canvas_draw_str_aligned (canvas , 50 , 25 , AlignLeft , AlignTop , "Result: " );
408
- if(data->send_started) {
409
- if(data->send_get_return) {
410
- for(uint8_t i = 0; i < sizeof(data->send_last_recv); i++) {
411
- snprintf(addr_text, sizeof(addr_text), "%#04x", (int)data->send_last_recv[i]);
412
- canvas_draw_str_aligned(canvas, 90, 25 + (i * 10), AlignLeft, AlignTop, addr_text);
413
- }
396
+ if (data -> sender .sended ) {
397
+ //if(data->sender.error) {
398
+ for (uint8_t i = 0 ; i < sizeof (data -> sender .recv ); i ++ ) {
399
+ snprintf (addr_text , sizeof (addr_text ), "0x%02x" , (int )data -> sender .recv [i ]);
400
+ canvas_draw_str_aligned (canvas , 90 , 25 + (i * 10 ), AlignLeft , AlignTop , addr_text );
401
+ }
402
+ /*
414
403
} else {
415
404
canvas_draw_str_aligned(canvas, 90, 25, AlignLeft, AlignTop, "Error");
416
- }
405
+ }*/
417
406
}
418
- */
419
407
}
420
408
421
409
void i2ctools_draw_scan_view (Canvas * canvas , i2cToolsData * data ) {
@@ -440,7 +428,7 @@ void i2ctools_draw_scan_view(Canvas* canvas, i2cToolsData* data) {
440
428
break ;
441
429
}
442
430
snprintf (
443
- count_text , sizeof (count_text ), "%#04x " , (int )data -> scanner .addresses [idx_to_print ]);
431
+ count_text , sizeof (count_text ), "0x%02x " , (int )data -> scanner .addresses [idx_to_print ]);
444
432
if (i < 3 ) {
445
433
x_pos = 50 + (i * 26 );
446
434
y_pos = 15 ;
@@ -464,6 +452,12 @@ void i2ctools_draw_scan_view(Canvas* canvas, i2cToolsData* data) {
464
452
// Right cursor
465
453
y_pos = 14 + data -> scanner .menu_index ;
466
454
canvas_draw_rbox (canvas , 125 , y_pos , 3 , 10 , 1 );
455
+
456
+ // Button
457
+ canvas_draw_rbox (canvas , 70 , 48 , 45 , 13 , 3 );
458
+ canvas_set_color (canvas , ColorWhite );
459
+ canvas_draw_icon (canvas , 75 , 50 , & I_Ok_btn_9x9 );
460
+ canvas_draw_str_aligned (canvas , 85 , 51 , AlignLeft , AlignTop , "Scan" );
467
461
}
468
462
469
463
void i2ctools_draw_callback (Canvas * canvas , void * ctx ) {
@@ -529,14 +523,17 @@ int32_t i2ctools_app(void* p) {
529
523
i2caddrs -> sniffer .menu_index = 0 ;
530
524
531
525
i2caddrs -> scanner .menu_index = 0 ;
526
+ i2caddrs -> scanner .scanned = false;
527
+
528
+ i2caddrs -> sender .must_send = false;
529
+ i2caddrs -> sender .sended = false;
532
530
while (furi_message_queue_get (event_queue , & event , FuriWaitForever ) == FuriStatusOk ) {
533
531
if (event .key == InputKeyBack && event .type == InputTypeRelease ) {
534
532
if (i2caddrs -> current_menu == MAIN_VIEW ) {
535
533
break ;
536
534
} else {
537
535
if (i2caddrs -> current_menu == SNIFF_VIEW ) {
538
- furi_hal_gpio_remove_int_callback (pinSCL );
539
- furi_hal_gpio_remove_int_callback (pinSDA );
536
+ stop_interrupts ();
540
537
i2caddrs -> sniffer .started = false;
541
538
i2caddrs -> sniffer .state = I2C_BUS_IDLE ;
542
539
}
@@ -551,28 +548,23 @@ int32_t i2ctools_app(void* p) {
551
548
if (i2caddrs -> scanner .menu_index > 0 ) {
552
549
i2caddrs -> scanner .menu_index -- ;
553
550
}
554
- } /* else if(i2caddrs->current_menu == SEND_VIEW) {
555
- if(i2caddrs->send_view_to_send < 0xFF) {
556
- i2caddrs->send_view_to_send ++;
557
- i2caddrs->send_started = false;
551
+ } else if (i2caddrs -> current_menu == SEND_VIEW ) {
552
+ if (i2caddrs -> sender . value < 0xFF ) {
553
+ i2caddrs -> sender . value ++ ;
554
+ i2caddrs -> sender . sended = false;
558
555
}
559
556
}
560
- */
561
-
562
- }
563
- /*
564
- else if(
557
+ } else if (
565
558
event .key == InputKeyUp &&
566
559
(event .type == InputTypeLong || event .type == InputTypeRepeat )) {
567
560
if (i2caddrs -> current_menu == SEND_VIEW ) {
568
- if(i2caddrs->send_view_to_send < 0xF9) {
569
- i2caddrs->send_view_to_send += 5;
570
- i2caddrs->send_started = false;
561
+ if (i2caddrs -> sender . value < 0xF9 ) {
562
+ i2caddrs -> sender . value += 5 ;
563
+ i2caddrs -> sender . sended = false;
571
564
}
572
565
}
573
566
574
- } */
575
- else if (event .key == InputKeyDown && event .type == InputTypeRelease ) {
567
+ } else if (event .key == InputKeyDown && event .type == InputTypeRelease ) {
576
568
if (i2caddrs -> current_menu == MAIN_VIEW ) {
577
569
if (i2caddrs -> main_menu_index < 3 ) {
578
570
i2caddrs -> main_menu_index ++ ;
@@ -581,25 +573,21 @@ int32_t i2ctools_app(void* p) {
581
573
if (i2caddrs -> scanner .menu_index < ((int )i2caddrs -> scanner .found / 3 )) {
582
574
i2caddrs -> scanner .menu_index ++ ;
583
575
}
584
- } /* else if(i2caddrs->current_menu == SEND_VIEW) {
585
- if(i2caddrs->send_view_to_send > 0x00) {
586
- i2caddrs->send_view_to_send --;
587
- i2caddrs->send_started = false;
576
+ } else if (i2caddrs -> current_menu == SEND_VIEW ) {
577
+ if (i2caddrs -> sender . value > 0x00 ) {
578
+ i2caddrs -> sender . value -- ;
579
+ i2caddrs -> sender . sended = false;
588
580
}
589
- }*/
590
- }
591
- /*
592
- else if(event.key == InputKeyDown && event.type == InputTypeLong) {
581
+ }
582
+ } else if (event .key == InputKeyDown && event .type == InputTypeLong ) {
593
583
if (i2caddrs -> current_menu == SEND_VIEW ) {
594
- if(i2caddrs->send_view_to_send > 0x05) {
595
- i2caddrs->send_view_to_send -= 5;
596
- i2caddrs->send_started = false;
584
+ if (i2caddrs -> sender . value > 0x05 ) {
585
+ i2caddrs -> sender . value -= 5 ;
586
+ i2caddrs -> sender . sended = false;
597
587
}
598
588
}
599
589
600
- }
601
- */
602
- else if (event .key == InputKeyOk && event .type == InputTypeRelease ) {
590
+ } else if (event .key == InputKeyOk && event .type == InputTypeRelease ) {
603
591
if (i2caddrs -> current_menu == MAIN_VIEW ) {
604
592
if (i2caddrs -> main_menu_index == 0 ) {
605
593
scan_i2c_bus (i2caddrs );
@@ -614,29 +602,35 @@ int32_t i2ctools_app(void* p) {
614
602
} else if (i2caddrs -> current_menu == SCAN_VIEW ) {
615
603
scan_i2c_bus (i2caddrs );
616
604
} else if (i2caddrs -> current_menu == SEND_VIEW ) {
617
- //i2caddrs->send_view_must_send = true;
605
+ i2caddrs -> sender .must_send = true;
606
+ } else if (i2caddrs -> current_menu == SNIFF_VIEW ) {
607
+ if (i2caddrs -> sniffer .started ) {
608
+ stop_interrupts ();
609
+ i2caddrs -> sniffer .started = false;
610
+ i2caddrs -> sniffer .state = I2C_BUS_IDLE ;
611
+ } else {
612
+ start_interrupts (i2caddrs );
613
+ i2caddrs -> sniffer .started = true;
614
+ i2caddrs -> sniffer .state = I2C_BUS_IDLE ;
615
+ }
618
616
}
619
617
} else if (event .key == InputKeyRight && event .type == InputTypeRelease ) {
620
618
if (i2caddrs -> current_menu == SEND_VIEW ) {
621
- /*
622
- if(i2caddrs->send_view_addr_index < (i2caddrs->nb_available - 1)) {
623
- i2caddrs->send_view_addr_index++;
624
- i2caddrs->send_started = false;
619
+ if (i2caddrs -> sender .address_idx < (i2caddrs -> scanner .found - 1 )) {
620
+ i2caddrs -> sender .address_idx ++ ;
621
+ i2caddrs -> sender .sended = false;
625
622
}
626
- */
627
623
} else if (i2caddrs -> current_menu == SNIFF_VIEW ) {
628
624
if (i2caddrs -> sniffer .menu_index < i2caddrs -> sniffer .frame_index ) {
629
625
i2caddrs -> sniffer .menu_index ++ ;
630
626
}
631
627
}
632
628
} else if (event .key == InputKeyLeft && event .type == InputTypeRelease ) {
633
629
if (i2caddrs -> current_menu == SEND_VIEW ) {
634
- /*
635
- if(i2caddrs->send_view_addr_index > 0) {
636
- i2caddrs->send_view_addr_index--;
637
- i2caddrs->send_started = false;
630
+ if (i2caddrs -> sender .address_idx > 0 ) {
631
+ i2caddrs -> sender .address_idx -- ;
632
+ i2caddrs -> sender .sended = false;
638
633
}
639
- */
640
634
} else if (i2caddrs -> current_menu == SNIFF_VIEW ) {
641
635
if (i2caddrs -> sniffer .menu_index > 0 ) {
642
636
i2caddrs -> sniffer .menu_index -- ;
0 commit comments