MX 2 лет назад
Родитель
Сommit
839ac81df3
5 измененных файлов с 86 добавлено и 36 удалено
  1. 2 1
      evil_portal_app.c
  2. 1 1
      evil_portal_app_i.h
  3. 64 22
      evil_portal_uart.c
  4. 1 1
      evil_portal_uart.h
  5. 18 11
      scenes/evil_portal_scene_console_output.c

+ 2 - 1
evil_portal_app.c

@@ -83,7 +83,8 @@ Evil_PortalApp* evil_portal_app_alloc() {
 
 
 void evil_portal_app_free(Evil_PortalApp* app) {
 void evil_portal_app_free(Evil_PortalApp* app) {
     // Send reset event to dev board
     // Send reset event to dev board
-    evil_portal_uart_tx((uint8_t*)(RESET_CMD "\nstopscan\n"), strlen(RESET_CMD "\nstopscan\n"));
+    evil_portal_uart_tx(
+        app->uart, (uint8_t*)(RESET_CMD "\nstopscan\n"), strlen(RESET_CMD "\nstopscan\n"));
 
 
     furi_assert(app);
     furi_assert(app);
 
 

+ 1 - 1
evil_portal_app_i.h

@@ -19,7 +19,7 @@
 #define NUM_MENU_ITEMS (6)
 #define NUM_MENU_ITEMS (6)
 
 
 #define EVIL_PORTAL_TEXT_BOX_STORE_SIZE (4096)
 #define EVIL_PORTAL_TEXT_BOX_STORE_SIZE (4096)
-#define UART_CH (FuriHalUartIdUSART1)
+#define UART_CH (FuriHalSerialIdUsart)
 
 
 #define SET_HTML_CMD "sethtml"
 #define SET_HTML_CMD "sethtml"
 #define SET_AP_CMD "setap"
 #define SET_AP_CMD "setap"

+ 64 - 22
evil_portal_uart.c

@@ -6,8 +6,12 @@ struct Evil_PortalUart {
     Evil_PortalApp* app;
     Evil_PortalApp* app;
     FuriThread* rx_thread;
     FuriThread* rx_thread;
     FuriStreamBuffer* rx_stream;
     FuriStreamBuffer* rx_stream;
+    bool pcap;
+    uint8_t mark_test_buf[11];
+    uint8_t mark_test_idx;
     uint8_t rx_buf[RX_BUF_SIZE + 1];
     uint8_t rx_buf[RX_BUF_SIZE + 1];
     void (*handle_rx_data_cb)(uint8_t* buf, size_t len, void* context);
     void (*handle_rx_data_cb)(uint8_t* buf, size_t len, void* context);
+    FuriHalSerialHandle* serial_handle;
 };
 };
 
 
 typedef enum {
 typedef enum {
@@ -24,12 +28,60 @@ void evil_portal_uart_set_handle_rx_data_cb(
 
 
 #define WORKER_ALL_RX_EVENTS (WorkerEvtStop | WorkerEvtRxDone)
 #define WORKER_ALL_RX_EVENTS (WorkerEvtStop | WorkerEvtRxDone)
 
 
-void evil_portal_uart_on_irq_cb(UartIrqEvent ev, uint8_t data, void* context) {
+void evil_portal_uart_on_irq_cb(
+    FuriHalSerialHandle* handle,
+    FuriHalSerialRxEvent event,
+    void* context) {
     Evil_PortalUart* uart = (Evil_PortalUart*)context;
     Evil_PortalUart* uart = (Evil_PortalUart*)context;
 
 
-    if(ev == UartIrqEventRXNE) {
-        furi_stream_buffer_send(uart->rx_stream, &data, 1, 0);
-        furi_thread_flags_set(furi_thread_get_id(uart->rx_thread), WorkerEvtRxDone);
+    if(event == FuriHalSerialRxEventData) {
+        uint8_t data = furi_hal_serial_async_rx(handle);
+        const char* mark_begin = "[BUF/BEGIN]";
+        const char* mark_close = "[BUF/CLOSE]";
+        if(uart->mark_test_idx != 0) {
+            // We are trying to match a marker
+            if(data == mark_begin[uart->mark_test_idx] ||
+               data == mark_close[uart->mark_test_idx]) {
+                // Received char matches next char in a marker, append to test buffer
+                uart->mark_test_buf[uart->mark_test_idx++] = data;
+                if(uart->mark_test_idx == sizeof(uart->mark_test_buf)) {
+                    // Test buffer reached max length, parse what marker this is and discard buffer
+                    if(!memcmp(
+                           uart->mark_test_buf, (void*)mark_begin, sizeof(uart->mark_test_buf))) {
+                        uart->pcap = true;
+                    } else if(!memcmp(
+                                  uart->mark_test_buf,
+                                  (void*)mark_close,
+                                  sizeof(uart->mark_test_buf))) {
+                        uart->pcap = false;
+                    }
+                    uart->mark_test_idx = 0;
+                }
+                // Don't pass to stream
+                return;
+            } else {
+                // Received char doesn't match any expected next char, send current test buffer
+                if(!uart->pcap) {
+                    furi_stream_buffer_send(
+                        uart->rx_stream, uart->mark_test_buf, uart->mark_test_idx, 0);
+                    furi_thread_flags_set(furi_thread_get_id(uart->rx_thread), WorkerEvtRxDone);
+                }
+                // Reset test buffer and try parsing this char from scratch
+                uart->mark_test_idx = 0;
+            }
+        }
+        // If we reach here the buffer is empty
+        if(data == mark_begin[0]) {
+            // Received marker start, append to test buffer
+            uart->mark_test_buf[uart->mark_test_idx++] = data;
+        } else {
+            // Not a marker start and we aren't matching a marker, this is just data
+            if(!uart->pcap) {
+                // We want to ignore pcap data from marauder
+                furi_stream_buffer_send(uart->rx_stream, &data, 1, 0);
+                furi_thread_flags_set(furi_thread_get_id(uart->rx_thread), WorkerEvtRxDone);
+            }
+        }
     }
     }
 }
 }
 
 
@@ -75,14 +127,13 @@ static int32_t uart_worker(void* context) {
         }
         }
     }
     }
 
 
-    furi_hal_uart_set_irq_cb(UART_CH, NULL, NULL);
     furi_stream_buffer_free(uart->rx_stream);
     furi_stream_buffer_free(uart->rx_stream);
 
 
     return 0;
     return 0;
 }
 }
 
 
