alloc.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. #include "callback/alloc.h"
  2. #include <callback/callback.h>
  3. #include <flip_storage/flip_wifi_storage.h>
  4. bool alloc_playlist(void *context)
  5. {
  6. FlipWiFiApp *app = (FlipWiFiApp *)context;
  7. furi_check(app);
  8. if (!wifi_playlist)
  9. {
  10. wifi_playlist = (WiFiPlaylist *)malloc(sizeof(WiFiPlaylist));
  11. if (!wifi_playlist)
  12. {
  13. FURI_LOG_E(TAG, "Failed to allocate playlist");
  14. return false;
  15. }
  16. wifi_playlist->count = 0;
  17. }
  18. // Load the playlist from storage
  19. if (!load_playlist(wifi_playlist))
  20. {
  21. FURI_LOG_E(TAG, "Failed to load playlist");
  22. // playlist is empty?
  23. submenu_reset(app->submenu_wifi);
  24. submenu_set_header(app->submenu_wifi, "Saved APs");
  25. submenu_add_item(app->submenu_wifi, "[Add Network]", FlipWiFiSubmenuIndexWiFiSavedAddSSID, callback_submenu_choices, app);
  26. }
  27. else
  28. {
  29. // Update the submenu
  30. callback_redraw_submenu_saved(app);
  31. }
  32. return true;
  33. }
  34. bool alloc_submenus(void *context, uint32_t view)
  35. {
  36. FlipWiFiApp *app = (FlipWiFiApp *)context;
  37. furi_check(app);
  38. switch (view)
  39. {
  40. case FlipWiFiViewSubmenuScan:
  41. if (!app->submenu_wifi)
  42. {
  43. if (!easy_flipper_set_submenu(&app->submenu_wifi, FlipWiFiViewSubmenu, "WiFi Nearby", callback_to_submenu_main, &app->view_dispatcher))
  44. {
  45. return false;
  46. }
  47. if (!app->submenu_wifi)
  48. {
  49. FURI_LOG_E(TAG, "Failed to allocate submenu for WiFi Scan");
  50. return false;
  51. }
  52. }
  53. return true;
  54. case FlipWiFiViewSubmenuSaved:
  55. if (!app->submenu_wifi)
  56. {
  57. if (!easy_flipper_set_submenu(&app->submenu_wifi, FlipWiFiViewSubmenu, "Saved APs", callback_to_submenu_main, &app->view_dispatcher))
  58. {
  59. return false;
  60. }
  61. if (!app->submenu_wifi)
  62. {
  63. FURI_LOG_E(TAG, "Failed to allocate submenu for WiFi Saved");
  64. return false;
  65. }
  66. if (!alloc_playlist(app))
  67. {
  68. FURI_LOG_E(TAG, "Failed to allocate playlist");
  69. return false;
  70. }
  71. }
  72. return true;
  73. case FlipWiFiViewSubmenuCommands:
  74. if (!app->submenu_wifi)
  75. {
  76. if (!easy_flipper_set_submenu(&app->submenu_wifi, FlipWiFiViewSubmenu, "Fast Commands", callback_to_submenu_main, &app->view_dispatcher))
  77. {
  78. return false;
  79. }
  80. if (!app->submenu_wifi)
  81. {
  82. FURI_LOG_E(TAG, "Failed to allocate submenu for Commands");
  83. return false;
  84. }
  85. // PING, LIST, WIFI/LIST, IP/ADDRESS, and WIFI/IP.
  86. submenu_add_item(app->submenu_wifi, "[CUSTOM]", FlipWiFiSubmenuIndexFastCommandStart + 0, callback_submenu_choices, app);
  87. submenu_add_item(app->submenu_wifi, "PING", FlipWiFiSubmenuIndexFastCommandStart + 1, callback_submenu_choices, app);
  88. submenu_add_item(app->submenu_wifi, "LIST", FlipWiFiSubmenuIndexFastCommandStart + 2, callback_submenu_choices, app);
  89. submenu_add_item(app->submenu_wifi, "IP/ADDRESS", FlipWiFiSubmenuIndexFastCommandStart + 3, callback_submenu_choices, app);
  90. submenu_add_item(app->submenu_wifi, "WIFI/IP", FlipWiFiSubmenuIndexFastCommandStart + 4, callback_submenu_choices, app);
  91. submenu_add_item(app->submenu_wifi, "WIFI/AP", FlipWiFiSubmenuIndexFastCommandStart + 5, callback_submenu_choices, app);
  92. }
  93. return true;
  94. case FlipWiFiViewSubmenuAP:
  95. if (!app->submenu_wifi)
  96. {
  97. if (!easy_flipper_set_submenu(&app->submenu_wifi, FlipWiFiViewSubmenu, "AP Mode", callback_to_submenu_main, &app->view_dispatcher))
  98. {
  99. return false;
  100. }
  101. if (!app->submenu_wifi)
  102. {
  103. FURI_LOG_E(TAG, "Failed to allocate submenu for AP Mode");
  104. return false;
  105. }
  106. // start, set SSID, set HTML
  107. submenu_add_item(app->submenu_wifi, "Start AP", FlipWiFiSubmenuIndexWiFiAPStart, callback_submenu_choices, app);
  108. submenu_add_item(app->submenu_wifi, "Set SSID", FlipWiFiSubmenuIndexWiFiAPSetSSID, callback_submenu_choices, app);
  109. submenu_add_item(app->submenu_wifi, "Change HTML", FlipWiFiSubmenuIndexWiFiAPSetHTML, callback_submenu_choices, app);
  110. }
  111. return true;
  112. }
  113. return false;
  114. }
  115. bool alloc_text_box(FlipWiFiApp *app)
  116. {
  117. furi_check(app, "FlipWiFiApp is NULL");
  118. if (app->textbox)
  119. {
  120. FURI_LOG_E(TAG, "Text box already allocated");
  121. return false;
  122. }
  123. if (!easy_flipper_set_text_box(
  124. &app->textbox,
  125. FlipWiFiViewWiFiAP,
  126. app->fhttp->last_response_str && furi_string_size(app->fhttp->last_response_str) > 0 ? (char *)furi_string_get_cstr(app->fhttp->last_response_str) : "AP Connected... please wait",
  127. false,
  128. callback_submenu_ap,
  129. &app->view_dispatcher))
  130. {
  131. FURI_LOG_E(TAG, "Failed to allocate text box");
  132. return false;
  133. }
  134. if (app->timer == NULL)
  135. {
  136. app->timer = furi_timer_alloc(callback_timer_callback, FuriTimerTypePeriodic, app);
  137. }
  138. furi_timer_start(app->timer, 250);
  139. return app->textbox != NULL;
  140. }
  141. bool alloc_text_inputs(void *context, uint32_t view)
  142. {
  143. FlipWiFiApp *app = (FlipWiFiApp *)context;
  144. furi_check(app);
  145. app->uart_text_input_buffer_size = MAX_SSID_LENGTH;
  146. if (!app->uart_text_input_buffer)
  147. {
  148. if (!easy_flipper_set_buffer(&app->uart_text_input_buffer, app->uart_text_input_buffer_size))
  149. {
  150. FURI_LOG_E(TAG, "Failed to allocate text input buffer");
  151. return false;
  152. }
  153. if (!app->uart_text_input_buffer)
  154. {
  155. FURI_LOG_E(TAG, "Failed to allocate text input buffer");
  156. return false;
  157. }
  158. }
  159. if (!app->uart_text_input_temp_buffer)
  160. {
  161. if (!easy_flipper_set_buffer(&app->uart_text_input_temp_buffer, app->uart_text_input_buffer_size))
  162. {
  163. FURI_LOG_E(TAG, "Failed to allocate text input temp buffer");
  164. return false;
  165. }
  166. if (!app->uart_text_input_temp_buffer)
  167. {
  168. FURI_LOG_E(TAG, "Failed to allocate text input temp buffer");
  169. return false;
  170. }
  171. }
  172. switch (view)
  173. {
  174. case FlipWiFiViewTextInputScan:
  175. if (!app->uart_text_input)
  176. {
  177. if (!easy_flipper_set_uart_text_input(&app->uart_text_input, FlipWiFiViewTextInput, "Enter WiFi Password", app->uart_text_input_temp_buffer, app->uart_text_input_buffer_size, callback_text_updated_password_scan, callback_to_submenu_scan, &app->view_dispatcher, app))
  178. {
  179. FURI_LOG_E(TAG, "Failed to allocate text input for WiFi Scan");
  180. return false;
  181. }
  182. if (!app->uart_text_input)
  183. {
  184. FURI_LOG_E(TAG, "Failed to allocate text input for WiFi Scan");
  185. return false;
  186. }
  187. }
  188. return true;
  189. case FlipWiFiViewTextInputSaved:
  190. if (!app->uart_text_input)
  191. {
  192. if (!easy_flipper_set_uart_text_input(&app->uart_text_input, FlipWiFiViewTextInput, "Enter WiFi Password", app->uart_text_input_temp_buffer, app->uart_text_input_buffer_size, callback_text_updated_password_saved, callback_to_submenu_saved, &app->view_dispatcher, app))
  193. {
  194. FURI_LOG_E(TAG, "Failed to allocate text input for WiFi Saved");
  195. return false;
  196. }
  197. if (!app->uart_text_input)
  198. {
  199. FURI_LOG_E(TAG, "Failed to allocate text input for WiFi Saved");
  200. return false;
  201. }
  202. }
  203. return true;
  204. case FlipWiFiViewTextInputSavedAddSSID:
  205. if (!app->uart_text_input)
  206. {
  207. if (!easy_flipper_set_uart_text_input(&app->uart_text_input, FlipWiFiViewTextInput, "Enter SSID", app->uart_text_input_temp_buffer, app->uart_text_input_buffer_size, callback_text_updated_add_ssid, callback_to_submenu_saved, &app->view_dispatcher, app))
  208. {
  209. FURI_LOG_E(TAG, "Failed to allocate text input for WiFi Saved Add SSID");
  210. return false;
  211. }
  212. if (!app->uart_text_input)
  213. {
  214. FURI_LOG_E(TAG, "Failed to allocate text input for WiFi Saved Add SSID");
  215. return false;
  216. }
  217. }
  218. return true;
  219. case FlipWiFiViewTextInputSavedAddPassword:
  220. if (!app->uart_text_input)
  221. {
  222. if (!easy_flipper_set_uart_text_input(&app->uart_text_input, FlipWiFiViewTextInput, "Enter Password", app->uart_text_input_temp_buffer, app->uart_text_input_buffer_size, callback_text_updated_add_password, callback_to_submenu_saved, &app->view_dispatcher, app))
  223. {
  224. FURI_LOG_E(TAG, "Failed to allocate text input for WiFi Saved Add Password");
  225. return false;
  226. }
  227. if (!app->uart_text_input)
  228. {
  229. FURI_LOG_E(TAG, "Failed to allocate text input for WiFi Saved Add Password");
  230. return false;
  231. }
  232. }
  233. return true;
  234. case FlipWiFiSubmenuIndexFastCommandStart:
  235. if (!app->uart_text_input)
  236. {
  237. if (!easy_flipper_set_uart_text_input(&app->uart_text_input, FlipWiFiViewTextInput, "Enter Command", app->uart_text_input_temp_buffer, app->uart_text_input_buffer_size, callback_custom_command_updated, callback_to_submenu_saved, &app->view_dispatcher, app))
  238. {
  239. FURI_LOG_E(TAG, "Failed to allocate text input for Fast Command");
  240. return false;
  241. }
  242. if (!app->uart_text_input)
  243. {
  244. FURI_LOG_E(TAG, "Failed to allocate text input for Fast Command");
  245. return false;
  246. }
  247. }
  248. return true;
  249. case FlipWiFiSubmenuIndexWiFiAPSetSSID:
  250. if (!app->uart_text_input)
  251. {
  252. if (!easy_flipper_set_uart_text_input(&app->uart_text_input, FlipWiFiViewTextInput, "Enter AP SSID", app->uart_text_input_temp_buffer, app->uart_text_input_buffer_size, callback_ap_ssid_updated, callback_to_submenu_saved, &app->view_dispatcher, app))
  253. {
  254. FURI_LOG_E(TAG, "Failed to allocate text input for Fast Command");
  255. return false;
  256. }
  257. if (!app->uart_text_input)
  258. {
  259. FURI_LOG_E(TAG, "Failed to allocate text input for Fast Command");
  260. return false;
  261. }
  262. }
  263. return true;
  264. }
  265. return false;
  266. }
  267. bool alloc_views(void *context, uint32_t view)
  268. {
  269. FlipWiFiApp *app = (FlipWiFiApp *)context;
  270. furi_check(app);
  271. switch (view)
  272. {
  273. case FlipWiFiViewWiFiScan:
  274. if (!app->view_wifi)
  275. {
  276. if (!easy_flipper_set_view(&app->view_wifi, FlipWiFiViewGeneric, callback_view_draw_callback_scan, callback_view_input_callback_scan, callback_to_submenu_scan, &app->view_dispatcher, app))
  277. {
  278. return false;
  279. }
  280. if (!app->view_wifi)
  281. {
  282. FURI_LOG_E(TAG, "Failed to allocate view for WiFi Scan");
  283. return false;
  284. }
  285. }
  286. return true;
  287. case FlipWiFiViewWiFiSaved:
  288. if (!app->view_wifi)
  289. {
  290. if (!easy_flipper_set_view(&app->view_wifi, FlipWiFiViewGeneric, callback_view_draw_callback_saved, callback_view_input_callback_saved, callback_to_submenu_saved, &app->view_dispatcher, app))
  291. {
  292. return false;
  293. }
  294. if (!app->view_wifi)
  295. {
  296. FURI_LOG_E(TAG, "Failed to allocate view for WiFi Scan");
  297. return false;
  298. }
  299. }
  300. return true;
  301. default:
  302. return false;
  303. }
  304. }
  305. bool alloc_widgets(void *context, uint32_t widget)
  306. {
  307. FlipWiFiApp *app = (FlipWiFiApp *)context;
  308. furi_check(app);
  309. switch (widget)
  310. {
  311. case FlipWiFiViewAbout:
  312. if (!app->widget_info)
  313. {
  314. char about_text[128];
  315. snprintf(about_text, sizeof(about_text), "FlipWiFi v%s\n-----\nFlipperHTTP companion app.\nScan and save WiFi networks.\n-----\nwww.github.com/jblanked", VERSION);
  316. if (!easy_flipper_set_widget(&app->widget_info, FlipWiFiViewAbout, about_text, callback_to_submenu_main, &app->view_dispatcher))
  317. {
  318. return false;
  319. }
  320. if (!app->widget_info)
  321. {
  322. FURI_LOG_E(TAG, "Failed to allocate widget for About");
  323. return false;
  324. }
  325. }
  326. return true;
  327. default:
  328. return false;
  329. }
  330. }