Willy-JL 2 лет назад
Родитель
Сommit
3954b8b19b

+ 1 - 1
application.fam

@@ -1,6 +1,6 @@
 App(
     appid="esp_flasher",
-    name="ESP Flasher",
+    name="[ESP] ESP Flasher",
     fap_version=(1,2),
     apptype=FlipperAppType.EXTERNAL,
     entry_point="esp_flasher_app",

BIN
assets/DolphinCommon_56x48.png


BIN
assets/KeyBackspaceSelected_16x9.png


BIN
assets/KeyBackspace_16x9.png


BIN
assets/KeyKeyboardSelected_10x11.png


BIN
assets/KeyKeyboard_10x11.png


BIN
assets/KeySaveSelected_24x11.png


BIN
assets/KeySave_24x11.png


BIN
assets/WarningDolphin_45x42.png


+ 3 - 1
esp_flasher_app.c

@@ -68,6 +68,7 @@ EspFlasherApp* esp_flasher_app_alloc() {
 
     app->reset = false;
     app->boot = false;
+    app->quickflash = false;
 
     scene_manager_next_scene(app->scene_manager, EspFlasherSceneStart);
 
@@ -116,6 +117,7 @@ int32_t esp_flasher_app(void* p) {
     UNUSED(p);
 
     uint8_t attempts = 0;
+    bool otg_was_enabled = furi_hal_power_is_otg_enabled();
     while(!furi_hal_power_is_otg_enabled() && attempts++ < 5) {
         furi_hal_power_enable_otg();
         furi_delay_ms(10);
@@ -132,7 +134,7 @@ int32_t esp_flasher_app(void* p) {
 
     esp_flasher_app_free(esp_flasher_app);
 
-    if(furi_hal_power_is_otg_enabled()) {
+    if(furi_hal_power_is_otg_enabled() && !otg_was_enabled) {
         furi_hal_power_disable_otg();
     }
 

+ 1 - 0
esp_flasher_app_i.h

@@ -65,6 +65,7 @@ struct EspFlasherApp {
 
     bool reset;
     bool boot;
+    bool quickflash;
 
     SwitchFirmware switch_fw;
 

+ 6 - 2
esp_flasher_uart.c

@@ -1,7 +1,11 @@
 #include "esp_flasher_app_i.h"
 #include "esp_flasher_uart.h"
 
-#define UART_CH (FuriHalUartIdUSART1)
+#include <xtreme.h>
+
+#define UART_CH                                                                 \
+    (XTREME_SETTINGS()->uart_esp_channel == UARTDefault ? FuriHalUartIdUSART1 : \
+                                                          FuriHalUartIdLPUART1)
 #define BAUDRATE (115200)
 
 struct EspFlasherUart {
@@ -52,6 +56,7 @@ static int32_t uart_worker(void* context) {
         }
     }
 
+    furi_hal_uart_set_irq_cb(uart->channel, NULL, NULL);
     furi_stream_buffer_free(uart->rx_stream);
 
     return 0;
@@ -96,7 +101,6 @@ void esp_flasher_uart_free(EspFlasherUart* uart) {
     furi_thread_join(uart->rx_thread);
     furi_thread_free(uart->rx_thread);
 
-    furi_hal_uart_set_irq_cb(uart->channel, NULL, NULL);
     if(uart->channel == FuriHalUartIdLPUART1) {
         furi_hal_uart_deinit(uart->channel);
     }

+ 5 - 0
esp_flasher_worker.c

@@ -272,6 +272,7 @@ static int32_t esp_flasher_flash_bin(void* context) {
 
     // done
     app->flash_worker_busy = false;
+    app->quickflash = false;
 
     // cleanup
     furi_stream_buffer_free(flash_rx_stream);
@@ -319,6 +320,10 @@ static int32_t esp_flasher_reset(void* context) {
     app->reset = false;
     app->boot = false;
 
+    if(app->quickflash) {
+        esp_flasher_flash_bin(app);
+    }
+
     return 0;
 }
 

+ 1 - 0
scenes/esp_flasher_scene_config.h

@@ -1,4 +1,5 @@
 ADD_SCENE(esp_flasher, start, Start)
+ADD_SCENE(esp_flasher, quick, Quick)
 ADD_SCENE(esp_flasher, console_output, ConsoleOutput)
 ADD_SCENE(esp_flasher, about, About)
 ADD_SCENE(esp_flasher, browse, Browse)

+ 186 - 0
scenes/esp_flasher_scene_quick.c

@@ -0,0 +1,186 @@
+#include "../esp_flasher_app_i.h"
+
+enum QuickState {
+    QuickStart,
+    QuickWifidevS2,
+    QuickWifidevS2Blackmagic,
+    QuickWifidevS2Dualboot,
+    QuickDevproWroom,
+    QuickDevproWroomEvilportal,
+    QuickDevproWroomMarauder,
+};
+
+void esp_flasher_scene_quick_submenu_callback(void* context, uint32_t index) {
+    furi_assert(context);
+    EspFlasherApp* app = context;
+
+    view_dispatcher_send_custom_event(app->view_dispatcher, index);
+}
+
+void esp_flasher_scene_quick_on_enter(void* context) {
+    furi_assert(context);
+    EspFlasherApp* app = context;
+    Submenu* submenu = app->submenu;
+    uint32_t state = scene_manager_get_scene_state(app->scene_manager, EspFlasherSceneQuick);
+
+    switch(state) {
+    case QuickStart:
+    case QuickWifidevS2:
+    case QuickDevproWroom:
+        submenu_set_header(submenu, "Choose Board:");
+        submenu_add_item(
+            submenu,
+            "WiFi Dev (ESP32-S2)",
+            QuickWifidevS2,
+            esp_flasher_scene_quick_submenu_callback,
+            app);
+        submenu_add_item(
+            submenu,
+            "Dev Pro (ESP32-WROOM)",
+            QuickDevproWroom,
+            esp_flasher_scene_quick_submenu_callback,
+            app);
+        break;
+    case QuickWifidevS2Blackmagic:
+    case QuickWifidevS2Dualboot:
+        submenu_set_header(submenu, "Choose Firmware:");
+        submenu_add_item(
+            submenu,
+            "Black Magic",
+            QuickWifidevS2Blackmagic,
+            esp_flasher_scene_quick_submenu_callback,
+            app);
+        submenu_add_item(
+            submenu,
+            "Evil Portal + Marauder",
+            QuickWifidevS2Dualboot,
+            esp_flasher_scene_quick_submenu_callback,
+            app);
+        break;
+    case QuickDevproWroomEvilportal:
+    case QuickDevproWroomMarauder:
+        submenu_set_header(submenu, "Choose Firmware:");
+        submenu_add_item(
+            submenu,
+            "Evil Portal",
+            QuickDevproWroomEvilportal,
+            esp_flasher_scene_quick_submenu_callback,
+            app);
+        submenu_add_item(
+            submenu,
+            "Marauder",
+            QuickDevproWroomMarauder,
+            esp_flasher_scene_quick_submenu_callback,
+            app);
+        break;
+    default:
+        break;
+    }
+
+    submenu_set_selected_item(submenu, state);
+
+    view_dispatcher_switch_to_view(app->view_dispatcher, EspFlasherAppViewSubmenu);
+}
+
+bool esp_flasher_scene_quick_on_event(void* context, SceneManagerEvent event) {
+    furi_assert(context);
+
+    EspFlasherApp* app = context;
+    bool consumed = false;
+    if(event.type == SceneManagerEventTypeCustom) {
+        consumed = true;
+
+        bool flash = true;
+        bool enter_bootloader = false;
+        const char* boot = NULL; // 0x1000
+        const char* part = NULL; // 0x8000
+        const char* app0 = NULL; // 0xE000
+        const char* firm = NULL; // 0x10000
+
+        switch(event.event) {
+        case QuickWifidevS2:
+        case QuickDevproWroom:
+            scene_manager_set_scene_state(
+                app->scene_manager, EspFlasherSceneQuick, event.event + 1);
+            scene_manager_next_scene(app->scene_manager, EspFlasherSceneQuick);
+            flash = false;
+            break;
+        case QuickWifidevS2Blackmagic:
+            boot = APP_DATA_PATH("assets/wifidev-s2/blackmagic/bootloader.bin");
+            part = APP_DATA_PATH("assets/wifidev-s2/blackmagic/partition-table.bin");
+            firm = APP_DATA_PATH("assets/wifidev-s2/blackmagic/blackmagic.bin");
+            enter_bootloader = true;
+            break;
+        case QuickWifidevS2Dualboot:
+            boot = APP_DATA_PATH("assets/wifidev-s2/dualboot.bin");
+            enter_bootloader = true;
+            break;
+        case QuickDevproWroomEvilportal:
+            boot = APP_DATA_PATH("assets/devpro-wroom/evilportal/EvilPortal.ino.bootloader.bin");
+            part = APP_DATA_PATH("assets/devpro-wroom/evilportal/EvilPortal.ino.partitions.bin");
+            app0 = APP_DATA_PATH("assets/devpro-wroom/boot_app0.bin");
+            firm = APP_DATA_PATH("assets/devpro-wroom/evilportal/EvilPortal.ino.bin");
+            break;
+        case QuickDevproWroomMarauder:
+            boot = APP_DATA_PATH("assets/devpro-wroom/marauder/bootloader.bin");
+            part = APP_DATA_PATH("assets/devpro-wroom/marauder/partitions.bin");
+            app0 = APP_DATA_PATH("assets/devpro-wroom/boot_app0.bin");
+            firm = APP_DATA_PATH("assets/devpro-wroom/marauder/marauder_dev_board_pro.bin");
+            break;
+        default:
+            flash = false;
+            consumed = false;
+            break;
+        }
+
+        if(flash) {
+            scene_manager_set_scene_state(app->scene_manager, EspFlasherSceneQuick, event.event);
+            memset(app->selected_flash_options, 0, sizeof(app->selected_flash_options));
+            app->bin_file_path_boot[0] = '\0';
+            app->bin_file_path_part[0] = '\0';
+            app->bin_file_path_nvs[0] = '\0';
+            app->bin_file_path_boot_app0[0] = '\0';
+            app->bin_file_path_app_a[0] = '\0';
+            app->bin_file_path_app_b[0] = '\0';
+            app->bin_file_path_custom[0] = '\0';
+
+            if(boot) {
+                app->selected_flash_options[SelectedFlashBoot] = true;
+                strncpy(app->bin_file_path_boot, boot, sizeof(app->bin_file_path_boot));
+            }
+            if(part) {
+                app->selected_flash_options[SelectedFlashPart] = true;
+                strncpy(app->bin_file_path_part, part, sizeof(app->bin_file_path_part));
+            }
+            if(app0) {
+                app->selected_flash_options[SelectedFlashBootApp0] = true;
+                strncpy(app->bin_file_path_boot_app0, app0, sizeof(app->bin_file_path_boot_app0));
+            }
+            if(firm) {
+                app->selected_flash_options[SelectedFlashAppA] = true;
+                strncpy(app->bin_file_path_app_a, firm, sizeof(app->bin_file_path_app_a));
+            }
+
+            app->reset = false;
+            app->quickflash = true;
+            app->boot = enter_bootloader;
+            scene_manager_next_scene(app->scene_manager, EspFlasherSceneConsoleOutput);
+        }
+    } else if(event.type == SceneManagerEventTypeBack) {
+        uint32_t state = scene_manager_get_scene_state(app->scene_manager, EspFlasherSceneQuick);
+        if(state > QuickDevproWroom)
+            state = QuickDevproWroom;
+        else if(state > QuickWifidevS2)
+            state = QuickWifidevS2;
+        scene_manager_set_scene_state(app->scene_manager, EspFlasherSceneQuick, state);
+    }
+
+    return consumed;
+}
+
+void esp_flasher_scene_quick_on_exit(void* context) {
+    furi_assert(context);
+
+    EspFlasherApp* app = context;
+    submenu_reset(app->submenu);
+}

+ 23 - 8
scenes/esp_flasher_scene_start.c

@@ -1,12 +1,13 @@
 #include "../esp_flasher_app_i.h"
 
 enum SubmenuIndex {
-    SubmenuIndexEspFlasherFlash,
+    SubmenuIndexEspFlasherQuickFlash,
     SubmenuIndexEspFlasherSwitchA,
     SubmenuIndexEspFlasherSwitchB,
-    SubmenuIndexEspFlasherAbout,
+    SubmenuIndexEspFlasherManualFlash,
     SubmenuIndexEspFlasherReset,
     SubmenuIndexEspFlasherBootloader,
+    SubmenuIndexEspFlasherAbout,
 };
 
 void esp_flasher_scene_start_submenu_callback(void* context, uint32_t index) {
@@ -21,24 +22,31 @@ void esp_flasher_scene_start_on_enter(void* context) {
 
     EspFlasherApp* app = context;
     Submenu* submenu = app->submenu;
+    submenu_set_header(submenu, "ESP Flasher");
     submenu_add_item(
         submenu,
-        "Flash ESP",
-        SubmenuIndexEspFlasherFlash,
+        "Quick Flash",
+        SubmenuIndexEspFlasherQuickFlash,
         esp_flasher_scene_start_submenu_callback,
         app);
     submenu_add_item(
         submenu,
-        "Switch to Firmware A",
+        "Select Evil Portal (Fw A)",
         SubmenuIndexEspFlasherSwitchA,
         esp_flasher_scene_start_submenu_callback,
         app);
     submenu_add_item(
         submenu,
-        "Switch to Firmware B",
+        "Select Marauder (Fw B)",
         SubmenuIndexEspFlasherSwitchB,
         esp_flasher_scene_start_submenu_callback,
         app);
+    submenu_add_item(
+        submenu,
+        "Manual Flash",
+        SubmenuIndexEspFlasherManualFlash,
+        esp_flasher_scene_start_submenu_callback,
+        app);
     submenu_add_item(
         submenu,
         "Reset Board",
@@ -73,17 +81,24 @@ bool esp_flasher_scene_start_on_event(void* context, SceneManagerEvent event) {
         if(event.event == SubmenuIndexEspFlasherAbout) {
             scene_manager_next_scene(app->scene_manager, EspFlasherSceneAbout);
             consumed = true;
-        } else if(event.event == SubmenuIndexEspFlasherFlash) {
-            scene_manager_next_scene(app->scene_manager, EspFlasherSceneBrowse);
+        } else if(event.event == SubmenuIndexEspFlasherQuickFlash) {
+            scene_manager_next_scene(app->scene_manager, EspFlasherSceneQuick);
             consumed = true;
         } else if(event.event == SubmenuIndexEspFlasherSwitchA) {
+            app->boot = true;
+            app->quickflash = true;
             app->switch_fw = SwitchToFirmwareA;
             scene_manager_next_scene(app->scene_manager, EspFlasherSceneConsoleOutput);
             consumed = true;
         } else if(event.event == SubmenuIndexEspFlasherSwitchB) {
+            app->boot = true;
+            app->quickflash = true;
             app->switch_fw = SwitchToFirmwareB;
             scene_manager_next_scene(app->scene_manager, EspFlasherSceneConsoleOutput);
             consumed = true;
+        } else if(event.event == SubmenuIndexEspFlasherManualFlash) {
+            scene_manager_next_scene(app->scene_manager, EspFlasherSceneBrowse);
+            consumed = true;
         } else if(event.event == SubmenuIndexEspFlasherReset) {
             app->reset = true;
             scene_manager_next_scene(app->scene_manager, EspFlasherSceneConsoleOutput);