-void evil_portal_uart_tx(uint8_t* data, size_t len) {
-    furi_hal_uart_tx(UART_CH, data, len);
+void evil_portal_uart_tx(Evil_PortalUart* uart, uint8_t* data, size_t len) {
+    furi_hal_serial_tx(uart->serial_handle, data, len);
 }
 }
 
 
 Evil_PortalUart* evil_portal_uart_init(Evil_PortalApp* app) {
 Evil_PortalUart* evil_portal_uart_init(Evil_PortalApp* app) {
@@ -98,19 +149,13 @@ Evil_PortalUart* evil_portal_uart_init(Evil_PortalApp* app) {
 
 
     furi_thread_start(uart->rx_thread);
     furi_thread_start(uart->rx_thread);
 
 
-    if(UART_CH == FuriHalUartIdUSART1) {
-        furi_hal_console_disable();
-    } else if(UART_CH == FuriHalUartIdLPUART1) {
-        furi_hal_uart_init(UART_CH, app->BAUDRATE);
-    }
-
     if(app->BAUDRATE == 0) {
     if(app->BAUDRATE == 0) {
         app->BAUDRATE = 115200;
         app->BAUDRATE = 115200;
     }
     }
-    furi_hal_uart_set_br(UART_CH, app->BAUDRATE);
-    furi_hal_uart_set_irq_cb(UART_CH, evil_portal_uart_on_irq_cb, uart);
-
-    //evil_portal_uart_tx((uint8_t*)("XFW#EVILPORTAL=1\n"), strlen("XFW#EVILPORTAL=1\n"));
+    uart->serial_handle = furi_hal_serial_control_acquire(UART_CH);
+    furi_check(uart->serial_handle);
+    furi_hal_serial_init(uart->serial_handle, app->BAUDRATE);
+    furi_hal_serial_async_rx_start(uart->serial_handle, evil_portal_uart_on_irq_cb, uart, false);
 
 
     return uart;
     return uart;
 }
 }
@@ -122,11 +167,8 @@ void evil_portal_uart_free(Evil_PortalUart* uart) {
     furi_thread_join(uart->rx_thread);
     furi_thread_join(uart->rx_thread);
     furi_thread_free(uart->rx_thread);
     furi_thread_free(uart->rx_thread);
 
 
-    if(UART_CH == FuriHalUartIdLPUART1) {
-        furi_hal_uart_deinit(UART_CH);
-    } else {
-        furi_hal_console_enable();
-    }
+    furi_hal_serial_deinit(uart->serial_handle);
+    furi_hal_serial_control_release(uart->serial_handle);
 
 
     free(uart);
     free(uart);
 }
 }

