Jean LE QUELLEC 3 лет назад
Родитель
Сommit
62eceae2c7
6 измененных файлов с 85 добавлено и 53 удалено
  1. 1 1
      i2cscanner.c
  2. 3 0
      i2cscanner.h
  3. 32 0
      i2csender.c
  4. 19 0
      i2csender.h
  5. 28 39
      i2ctools.c
  6. 2 13
      i2ctools_i.h

+ 1 - 1
i2cscanner.c

@@ -8,7 +8,7 @@ void scan_i2c_bus(i2cScanner* i2c_scanner) {
     // scan
     for(uint8_t addr = 0x01; addr < MAX_I2C_ADDR; addr++) {
         // Check for peripherals
-        if(furi_hal_i2c_is_device_ready(I2C_BUS, addr, 2)) {
+        if(furi_hal_i2c_is_device_ready(I2C_BUS, addr, I2C_TIMEOUT)) {
             // skip even 8-bit addr
             if(addr % 2 != 0) {
                 continue;

+ 3 - 0
i2cscanner.h

@@ -1,8 +1,11 @@
+#pragma once
+
 #include <furi.h>
 #include <furi_hal.h>
 
 // I2C BUS
 #define I2C_BUS &furi_hal_i2c_handle_external
+#define I2C_TIMEOUT 3
 
 // 7 bits addresses
 #define MAX_I2C_ADDR 0x7F

+ 32 - 0
i2csender.c

@@ -0,0 +1,32 @@
+#include "i2csender.h"
+
+void i2c_send(i2cSender* i2c_sender) {
+    furi_hal_i2c_acquire(I2C_BUS);
+    uint8_t adress = i2c_sender->scanner->addresses[i2c_sender->address_idx] << 1;
+    i2c_sender->error = furi_hal_i2c_trx(
+        I2C_BUS,
+        adress,
+        &i2c_sender->value,
+        sizeof(i2c_sender->value),
+        i2c_sender->recv,
+        sizeof(i2c_sender->recv),
+        I2C_TIMEOUT);
+    furi_hal_i2c_release(I2C_BUS);
+    i2c_sender->must_send = false;
+    i2c_sender->sended = true;
+}
+
+i2cSender* i2c_sender_alloc() {
+    i2cSender* i2c_sender = malloc(sizeof(i2cSender));
+    i2c_sender->scanner = i2c_scanner_alloc();
+    scan_i2c_bus(i2c_sender->scanner);
+    i2c_sender->must_send = false;
+    i2c_sender->sended = false;
+    return i2c_sender;
+}
+
+void i2c_sender_free(i2cSender* i2c_sender) {
+    furi_assert(i2c_sender);
+    i2c_scanner_free(i2c_sender->scanner);
+    free(i2c_sender);
+}

+ 19 - 0
i2csender.h

@@ -0,0 +1,19 @@
+#include <furi.h>
+#include <furi_hal.h>
+#include "i2cscanner.h"
+
+typedef struct {
+    uint8_t address_idx;
+    uint8_t value;
+    uint8_t recv[2];
+    bool must_send;
+    bool sended;
+    bool error;
+
+    i2cScanner* scanner;
+} i2cSender;
+
+void i2c_send();
+
+i2cSender* i2c_sender_alloc();
+void i2c_sender_free(i2cSender* i2c_sender);

+ 28 - 39
i2ctools.c

@@ -196,32 +196,21 @@ void i2ctools_draw_send_view(Canvas* canvas, i2cTools* i2ctools) {
         addr_text,
         sizeof(addr_text),
         "0x%02x",
-        (int)i2ctools->scanner->addresses[i2ctools->sender.address_idx]);
+        (int)i2ctools->scanner->addresses[i2ctools->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), "0x%02x", (int)i2ctools->sender.value);
+    snprintf(addr_text, sizeof(addr_text), "0x%02x", (int)i2ctools->sender->value);
     canvas_draw_str_aligned(canvas, 90, 15, AlignLeft, AlignTop, addr_text);
-    if(i2ctools->sender.must_send) {
-        furi_hal_i2c_acquire(&furi_hal_i2c_handle_external);
-        i2ctools->sender.error = furi_hal_i2c_trx(
-            &furi_hal_i2c_handle_external,
-            i2ctools->scanner->addresses[i2ctools->sender.address_idx] << 1,
-            &i2ctools->sender.value,
-            1,
-            i2ctools->sender.recv,
-            sizeof(i2ctools->sender.recv),
-            3);
-        furi_hal_i2c_release(&furi_hal_i2c_handle_external);
-        i2ctools->sender.must_send = false;
-        i2ctools->sender.sended = true;
+    if(i2ctools->sender->must_send) {
+        i2c_send(i2ctools->sender);
     }
     canvas_draw_str_aligned(canvas, 50, 25, AlignLeft, AlignTop, "Result: ");
-    if(i2ctools->sender.sended) {
-        for(uint8_t i = 0; i < sizeof(i2ctools->sender.recv); i++) {
-            snprintf(addr_text, sizeof(addr_text), "0x%02x", (int)i2ctools->sender.recv[i]);
+    if(i2ctools->sender->sended) {
+        for(uint8_t i = 0; i < sizeof(i2ctools->sender->recv); i++) {
+            snprintf(addr_text, sizeof(addr_text), "0x%02x", (int)i2ctools->sender->recv[i]);
             canvas_draw_str_aligned(canvas, 90, 25 + (i * 10), AlignLeft, AlignTop, addr_text);
         }
     }
@@ -346,8 +335,8 @@ int32_t i2ctools_app(void* p) {
 
     i2ctools->scanner = i2c_scanner_alloc();
 
-    i2ctools->sender.must_send = false;
-    i2ctools->sender.sended = false;
+    i2ctools->sender = i2c_sender_alloc();
+
     while(furi_message_queue_get(event_queue, &event, FuriWaitForever) == FuriStatusOk) {
         if(event.key == InputKeyBack && event.type == InputTypeRelease) {
             if(i2ctools->current_menu == MAIN_VIEW) {
@@ -370,18 +359,18 @@ int32_t i2ctools_app(void* p) {
                     i2ctools->scanner->menu_index--;
                 }
             } else if(i2ctools->current_menu == SEND_VIEW) {
-                if(i2ctools->sender.value < 0xFF) {
-                    i2ctools->sender.value++;
-                    i2ctools->sender.sended = false;
+                if(i2ctools->sender->value < 0xFF) {
+                    i2ctools->sender->value++;
+                    i2ctools->sender->sended = false;
                 }
             }
         } else if(
             event.key == InputKeyUp &&
             (event.type == InputTypeLong || event.type == InputTypeRepeat)) {
             if(i2ctools->current_menu == SEND_VIEW) {
-                if(i2ctools->sender.value < 0xF9) {
-                    i2ctools->sender.value += 5;
-                    i2ctools->sender.sended = false;
+                if(i2ctools->sender->value < 0xF9) {
+                    i2ctools->sender->value += 5;
+                    i2ctools->sender->sended = false;
                 }
             }
         } else if(event.key == InputKeyDown && event.type == InputTypeRelease) {
@@ -394,16 +383,16 @@ int32_t i2ctools_app(void* p) {
                     i2ctools->scanner->menu_index++;
                 }
             } else if(i2ctools->current_menu == SEND_VIEW) {
-                if(i2ctools->sender.value > 0x00) {
-                    i2ctools->sender.value--;
-                    i2ctools->sender.sended = false;
+                if(i2ctools->sender->value > 0x00) {
+                    i2ctools->sender->value--;
+                    i2ctools->sender->sended = false;
                 }
             }
         } else if(event.key == InputKeyDown && event.type == InputTypeLong) {
             if(i2ctools->current_menu == SEND_VIEW) {
-                if(i2ctools->sender.value > 0x05) {
-                    i2ctools->sender.value -= 5;
-                    i2ctools->sender.sended = false;
+                if(i2ctools->sender->value > 0x05) {
+                    i2ctools->sender->value -= 5;
+                    i2ctools->sender->sended = false;
                 }
             }
 
@@ -422,7 +411,7 @@ int32_t i2ctools_app(void* p) {
             } else if(i2ctools->current_menu == SCAN_VIEW) {
                 scan_i2c_bus(i2ctools->scanner);
             } else if(i2ctools->current_menu == SEND_VIEW) {
-                i2ctools->sender.must_send = true;
+                i2ctools->sender->must_send = true;
             } else if(i2ctools->current_menu == SNIFF_VIEW) {
                 if(i2ctools->sniffer->started) {
                     stop_interrupts();
@@ -436,9 +425,9 @@ int32_t i2ctools_app(void* p) {
             }
         } else if(event.key == InputKeyRight && event.type == InputTypeRelease) {
             if(i2ctools->current_menu == SEND_VIEW) {
-                if(i2ctools->sender.address_idx < (i2ctools->scanner->nb_found - 1)) {
-                    i2ctools->sender.address_idx++;
-                    i2ctools->sender.sended = false;
+                if(i2ctools->sender->address_idx < (i2ctools->scanner->nb_found - 1)) {
+                    i2ctools->sender->address_idx++;
+                    i2ctools->sender->sended = false;
                 }
             } else if(i2ctools->current_menu == SNIFF_VIEW) {
                 if(i2ctools->sniffer->menu_index < i2ctools->sniffer->frame_index) {
@@ -447,9 +436,9 @@ int32_t i2ctools_app(void* p) {
             }
         } else if(event.key == InputKeyLeft && event.type == InputTypeRelease) {
             if(i2ctools->current_menu == SEND_VIEW) {
-                if(i2ctools->sender.address_idx > 0) {
-                    i2ctools->sender.address_idx--;
-                    i2ctools->sender.sended = false;
+                if(i2ctools->sender->address_idx > 0) {
+                    i2ctools->sender->address_idx--;
+                    i2ctools->sender->sended = false;
                 }
             } else if(i2ctools->current_menu == SNIFF_VIEW) {
                 if(i2ctools->sniffer->menu_index > 0) {

+ 2 - 13
i2ctools_i.h

@@ -5,6 +5,7 @@
 
 #include "i2csniffer.h"
 #include "i2cscanner.h"
+#include "i2csender.h"
 
 // Menu
 typedef enum {
@@ -18,18 +19,6 @@ typedef enum {
     MENU_SIZE
 } i2cToolsMainMenu;
 
-// Bus scanner
-
-// Sender
-typedef struct {
-    uint8_t address_idx;
-    uint8_t value;
-    uint8_t recv[2];
-    bool must_send;
-    bool sended;
-    bool error;
-} _sender;
-
 // App datas
 typedef struct {
     ViewPort* view_port;
@@ -38,5 +27,5 @@ typedef struct {
 
     i2cScanner* scanner;
     i2cSniffer* sniffer;
-    _sender sender;
+    i2cSender* sender;
 } i2cTools;