esp_flasher_scene_quick.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. #include "../esp_flasher_app_i.h"
  2. // Marauder firmware source - https://github.com/justcallmekoko/ESP32Marauder
  3. // Wardriver firmware source - https://github.com/Sil333033/flipperzero-wardriver
  4. // BlackMagic firmware source - https://github.com/flipperdevices/blackmagic-esp32-s2
  5. // DO NOT use this code as an example, you should split into different scene files for each screen
  6. // To keep in a single file, this is setup in an unusual and confusing way
  7. // You can find more info in comments throughout
  8. // There's one entry for each item on quick flash menu
  9. // Following each one, there are its submenu items
  10. // Not all boards support automatic bootmode, so here we separate into those that do and don't
  11. enum QuickState {
  12. QuickStart,
  13. QuickS2Boot,
  14. QuickS2Boot_Marauder,
  15. QuickS2Boot_Blackmagic,
  16. QuickWROOMBoot,
  17. QuickWROOMBoot_Marauder,
  18. QuickWROOMBoot_Wardriver,
  19. QuickS3Boot,
  20. QuickS3Boot_Marauder,
  21. QuickS3Boot_Wardriver,
  22. QuickWROOM,
  23. QuickWROOM_Marauder,
  24. QuickWROOM_Wardriver,
  25. QuickS2,
  26. QuickS2_Marauder,
  27. QuickS2_Blackmagic,
  28. QuickS3,
  29. QuickS3_Marauder,
  30. QuickS3_Wardriver,
  31. };
  32. void esp_flasher_scene_quick_submenu_callback(void* context, uint32_t index) {
  33. furi_assert(context);
  34. EspFlasherApp* app = context;
  35. view_dispatcher_send_custom_event(app->view_dispatcher, index);
  36. }
  37. void esp_flasher_scene_quick_on_enter(void* context) {
  38. furi_assert(context);
  39. EspFlasherApp* app = context;
  40. Submenu* submenu = app->submenu;
  41. uint32_t state = scene_manager_get_scene_state(app->scene_manager, EspFlasherSceneQuick);
  42. // State indicates the currently selected (or activated) item
  43. // So map quick flash menu values to show the quick flash menu
  44. // And map submenu values to show corresponding submenu
  45. switch(state) {
  46. case QuickStart:
  47. case QuickS2Boot:
  48. case QuickWROOMBoot:
  49. case QuickS3Boot:
  50. case QuickWROOM:
  51. case QuickS2:
  52. case QuickS3:
  53. submenu_set_header(submenu, "Choose ESP32 Type:");
  54. submenu_add_item(
  55. submenu,
  56. "Flipper WiFi Devboard",
  57. QuickS2Boot,
  58. esp_flasher_scene_quick_submenu_callback,
  59. app);
  60. submenu_add_item(
  61. submenu,
  62. "WROOM (auto bootloader)",
  63. QuickWROOMBoot,
  64. esp_flasher_scene_quick_submenu_callback,
  65. app);
  66. submenu_add_item(
  67. submenu,
  68. "S3 (auto bootloader)",
  69. QuickS3Boot,
  70. esp_flasher_scene_quick_submenu_callback,
  71. app);
  72. submenu_add_item(
  73. submenu,
  74. "Other ESP32-WROOM",
  75. QuickWROOM,
  76. esp_flasher_scene_quick_submenu_callback,
  77. app);
  78. submenu_add_item(
  79. submenu, "Other ESP32-S2", QuickS2, esp_flasher_scene_quick_submenu_callback, app);
  80. submenu_add_item(
  81. submenu, "Other ESP32-S3", QuickS3, esp_flasher_scene_quick_submenu_callback, app);
  82. break;
  83. case QuickS2Boot_Marauder:
  84. case QuickS2Boot_Blackmagic:
  85. case QuickS2_Marauder:
  86. case QuickS2_Blackmagic:
  87. submenu_set_header(submenu, "Choose Firmware:");
  88. submenu_add_item(
  89. submenu,
  90. "Marauder (has Evil Portal)",
  91. state > QuickS2 ? QuickS2_Marauder : QuickS2Boot_Marauder,
  92. esp_flasher_scene_quick_submenu_callback,
  93. app);
  94. submenu_add_item(
  95. submenu,
  96. "Black Magic (FZ debugger)",
  97. state > QuickS2 ? QuickS2_Blackmagic : QuickS2Boot_Blackmagic,
  98. esp_flasher_scene_quick_submenu_callback,
  99. app);
  100. break;
  101. case QuickWROOMBoot_Marauder:
  102. case QuickWROOMBoot_Wardriver:
  103. case QuickWROOM_Marauder:
  104. case QuickWROOM_Wardriver:
  105. submenu_set_header(submenu, "Choose Firmware:");
  106. submenu_add_item(
  107. submenu,
  108. "Marauder (has Evil Portal)",
  109. state > QuickWROOM ? QuickWROOM_Marauder : QuickWROOMBoot_Marauder,
  110. esp_flasher_scene_quick_submenu_callback,
  111. app);
  112. submenu_add_item(
  113. submenu,
  114. "Wardriver (GPS -> Flipper)",
  115. state > QuickWROOM ? QuickWROOM_Wardriver : QuickWROOMBoot_Wardriver,
  116. esp_flasher_scene_quick_submenu_callback,
  117. app);
  118. break;
  119. case QuickS3Boot_Marauder:
  120. case QuickS3Boot_Wardriver:
  121. case QuickS3_Marauder:
  122. case QuickS3_Wardriver:
  123. submenu_set_header(submenu, "Choose Firmware:");
  124. submenu_add_item(
  125. submenu,
  126. "Marauder (has Evil Portal)",
  127. state > QuickS3 ? QuickS3_Marauder : QuickS3Boot_Marauder,
  128. esp_flasher_scene_quick_submenu_callback,
  129. app);
  130. submenu_add_item(
  131. submenu,
  132. "Wardriver (GPS -> Flipper)",
  133. state > QuickS3 ? QuickS3_Wardriver : QuickS3Boot_Wardriver,
  134. esp_flasher_scene_quick_submenu_callback,
  135. app);
  136. break;
  137. default:
  138. break;
  139. }
  140. submenu_set_selected_item(submenu, state);
  141. view_dispatcher_switch_to_view(app->view_dispatcher, EspFlasherAppViewSubmenu);
  142. }
  143. bool esp_flasher_scene_quick_on_event(void* context, SceneManagerEvent event) {
  144. furi_assert(context);
  145. EspFlasherApp* app = context;
  146. bool consumed = false;
  147. if(event.type == SceneManagerEventTypeCustom) {
  148. consumed = true;
  149. bool enter_bootloader = false;
  150. bool s3 = false;
  151. const char* boot = NULL; // 0x1000 (or 0x0 on S3)
  152. const char* part = NULL; // 0x8000
  153. const char* app0 = NULL; // 0xE000
  154. const char* firm = NULL; // 0x10000
  155. switch(event.event) {
  156. case QuickS2Boot:
  157. case QuickWROOMBoot:
  158. case QuickS3Boot:
  159. case QuickWROOM:
  160. case QuickS2:
  161. case QuickS3:
  162. // Select first item of submenu
  163. scene_manager_set_scene_state(
  164. app->scene_manager, EspFlasherSceneQuick, event.event + 1);
  165. scene_manager_next_scene(app->scene_manager, EspFlasherSceneQuick);
  166. return consumed;
  167. case QuickS2Boot_Marauder:
  168. enter_bootloader = true;
  169. /* fallthrough */
  170. case QuickS2_Marauder:
  171. boot = APP_DATA_PATH("assets/marauder/s2/esp32_marauder.ino.bootloader.bin");
  172. part = APP_DATA_PATH("assets/marauder/esp32_marauder.ino.partitions.bin");
  173. app0 = APP_DATA_PATH("assets/marauder/boot_app0.bin");
  174. firm = APP_DATA_PATH("assets/marauder/s2/esp32_marauder.flipper.bin");
  175. break;
  176. case QuickS2Boot_Blackmagic:
  177. enter_bootloader = true;
  178. /* fallthrough */
  179. case QuickS2_Blackmagic:
  180. boot = APP_DATA_PATH("assets/blackmagic/s2/bootloader.bin");
  181. part = APP_DATA_PATH("assets/blackmagic/s2/partition-table.bin");
  182. firm = APP_DATA_PATH("assets/blackmagic/s2/blackmagic.bin");
  183. break;
  184. case QuickWROOMBoot_Marauder:
  185. enter_bootloader = true;
  186. /* fallthrough */
  187. case QuickWROOM_Marauder:
  188. boot = APP_DATA_PATH("assets/marauder/wroom/esp32_marauder.ino.bootloader.bin");
  189. part = APP_DATA_PATH("assets/marauder/esp32_marauder.ino.partitions.bin");
  190. app0 = APP_DATA_PATH("assets/marauder/boot_app0.bin");
  191. firm = APP_DATA_PATH("assets/marauder/wroom/esp32_marauder.dev_board_pro.bin");
  192. break;
  193. case QuickWROOMBoot_Wardriver:
  194. enter_bootloader = true;
  195. /* fallthrough */
  196. case QuickWROOM_Wardriver:
  197. boot = APP_DATA_PATH("assets/wardriver/f0-wardrive-wroom.bin");
  198. break;
  199. case QuickS3Boot_Marauder:
  200. enter_bootloader = true;
  201. /* fallthrough */
  202. case QuickS3_Marauder:
  203. s3 = true;
  204. boot = APP_DATA_PATH("assets/marauder/s3/esp32_marauder.ino.bootloader.bin");
  205. part = APP_DATA_PATH("assets/marauder/esp32_marauder.ino.partitions.bin");
  206. app0 = APP_DATA_PATH("assets/marauder/boot_app0.bin");
  207. firm = APP_DATA_PATH("assets/marauder/s3/esp32_marauder.multiboardS3.bin");
  208. break;
  209. case QuickS3Boot_Wardriver:
  210. enter_bootloader = true;
  211. /* fallthrough */
  212. case QuickS3_Wardriver:
  213. s3 = true;
  214. boot = APP_DATA_PATH("assets/wardriver/f0-wardrive-s3.bin");
  215. break;
  216. default:
  217. consumed = false;
  218. return consumed;
  219. }
  220. scene_manager_set_scene_state(app->scene_manager, EspFlasherSceneQuick, event.event);
  221. memset(app->selected_flash_options, 0, sizeof(app->selected_flash_options));
  222. app->bin_file_path_boot[0] = '\0';
  223. app->bin_file_path_part[0] = '\0';
  224. app->bin_file_path_nvs[0] = '\0';
  225. app->bin_file_path_boot_app0[0] = '\0';
  226. app->bin_file_path_app_a[0] = '\0';
  227. app->bin_file_path_app_b[0] = '\0';
  228. app->bin_file_path_custom[0] = '\0';
  229. app->selected_flash_options[SelectedFlashS3Mode] = s3;
  230. if(boot) {
  231. app->selected_flash_options[SelectedFlashBoot] = true;
  232. strncpy(app->bin_file_path_boot, boot, sizeof(app->bin_file_path_boot));
  233. }
  234. if(part) {
  235. app->selected_flash_options[SelectedFlashPart] = true;
  236. strncpy(app->bin_file_path_part, part, sizeof(app->bin_file_path_part));
  237. }
  238. if(app0) {
  239. app->selected_flash_options[SelectedFlashBootApp0] = true;
  240. strncpy(app->bin_file_path_boot_app0, app0, sizeof(app->bin_file_path_boot_app0));
  241. }
  242. if(firm) {
  243. app->selected_flash_options[SelectedFlashAppA] = true;
  244. strncpy(app->bin_file_path_app_a, firm, sizeof(app->bin_file_path_app_a));
  245. }
  246. app->reset = false;
  247. app->quickflash = true;
  248. app->turbospeed = true;
  249. app->boot = enter_bootloader;
  250. scene_manager_next_scene(app->scene_manager, EspFlasherSceneConsoleOutput);
  251. } else if(event.type == SceneManagerEventTypeBack) {
  252. uint32_t state = scene_manager_get_scene_state(app->scene_manager, EspFlasherSceneQuick);
  253. // Pressing back from submenu, check if in submenu, select corresponding item in quick flash menu
  254. if(state > QuickS3)
  255. state = QuickS3;
  256. else if(state > QuickS2)
  257. state = QuickS2;
  258. else if(state > QuickWROOM)
  259. state = QuickWROOM;
  260. else if(state > QuickS3Boot)
  261. state = QuickS3Boot;
  262. else if(state > QuickWROOMBoot)
  263. state = QuickWROOMBoot;
  264. else if(state > QuickS2Boot)
  265. state = QuickS2Boot;
  266. // If pressing back from quick flash menu (not submenu), state will not matter
  267. scene_manager_set_scene_state(app->scene_manager, EspFlasherSceneQuick, state);
  268. }
  269. return consumed;
  270. }
  271. void esp_flasher_scene_quick_on_exit(void* context) {
  272. furi_assert(context);
  273. EspFlasherApp* app = context;
  274. submenu_reset(app->submenu);
  275. }