+ 1 - 1
evil_portal_uart.h

@@ -9,6 +9,6 @@ typedef struct Evil_PortalUart Evil_PortalUart;
 void evil_portal_uart_set_handle_rx_data_cb(
 void evil_portal_uart_set_handle_rx_data_cb(
     Evil_PortalUart* uart,
     Evil_PortalUart* uart,
     void (*handle_rx_data_cb)(uint8_t* buf, size_t len, void* context));
     void (*handle_rx_data_cb)(uint8_t* buf, size_t len, void* context));
-void evil_portal_uart_tx(uint8_t* data, size_t len);
+void evil_portal_uart_tx(Evil_PortalUart* uart, uint8_t* data, size_t len);
 Evil_PortalUart* evil_portal_uart_init(Evil_PortalApp* app);
 Evil_PortalUart* evil_portal_uart_init(Evil_PortalApp* app);
 void evil_portal_uart_free(Evil_PortalUart* uart);
 void evil_portal_uart_free(Evil_PortalUart* uart);

+ 18 - 11
scenes/evil_portal_scene_console_output.c

@@ -120,7 +120,8 @@ void evil_portal_scene_console_output_on_enter(void* context) {
             // Test evil portal syntax and response, marauder ignores it
             // Test evil portal syntax and response, marauder ignores it
             furi_string_printf(data, "setap=%s\n", (char*)app->ap_name);
             furi_string_printf(data, "setap=%s\n", (char*)app->ap_name);
             furi_string_reset(app->captured_line);
             furi_string_reset(app->captured_line);
-            evil_portal_uart_tx((uint8_t*)(furi_string_get_cstr(data)), furi_string_size(data));
+            evil_portal_uart_tx(
+                app->uart, (uint8_t*)(furi_string_get_cstr(data)), furi_string_size(data));
             // TODO: move timeouts and commands elsewhere, can't block input cycle
             // TODO: move timeouts and commands elsewhere, can't block input cycle
             for(uint8_t t = 0; t < 69 && !captured(app, "ap set") && !captured(app, "\n>"); t++)
             for(uint8_t t = 0; t < 69 && !captured(app, "ap set") && !captured(app, "\n>"); t++)
                 furi_delay_ms(100);
                 furi_delay_ms(100);
@@ -131,7 +132,7 @@ void evil_portal_scene_console_output_on_enter(void* context) {
                 furi_string_printf(data, "clearlist -a -s -c\nssid -a -n '%s'\n", app->ap_name);
                 furi_string_printf(data, "clearlist -a -s -c\nssid -a -n '%s'\n", app->ap_name);
                 furi_string_reset(app->captured_line);
                 furi_string_reset(app->captured_line);
                 evil_portal_uart_tx(
                 evil_portal_uart_tx(
-                    (uint8_t*)(furi_string_get_cstr(data)), furi_string_size(data));
+                    app->uart, (uint8_t*)(furi_string_get_cstr(data)), furi_string_size(data));
                 // Marauder echoes the command, maybe still init so wait a while for echo
                 // Marauder echoes the command, maybe still init so wait a while for echo
                 for(uint8_t t = 0; t < 10 && !captured(app, (char*)app->ap_name); t++)
                 for(uint8_t t = 0; t < 10 && !captured(app, (char*)app->ap_name); t++)
                     furi_delay_ms(100);
                     furi_delay_ms(100);
@@ -142,6 +143,7 @@ void evil_portal_scene_console_output_on_enter(void* context) {
             if(icanhazmarauder) {
             if(icanhazmarauder) {
                 furi_string_reset(app->captured_line);
                 furi_string_reset(app->captured_line);
                 evil_portal_uart_tx(
                 evil_portal_uart_tx(
+                    app->uart,
                     (uint8_t*)("evilportal -c sethtmlstr\n"),
                     (uint8_t*)("evilportal -c sethtmlstr\n"),
                     strlen("evilportal -c sethtmlstr\n"));
                     strlen("evilportal -c sethtmlstr\n"));
                 for(uint8_t t = 0; t < 10 && !captured(app, "\n>") &&
                 for(uint8_t t = 0; t < 10 && !captured(app, "\n>") &&
@@ -151,19 +153,24 @@ void evil_portal_scene_console_output_on_enter(void* context) {
                 // Check for active attack
                 // Check for active attack
                 if(!(captured(app, "\n>") && !captured(app, "Setting HTML from serial..."))) {
                 if(!(captured(app, "\n>") && !captured(app, "Setting HTML from serial..."))) {
                     furi_string_reset(app->captured_line);
                     furi_string_reset(app->captured_line);
-                    evil_portal_uart_tx(app->index_html, strlen((char*)app->index_html));
-                    evil_portal_uart_tx((uint8_t*)("\n"), 1);
+                    evil_portal_uart_tx(
+                        app->uart, app->index_html, strlen((char*)app->index_html));
+                    evil_portal_uart_tx(app->uart, (uint8_t*)("\n"), 1);
                     for(uint8_t t = 0; t < 20 && !captured(app, "html set"); t++)
                     for(uint8_t t = 0; t < 20 && !captured(app, "html set"); t++)
                         furi_delay_ms(100);
                         furi_delay_ms(100);
                     evil_portal_uart_tx(
                     evil_portal_uart_tx(
-                        (uint8_t*)("evilportal -c start\n"), strlen("evilportal -c start\n"));
+                        app->uart,
+                        (uint8_t*)("evilportal -c start\n"),
+                        strlen("evilportal -c start\n"));
                 }
                 }
             } else {
             } else {
                 furi_string_set(data, "sethtml=");
                 furi_string_set(data, "sethtml=");
                 furi_string_cat(data, (char*)app->index_html);
                 furi_string_cat(data, (char*)app->index_html);
                 evil_portal_uart_tx(
                 evil_portal_uart_tx(
-                    (uint8_t*)(furi_string_get_cstr(data)), strlen(furi_string_get_cstr(data)));
-                evil_portal_uart_tx((uint8_t*)("\n"), 1);
+                    app->uart,
+                    (uint8_t*)(furi_string_get_cstr(data)),
+                    strlen(furi_string_get_cstr(data)));
+                evil_portal_uart_tx(app->uart, (uint8_t*)("\n"), 1);
             }
             }
 
 
             free(app->index_html);
             free(app->index_html);
@@ -172,12 +179,12 @@ void evil_portal_scene_console_output_on_enter(void* context) {
             furi_string_free(data);
             furi_string_free(data);
         } else if(0 == strncmp(RESET_CMD, app->selected_tx_string, strlen(RESET_CMD))) {
         } else if(0 == strncmp(RESET_CMD, app->selected_tx_string, strlen(RESET_CMD))) {
             evil_portal_uart_tx(
             evil_portal_uart_tx(
-                (uint8_t*)(app->selected_tx_string), strlen(app->selected_tx_string));
-            evil_portal_uart_tx((uint8_t*)("\nstopscan\n"), strlen("\nstopscan\n"));
+                app->uart, (uint8_t*)(app->selected_tx_string), strlen(app->selected_tx_string));
+            evil_portal_uart_tx(app->uart, (uint8_t*)("\nstopscan\n"), strlen("\nstopscan\n"));
         } else if(1 == strncmp("help", app->selected_tx_string, strlen("help"))) {
         } else if(1 == strncmp("help", app->selected_tx_string, strlen("help"))) {
             evil_portal_uart_tx(
             evil_portal_uart_tx(
-                (uint8_t*)(app->selected_tx_string), strlen(app->selected_tx_string));
-            evil_portal_uart_tx((uint8_t*)("\n"), 1);
+                app->uart, (uint8_t*)(app->selected_tx_string), strlen(app->selected_tx_string));
+            evil_portal_uart_tx(app->uart, (uint8_t*)("\n"), 1);
         }
         }
     }
     }
 }
 }