meal_pager_storage.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  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_rewind(file);
  11. flipper_format_file_close(file);
  12. flipper_format_free(file);
  13. }
  14. bool meal_pager_save_subghz_buffer_file_start(
  15. void* context,
  16. FlipperFormat* ff,
  17. Storage* storage,
  18. char* frequency) {
  19. // SubGhz TXRX can only be loaded with files, makes sense as to save RAM
  20. Meal_Pager* app = context;
  21. UNUSED(app);
  22. bool success = false;
  23. FURI_LOG_D(TAG, "Creating Temp File");
  24. //Storage* storage = furi_record_open(RECORD_STORAGE);
  25. //FlipperFormat* ff = flipper_format_file_alloc(storage);
  26. // Overwrite wont work, so delete first
  27. if(storage_file_exists(storage, MEAL_PAGER_TMP_FILE)) {
  28. bool stored = storage_simply_remove(storage, MEAL_PAGER_TMP_FILE);
  29. if(!stored) {
  30. FURI_LOG_D(TAG, "Cannot remove file, seems to be open");
  31. return success;
  32. }
  33. }
  34. // Open File, create if not exists
  35. if(!storage_common_stat(storage, MEAL_PAGER_TMP_FILE, NULL) == FSE_OK) {
  36. FURI_LOG_D(
  37. TAG, "Config file %s is not found. Will create new.", MEAL_PAGER_SETTINGS_SAVE_PATH);
  38. if(storage_common_stat(storage, CONFIG_FILE_DIRECTORY_PATH, NULL) == FSE_NOT_EXIST) {
  39. FURI_LOG_D(
  40. TAG, "Directory %s doesn't exist. Will create new.", CONFIG_FILE_DIRECTORY_PATH);
  41. if(!storage_simply_mkdir(storage, CONFIG_FILE_DIRECTORY_PATH)) {
  42. FURI_LOG_D(TAG, "Error creating directory %s", CONFIG_FILE_DIRECTORY_PATH);
  43. }
  44. }
  45. }
  46. if(!flipper_format_file_open_new(ff, MEAL_PAGER_TMP_FILE)) {
  47. //totp_close_config_file(fff_file);
  48. FURI_LOG_D(TAG, "Error creating new file %s", MEAL_PAGER_TMP_FILE);
  49. meal_pager_close_storage();
  50. return success;
  51. }
  52. success = flipper_format_write_header_cstr(
  53. ff, MEAL_PAGER_SUBGHZ_FILE_TYPE, MEAL_PAGER_SUBGHZ_FILE_VERSION) &&
  54. flipper_format_write_string_cstr(ff, "Frequency", frequency) &&
  55. flipper_format_write_string_cstr(ff, "Preset", MEAL_PAGER_SUBGHZ_FILE_PRESET) &&
  56. flipper_format_write_string_cstr(ff, "Protocol", MEAL_PAGER_SUBGHZ_FILE_Protocol);
  57. return success;
  58. }
  59. void meal_pager_save_subghz_buffer_stop(void* context, FlipperFormat* ff) {
  60. Meal_Pager* app = context;
  61. UNUSED(app);
  62. FURI_LOG_D(TAG, "Closing Temp File");
  63. if(!flipper_format_rewind(ff)) {
  64. meal_pager_close_config_file(ff);
  65. FURI_LOG_E(TAG, "Rewind error");
  66. meal_pager_close_storage();
  67. return;
  68. }
  69. meal_pager_close_config_file(ff);
  70. meal_pager_close_storage();
  71. }
  72. void meal_pager_save_settings(void* context) {
  73. Meal_Pager* app = context;
  74. if(app->save_settings == 0) {
  75. FURI_LOG_D(TAG, "Skipping Save because Disabled");
  76. return;
  77. }
  78. FURI_LOG_D(TAG, "Saving Settings to File");
  79. Storage* storage = meal_pager_open_storage();
  80. FlipperFormat* fff_file = flipper_format_file_alloc(storage);
  81. // Overwrite wont work, so delete first
  82. if(storage_file_exists(storage, MEAL_PAGER_SETTINGS_SAVE_PATH)) {
  83. storage_simply_remove(storage, MEAL_PAGER_SETTINGS_SAVE_PATH);
  84. }
  85. // Open File, create if not exists
  86. if(!storage_common_stat(storage, MEAL_PAGER_SETTINGS_SAVE_PATH, NULL) == FSE_OK) {
  87. FURI_LOG_D(
  88. TAG, "Config file %s is not found. Will create new.", MEAL_PAGER_SETTINGS_SAVE_PATH);
  89. if(storage_common_stat(storage, CONFIG_FILE_DIRECTORY_PATH, NULL) == FSE_NOT_EXIST) {
  90. FURI_LOG_D(
  91. TAG, "Directory %s doesn't exist. Will create new.", CONFIG_FILE_DIRECTORY_PATH);
  92. if(!storage_simply_mkdir(storage, CONFIG_FILE_DIRECTORY_PATH)) {
  93. FURI_LOG_E(TAG, "Error creating directory %s", CONFIG_FILE_DIRECTORY_PATH);
  94. }
  95. }
  96. }
  97. if(!flipper_format_file_open_new(fff_file, MEAL_PAGER_SETTINGS_SAVE_PATH)) {
  98. //totp_close_config_file(fff_file);
  99. FURI_LOG_E(TAG, "Error creating new file %s", MEAL_PAGER_SETTINGS_SAVE_PATH);
  100. meal_pager_close_storage();
  101. return;
  102. }
  103. // Store Settings
  104. flipper_format_write_header_cstr(
  105. fff_file, MEAL_PAGER_SETTINGS_HEADER, MEAL_PAGER_SETTINGS_FILE_VERSION);
  106. flipper_format_write_uint32(fff_file, MEAL_PAGER_SETTINGS_KEY_PAGER_TYPE, &app->pager_type, 1);
  107. flipper_format_write_uint32(
  108. fff_file, MEAL_PAGER_SETTINGS_KEY_FIRST_STATION, &app->first_station, 1);
  109. flipper_format_write_uint32(
  110. fff_file, MEAL_PAGER_SETTINGS_KEY_LAST_STATION, &app->last_station, 1);
  111. flipper_format_write_uint32(
  112. fff_file, MEAL_PAGER_SETTINGS_KEY_FIRST_PAGER, &app->first_pager, 1);
  113. flipper_format_write_uint32(fff_file, MEAL_PAGER_SETTINGS_KEY_LAST_PAGER, &app->last_pager, 1);
  114. flipper_format_write_uint32(fff_file, MEAL_PAGER_SETTINGS_KEY_LAST_PAGER, &app->last_pager, 1);
  115. flipper_format_write_uint32(fff_file, MEAL_PAGER_SETTINGS_KEY_REPEATS, &app->repeats, 1);
  116. flipper_format_write_uint32(fff_file, MEAL_PAGER_SETTINGS_KEY_HAPTIC, &app->haptic, 1);
  117. flipper_format_write_uint32(fff_file, MEAL_PAGER_SETTINGS_KEY_SPEAKER, &app->speaker, 1);
  118. flipper_format_write_uint32(fff_file, MEAL_PAGER_SETTINGS_KEY_LED, &app->led, 1);
  119. flipper_format_write_uint32(
  120. fff_file, MEAL_PAGER_SETTINGS_KEY_SAVE_SETTINGS, &app->save_settings, 1);
  121. if(!flipper_format_rewind(fff_file)) {
  122. meal_pager_close_config_file(fff_file);
  123. FURI_LOG_E(TAG, "Rewind error");
  124. meal_pager_close_storage();
  125. return;
  126. }
  127. meal_pager_close_config_file(fff_file);
  128. meal_pager_close_storage();
  129. }
  130. void meal_pager_read_settings(void* context) {
  131. Meal_Pager* app = context;
  132. Storage* storage = meal_pager_open_storage();
  133. FlipperFormat* fff_file = flipper_format_file_alloc(storage);
  134. if(storage_common_stat(storage, MEAL_PAGER_SETTINGS_SAVE_PATH, NULL) != FSE_OK) {
  135. meal_pager_close_config_file(fff_file);
  136. meal_pager_close_storage();
  137. return;
  138. }
  139. uint32_t file_version;
  140. FuriString* temp_str = furi_string_alloc();
  141. if(!flipper_format_file_open_existing(fff_file, MEAL_PAGER_SETTINGS_SAVE_PATH)) {
  142. FURI_LOG_E(TAG, "Cannot open file %s", MEAL_PAGER_SETTINGS_SAVE_PATH);
  143. meal_pager_close_config_file(fff_file);
  144. meal_pager_close_storage();
  145. furi_string_free(temp_str);
  146. return;
  147. }
  148. if(!flipper_format_read_header(fff_file, temp_str, &file_version)) {
  149. FURI_LOG_E(TAG, "Missing Header Data");
  150. meal_pager_close_config_file(fff_file);
  151. meal_pager_close_storage();
  152. furi_string_free(temp_str);
  153. return;
  154. }
  155. if(file_version < MEAL_PAGER_SETTINGS_FILE_VERSION) {
  156. FURI_LOG_I(TAG, "old config version, will be removed.");
  157. meal_pager_close_config_file(fff_file);
  158. meal_pager_close_storage();
  159. furi_string_free(temp_str);
  160. return;
  161. }
  162. flipper_format_read_uint32(fff_file, MEAL_PAGER_SETTINGS_KEY_PAGER_TYPE, &app->pager_type, 1);
  163. meal_pager_set_max_values(app);
  164. flipper_format_read_uint32(
  165. fff_file, MEAL_PAGER_SETTINGS_KEY_FIRST_STATION, &app->first_station, 1);
  166. flipper_format_read_uint32(
  167. fff_file, MEAL_PAGER_SETTINGS_KEY_LAST_STATION, &app->last_station, 1);
  168. flipper_format_read_uint32(
  169. fff_file, MEAL_PAGER_SETTINGS_KEY_FIRST_PAGER, &app->first_pager, 1);
  170. flipper_format_read_uint32(fff_file, MEAL_PAGER_SETTINGS_KEY_LAST_PAGER, &app->last_pager, 1);
  171. flipper_format_read_uint32(fff_file, MEAL_PAGER_SETTINGS_KEY_REPEATS, &app->repeats, 1);
  172. flipper_format_read_uint32(fff_file, MEAL_PAGER_SETTINGS_KEY_HAPTIC, &app->haptic, 1);
  173. flipper_format_read_uint32(fff_file, MEAL_PAGER_SETTINGS_KEY_SPEAKER, &app->speaker, 1);
  174. flipper_format_read_uint32(fff_file, MEAL_PAGER_SETTINGS_KEY_LED, &app->led, 1);
  175. flipper_format_read_uint32(
  176. fff_file, MEAL_PAGER_SETTINGS_KEY_SAVE_SETTINGS, &app->save_settings, 1);
  177. flipper_format_rewind(fff_file);
  178. furi_string_free(temp_str);
  179. meal_pager_close_config_file(fff_file);
  180. meal_pager_close_storage();
  181. }
  182. void meal_pager_set_max_values(void* context) {
  183. Meal_Pager* app = context;
  184. switch(app->pager_type) {
  185. case Meal_PagerPagerTypeT119:
  186. case Meal_PagerPagerTypeTD165:
  187. app->max_station = 8191;
  188. app->max_pager = 999;
  189. break;
  190. case Meal_PagerPagerTypeTD174:
  191. app->max_station = 8191;
  192. app->max_pager = 10;
  193. break;
  194. case Meal_PagerPagerTypeTD157:
  195. app->max_station = 1023;
  196. app->max_pager = 999;
  197. break;
  198. }
  199. if(app->first_station > app->max_station) {
  200. app->first_station = app->max_station;
  201. snprintf(app->text_store[0], sizeof(app->text_store[0]), "%lu", app->first_station);
  202. }
  203. if(app->last_station > app->max_station) {
  204. app->last_station = app->max_station;
  205. snprintf(app->text_store[1], sizeof(app->text_store[1]), "%lu", app->last_station);
  206. }
  207. if(app->last_station < app->first_station) {
  208. app->last_station = app->first_station;
  209. snprintf(app->text_store[1], sizeof(app->text_store[1]), "%lu", app->last_station);
  210. }
  211. if(app->first_pager > app->max_pager) {
  212. app->first_pager = app->max_pager;
  213. snprintf(app->text_store[2], sizeof(app->text_store[2]), "%lu", app->first_pager);
  214. }
  215. if(app->last_pager > app->max_pager) {
  216. app->last_pager = app->max_pager;
  217. snprintf(app->text_store[3], sizeof(app->text_store[3]), "%lu", app->last_pager);
  218. }
  219. if(app->last_pager < app->first_pager) {
  220. app->last_pager = app->first_pager;
  221. snprintf(app->text_store[3], sizeof(app->text_store[3]), "%lu", app->last_pager);
  222. }
  223. }