spi_mem_scene_read.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include "../spi_mem_app_i.h"
  2. #include "../spi_mem_files.h"
  3. #include "../lib/spi/spi_mem_chip.h"
  4. #include "../lib/spi/spi_mem_tools.h"
  5. void spi_mem_scene_read_progress_view_result_callback(void* context) {
  6. SPIMemApp* app = context;
  7. view_dispatcher_send_custom_event(app->view_dispatcher, SPIMemCustomEventViewReadCancel);
  8. }
  9. static void spi_mem_scene_read_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_read_on_enter(void* context) {
  14. SPIMemApp* app = context;
  15. spi_mem_view_progress_set_read_callback(
  16. app->view_progress, spi_mem_scene_read_progress_view_result_callback, app);
  17. notification_message(app->notifications, &sequence_blink_start_blue);
  18. spi_mem_view_progress_set_chip_size(app->view_progress, spi_mem_chip_get_size(app->chip_info));
  19. spi_mem_view_progress_set_block_size(
  20. app->view_progress, spi_mem_tools_get_file_max_block_size(app->chip_info));
  21. view_dispatcher_switch_to_view(app->view_dispatcher, SPIMemViewProgress);
  22. spi_mem_worker_start_thread(app->worker);
  23. spi_mem_worker_read_start(app->chip_info, app->worker, spi_mem_scene_read_callback, app);
  24. }
  25. bool spi_mem_scene_read_on_event(void* context, SceneManagerEvent event) {
  26. SPIMemApp* app = context;
  27. UNUSED(app);
  28. bool success = false;
  29. if(event.type == SceneManagerEventTypeBack) {
  30. success = true;
  31. } else if(event.type == SceneManagerEventTypeCustom) {
  32. success = true;
  33. if(event.event == SPIMemCustomEventViewReadCancel) {
  34. scene_manager_search_and_switch_to_previous_scene(
  35. app->scene_manager, SPIMemSceneChipDetect);
  36. } else if(event.event == SPIMemCustomEventWorkerBlockReaded) {
  37. spi_mem_view_progress_inc_progress(app->view_progress);
  38. } else if(event.event == SPIMemCustomEventWorkerDone) {
  39. scene_manager_next_scene(app->scene_manager, SPIMemSceneVerify);
  40. } else if(event.event == SPIMemCustomEventWorkerChipFail) {
  41. scene_manager_next_scene(app->scene_manager, SPIMemSceneChipError);
  42. } else if(event.event == SPIMemCustomEventWorkerFileFail) {
  43. scene_manager_next_scene(app->scene_manager, SPIMemSceneStorageError);
  44. }
  45. }
  46. return success;
  47. }
  48. void spi_mem_scene_read_on_exit(void* context) {
  49. SPIMemApp* app = context;
  50. spi_mem_worker_stop_thread(app->worker);
  51. spi_mem_view_progress_reset(app->view_progress);
  52. notification_message(app->notifications, &sequence_blink_stop);
  53. }