Skip to content

Commit 3818684

Browse files
committed
Add sender view
1 parent dc124f0 commit 3818684

File tree

1 file changed

+100
-106
lines changed

1 file changed

+100
-106
lines changed

i2ctools.c

+100-106
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
#define SEND_MENU_Y 34
2323

2424
#define PLAY_MENU_TEXT "Play"
25-
#define PLAY_MENU_X 70
25+
#define PLAY_MENU_X 75
2626
#define PLAY_MENU_Y 48
2727

2828
// Sniffer Pins
@@ -43,16 +43,6 @@ typedef enum {
4343
MENU_SIZE
4444
} i2cToolsMainMenu;
4545

46-
/*
47-
// Menu
48-
typedef struct {
49-
uint8_t idx;
50-
char* name;
51-
void* cb;
52-
Icon* icon;
53-
} i2cMenu;
54-
*/
55-
5646
// Bus Sniffer
5747
typedef enum { I2C_BUS_IDLE, I2C_BUS_STARTED } i2cBusStates;
5848

@@ -79,13 +69,15 @@ typedef struct {
7969
uint8_t addresses[MAX_I2C_ADDR + 1];
8070
uint8_t found;
8171
uint8_t menu_index;
72+
bool scanned;
8273
} _scanner;
8374

8475
// Sender
8576
typedef struct {
86-
uint8_t address;
77+
uint8_t address_idx;
8778
uint8_t value;
88-
uint8_t recv[MAX_FRAMES];
79+
uint8_t recv[2];
80+
bool must_send;
8981
bool sended;
9082
bool error;
9183
} _sender;
@@ -103,9 +95,9 @@ typedef struct {
10395

10496
void scan_i2c_bus(i2cToolsData* data) {
10597
data->scanner.found = 0;
98+
data->scanner.scanned = true;
10699
furi_hal_i2c_acquire(I2C_BUS);
107100
// scan
108-
printf("scan\r\n");
109101
for(uint8_t addr = 0x01; addr < MAX_I2C_ADDR; addr++) {
110102
// Check for peripherals
111103
if(furi_hal_i2c_is_device_ready(I2C_BUS, addr, 2)) {
@@ -116,8 +108,6 @@ void scan_i2c_bus(i2cToolsData* data) {
116108
// convert addr to 7-bits
117109
data->scanner.addresses[data->scanner.found] = addr >> 1;
118110
data->scanner.found++;
119-
printf("%#4x", addr >> 1);
120-
printf("\r\n");
121111
}
122112
}
123113
furi_hal_i2c_release(I2C_BUS);
@@ -263,40 +253,40 @@ static void SCLcallback(void* ctx) {
263253
}
264254
}
265255

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);
275259

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+
}
284264

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+
}
290269

270+
void i2ctools_draw_sniff_view(Canvas* canvas, i2cToolsData* data) {
291271
canvas_clear(canvas);
292272
canvas_set_color(canvas, ColorBlack);
293273
canvas_draw_rframe(canvas, 0, 0, 128, 64, 3);
294274
canvas_draw_icon(canvas, 2, 13, &I_passport_happy2_46x49);
295275

296276
canvas_set_font(canvas, FontPrimary);
297277
canvas_draw_str_aligned(canvas, 3, 3, AlignLeft, AlignTop, SNIFF_MENU_TEXT);
298-
299278
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);
300290
// Address text
301291
char addr_text[8];
302292
snprintf(
@@ -356,15 +346,13 @@ void i2ctools_draw_send_view(Canvas* canvas, i2cToolsData* data) {
356346
canvas_draw_icon(canvas, 2, 13, &I_passport_happy2_46x49);
357347
canvas_set_font(canvas, FontPrimary);
358348
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);
363352
}
364353

365-
366354
canvas_set_font(canvas, FontSecondary);
367-
if(data->nb_available <= 0) {
355+
if(data->scanner.found <= 0) {
368356
canvas_draw_str_aligned(canvas, 60, 5, AlignLeft, AlignTop, "No peripherals");
369357
canvas_draw_str_aligned(canvas, 60, 15, AlignLeft, AlignTop, "Found");
370358
return;
@@ -381,41 +369,41 @@ void i2ctools_draw_send_view(Canvas* canvas, i2cToolsData* data) {
381369
snprintf(
382370
addr_text,
383371
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]);
386374
canvas_draw_str_aligned(canvas, 90, 5, AlignLeft, AlignTop, addr_text);
387375
canvas_draw_str_aligned(canvas, 50, 15, AlignLeft, AlignTop, "Value: ");
388376

389377
canvas_draw_icon(canvas, 80, 17, &I_ButtonUp_7x4);
390378
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);
392380
canvas_draw_str_aligned(canvas, 90, 15, AlignLeft, AlignTop, addr_text);
393-
if(data->send_view_must_send) {
381+
if(data->sender.must_send) {
394382
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(
396384
&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,
399387
1,
400-
data->send_last_recv,
401-
sizeof(data->send_last_recv),
388+
data->sender.recv,
389+
sizeof(data->sender.recv),
402390
3);
403391
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;
406394
}
407395
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+
/*
414403
} else {
415404
canvas_draw_str_aligned(canvas, 90, 25, AlignLeft, AlignTop, "Error");
416-
}
405+
}*/
417406
}
418-
*/
419407
}
420408

