subrem_presets.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #include "subrem_presets.h"
  2. #define TAG "SubRemPresets"
  3. SubRemSubFilePreset* subrem_sub_file_preset_alloc(void) {
  4. SubRemSubFilePreset* sub_preset = malloc(sizeof(SubRemSubFilePreset));
  5. sub_preset->fff_data = flipper_format_string_alloc();
  6. sub_preset->file_path = furi_string_alloc();
  7. sub_preset->protocaol_name = furi_string_alloc();
  8. sub_preset->label = furi_string_alloc();
  9. sub_preset->freq_preset.name = furi_string_alloc();
  10. sub_preset->type = SubGhzProtocolTypeUnknown;
  11. sub_preset->load_state = SubRemLoadSubStateNotSet;
  12. return sub_preset;
  13. }
  14. void subrem_sub_file_preset_free(SubRemSubFilePreset* sub_preset) {
  15. furi_assert(sub_preset);
  16. furi_string_free(sub_preset->label);
  17. furi_string_free(sub_preset->protocaol_name);
  18. furi_string_free(sub_preset->file_path);
  19. flipper_format_free(sub_preset->fff_data);
  20. furi_string_free(sub_preset->freq_preset.name);
  21. free(sub_preset);
  22. }
  23. void subrem_sub_file_preset_reset(SubRemSubFilePreset* sub_preset) {
  24. furi_assert(sub_preset);
  25. furi_string_set_str(sub_preset->label, "");
  26. furi_string_reset(sub_preset->protocaol_name);
  27. furi_string_reset(sub_preset->file_path);
  28. Stream* fff_data_stream = flipper_format_get_raw_stream(sub_preset->fff_data);
  29. stream_clean(fff_data_stream);
  30. sub_preset->type = SubGhzProtocolTypeUnknown;
  31. sub_preset->load_state = SubRemLoadSubStateNotSet;
  32. }
  33. SubRemLoadSubState subrem_sub_preset_load(
  34. SubRemSubFilePreset* sub_preset,
  35. SubGhzTxRx* txrx,
  36. FlipperFormat* fff_data_file) {
  37. furi_assert(sub_preset);
  38. furi_assert(txrx);
  39. furi_assert(fff_data_file);
  40. Stream* fff_data_stream = flipper_format_get_raw_stream(sub_preset->fff_data);
  41. SubRemLoadSubState ret;
  42. FuriString* temp_str = furi_string_alloc();
  43. uint32_t temp_data32;
  44. uint32_t repeat = 200;
  45. ret = SubRemLoadSubStateError;
  46. do {
  47. stream_clean(fff_data_stream);
  48. if(!flipper_format_read_header(fff_data_file, temp_str, &temp_data32)) {
  49. FURI_LOG_E(TAG, "Missing or incorrect header");
  50. break;
  51. }
  52. if(((!strcmp(furi_string_get_cstr(temp_str), SUBGHZ_KEY_FILE_TYPE)) ||
  53. (!strcmp(furi_string_get_cstr(temp_str), SUBGHZ_RAW_FILE_TYPE))) &&
  54. temp_data32 == SUBGHZ_KEY_FILE_VERSION) {
  55. } else {
  56. FURI_LOG_E(TAG, "Type or version mismatch");
  57. break;
  58. }
  59. SubGhzSetting* setting = subghz_txrx_get_setting(txrx);
  60. //Load frequency or using default from settings
  61. ret = SubRemLoadSubStateErrorFreq;
  62. if(!flipper_format_read_uint32(fff_data_file, "Frequency", &temp_data32, 1)) {
  63. FURI_LOG_W(TAG, "Cannot read frequency. Set default frequency");
  64. sub_preset->freq_preset.frequency = subghz_setting_get_default_frequency(setting);
  65. } else if(!subghz_txrx_radio_device_is_frequency_valid(txrx, temp_data32)) {
  66. FURI_LOG_E(TAG, "Frequency not supported on chosen radio module");
  67. break;
  68. }
  69. sub_preset->freq_preset.frequency = temp_data32;
  70. //Load preset
  71. ret = SubRemLoadSubStateErrorMod;
  72. if(!flipper_format_read_string(fff_data_file, "Preset", temp_str)) {
  73. FURI_LOG_E(TAG, "Missing Preset");
  74. break;
  75. }
  76. furi_string_set_str(
  77. temp_str, subghz_txrx_get_preset_name(txrx, furi_string_get_cstr(temp_str)));
  78. if(!strcmp(furi_string_get_cstr(temp_str), "")) {
  79. break;
  80. }
  81. if(!strcmp(furi_string_get_cstr(temp_str), "CUSTOM")) {
  82. //TODO Does this work properly?
  83. //delete preset if it already exists
  84. subghz_setting_delete_custom_preset(setting, furi_string_get_cstr(temp_str));
  85. //load custom preset from file
  86. if(!subghz_setting_load_custom_preset(
  87. setting, furi_string_get_cstr(temp_str), fff_data_file)) {
  88. FURI_LOG_E(TAG, "Missing Custom preset");
  89. break;
  90. }
  91. // FURI_LOG_E(TAG, "CUSTOM preset is not supported");
  92. // break;
  93. // TODO Custom preset loading logic if need
  94. // sub_preset->freq_preset.preset_index =
  95. // subghz_setting_get_inx_preset_by_name(setting, furi_string_get_cstr(temp_str));
  96. }
  97. furi_string_set(sub_preset->freq_preset.name, temp_str);
  98. // Load protocol
  99. ret = SubRemLoadSubStateErrorProtocol;
  100. if(!flipper_format_read_string(fff_data_file, "Protocol", temp_str)) {
  101. FURI_LOG_E(TAG, "Missing Protocol");
  102. break;
  103. }
  104. FlipperFormat* fff_data = sub_preset->fff_data;
  105. if(!strcmp(furi_string_get_cstr(temp_str), "RAW")) {
  106. //if RAW
  107. subghz_protocol_raw_gen_fff_data(
  108. fff_data,
  109. furi_string_get_cstr(sub_preset->file_path),
  110. subghz_txrx_radio_device_get_name(txrx));
  111. } else {
  112. stream_copy_full(
  113. flipper_format_get_raw_stream(fff_data_file),
  114. flipper_format_get_raw_stream(fff_data));
  115. }
  116. if(subghz_txrx_load_decoder_by_name_protocol(txrx, furi_string_get_cstr(temp_str))) {
  117. SubGhzProtocolStatus status =
  118. subghz_protocol_decoder_base_deserialize(subghz_txrx_get_decoder(txrx), fff_data);
  119. if(status != SubGhzProtocolStatusOk) {
  120. break;
  121. }
  122. } else {
  123. FURI_LOG_E(TAG, "Protocol not found");
  124. break;
  125. }
  126. const SubGhzProtocol* protocol = subghz_txrx_get_decoder(txrx)->protocol;
  127. if(protocol->flag & SubGhzProtocolFlag_Send) {
  128. if((protocol->type == SubGhzProtocolTypeStatic) ||
  129. (protocol->type == SubGhzProtocolTypeDynamic) ||
  130. #ifndef FW_ORIGIN_Official
  131. (protocol->type == SubGhzProtocolTypeBinRAW) ||
  132. #endif
  133. (protocol->type == SubGhzProtocolTypeRAW)) {
  134. sub_preset->type = protocol->type;
  135. } else {
  136. FURI_LOG_E(TAG, "Unsuported Protocol");
  137. break;
  138. }
  139. furi_string_set(sub_preset->protocaol_name, temp_str);
  140. } else {
  141. FURI_LOG_E(TAG, "Protocol does not support transmission");
  142. break;
  143. }
  144. if(!flipper_format_insert_or_update_uint32(fff_data, "Repeat", &repeat, 1)) {
  145. FURI_LOG_E(TAG, "Unable Repeat");
  146. break;
  147. }
  148. ret = SubRemLoadSubStateOK;
  149. #ifdef FURI_DEBUG
  150. FURI_LOG_I(TAG, "%-16s - protocol Loaded", furi_string_get_cstr(sub_preset->label));
  151. #endif
  152. } while(false);
  153. furi_string_free(temp_str);
  154. sub_preset->load_state = ret;
  155. return ret;
  156. }