spi_mem_scene_erase.c 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include "../spi_mem_app_i.h"
  2. static void
  3. spi_mem_scene_erase_widget_callback(GuiButtonType result, InputType type, void* context) {
  4. SPIMemApp* app = context;
  5. if(type == InputTypeShort) {
  6. view_dispatcher_send_custom_event(app->view_dispatcher, result);
  7. }
  8. }
  9. static void spi_mem_scene_erase_callback(void* context, SPIMemCustomEventWorker event) {
  10. SPIMemApp* app = context;
  11. view_dispatcher_send_custom_event(app->view_dispatcher, event);
  12. }
  13. void spi_mem_scene_erase_on_enter(void* context) {
  14. SPIMemApp* app = context;
  15. widget_add_button_element(
  16. app->widget, GuiButtonTypeLeft, "Cancel", spi_mem_scene_erase_widget_callback, app);
  17. widget_add_string_element(
  18. app->widget, 64, 15, AlignCenter, AlignBottom, FontPrimary, "Erasing SPI chip");
  19. widget_add_string_element(
  20. app->widget, 64, 27, AlignCenter, AlignBottom, FontSecondary, "Please be patient");
  21. notification_message(app->notifications, &sequence_blink_start_magenta);
  22. view_dispatcher_switch_to_view(app->view_dispatcher, SPIMemViewWidget);
  23. spi_mem_worker_start_thread(app->worker);
  24. spi_mem_worker_erase_start(app->chip_info, app->worker, spi_mem_scene_erase_callback, app);
  25. }
  26. static void spi_mem_scene_erase_set_previous_scene(SPIMemApp* app) {
  27. uint32_t scene = SPIMemSceneStart;
  28. if(app->mode == SPIMemModeWrite) scene = SPIMemSceneSavedFileMenu;
  29. scene_manager_search_and_switch_to_previous_scene(app->scene_manager, scene);
  30. }
  31. static void spi_mem_scene_erase_set_next_scene(SPIMemApp* app) {
  32. uint32_t scene = SPIMemSceneSuccess;
  33. if(app->mode == SPIMemModeWrite) scene = SPIMemSceneWrite;
  34. scene_manager_next_scene(app->scene_manager, scene);
  35. }
  36. bool spi_mem_scene_erase_on_event(void* context, SceneManagerEvent event) {
  37. SPIMemApp* app = context;
  38. bool success = false;
  39. if(event.type == SceneManagerEventTypeBack) {
  40. success = true;
  41. spi_mem_scene_erase_set_previous_scene(app);
  42. } else if(event.type == SceneManagerEventTypeCustom) {
  43. success = true;
  44. if(event.event == GuiButtonTypeLeft) {
  45. scene_manager_previous_scene(app->scene_manager);
  46. } else if(event.event == SPIMemCustomEventWorkerDone) {
  47. spi_mem_scene_erase_set_next_scene(app);
  48. } else if(event.event == SPIMemCustomEventWorkerChipFail) {
  49. scene_manager_next_scene(app->scene_manager, SPIMemSceneChipError);
  50. }
  51. }
  52. return success;
  53. }
  54. void spi_mem_scene_erase_on_exit(void* context) {
  55. SPIMemApp* app = context;
  56. spi_mem_worker_stop_thread(app->worker);
  57. notification_message(app->notifications, &sequence_blink_stop);
  58. widget_reset(app->widget);
  59. }