421409
void i2ctools_draw_scan_view(Canvas* canvas, i2cToolsData* data) {
@@ -440,7 +428,7 @@ void i2ctools_draw_scan_view(Canvas* canvas, i2cToolsData* data) {
440428
break;
441429
}
442430
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]);
444432
if(i < 3) {
445433
x_pos = 50 + (i * 26);
446434
y_pos = 15;
@@ -464,6 +452,12 @@ void i2ctools_draw_scan_view(Canvas* canvas, i2cToolsData* data) {
464452
// Right cursor
465453
y_pos = 14 + data->scanner.menu_index;
466454
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");
467461
}
468462

469463
void i2ctools_draw_callback(Canvas* canvas, void* ctx) {
@@ -529,14 +523,17 @@ int32_t i2ctools_app(void* p) {
529523
i2caddrs->sniffer.menu_index = 0;
530524

531525
i2caddrs->scanner.menu_index = 0;
526+
i2caddrs->scanner.scanned = false;
527+
528+
i2caddrs->sender.must_send = false;
529+
i2caddrs->sender.sended = false;
532530
while(furi_message_queue_get(event_queue, &event, FuriWaitForever) == FuriStatusOk) {
533531
if(event.key == InputKeyBack && event.type == InputTypeRelease) {
534532
if(i2caddrs->current_menu == MAIN_VIEW) {
535533
break;
536534
} else {
537535
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();
540537
i2caddrs->sniffer.started = false;
541538
i2caddrs->sniffer.state = I2C_BUS_IDLE;
542539
}
@@ -551,28 +548,23 @@ int32_t i2ctools_app(void* p) {
551548
if(i2caddrs->scanner.menu_index > 0) {
552549
i2caddrs->scanner.menu_index--;
553550
}
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;
558555
}
559556
}
560-
*/
561-
562-
}
563-
/*
564-
else if(
557+
} else if(
565558
event.key == InputKeyUp &&
566559
(event.type == InputTypeLong || event.type == InputTypeRepeat)) {
567560
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;
571564
}
572565
}
573566

574-
} */
575-
else if(event.key == InputKeyDown && event.type == InputTypeRelease) {
567+
} else if(event.key == InputKeyDown && event.type == InputTypeRelease) {
576568
if(i2caddrs->current_menu == MAIN_VIEW) {
577569
if(i2caddrs->main_menu_index < 3) {
578570
i2caddrs->main_menu_index++;
@@ -581,25 +573,21 @@ int32_t i2ctools_app(void* p) {
581573
if(i2caddrs->scanner.menu_index < ((int)i2caddrs->scanner.found / 3)) {
582574
i2caddrs->scanner.menu_index++;
583575
}
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;
588580
}
589-
}*/
590-
}
591-
/*
592-
else if(event.key == InputKeyDown && event.type == InputTypeLong) {
581+
}
582+
} else if(event.key == InputKeyDown && event.type == InputTypeLong) {
593583
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;
597587
}
598588
}
599589

600-
}
601-
*/
602-
else if(event.key == InputKeyOk && event.type == InputTypeRelease) {
590+
} else if(event.key == InputKeyOk && event.type == InputTypeRelease) {
603591
if(i2caddrs->current_menu == MAIN_VIEW) {
604592
if(i2caddrs->main_menu_index == 0) {
605593
scan_i2c_bus(i2caddrs);
@@ -614,29 +602,35 @@ int32_t i2ctools_app(void* p) {
614602
} else if(i2caddrs->current_menu == SCAN_VIEW) {
615603
scan_i2c_bus(i2caddrs);
616604
} 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+
}
618616
}
619617
} else if(event.key == InputKeyRight && event.type == InputTypeRelease) {
620618
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;
625622
}
626-
*/
627623
} else if(i2caddrs->current_menu == SNIFF_VIEW) {
628624
if(i2caddrs->sniffer.menu_index < i2caddrs->sniffer.frame_index) {
629625
i2caddrs->sniffer.menu_index++;
630626
}
631627
}
632628
} else if(event.key == InputKeyLeft && event.type == InputTypeRelease) {
633629
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;
638633
}
639-
*/
640634
} else if(i2caddrs->current_menu == SNIFF_VIEW) {
641635
if(i2caddrs->sniffer.menu_index > 0) {
642636
i2caddrs->sniffer.menu_index--;

0 commit comments

Comments
 (0)