Explorar o código

FIXES FIXED - Fixed by RogueMMX WILL BE IN LATEST RELEASE 2024

MX %!s(int64=2) %!d(string=hai) anos
pai
achega
36601389c3

+ 13 - 8
apps_source_code/airmon/airmon_pms.c

@@ -28,25 +28,30 @@ typedef enum {
 
 #define WORKER_ALL_RX_EVENTS (WorkerEvtStop | WorkerEvtRxDone)
 
-static void airmon_pms_uart_on_irq_cb(UartIrqEvent ev, uint8_t data, void* context) {
+static void airmon_pms_uart_on_irq_cb(
+    FuriHalSerialHandle* handle,
+    FuriHalSerialRxEvent event,
+    void* context) {
     AirmonPmsContext* pms_context = context;
 
-    if(ev == UartIrqEventRXNE) {
+    if(event == FuriHalSerialRxEventData) {
+        uint8_t data = furi_hal_serial_async_rx(handle);
         furi_stream_buffer_send(pms_context->rx_stream, &data, 1, 0);
         furi_thread_flags_set(furi_thread_get_id(pms_context->thread), WorkerEvtRxDone);
     }
 }
 
 static void airmon_pms_serial_init(AirmonPmsContext* pms_context) {
-    furi_hal_console_disable();
-    furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, airmon_pms_uart_on_irq_cb, pms_context);
-    furi_hal_uart_set_br(FuriHalUartIdUSART1, PMS_BAUDRATE);
+    pms_context->serial_handle = furi_hal_serial_control_acquire(UART_CH);
+    furi_check(pms_context->serial_handle);
+    furi_hal_serial_init(pms_context->serial_handle, PMS_BAUDRATE);
+    furi_hal_serial_async_rx_start(
+        pms_context->serial_handle, airmon_pms_uart_on_irq_cb, pms_context, false);
 }
 
 static void airmon_pms_serial_deinit(AirmonPmsContext* pms_context) {
-    UNUSED(pms_context);
-    furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, NULL, NULL);
-    furi_hal_console_enable();
+    furi_hal_serial_deinit(pms_context->serial_handle);
+    furi_hal_serial_control_release(pms_context->serial_handle);
 }
 
 bool airmon_pms_frame_valid(AirmonPmsContext* pms_context, size_t frame_len) {

+ 2 - 0
apps_source_code/airmon/airmon_pms.h

@@ -4,6 +4,7 @@
 #include <notification/notification_messages.h>
 
 #define RX_BUF_SIZE 64
+#define UART_CH (FuriHalSerialIdUsart)
 
 typedef struct {
     uint16_t pm1_0cf; // PM1.0 ug/m3 (ultrafine particles)
@@ -29,6 +30,7 @@ typedef struct {
     NotificationApp* notifications;
 
     AirmonPmsData pms_data;
+    FuriHalSerialHandle* serial_handle;
 } AirmonPmsContext;
 
 AirmonPmsContext* airmon_pms_context_alloc();

+ 1 - 1
non_catalog_apps/LORA_term/scenes/uart_terminal_scene_console_output.c

@@ -120,7 +120,7 @@ void uart_terminal_scene_console_output_on_enter(void* context) {
         snprintf(buffer, 240, "%s\r\n", (app->selected_tx_string));
         FURI_LOG_E(appName, "Command: %s", buffer);
         FURI_LOG_I(appName, "Command: %s", buffer);
-        uart_terminal_uart_tx((unsigned char*)buffer, strlen(buffer));
+        uart_terminal_uart_tx(app->uart, (unsigned char*)buffer, strlen(buffer));
     }
 }
 

+ 1 - 1
non_catalog_apps/LORA_term/uart_terminal_app_i.h

@@ -16,7 +16,7 @@
 
 #define UART_TERMINAL_TEXT_BOX_STORE_SIZE (4096)
 #define UART_TERMINAL_TEXT_INPUT_STORE_SIZE (512)
-#define UART_CH (FuriHalUartIdUSART1)
+#define UART_CH (FuriHalSerialIdUsart)
 
 struct UART_TerminalApp {
     Gui* gui;

+ 15 - 9
non_catalog_apps/LORA_term/uart_terminal_uart.c

@@ -10,6 +10,7 @@ struct UART_TerminalUart {
     FuriStreamBuffer* rx_stream;
     uint8_t rx_buf[RX_BUF_SIZE + 1];
     void (*handle_rx_data_cb)(uint8_t* buf, size_t len, void* context);
+    FuriHalSerialHandle* serial_handle;
 };
 
 typedef enum {
@@ -26,10 +27,14 @@ void uart_terminal_uart_set_handle_rx_data_cb(
 
 #define WORKER_ALL_RX_EVENTS (WorkerEvtStop | WorkerEvtRxDone)
 
-void uart_terminal_uart_on_irq_cb(UartIrqEvent ev, uint8_t data, void* context) {
+void uart_terminal_uart_on_irq_cb(
+    FuriHalSerialHandle* handle,
+    FuriHalSerialRxEvent event,
+    void* context) {
     UART_TerminalUart* uart = (UART_TerminalUart*)context;
 
-    if(ev == UartIrqEventRXNE) {
+    if(event == FuriHalSerialRxEventData) {
+        uint8_t data = furi_hal_serial_async_rx(handle);
         furi_stream_buffer_send(uart->rx_stream, &data, 1, 0);
         furi_thread_flags_set(furi_thread_get_id(uart->rx_thread), WorkerEvtRxDone);
     }
@@ -56,8 +61,8 @@ static int32_t uart_worker(void* context) {
     return 0;
 }
 
-void uart_terminal_uart_tx(uint8_t* data, size_t len) {
-    furi_hal_uart_tx(UART_CH, data, len);
+void uart_terminal_uart_tx(UART_TerminalUart* uart, uint8_t* data, size_t len) {
+    furi_hal_serial_tx(uart->serial_handle, data, len);
 }
 
 UART_TerminalUart* uart_terminal_uart_init(UART_TerminalApp* app) {
@@ -73,12 +78,13 @@ UART_TerminalUart* uart_terminal_uart_init(UART_TerminalApp* app) {
 
     furi_thread_start(uart->rx_thread);
 
-    furi_hal_console_disable();
     if(app->BAUDRATE == 0) {
         app->BAUDRATE = 115200;
     }
-    furi_hal_uart_set_br(UART_CH, app->BAUDRATE);
-    furi_hal_uart_set_irq_cb(UART_CH, uart_terminal_uart_on_irq_cb, uart);
+    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, uart_terminal_uart_on_irq_cb, uart, false);
 
     return uart;
 }
@@ -90,8 +96,8 @@ void uart_terminal_uart_free(UART_TerminalUart* uart) {
     furi_thread_join(uart->rx_thread);
     furi_thread_free(uart->rx_thread);
 
-    furi_hal_uart_set_irq_cb(UART_CH, NULL, NULL);
-    furi_hal_console_enable();
+    furi_hal_serial_deinit(uart->serial_handle);
+    furi_hal_serial_control_release(uart->serial_handle);
 
     free(uart);
 }

+ 1 - 1
non_catalog_apps/LORA_term/uart_terminal_uart.h

@@ -9,6 +9,6 @@ typedef struct UART_TerminalUart UART_TerminalUart;
 void uart_terminal_uart_set_handle_rx_data_cb(
     UART_TerminalUart* uart,
     void (*handle_rx_data_cb)(uint8_t* buf, size_t len, void* context));
-void uart_terminal_uart_tx(uint8_t* data, size_t len);
+void uart_terminal_uart_tx(UART_TerminalUart* uart, uint8_t* data, size_t len);
 UART_TerminalUart* uart_terminal_uart_init(UART_TerminalApp* app);
 void uart_terminal_uart_free(UART_TerminalUart* uart);

+ 13 - 7
non_catalog_apps/bc_scanner_emulator/bc_scanner_script.c

@@ -17,6 +17,8 @@
 #define UART_BAUD 19200
 #define UART_PORT 0
 
+#define UART_CH (FuriHalSerialIdUsart)
+
 typedef enum {
     WorkerEvtToggle = (1 << 0),
     WorkerEvtEnd = (1 << 1),
@@ -31,6 +33,7 @@ struct BarCodeScript {
     uint8_t file_buf[FILE_BUFFER_LEN];
     uint8_t buf_len;
     bool is_file_end;
+    FuriHalSerialHandle* serial_handle;
 };
 
 static void scan_sound() {
@@ -45,23 +48,26 @@ static void scan_sound() {
     }
 }
 
-static void usb_uart_serial_init() {
+static void usb_uart_serial_init(BarCodeScript* bc_context) {
     furi_hal_usb_unlock();
     Cli* cli = furi_record_open(RECORD_CLI);
     cli_session_close(cli);
     furi_record_close(RECORD_CLI);
     furi_check(furi_hal_usb_set_config(&usb_cdc_single, NULL) == true);
-    furi_hal_console_disable();
-    furi_hal_uart_set_br(FuriHalUartIdUSART1, UART_BAUD);
+
+    bc_context->serial_handle = furi_hal_serial_control_acquire(UART_CH);
+    furi_check(bc_context->serial_handle);
+    furi_hal_serial_init(bc_context->serial_handle, UART_BAUD);
 }
 
-static void usb_uart_serial_deinit() {
+static void usb_uart_serial_deinit(BarCodeScript* bc_context) {
     furi_hal_usb_unlock();
     furi_check(furi_hal_usb_set_config(&usb_cdc_single, NULL) == true);
     Cli* cli = furi_record_open(RECORD_CLI);
     cli_session_open(cli, &cli_vcp);
     furi_record_close(RECORD_CLI);
-    furi_hal_console_enable();
+    furi_hal_serial_deinit(bc_context->serial_handle);
+    furi_hal_serial_control_release(bc_context->serial_handle);
 }
 
 static bool is_bc_end(const char chr) {
@@ -91,7 +97,7 @@ static int32_t bc_scanner_worker(void* context) {
     //uint8_t buff[5] = {'p', 'r', 'i', 'v', 'k'};
     //uint8_t state = 99;
 
-    usb_uart_serial_init();
+    usb_uart_serial_init(bc_script);
 
     while(1) {
         //state = furi_hal_cdc_get_ctrl_line_state(FuriHalUartIdUSART1);
@@ -162,7 +168,7 @@ static int32_t bc_scanner_worker(void* context) {
         }
     }
 
-    usb_uart_serial_deinit();
+    usb_uart_serial_deinit(bc_script);
     storage_file_close(script_file);
     storage_file_free(script_file);
     FURI_LOG_I(WORKER_TAG, "End");

+ 13 - 12
non_catalog_apps/esp32_gravity/scenes/uart_terminal_scene_console_output.c

@@ -33,27 +33,29 @@ void uart_terminal_scene_console_output_on_enter(void* context) {
         text_box_set_focus(text_box, TextBoxFocusEnd);
     }
 
-    if(app->is_command) {                       /* View console ensures this is false */
+    if(app->is_command) { /* View console ensures this is false */
         furi_string_reset(app->text_box_store);
         app->text_box_store_strlen = 0;
 
         /* Handle Flipper commands here - set ap->is_command = false for commands that are consumed */
-        if (!strcmp(app->selected_tx_string, "GET_STARTED")) {
+        if(!strcmp(app->selected_tx_string, "GET_STARTED")) {
             app->is_command = false;
             /* Display detailed instructions on getting started */
             uart_text_input_set_header_text(app->text_input, "Getting Started");
             // TODO: See if the header works
-            const char string[] = "             Flipper Gravity\nGETTING STARTED\nUnless you're doing a basic beacon spam or probe flood attack, or a Mana attack, the first thing to do is turn scanning on and let it run while you explore the menu. View found APs (you can leave scanning on or turn it off), select a few APs or STAs and run a DEAUTH attack against the selected APs or STAs. When an AP is specified for a DEAUTH attack Gravity will use all STAs it identifies as clients of the specified APs. Turn off scanning and deauth, and turn on MANA or LOUD MANA. This is still under development, but you can watch Wireshark to see if any devices send you an association request.\n";
+            const char string[] =
+                "             Flipper Gravity\nGETTING STARTED\nUnless you're doing a basic beacon spam or probe flood attack, or a Mana attack, the first thing to do is turn scanning on and let it run while you explore the menu. View found APs (you can leave scanning on or turn it off), select a few APs or STAs and run a DEAUTH attack against the selected APs or STAs. When an AP is specified for a DEAUTH attack Gravity will use all STAs it identifies as clients of the specified APs. Turn off scanning and deauth, and turn on MANA or LOUD MANA. This is still under development, but you can watch Wireshark to see if any devices send you an association request.\n";
             furi_string_cat_str(app->text_box_store, string);
             app->text_box_store_strlen += strlen(string);
-        } else if (!strcmp(app->selected_tx_string, "gravity-version")) {
+        } else if(!strcmp(app->selected_tx_string, "gravity-version")) {
             /* Display Flipper-Gravity components of the About screen */
             /* Not setting app->is_command = false;
                We want this command to be passed through to esp32-Gravity, so we can also
                display its version */
             /* Display a basic about screen */
             // TODO: See if the following works:
-            const char about1[] = "              Flipper Gravity\nBy Chris BC\n\nBe The Unseen Force.\n\nhttps://github.com/chris-bc/esp32-gravity\nhttps://github.com/chris-bc/Flipper-Gravity\n\nFlipper-Gravity : v";
+            const char about1[] =
+                "              Flipper Gravity\nBy Chris BC\n\nBe The Unseen Force.\n\nhttps://github.com/chris-bc/esp32-gravity\nhttps://github.com/chris-bc/Flipper-Gravity\n\nFlipper-Gravity : v";
             furi_string_cat_str(app->text_box_store, about1);
             app->text_box_store_strlen += strlen(about1);
             furi_string_cat_str(app->text_box_store, GRAVITY_VERSION);
@@ -86,12 +88,12 @@ void uart_terminal_scene_console_output_on_enter(void* context) {
     if(app->is_command && app->selected_tx_string && strcmp(app->selected_tx_string, "cls")) {
         if(app->TERMINAL_MODE == 1) {
             uart_terminal_uart_tx(
-                (uint8_t*)(app->selected_tx_string), strlen(app->selected_tx_string));
-            uart_terminal_uart_tx((uint8_t*)("\r\n"), 2);
+                app->uart, (uint8_t*)(app->selected_tx_string), strlen(app->selected_tx_string));
+            uart_terminal_uart_tx(app->uart, (uint8_t*)("\r\n"), 2);
         } else {
             uart_terminal_uart_tx(
-                (uint8_t*)(app->selected_tx_string), strlen(app->selected_tx_string));
-            uart_terminal_uart_tx((uint8_t*)("\n"), 1);
+                app->uart, (uint8_t*)(app->selected_tx_string), strlen(app->selected_tx_string));
+            uart_terminal_uart_tx(app->uart, (uint8_t*)("\n"), 1);
         }
     }
 }
@@ -118,8 +120,7 @@ void uart_terminal_scene_console_output_on_exit(void* context) {
     uart_terminal_uart_set_handle_rx_data_cb(app->uart, NULL);
 
     /* Instruct ESP32 to halt any UIs that may be drawing */
-    if (!strcmp(app->selected_tx_string, "stalk on")) {
-        uart_terminal_uart_tx(
-                (uint8_t*)"stalk off\n", strlen("stalk off\n"));
+    if(!strcmp(app->selected_tx_string, "stalk on")) {
+        uart_terminal_uart_tx(app->uart, (uint8_t*)"stalk off\n", strlen("stalk off\n"));
     }
 }

+ 263 - 169
non_catalog_apps/esp32_gravity/scenes/uart_terminal_scene_start.c

@@ -29,177 +29,272 @@ typedef struct {
 const UART_TerminalItem items[NUM_MENU_ITEMS] = {
     {"Console", {"View", "Clear"}, 2, {"", "cls"}, NO_ARGS, FOCUS_CONSOLE_END, NO_TIP},
     {"Beacon",
-    {"Status", "target-ssids", "APs", "RickRoll", "Random", "Infinite", "Off"},
-    7,
-    {"beacon", "beacon target-ssids", "beacon aps", "beacon rickroll", "beacon random ", "beacon infinite", "beacon off"},
-    TOGGLE_ARGS,
-    FOCUS_CONSOLE_END,
-    NO_TIP},
+     {"Status", "target-ssids", "APs", "RickRoll", "Random", "Infinite", "Off"},
+     7,
+     {"beacon",
+      "beacon target-ssids",
+      "beacon aps",
+      "beacon rickroll",
+      "beacon random ",
+      "beacon infinite",
+      "beacon off"},
+     TOGGLE_ARGS,
+     FOCUS_CONSOLE_END,
+     NO_TIP},
     {"Probe",
-    {"Status", "Any", "target-ssids", "APs", "Off"},
-    5,
-    {"probe", "probe any", "probe target-ssids", "probe aps", "probe off"},
-    NO_ARGS,
-    FOCUS_CONSOLE_END,
-    NO_TIP},
+     {"Status", "Any", "target-ssids", "APs", "Off"},
+     5,
+     {"probe", "probe any", "probe target-ssids", "probe aps", "probe off"},
+     NO_ARGS,
+     FOCUS_CONSOLE_END,
+     NO_TIP},
     {"Fuzz",
-    {"Status", "Off", "Overflow Beacon", "Overflow Request", "Overflow Response", "Malformed Beacon", "Malformed Request", "Malformed Response"},
-    8,
-    {"fuzz", "fuzz off", "fuzz beacon overflow", "fuzz req overflow", "fuzz resp overflow", "fuzz beacon malformed", "fuzz req malformed", "fuzz resp malformed"},
-    NO_ARGS,
-    FOCUS_CONSOLE_END,
-    NO_TIP},
+     {"Status",
+      "Off",
+      "Overflow Beacon",
+      "Overflow Request",
+      "Overflow Response",
+      "Malformed Beacon",
+      "Malformed Request",
+      "Malformed Response"},
+     8,
+     {"fuzz",
+      "fuzz off",
+      "fuzz beacon overflow",
+      "fuzz req overflow",
+      "fuzz resp overflow",
+      "fuzz beacon malformed",
+      "fuzz req malformed",
+      "fuzz resp malformed"},
+     NO_ARGS,
+     FOCUS_CONSOLE_END,
+     NO_TIP},
     {"Sniff",
-    {"Status", "On", "Off"},
-    3,
-    {"sniff", "sniff on", "sniff off"},
-    NO_ARGS,
-    FOCUS_CONSOLE_END,
-    NO_TIP},
+     {"Status", "On", "Off"},
+     3,
+     {"sniff", "sniff on", "sniff off"},
+     NO_ARGS,
+     FOCUS_CONSOLE_END,
+     NO_TIP},
     {"target-ssids",
-    {"Add", "Remove", "List"},
-    3,
-    {"target-ssids add ", "target-ssids remove ", "target-ssids"},
-    TOGGLE_ARGS,
-    FOCUS_CONSOLE_END,
-    NO_TIP},
+     {"Add", "Remove", "List"},
+     3,
+     {"target-ssids add ", "target-ssids remove ", "target-ssids"},
+     TOGGLE_ARGS,
+     FOCUS_CONSOLE_END,
+     NO_TIP},
     {"Scan",
-    {"Status", "<SSID>", "WiFi", "BT", "BLE", "BT Svcs", "Off"},
-    7,
-    {"scan", "scan ", "scan wifi", "scan bt", "scan ble", "scan bt services", "scan off"},
-    TOGGLE_ARGS,
-    FOCUS_CONSOLE_END,
-    NO_TIP},
+     {"Status", "<SSID>", "WiFi", "BT", "BLE", "BT Svcs", "Off"},
+     7,
+     {"scan", "scan ", "scan wifi", "scan bt", "scan ble", "scan bt services", "scan off"},
+     TOGGLE_ARGS,
+     FOCUS_CONSOLE_END,
+     NO_TIP},
     {"Hop",
-    {"Status", "On", "Off", "Sequential", "Random", "Default", "Set "},
-    7,
-    {"hop", "hop on", "hop off", "hop sequential", "hop random", "hop default", "hop "},
-    TOGGLE_ARGS,
-    FOCUS_CONSOLE_END,
-    NO_TIP},
+     {"Status", "On", "Off", "Sequential", "Random", "Default", "Set "},
+     7,
+     {"hop", "hop on", "hop off", "hop sequential", "hop random", "hop default", "hop "},
+     TOGGLE_ARGS,
+     FOCUS_CONSOLE_END,
+     NO_TIP},
     {"View",
-    {"STA", "AP", "BT", "BT SVCS", "BT+AP+STA", "STA+AP"},
-    6,
-    {"view sta", "view ap", "view bt", "view bt services", "view ap sta bt", "view sta ap"},
-    NO_ARGS,
-    FOCUS_CONSOLE_START,
-    NO_TIP},
+     {"STA", "AP", "BT", "BT SVCS", "BT+AP+STA", "STA+AP"},
+     6,
+     {"view sta", "view ap", "view bt", "view bt services", "view ap sta bt", "view sta ap"},
+     NO_ARGS,
+     FOCUS_CONSOLE_START,
+     NO_TIP},
     {"Select",
-    {"STA", "AP", "BT"},
-    3,
-    {"select sta ", "select ap ", "select bt "},
-    INPUT_ARGS,
-    FOCUS_CONSOLE_END,
-    NO_TIP},
+     {"STA", "AP", "BT"},
+     3,
+     {"select sta ", "select ap ", "select bt "},
+     INPUT_ARGS,
+     FOCUS_CONSOLE_END,
+     NO_TIP},
     {"Selected",
-    {"STA", "AP", "BT", "AP+STA+BT"},
-    4,
-    {"selected sta", "selected ap", "selected bt", "selected"},
-    NO_ARGS,
-    FOCUS_CONSOLE_START,
-    NO_TIP},
+     {"STA", "AP", "BT", "AP+STA+BT"},
+     4,
+     {"selected sta", "selected ap", "selected bt", "selected"},
+     NO_ARGS,
+     FOCUS_CONSOLE_START,
+     NO_TIP},
     {"Clear",
-    {"STA", "STA Sel.", "AP", "AP Sel.", "BT", "BT Sel.", "BT Svcs", "ALL"},
-    8,
-    {"clear sta", "clear sta selected", "clear ap", "clear ap selected", "clear bt", "clear bt selected", "clear bt services", "clear all"},
-    NO_ARGS,
-    FOCUS_CONSOLE_END,
-    NO_TIP},
+     {"STA", "STA Sel.", "AP", "AP Sel.", "BT", "BT Sel.", "BT Svcs", "ALL"},
+     8,
+     {"clear sta",
+      "clear sta selected",
+      "clear ap",
+      "clear ap selected",
+      "clear bt",
+      "clear bt selected",
+      "clear bt services",
+      "clear all"},
+     NO_ARGS,
+     FOCUS_CONSOLE_END,
+     NO_TIP},
     {"Purge",
-    {"AP", "STA", "BT", "BLE"},
-    4,
-    {"purge ap", "purge sta", "purge bt", "purge ble"},
-    NO_ARGS,
-    FOCUS_CONSOLE_END,
-    NO_TIP},
+     {"AP", "STA", "BT", "BLE"},
+     4,
+     {"purge ap", "purge sta", "purge bt", "purge ble"},
+     NO_ARGS,
+     FOCUS_CONSOLE_END,
+     NO_TIP},
     {"Get",
-    {"pkt expiry", "SSID rnd chars", "Attack millis", "SSID min len", "SSID max len", "default SSID count", "Channel", "MAC", "MAC Randomisation", "Purge Strategy", "Purge Min Age", "Purge Max RSSI"},
-    12,
-    {"get expiry", "get scramble_words", "get attack_millis", "get ssid_len_min", "get ssid_len_max", "get default_ssid_count", "get channel", "get mac", "get mac_rand", "get ble_purge_strat", "get ble_purge_min_age", "get ble_purge_max_rssi"},
-    NO_ARGS,
-    FOCUS_CONSOLE_END,
-    NO_TIP},
+     {"pkt expiry",
+      "SSID rnd chars",
+      "Attack millis",
+      "SSID min len",
+      "SSID max len",
+      "default SSID count",
+      "Channel",
+      "MAC",
+      "MAC Randomisation",
+      "Purge Strategy",
+      "Purge Min Age",
+      "Purge Max RSSI"},
+     12,
+     {"get expiry",
+      "get scramble_words",
+      "get attack_millis",
+      "get ssid_len_min",
+      "get ssid_len_max",
+      "get default_ssid_count",
+      "get channel",
+      "get mac",
+      "get mac_rand",
+      "get ble_purge_strat",
+      "get ble_purge_min_age",
+      "get ble_purge_max_rssi"},
+     NO_ARGS,
+     FOCUS_CONSOLE_END,
+     NO_TIP},
     {"Set",
-    {"pkt expiry", "SSID rnd chars", "Attack millis", "SSID min len", "SSID max len", "default SSID count", "Channel", "MAC", "MAC Randomisation", "Purge Strategy", "Purge Min Age", "Purge Max RSSI"},
-    12,
-    {"set expiry ", "set scramble_words ", "set attack_millis ", "set ssid_len_min ", "set ssid_len_max ", "set default_ssid_count ", "set channel ", "set mac ", "set mac_rand ", "set BLE_PURGE_STRAT ", "set BLE_PURGE_MIN_AGE ", "set BLE_PURGE_MAX_RSSI "},
-    INPUT_ARGS,
-    FOCUS_CONSOLE_END,
-    NO_TIP},
+     {"pkt expiry",
+      "SSID rnd chars",
+      "Attack millis",
+      "SSID min len",
+      "SSID max len",
+      "default SSID count",
+      "Channel",
+      "MAC",
+      "MAC Randomisation",
+      "Purge Strategy",
+      "Purge Min Age",
+      "Purge Max RSSI"},
+     12,
+     {"set expiry ",
+      "set scramble_words ",
+      "set attack_millis ",
+      "set ssid_len_min ",
+      "set ssid_len_max ",
+      "set default_ssid_count ",
+      "set channel ",
+      "set mac ",
+      "set mac_rand ",
+      "set BLE_PURGE_STRAT ",
+      "set BLE_PURGE_MIN_AGE ",
+      "set BLE_PURGE_MAX_RSSI "},
+     INPUT_ARGS,
+     FOCUS_CONSOLE_END,
+     NO_TIP},
     {"Deauth",
-    {"Status", "Set Delay", "Off", "Frame STA", "Device STA", "Spoof STA", "Frame APs", "Device APs", "Spoof APs", "Frame B'Cast", "Device B'Cast", "Spoof B'Cast"},
-    12,
-    {"deauth", "deauth ", "deauth off", "deauth frame sta", "deauth device sta", "deauth spoof sta", "deauth frame ap", "deauth device ap", "deauth spoof ap", "deauth frame broadcast", "deauth device broadcast", "deauth spoof broadcast"},
-    TOGGLE_ARGS,
-    FOCUS_CONSOLE_END,
-    NO_TIP},
+     {"Status",
+      "Set Delay",
+      "Off",
+      "Frame STA",
+      "Device STA",
+      "Spoof STA",
+      "Frame APs",
+      "Device APs",
+      "Spoof APs",
+      "Frame B'Cast",
+      "Device B'Cast",
+      "Spoof B'Cast"},
+     12,
+     {"deauth",
+      "deauth ",
+      "deauth off",
+      "deauth frame sta",
+      "deauth device sta",
+      "deauth spoof sta",
+      "deauth frame ap",
+      "deauth device ap",
+      "deauth spoof ap",
+      "deauth frame broadcast",
+      "deauth device broadcast",
+      "deauth spoof broadcast"},
+     TOGGLE_ARGS,
+     FOCUS_CONSOLE_END,
+     NO_TIP},
     {"Mana",
-    {"Status", "On", "Off", "Clear"},
-    4,
-    {"mana", "mana on", "mana off", "mana clear"},
-    NO_ARGS,
-    FOCUS_CONSOLE_END,
-    NO_TIP},
+     {"Status", "On", "Off", "Clear"},
+     4,
+     {"mana", "mana on", "mana off", "mana clear"},
+     NO_ARGS,
+     FOCUS_CONSOLE_END,
+     NO_TIP},
     {"Mana Verbose",
-    {"Status", "On", "Off"},
-    3,
-    {"mana verbose", "mana verbose on", "mana verbose off"},
-    NO_ARGS,
-    FOCUS_CONSOLE_END,
-    NO_TIP},
+     {"Status", "On", "Off"},
+     3,
+     {"mana verbose", "mana verbose on", "mana verbose off"},
+     NO_ARGS,
+     FOCUS_CONSOLE_END,
+     NO_TIP},
     {"Mana Loud",
-    {"Status", "On", "Off"},
-    3,
-    {"mana loud", "mana loud on", "mana loud off"},
-    NO_ARGS,
-    FOCUS_CONSOLE_END,
-    NO_TIP},
+     {"Status", "On", "Off"},
+     3,
+     {"mana loud", "mana loud on", "mana loud off"},
+     NO_ARGS,
+     FOCUS_CONSOLE_END,
+     NO_TIP},
     {"selectedAP DOS",
-    {"Status", "On", "Off"},
-    3,
-    {"ap-dos", "ap-dos on", "ap-dos off"},
-    NO_ARGS,
-    FOCUS_CONSOLE_END,
-    NO_TIP},
+     {"Status", "On", "Off"},
+     3,
+     {"ap-dos", "ap-dos on", "ap-dos off"},
+     NO_ARGS,
+     FOCUS_CONSOLE_END,
+     NO_TIP},
     {"AP Clone Attack",
-    {"Status", "Off", "OPN", "WEP", "WPA", "OPN+WEP", "OPN+WPA", "WEP+WPA", "OPN+WEP+WPA"},
-    9,
-    {"ap-clone", "ap-clone off", "ap-clone on open", "ap-clone on wep", "ap-clone on wpa", "ap-clone on open wep", "ap-clone on open wpa", "ap-clone on wep wpa", "ap-clone on open wep wpa"},
-    NO_ARGS,
-    FOCUS_CONSOLE_END,
-    NO_TIP},
-    {"Homing",
-    {"On", "Off"},
-    2,
-    {"stalk on", "stalk off"},
-    NO_ARGS,
-    FOCUS_CONSOLE_END,
-    NO_TIP},
+     {"Status", "Off", "OPN", "WEP", "WPA", "OPN+WEP", "OPN+WPA", "WEP+WPA", "OPN+WEP+WPA"},
+     9,
+     {"ap-clone",
+      "ap-clone off",
+      "ap-clone on open",
+      "ap-clone on wep",
+      "ap-clone on wpa",
+      "ap-clone on open wep",
+      "ap-clone on open wpa",
+      "ap-clone on wep wpa",
+      "ap-clone on open wep wpa"},
+     NO_ARGS,
+     FOCUS_CONSOLE_END,
+     NO_TIP},
+    {"Homing", {"On", "Off"}, 2, {"stalk on", "stalk off"}, NO_ARGS, FOCUS_CONSOLE_END, NO_TIP},
     {"Help",
-    {"Info <cmd>", "Get Started", "Commands", "About", "Help"},
-    5,
-    {"info ", "GET_STARTED", "commands", "gravity-version", "help"},
-    TOGGLE_ARGS,
-    FOCUS_CONSOLE_START,
-    NO_TIP},
+     {"Info <cmd>", "Get Started", "Commands", "About", "Help"},
+     5,
+     {"info ", "GET_STARTED", "commands", "gravity-version", "help"},
+     TOGGLE_ARGS,
+     FOCUS_CONSOLE_START,
+     NO_TIP},
 };
 
