meal_pager_storage.c 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. #include "meal_pager_storage.h"
  2. static Storage* meal_pager_open_storage() {
  3. return furi_record_open(RECORD_STORAGE);
  4. }
  5. static void meal_pager_close_storage() {
  6. furi_record_close(RECORD_STORAGE);
  7. }
  8. static void meal_pager_close_config_file(FlipperFormat* file) {
  9. if (file == NULL) return;
  10. flipper_format_file_close(file);
  11. flipper_format_free(file);
  12. }
  13. FlipperFormat* meal_pager_save_subghz_buffer_file_start(void* context) {
  14. // SubGhz TXRX can only be loaded with files, makes sense as to save RAM
  15. Meal_Pager* app = context;
  16. UNUSED(app);
  17. FURI_LOG_D(TAG, "Creating Temp File");
  18. Storage* storage = furi_record_open(RECORD_STORAGE);
  19. FlipperFormat* ff = flipper_format_file_alloc(storage);
  20. // Overwrite wont work, so delete first
  21. if(storage_file_exists(storage, MEAL_PAGER_TMP_FILE)) {
  22. storage_simply_remove(storage, MEAL_PAGER_TMP_FILE);
  23. }
  24. // Open File, create if not exists
  25. if(!storage_common_stat(storage, MEAL_PAGER_TMP_FILE, NULL) == FSE_OK) {
  26. FURI_LOG_D(TAG, "Config file %s is not found. Will create new.", MEAL_PAGER_SETTINGS_SAVE_PATH);
  27. if(storage_common_stat(storage, CONFIG_FILE_DIRECTORY_PATH, NULL) == FSE_NOT_EXIST) {
  28. FURI_LOG_D(
  29. TAG,
  30. "Directory %s doesn't exist. Will create new.",
  31. CONFIG_FILE_DIRECTORY_PATH);
  32. if(!storage_simply_mkdir(storage, CONFIG_FILE_DIRECTORY_PATH)) {
  33. FURI_LOG_D(TAG, "Error creating directory %s", CONFIG_FILE_DIRECTORY_PATH);
  34. }
  35. }
  36. }
  37. if(!flipper_format_file_open_new(ff, MEAL_PAGER_TMP_FILE)) {
  38. //totp_close_config_file(fff_file);
  39. FURI_LOG_D(TAG, "Error creating new file %s", MEAL_PAGER_TMP_FILE);
  40. meal_pager_close_storage();
  41. return ff;
  42. }
  43. bool success = flipper_format_write_header_cstr(ff, MEAL_PAGER_SUBGHZ_FILE_TYPE, MEAL_PAGER_SUBGHZ_FILE_VERSION) &&
  44. flipper_format_write_string_cstr(ff, "Frequency", MEAL_PAGER_SUBGHZ_FILE_FREQUENCY) &&
  45. flipper_format_write_string_cstr(ff, "Preset", MEAL_PAGER_SUBGHZ_FILE_PRESET) &&
  46. flipper_format_write_string_cstr(ff, "Protocol", MEAL_PAGER_SUBGHZ_FILE_Protocol);
  47. UNUSED(success);
  48. return ff;
  49. }
  50. void meal_pager_save_subghz_buffer_stop(void* context, FlipperFormat* ff) {
  51. Meal_Pager* app = context;
  52. UNUSED(app);
  53. FURI_LOG_D(TAG, "Closing Temp File");
  54. if(!flipper_format_rewind(ff)) {
  55. meal_pager_close_config_file(ff);
  56. FURI_LOG_E(TAG, "Rewind error");
  57. meal_pager_close_storage();
  58. return;
  59. }
  60. meal_pager_close_config_file(ff);
  61. meal_pager_close_storage();
  62. }
  63. void meal_pager_save_settings(void* context) {
  64. Meal_Pager* app = context;
  65. if (app->save_settings == 0) {
  66. FURI_LOG_D(TAG, "Skipping Save because Disabled");
  67. return;
  68. }
  69. FURI_LOG_D(TAG, "Saving Settings to File");
  70. Storage* storage = meal_pager_open_storage();
  71. FlipperFormat* fff_file = flipper_format_file_alloc(storage);
  72. // Overwrite wont work, so delete first
  73. if(storage_file_exists(storage, MEAL_PAGER_SETTINGS_SAVE_PATH)) {
  74. storage_simply_remove(storage, MEAL_PAGER_SETTINGS_SAVE_PATH);
  75. }
  76. // Open File, create if not exists
  77. if(!storage_common_stat(storage, MEAL_PAGER_SETTINGS_SAVE_PATH, NULL) == FSE_OK) {
  78. FURI_LOG_D(TAG, "Config file %s is not found. Will create new.", MEAL_PAGER_SETTINGS_SAVE_PATH);
  79. if(storage_common_stat(storage, CONFIG_FILE_DIRECTORY_PATH, NULL) == FSE_NOT_EXIST) {
  80. FURI_LOG_D(
  81. TAG,
  82. "Directory %s doesn't exist. Will create new.",
  83. CONFIG_FILE_DIRECTORY_PATH);
  84. if(!storage_simply_mkdir(storage, CONFIG_FILE_DIRECTORY_PATH)) {
  85. FURI_LOG_E(TAG, "Error creating directory %s", CONFIG_FILE_DIRECTORY_PATH);
  86. }
  87. }
  88. }
  89. if(!flipper_format_file_open_new(fff_file, MEAL_PAGER_SETTINGS_SAVE_PATH)) {
  90. //totp_close_config_file(fff_file);
  91. FURI_LOG_E(TAG, "Error creating new file %s", MEAL_PAGER_SETTINGS_SAVE_PATH);
  92. meal_pager_close_storage();
  93. return;
  94. }
  95. // Store Settings
  96. flipper_format_write_header_cstr(
  97. fff_file, MEAL_PAGER_SETTINGS_HEADER, MEAL_PAGER_SETTINGS_FILE_VERSION);
  98. flipper_format_write_uint32(
  99. fff_file, MEAL_PAGER_SETTINGS_KEY_PAGER_TYPE, &app->pager_type, 1);
  100. flipper_format_write_uint32(
  101. fff_file, MEAL_PAGER_SETTINGS_KEY_FIRST_STATION, &app->first_station, 1);
  102. flipper_format_write_uint32(
  103. fff_file, MEAL_PAGER_SETTINGS_KEY_LAST_STATION, &app->last_station, 1);
  104. flipper_format_write_uint32(
  105. fff_file, MEAL_PAGER_SETTINGS_KEY_FIRST_PAGER, &app->first_pager, 1);
  106. flipper_format_write_uint32(
  107. fff_file, MEAL_PAGER_SETTINGS_KEY_LAST_PAGER, &app->last_pager, 1);
  108. flipper_format_write_uint32(
  109. fff_file, MEAL_PAGER_SETTINGS_KEY_HAPTIC, &app->haptic, 1);
  110. flipper_format_write_uint32(
  111. fff_file, MEAL_PAGER_SETTINGS_KEY_SPEAKER, &app->speaker, 1);
  112. flipper_format_write_uint32(
  113. fff_file, MEAL_PAGER_SETTINGS_KEY_LED, &app->led, 1);
  114. flipper_format_write_uint32(
  115. fff_file, MEAL_PAGER_SETTINGS_KEY_SAVE_SETTINGS, &app->save_settings, 1);
  116. if(!flipper_format_rewind(fff_file)) {
  117. meal_pager_close_config_file(fff_file);
  118. FURI_LOG_E(TAG, "Rewind error");
  119. meal_pager_close_storage();
  120. return;
  121. }
  122. meal_pager_close_config_file(fff_file);
  123. meal_pager_close_storage();
  124. }
  125. void meal_pager_read_settings(void* context) {
  126. Meal_Pager* app = context;
  127. Storage* storage = meal_pager_open_storage();
  128. FlipperFormat* fff_file = flipper_format_file_alloc(storage);
  129. if(storage_common_stat(storage, MEAL_PAGER_SETTINGS_SAVE_PATH, NULL) != FSE_OK) {
  130. meal_pager_close_config_file(fff_file);
  131. meal_pager_close_storage();
  132. return;
  133. }
  134. uint32_t file_version;
  135. FuriString* temp_str = furi_string_alloc();
  136. if (!flipper_format_file_open_existing(fff_file, MEAL_PAGER_SETTINGS_SAVE_PATH)) {
  137. FURI_LOG_E(TAG, "Cannot open file %s", MEAL_PAGER_SETTINGS_SAVE_PATH);
  138. meal_pager_close_config_file(fff_file);
  139. meal_pager_close_storage();
  140. return;
  141. }
  142. if(!flipper_format_read_header(fff_file, temp_str, &file_version)) {
  143. FURI_LOG_E(TAG, "Missing Header Data");
  144. meal_pager_close_config_file(fff_file);
  145. meal_pager_close_storage();
  146. return;
  147. }
  148. if(file_version < MEAL_PAGER_SETTINGS_FILE_VERSION) {
  149. FURI_LOG_I(TAG, "old config version, will be removed.");
  150. meal_pager_close_config_file(fff_file);
  151. meal_pager_close_storage();
  152. return;
  153. }
  154. flipper_format_read_uint32(fff_file, MEAL_PAGER_SETTINGS_KEY_PAGER_TYPE, &app->pager_type, 1);
  155. flipper_format_read_uint32(fff_file, MEAL_PAGER_SETTINGS_KEY_FIRST_STATION, &app->first_station, 1);
  156. flipper_format_read_uint32(fff_file, MEAL_PAGER_SETTINGS_KEY_LAST_STATION, &app->last_station, 1);
  157. flipper_format_read_uint32(fff_file, MEAL_PAGER_SETTINGS_KEY_FIRST_PAGER, &app->first_pager, 1);
  158. flipper_format_read_uint32(fff_file, MEAL_PAGER_SETTINGS_KEY_LAST_PAGER, &app->last_pager, 1);
  159. flipper_format_read_uint32(fff_file, MEAL_PAGER_SETTINGS_KEY_HAPTIC, &app->haptic, 1);
  160. flipper_format_read_uint32(fff_file, MEAL_PAGER_SETTINGS_KEY_SPEAKER, &app->speaker, 1);
  161. flipper_format_read_uint32(fff_file, MEAL_PAGER_SETTINGS_KEY_LED, &app->led, 1);
  162. flipper_format_read_uint32(fff_file, MEAL_PAGER_SETTINGS_KEY_SAVE_SETTINGS, &app->save_settings, 1);
  163. flipper_format_rewind(fff_file);
  164. meal_pager_close_config_file(fff_file);
  165. meal_pager_close_storage();
  166. }