meal_pager_storage.c 8.6 KB

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