storage.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include "storage.h"
  2. #include "storage_i.h"
  3. #include "storage_message.h"
  4. #include "storage_processing.h"
  5. #include "storage/storage_glue.h"
  6. #include "storages/storage_int.h"
  7. #include "storages/storage_ext.h"
  8. #define STORAGE_TICK 1000
  9. #define ICON_SD_MOUNTED &I_SDcardMounted_11x8
  10. #define ICON_SD_ERROR &I_SDcardFail_11x8
  11. #define TAG "Storage"
  12. static void storage_app_sd_icon_draw_callback(Canvas* canvas, void* context) {
  13. furi_assert(canvas);
  14. furi_assert(context);
  15. Storage* app = context;
  16. // here we don't care about thread race when reading / writing status
  17. switch(app->storage[ST_EXT].status) {
  18. case StorageStatusNotReady:
  19. break;
  20. case StorageStatusOK:
  21. canvas_draw_icon(canvas, 0, 0, ICON_SD_MOUNTED);
  22. break;
  23. default:
  24. canvas_draw_icon(canvas, 0, 0, ICON_SD_ERROR);
  25. break;
  26. }
  27. }
  28. Storage* storage_app_alloc() {
  29. Storage* app = malloc(sizeof(Storage));
  30. app->message_queue = osMessageQueueNew(8, sizeof(StorageMessage), NULL);
  31. app->pubsub = furi_pubsub_alloc();
  32. for(uint8_t i = 0; i < STORAGE_COUNT; i++) {
  33. storage_data_init(&app->storage[i]);
  34. }
  35. #ifndef FURI_RAM_EXEC
  36. storage_int_init(&app->storage[ST_INT]);
  37. #endif
  38. storage_ext_init(&app->storage[ST_EXT]);
  39. // sd icon gui
  40. app->sd_gui.enabled = false;
  41. app->sd_gui.view_port = view_port_alloc();
  42. view_port_set_width(app->sd_gui.view_port, icon_get_width(ICON_SD_MOUNTED));
  43. view_port_draw_callback_set(app->sd_gui.view_port, storage_app_sd_icon_draw_callback, app);
  44. view_port_enabled_set(app->sd_gui.view_port, false);
  45. Gui* gui = furi_record_open("gui");
  46. gui_add_view_port(gui, app->sd_gui.view_port, GuiLayerStatusBarLeft);
  47. furi_record_close("gui");
  48. return app;
  49. }
  50. void storage_tick(Storage* app) {
  51. for(uint8_t i = 0; i < STORAGE_COUNT; i++) {
  52. StorageApi api = app->storage[i].api;
  53. if(api.tick != NULL) {
  54. api.tick(&app->storage[i]);
  55. }
  56. }
  57. // storage not enabled but was enabled (sd card unmount)
  58. if(app->storage[ST_EXT].status == StorageStatusNotReady && app->sd_gui.enabled == true) {
  59. app->sd_gui.enabled = false;
  60. view_port_enabled_set(app->sd_gui.view_port, false);
  61. FURI_LOG_I(TAG, "SD card unmount");
  62. StorageEvent event = {.type = StorageEventTypeCardUnmount};
  63. furi_pubsub_publish(app->pubsub, &event);
  64. }
  65. // storage enabled (or in error state) but was not enabled (sd card mount)
  66. if((app->storage[ST_EXT].status == StorageStatusOK ||
  67. app->storage[ST_EXT].status == StorageStatusNotMounted ||
  68. app->storage[ST_EXT].status == StorageStatusNoFS ||
  69. app->storage[ST_EXT].status == StorageStatusNotAccessible ||
  70. app->storage[ST_EXT].status == StorageStatusErrorInternal) &&
  71. app->sd_gui.enabled == false) {
  72. app->sd_gui.enabled = true;
  73. view_port_enabled_set(app->sd_gui.view_port, true);
  74. if(app->storage[ST_EXT].status == StorageStatusOK) {
  75. FURI_LOG_I(TAG, "SD card mount");
  76. StorageEvent event = {.type = StorageEventTypeCardMount};
  77. furi_pubsub_publish(app->pubsub, &event);
  78. } else {
  79. FURI_LOG_I(TAG, "SD card mount error");
  80. StorageEvent event = {.type = StorageEventTypeCardMountError};
  81. furi_pubsub_publish(app->pubsub, &event);
  82. }
  83. }
  84. }
  85. int32_t storage_srv(void* p) {
  86. Storage* app = storage_app_alloc();
  87. furi_record_create("storage", app);
  88. StorageMessage message;
  89. while(1) {
  90. if(osMessageQueueGet(app->message_queue, &message, NULL, STORAGE_TICK) == osOK) {
  91. storage_process_message(app, &message);
  92. } else {
  93. storage_tick(app);
  94. }
  95. }
  96. return 0;
  97. }