updater_scene_main.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include <furi.h>
  2. #include <furi_hal.h>
  3. #include <applications.h>
  4. #include <storage/storage.h>
  5. #include "updater/updater_i.h"
  6. #include "updater/views/updater_main.h"
  7. #include "updater_scene.h"
  8. static void sd_mount_callback(const void* message, void* context) {
  9. Updater* updater = context;
  10. const StorageEvent* new_event = message;
  11. switch(new_event->type) {
  12. case StorageEventTypeCardMount:
  13. view_dispatcher_send_custom_event(updater->view_dispatcher, UpdaterCustomEventStartUpdate);
  14. break;
  15. case StorageEventTypeCardUnmount:
  16. view_dispatcher_send_custom_event(updater->view_dispatcher, UpdaterCustomEventSdUnmounted);
  17. break;
  18. default:
  19. break;
  20. }
  21. }
  22. void updater_scene_main_on_enter(void* context) {
  23. Updater* updater = (Updater*)context;
  24. UpdaterMainView* main_view = updater->main_view;
  25. FuriPubSubSubscription* sub =
  26. furi_pubsub_subscribe(storage_get_pubsub(updater->storage), &sd_mount_callback, updater);
  27. updater_main_set_storage_pubsub(main_view, sub);
  28. /* FIXME: there's a misbehavior in storage subsystem. If we produce heavy load on it before it
  29. * fires an SD card event, it'll never do that until the load is lifted. Meanwhile SD card icon
  30. * will be missing from UI, however, /ext will be fully operational. So, until it's fixed, this
  31. * should remain commented out. */
  32. // If (somehow) we started after SD card is mounted, initiate update immediately
  33. //if(storage_sd_status(updater->storage) == FSE_OK) {
  34. // view_dispatcher_send_custom_event(updater->view_dispatcher, UpdaterCustomEventStartUpdate);
  35. //}
  36. updater_main_set_view_dispatcher(main_view, updater->view_dispatcher);
  37. view_dispatcher_switch_to_view(updater->view_dispatcher, UpdaterViewMain);
  38. }
  39. static void updater_scene_restart_to_postupdate() {
  40. furi_hal_rtc_set_boot_mode(FuriHalRtcBootModePostUpdate);
  41. furi_hal_power_reset();
  42. }
  43. bool updater_scene_main_on_event(void* context, SceneManagerEvent event) {
  44. Updater* updater = (Updater*)context;
  45. bool consumed = false;
  46. if(event.type == SceneManagerEventTypeTick) {
  47. if(!update_task_is_running(updater->update_task)) {
  48. if(updater->idle_ticks++ >= (UPDATE_DELAY_OPERATION_ERROR / UPDATER_APP_TICK)) {
  49. updater_scene_restart_to_postupdate();
  50. }
  51. } else {
  52. updater->idle_ticks = 0;
  53. }
  54. } else if(event.type == SceneManagerEventTypeCustom) {
  55. switch(event.event) {
  56. case UpdaterCustomEventStartUpdate:
  57. if(!update_task_is_running(updater->update_task) &&
  58. update_task_init(updater->update_task)) {
  59. update_task_start(updater->update_task);
  60. }
  61. consumed = true;
  62. break;
  63. case UpdaterCustomEventRetryUpdate:
  64. if(!update_task_is_running(updater->update_task) &&
  65. (update_task_get_state(updater->update_task)->stage != UpdateTaskStageComplete))
  66. update_task_start(updater->update_task);
  67. consumed = true;
  68. break;
  69. case UpdaterCustomEventCancelUpdate:
  70. if(!update_task_is_running(updater->update_task)) {
  71. updater_scene_restart_to_postupdate();
  72. }
  73. consumed = true;
  74. break;
  75. case UpdaterCustomEventSdUnmounted:
  76. // TODO: error out, stop worker (it's probably dead actually)
  77. break;
  78. default:
  79. break;
  80. }
  81. }
  82. return consumed;
  83. }
  84. void updater_scene_main_on_exit(void* context) {
  85. Updater* updater = (Updater*)context;
  86. furi_pubsub_unsubscribe(
  87. storage_get_pubsub(updater->storage), updater_main_get_storage_pubsub(updater->main_view));
  88. scene_manager_set_scene_state(updater->scene_manager, UpdaterSceneMain, 0);
  89. }