-
-char *strToken(char *cmdLine, char sep, int tokenNum) {
+char* strToken(char* cmdLine, char sep, int tokenNum) {
     int i;
     int tokenCount = 0;
-    for (i = 0; i < (int)strlen(cmdLine) && tokenCount != tokenNum; ++i) {
-        if (cmdLine[i] == sep) {
+    for(i = 0; i < (int)strlen(cmdLine) && tokenCount != tokenNum; ++i) {
+        if(cmdLine[i] == sep) {
             ++tokenCount;
         }
     }
-    if (cmdLine[i - 1] == sep || cmdLine[i - 1] == '\0') {
+    if(cmdLine[i - 1] == sep || cmdLine[i - 1] == '\0') {
         /* Found the end of the token, now find the beginning */
         int j;
-        for (j = (i - 2); j > 0 && cmdLine[j] != sep; --j) { }
+        for(j = (i - 2); j > 0 && cmdLine[j] != sep; --j) {
+        }
         /* Token runs from index j to (i - 2) */
-        char *retVal = malloc(sizeof(char) * (i - j));
-        if (retVal == NULL) {
+        char* retVal = malloc(sizeof(char) * (i - j));
+        if(retVal == NULL) {
             printf("GRAVITY: Failed to malloc token\n");
             return NULL;
         }
@@ -208,7 +303,7 @@ char *strToken(char *cmdLine, char sep, int tokenNum) {
         return retVal;
     } else {
         /* No token */
-        if (tokenNum == 1) {
+        if(tokenNum == 1) {
             return cmdLine;
         } else {
             return NULL;
@@ -225,7 +320,6 @@ static void uart_terminal_scene_start_var_list_enter_callback(void* context, uin
     furi_assert(index < NUM_MENU_ITEMS);
     const UART_TerminalItem* item = &items[index];
 
-
     const int selected_option_index = app->selected_option_index[index];
     dolphin_deed(DolphinDeedGpioUartBridge);
     furi_assert(selected_option_index < item->num_options_menu);
@@ -244,48 +338,48 @@ static void uart_terminal_scene_start_var_list_enter_callback(void* context, uin
     //char *cmd = strsep(&origCmd, " ");
     /* GRAVITY: strsep is disabled by Flipper's SDK. RYO */
 
-    char *cmd = strToken((char *)app->selected_tx_string, ' ', 1);
-    if (!strcmp(cmd, "beacon")) {
+    char* cmd = strToken((char*)app->selected_tx_string, ' ', 1);
+    if(!strcmp(cmd, "beacon")) {
         app->gravityCommand = GRAVITY_BEACON;
-    } else if (!strcmp(cmd, "target-ssids")) {
+    } else if(!strcmp(cmd, "target-ssids")) {
         app->gravityCommand = GRAVITY_TARGET_SSIDS;
-    } else if (!strcmp(cmd, "probe")) {
+    } else if(!strcmp(cmd, "probe")) {
         app->gravityCommand = GRAVITY_PROBE;
-    } else if (!strcmp(cmd, "fuzz")) {
+    } else if(!strcmp(cmd, "fuzz")) {
         app->gravityCommand = GRAVITY_FUZZ;
-    } else if (!strcmp(cmd, "sniff")) {
+    } else if(!strcmp(cmd, "sniff")) {
         app->gravityCommand = GRAVITY_SNIFF;
-    } else if (!strcmp(cmd, "deauth")) {
+    } else if(!strcmp(cmd, "deauth")) {
         app->gravityCommand = GRAVITY_DEAUTH;
-    } else if (!strcmp(cmd, "mana")) {
+    } else if(!strcmp(cmd, "mana")) {
         app->gravityCommand = GRAVITY_MANA;
-    } else if (!strcmp(cmd, "stalk")) {
+    } else if(!strcmp(cmd, "stalk")) {
         app->gravityCommand = GRAVITY_STALK;
-    } else if (!strcmp(cmd, "ap-dos")) {
+    } else if(!strcmp(cmd, "ap-dos")) {
         app->gravityCommand = GRAVITY_AP_DOS;
-    } else if (!strcmp(cmd, "ap-clone")) {
+    } else if(!strcmp(cmd, "ap-clone")) {
         app->gravityCommand = GRAVITY_AP_CLONE;
-    } else if (!strcmp(cmd, "scan")) {
+    } else if(!strcmp(cmd, "scan")) {
         app->gravityCommand = GRAVITY_SCAN;
-    } else if (!strcmp(cmd, "hop")) {
+    } else if(!strcmp(cmd, "hop")) {
         app->gravityCommand = GRAVITY_HOP;
-    } else if (!strcmp(cmd, "set")) {
+    } else if(!strcmp(cmd, "set")) {
         app->gravityCommand = GRAVITY_SET;
-    } else if (!strcmp(cmd, "get")) {
+    } else if(!strcmp(cmd, "get")) {
         app->gravityCommand = GRAVITY_GET;
-    } else if (!strcmp(cmd, "view")) {
+    } else if(!strcmp(cmd, "view")) {
         app->gravityCommand = GRAVITY_VIEW;
-    } else if (!strcmp(cmd, "select")) {
+    } else if(!strcmp(cmd, "select")) {
         app->gravityCommand = GRAVITY_SELECT;
-    } else if (!strcmp(cmd, "selected")) {
+    } else if(!strcmp(cmd, "selected")) {
         app->gravityCommand = GRAVITY_SELECTED;
-    } else if (!strcmp(cmd, "clear")) {
+    } else if(!strcmp(cmd, "clear")) {
         app->gravityCommand = GRAVITY_CLEAR;
-    } else if (!strcmp(cmd, "handshake")) {
+    } else if(!strcmp(cmd, "handshake")) {
         app->gravityCommand = GRAVITY_HANDSHAKE;
-    } else if (!strcmp(cmd, "commands")) {
+    } else if(!strcmp(cmd, "commands")) {
         app->gravityCommand = GRAVITY_COMMANDS;
-    } else if (!strcmp(cmd, "info")) {
+    } else if(!strcmp(cmd, "info")) {
         app->gravityCommand = GRAVITY_INFO;
     } else {
         app->gravityCommand = GRAVITY_NONE;
@@ -295,11 +389,11 @@ static void uart_terminal_scene_start_var_list_enter_callback(void* context, uin
 
     /* GRAVITY: For TOGGLE_ARGS display a keyboard if actual_command ends with ' ' */
     int cmdLen = strlen(app->selected_tx_string);
-    bool needs_keyboard = ((item->needs_keyboard == INPUT_ARGS) ||
-                            (item->needs_keyboard == TOGGLE_ARGS &&
-                                (app->selected_tx_string[cmdLen-1] == ' ')));
+    bool needs_keyboard =
+        ((item->needs_keyboard == INPUT_ARGS) ||
+         (item->needs_keyboard == TOGGLE_ARGS && (app->selected_tx_string[cmdLen - 1] == ' ')));
     /* Initialise the serial console */
-    uart_terminal_uart_tx((uint8_t*)("\n"), 1);
+    uart_terminal_uart_tx(app->uart, (uint8_t*)("\n"), 1);
 
     if(needs_keyboard) {
         view_dispatcher_send_custom_event(app->view_dispatcher, UART_TerminalEventStartKeyboard);

+ 1 - 1
non_catalog_apps/esp32_gravity/uart_terminal_app_i.h

@@ -18,7 +18,7 @@
 
 #define UART_TERMINAL_TEXT_BOX_STORE_SIZE (1024)
 #define UART_TERMINAL_TEXT_INPUT_STORE_SIZE (512)
-#define UART_CH (FuriHalUartIdUSART1)
+#define UART_CH (FuriHalSerialIdUsart)
 
 /* GRAVITY: Import GravityMode etc. */
 #include "esp_flip_struct.h"

+ 15 - 10
non_catalog_apps/esp32_gravity/uart_terminal_uart.c

@@ -10,6 +10,7 @@ struct UART_TerminalUart {
     FuriStreamBuffer* rx_stream;
     uint8_t rx_buf[RX_BUF_SIZE + 1];
     void (*handle_rx_data_cb)(uint8_t* buf, size_t len, void* context);
+    FuriHalSerialHandle* serial_handle;
 };
 
 typedef enum {
@@ -25,11 +26,14 @@ void uart_terminal_uart_set_handle_rx_data_cb(
 }
 
 #define WORKER_ALL_RX_EVENTS (WorkerEvtStop | WorkerEvtRxDone)
-
-void uart_terminal_uart_on_irq_cb(UartIrqEvent ev, uint8_t data, void* context) {
+void uart_terminal_uart_on_irq_cb(
+    FuriHalSerialHandle* handle,
+    FuriHalSerialRxEvent event,
+    void* context) {
     UART_TerminalUart* uart = (UART_TerminalUart*)context;
 
-    if(ev == UartIrqEventRXNE) {
+    if(event == FuriHalSerialRxEventData) {
+        uint8_t data = furi_hal_serial_async_rx(handle);
         furi_stream_buffer_send(uart->rx_stream, &data, 1, 0);
         furi_thread_flags_set(furi_thread_get_id(uart->rx_thread), WorkerEvtRxDone);
     }
@@ -56,8 +60,8 @@ static int32_t uart_worker(void* context) {
     return 0;
 }
 
-void uart_terminal_uart_tx(uint8_t* data, size_t len) {
-    furi_hal_uart_tx(UART_CH, data, len);
+void uart_terminal_uart_tx(UART_TerminalUart* uart, uint8_t* data, size_t len) {
+    furi_hal_serial_tx(uart->serial_handle, data, len);
 }
 
 UART_TerminalUart* uart_terminal_uart_init(UART_TerminalApp* app) {
@@ -73,12 +77,13 @@ UART_TerminalUart* uart_terminal_uart_init(UART_TerminalApp* app) {
 
     furi_thread_start(uart->rx_thread);
 
-    furi_hal_console_disable();
     if(app->BAUDRATE == 0) {
         app->BAUDRATE = 115200;
     }
-    furi_hal_uart_set_br(UART_CH, app->BAUDRATE);
-    furi_hal_uart_set_irq_cb(UART_CH, uart_terminal_uart_on_irq_cb, uart);
+    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, uart_terminal_uart_on_irq_cb, uart, false);
 
     return uart;
 }
@@ -90,8 +95,8 @@ void uart_terminal_uart_free(UART_TerminalUart* uart) {
     furi_thread_join(uart->rx_thread);
     furi_thread_free(uart->rx_thread);
 
-    furi_hal_uart_set_irq_cb(UART_CH, NULL, NULL);
-    furi_hal_console_enable();
+    furi_hal_serial_deinit(uart->serial_handle);
+    furi_hal_serial_control_release(uart->serial_handle);
 
     free(uart);
 }

+ 1 - 1
non_catalog_apps/esp32_gravity/uart_terminal_uart.h

@@ -9,6 +9,6 @@ typedef struct UART_TerminalUart UART_TerminalUart;
 void uart_terminal_uart_set_handle_rx_data_cb(
     UART_TerminalUart* uart,
     void (*handle_rx_data_cb)(uint8_t* buf, size_t len, void* context));
-void uart_terminal_uart_tx(uint8_t* data, size_t len);
+void uart_terminal_uart_tx(UART_TerminalUart* uart, uint8_t* data, size_t len);
 UART_TerminalUart* uart_terminal_uart_init(UART_TerminalApp* app);
 void uart_terminal_uart_free(UART_TerminalUart* uart);

+ 1 - 3
non_catalog_apps/flipagotchi/include/constants.h

@@ -1,9 +1,7 @@
 #pragma once
 
-#include <furi_hal_uart.h>
-
 /// Defines the channel that the pwnagotchi uses
-#define PWNAGOTCHI_UART_CHANNEL FuriHalUartIdUSART1
+#define PWNAGOTCHI_UART_CHANNEL (FuriHalSerialIdUsart)
 
 /// Defines the baudrate that the pwnagotchi will use
 #define PWNAGOTCHI_UART_BAUD 115200

+ 12 - 8
non_catalog_apps/flipagotchi/src/flipagotchi.c

@@ -3,8 +3,7 @@
 #include <notification/notification.h>
 #include <notification/notification_messages.h>
 #include <gui/elements.h>
-#include <furi_hal_uart.h>
-#include <furi_hal_console.h>
+#include <furi_hal.h>
 #include <gui/view_dispatcher.h>
 #include <gui/modules/dialog_ex.h>
 
@@ -25,6 +24,7 @@ typedef struct {
     View* view;
     FuriThread* worker_thread;
     FuriStreamBuffer* rx_stream;
+    FuriHalSerialHandle* serial_handle;
 } FlipagotchiApp;
 
 typedef struct {
@@ -209,11 +209,13 @@ static uint32_t flipagotchi_exit(void* context) {
     return VIEW_NONE;
 }
 
-static void flipagotchi_on_irq_cb(UartIrqEvent ev, uint8_t data, void* context) {
+static void
+    flipagotchi_on_irq_cb(FuriHalSerialHandle* handle, FuriHalSerialRxEvent event, void* context) {
     furi_assert(context);
     FlipagotchiApp* app = context;
 
-    if(ev == UartIrqEventRXNE) {
+    if(event == FuriHalSerialRxEventData) {
+        uint8_t data = furi_hal_serial_async_rx(handle);
         furi_stream_buffer_send(app->rx_stream, &data, 1, 0);
         furi_thread_flags_set(furi_thread_get_id(app->worker_thread), WorkerEventRx);
     }
@@ -294,9 +296,10 @@ static FlipagotchiApp* flipagotchi_app_alloc() {
     view_dispatcher_switch_to_view(app->view_dispatcher, 0);
 
     // Enable uart listener
-    furi_hal_console_disable();
-    furi_hal_uart_set_br(PWNAGOTCHI_UART_CHANNEL, PWNAGOTCHI_UART_BAUD);
-    furi_hal_uart_set_irq_cb(PWNAGOTCHI_UART_CHANNEL, flipagotchi_on_irq_cb, app);
+    app->serial_handle = furi_hal_serial_control_acquire(PWNAGOTCHI_UART_CHANNEL);
+    furi_check(app->serial_handle);
+    furi_hal_serial_init(app->serial_handle, PWNAGOTCHI_UART_BAUD);
+    furi_hal_serial_async_rx_start(app->serial_handle, flipagotchi_on_irq_cb, app, false);
 
     app->worker_thread = furi_thread_alloc();
     furi_thread_set_name(app->worker_thread, "UsbUartWorker");
@@ -315,7 +318,8 @@ static void flipagotchi_app_free(FlipagotchiApp* app) {
     furi_thread_join(app->worker_thread);
     furi_thread_free(app->worker_thread);
 
-    furi_hal_console_enable();
+    furi_hal_serial_deinit(app->serial_handle);
+    furi_hal_serial_control_release(app->serial_handle);
 
     // Free views
     view_dispatcher_remove_view(app->view_dispatcher, 0);

+ 12 - 7
non_catalog_apps/flipperzero-camera/camera.c

@@ -97,6 +97,7 @@ static void save_image(void* context) {
 }
 
 static bool camera_view_input_callback(InputEvent* event, void* context) {
+    UartEchoApp* app = context;
     if(event->type == InputTypePress) {
         uint8_t data[1];
         if(event->key == InputKeyUp) {
@@ -110,7 +111,7 @@ static bool camera_view_input_callback(InputEvent* event, void* context) {
         } else if(event->key == InputKeyOk) {
             save_image(context);
         }
-        furi_hal_uart_tx(FuriHalUartIdUSART1, data, 1);
+        furi_hal_serial_tx(app->serial_handle, data, 1);
     }
 
     return false;
@@ -121,11 +122,13 @@ static uint32_t camera_exit(void* context) {
     return VIEW_NONE;
 }
 
-static void camera_on_irq_cb(UartIrqEvent ev, uint8_t data, void* context) {
+static void
+    camera_on_irq_cb(FuriHalSerialHandle* handle, FuriHalSerialRxEvent event, void* context) {
     furi_assert(context);
     UartEchoApp* app = context;
 
-    if(ev == UartIrqEventRXNE) {
+    if(event == FuriHalSerialRxEventData) {
+        uint8_t data = furi_hal_serial_async_rx(handle);
         furi_stream_buffer_send(app->rx_stream, &data, 1, 0);
         furi_thread_flags_set(furi_thread_get_id(app->worker_thread), WorkerEventRx);
     }
@@ -247,9 +250,10 @@ static UartEchoApp* camera_app_alloc() {
     furi_thread_start(app->worker_thread);
 
     // Enable uart listener
-    furi_hal_console_disable();
-    furi_hal_uart_set_br(FuriHalUartIdUSART1, 230400);
-    furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, camera_on_irq_cb, app);
+    app->serial_handle = furi_hal_serial_control_acquire(FuriHalSerialIdUsart);
+    furi_check(app->serial_handle);
+    furi_hal_serial_init(app->serial_handle, 230400);
+    furi_hal_serial_async_rx_start(app->serial_handle, camera_on_irq_cb, app, false);
 
     return app;
 }
@@ -257,7 +261,8 @@ static UartEchoApp* camera_app_alloc() {
 static void camera_app_free(UartEchoApp* app) {
     furi_assert(app);
 
-    furi_hal_console_enable(); // this will also clear IRQ callback so thread is no longer referenced
+    furi_hal_serial_deinit(app->serial_handle);
+    furi_hal_serial_control_release(app->serial_handle);
 
     furi_thread_flags_set(furi_thread_get_id(app->worker_thread), WorkerEventStop);
     furi_thread_join(app->worker_thread);

+ 1 - 2
non_catalog_apps/flipperzero-camera/camera.h

@@ -14,8 +14,6 @@
 #include <notification/notification.h>
 #include <notification/notification_messages.h>
 #include <gui/elements.h>
-#include <furi_hal_uart.h>
-#include <furi_hal_console.h>
 #include <gui/view_dispatcher.h>
 #include <gui/modules/dialog_ex.h>
 #include <storage/filesystem_api_defines.h>
@@ -74,6 +72,7 @@ typedef struct {
     View* view;
     FuriThread* worker_thread;
     FuriStreamBuffer* rx_stream;
+    FuriHalSerialHandle* serial_handle;
 } UartEchoApp;
 
 struct UartDumpModel {

+ 12 - 9
non_catalog_apps/wifi-map/wifi_map.c

@@ -9,8 +9,6 @@
 #include <notification/notification.h>
 #include <notification/notification_messages.h>
 #include <gui/elements.h>
-#include <furi_hal_uart.h>
-#include <furi_hal_console.h>
 #include <gui/view_dispatcher.h>
 #include <gui/modules/dialog_ex.h>
 
@@ -28,6 +26,7 @@ typedef struct {
     FuriThread* worker_thread;
     FuriStreamBuffer* rx_stream;
     File* file;
+    FuriHalSerialHandle* serial_handle;
 } WiFiMapApp;
 
 typedef struct {
@@ -123,11 +122,13 @@ static uint32_t uart_echo_exit(void* context) {
     return VIEW_NONE;
 }
 
-static void uart_echo_on_irq_cb(UartIrqEvent ev, uint8_t data, void* context) {
+static void
+    uart_echo_on_irq_cb(FuriHalSerialHandle* handle, FuriHalSerialRxEvent event, void* context) {
     furi_assert(context);
     WiFiMapApp* app = context;
 
-    if(ev == UartIrqEventRXNE) {
+    if(event == FuriHalSerialRxEventData) {
+        uint8_t data = furi_hal_serial_async_rx(handle);
         furi_stream_buffer_send(app->rx_stream, &data, 1, 0);
         furi_thread_flags_set(furi_thread_get_id(app->worker_thread), WorkerEventRx);
     }
@@ -192,7 +193,7 @@ static int32_t uart_echo_worker(void* context) {
                 uint8_t data[64];
                 length = furi_stream_buffer_receive(app->rx_stream, data, 64, 0);
                 if(length > 0) {
-                    furi_hal_uart_tx(FuriHalUartIdUSART1, data, length);
+                    furi_hal_serial_tx(app->serial_handle, data, length);
                     with_view_model(
                         app->view,
                         UartDumpModel * model,
@@ -256,9 +257,10 @@ static WiFiMapApp* uart_echo_app_alloc() {
     furi_thread_start(app->worker_thread);
 
     // Enable uart listener
-    furi_hal_console_disable();
-    furi_hal_uart_set_br(FuriHalUartIdUSART1, 115200);
-    furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, uart_echo_on_irq_cb, app);
+    app->serial_handle = furi_hal_serial_control_acquire(FuriHalSerialIdUsart);
+    furi_check(app->serial_handle);
+    furi_hal_serial_init(app->serial_handle, 115200);
+    furi_hal_serial_async_rx_start(app->serial_handle, uart_echo_on_irq_cb, app, false);
 
     return app;
 }
@@ -266,7 +268,8 @@ static WiFiMapApp* uart_echo_app_alloc() {
 static void uart_echo_app_free(WiFiMapApp* app) {
     furi_assert(app);
 
-    furi_hal_console_enable(); // this will also clear IRQ callback so thread is no longer referenced
+    furi_hal_serial_deinit(app->serial_handle);
+    furi_hal_serial_control_release(app->serial_handle);
 
     furi_thread_flags_set(furi_thread_get_id(app->worker_thread), WorkerEventStop);
     furi_thread_join(app->worker_thread);