spi_mem_app.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include <furi_hal.h>
  2. #include "spi_mem_app_i.h"
  3. #include "spi_mem_files.h"
  4. #include "lib/spi/spi_mem_chip_i.h"
  5. static bool spi_mem_custom_event_callback(void* context, uint32_t event) {
  6. furi_assert(context);
  7. SPIMemApp* app = context;
  8. return scene_manager_handle_custom_event(app->scene_manager, event);
  9. }
  10. static bool spi_mem_back_event_callback(void* context) {
  11. furi_assert(context);
  12. SPIMemApp* app = context;
  13. return scene_manager_handle_back_event(app->scene_manager);
  14. }
  15. SPIMemApp* spi_mem_alloc(void) {
  16. SPIMemApp* instance = malloc(sizeof(SPIMemApp)); //-V799
  17. instance->file_path = furi_string_alloc_set(STORAGE_APP_DATA_PATH_PREFIX);
  18. instance->gui = furi_record_open(RECORD_GUI);
  19. instance->notifications = furi_record_open(RECORD_NOTIFICATION);
  20. instance->view_dispatcher = view_dispatcher_alloc();
  21. instance->scene_manager = scene_manager_alloc(&spi_mem_scene_handlers, instance);
  22. instance->submenu = submenu_alloc();
  23. instance->dialog_ex = dialog_ex_alloc();
  24. instance->popup = popup_alloc();
  25. instance->worker = spi_mem_worker_alloc();
  26. instance->dialogs = furi_record_open(RECORD_DIALOGS);
  27. instance->storage = furi_record_open(RECORD_STORAGE);
  28. instance->widget = widget_alloc();
  29. instance->chip_info = malloc(sizeof(SPIMemChip));
  30. found_chips_init(instance->found_chips);
  31. instance->view_progress = spi_mem_view_progress_alloc();
  32. instance->view_detect = spi_mem_view_detect_alloc();
  33. instance->text_input = text_input_alloc();
  34. instance->mode = SPIMemModeUnknown;
  35. // Migrate data from old sd-card folder
  36. storage_common_migrate(instance->storage, EXT_PATH("spimem"), STORAGE_APP_DATA_PATH_PREFIX);
  37. view_dispatcher_set_event_callback_context(instance->view_dispatcher, instance);
  38. view_dispatcher_set_custom_event_callback(
  39. instance->view_dispatcher, spi_mem_custom_event_callback);
  40. view_dispatcher_set_navigation_event_callback(
  41. instance->view_dispatcher, spi_mem_back_event_callback);
  42. view_dispatcher_attach_to_gui(
  43. instance->view_dispatcher, instance->gui, ViewDispatcherTypeFullscreen);
  44. view_dispatcher_add_view(
  45. instance->view_dispatcher, SPIMemViewSubmenu, submenu_get_view(instance->submenu));
  46. view_dispatcher_add_view(
  47. instance->view_dispatcher, SPIMemViewDialogEx, dialog_ex_get_view(instance->dialog_ex));
  48. view_dispatcher_add_view(
  49. instance->view_dispatcher, SPIMemViewPopup, popup_get_view(instance->popup));
  50. view_dispatcher_add_view(
  51. instance->view_dispatcher, SPIMemViewWidget, widget_get_view(instance->widget));
  52. view_dispatcher_add_view(
  53. instance->view_dispatcher,
  54. SPIMemViewProgress,
  55. spi_mem_view_progress_get_view(instance->view_progress));
  56. view_dispatcher_add_view(
  57. instance->view_dispatcher,
  58. SPIMemViewDetect,
  59. spi_mem_view_detect_get_view(instance->view_detect));
  60. view_dispatcher_add_view(
  61. instance->view_dispatcher, SPIMemViewTextInput, text_input_get_view(instance->text_input));
  62. furi_hal_power_enable_otg();
  63. furi_hal_spi_bus_handle_init(&furi_hal_spi_bus_handle_external);
  64. scene_manager_next_scene(instance->scene_manager, SPIMemSceneStart);
  65. return instance;
  66. } //-V773
  67. void spi_mem_free(SPIMemApp* instance) {
  68. view_dispatcher_remove_view(instance->view_dispatcher, SPIMemViewSubmenu);
  69. view_dispatcher_remove_view(instance->view_dispatcher, SPIMemViewDialogEx);
  70. view_dispatcher_remove_view(instance->view_dispatcher, SPIMemViewPopup);
  71. view_dispatcher_remove_view(instance->view_dispatcher, SPIMemViewWidget);
  72. view_dispatcher_remove_view(instance->view_dispatcher, SPIMemViewProgress);
  73. view_dispatcher_remove_view(instance->view_dispatcher, SPIMemViewDetect);
  74. view_dispatcher_remove_view(instance->view_dispatcher, SPIMemViewTextInput);
  75. spi_mem_view_progress_free(instance->view_progress);
  76. spi_mem_view_detect_free(instance->view_detect);
  77. submenu_free(instance->submenu);
  78. dialog_ex_free(instance->dialog_ex);
  79. popup_free(instance->popup);
  80. widget_free(instance->widget);
  81. text_input_free(instance->text_input);
  82. view_dispatcher_free(instance->view_dispatcher);
  83. scene_manager_free(instance->scene_manager);
  84. spi_mem_worker_free(instance->worker);
  85. free(instance->chip_info);
  86. found_chips_clear(instance->found_chips);
  87. furi_record_close(RECORD_STORAGE);
  88. furi_record_close(RECORD_DIALOGS);
  89. furi_record_close(RECORD_NOTIFICATION);
  90. furi_record_close(RECORD_GUI);
  91. furi_string_free(instance->file_path);
  92. furi_hal_spi_bus_handle_deinit(&furi_hal_spi_bus_handle_external);
  93. furi_hal_power_disable_otg();
  94. free(instance);
  95. }
  96. int32_t spi_mem_app(void* p) {
  97. UNUSED(p);
  98. SPIMemApp* instance = spi_mem_alloc();
  99. view_dispatcher_run(instance->view_dispatcher);
  100. spi_mem_free(instance);
  101. return 0;
  102. }