subghz_scene_read_raw.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #include "../subghz_i.h"
  2. #include "../views/subghz_read_raw.h"
  3. #include <lib/subghz/protocols/subghz_protocol_raw.h>
  4. #include <lib/subghz/subghz_parser.h>
  5. static void subghz_scene_read_raw_update_statusbar(void* context) {
  6. furi_assert(context);
  7. SubGhz* subghz = context;
  8. char frequency_str[20];
  9. char preset_str[10];
  10. snprintf(
  11. frequency_str,
  12. sizeof(frequency_str),
  13. "%03ld.%02ld",
  14. subghz->txrx->frequency / 1000000 % 1000,
  15. subghz->txrx->frequency / 10000 % 100);
  16. if(subghz->txrx->preset == FuriHalSubGhzPresetOok650Async ||
  17. subghz->txrx->preset == FuriHalSubGhzPresetOok270Async) {
  18. snprintf(preset_str, sizeof(preset_str), "AM");
  19. } else if(
  20. subghz->txrx->preset == FuriHalSubGhzPreset2FSKDev238Async ||
  21. subghz->txrx->preset == FuriHalSubGhzPreset2FSKDev476Async) {
  22. snprintf(preset_str, sizeof(preset_str), "FM");
  23. } else {
  24. furi_crash(NULL);
  25. }
  26. subghz_read_raw_add_data_statusbar(subghz->subghz_read_raw, frequency_str, preset_str);
  27. }
  28. void subghz_scene_read_raw_callback(SubghzCustomEvent event, void* context) {
  29. furi_assert(context);
  30. SubGhz* subghz = context;
  31. view_dispatcher_send_custom_event(subghz->view_dispatcher, event);
  32. }
  33. void subghz_scene_read_raw_on_enter(void* context) {
  34. SubGhz* subghz = context;
  35. if(subghz->txrx->rx_key_state == SubGhzRxKeyStateNeedSave) {
  36. view_dispatcher_send_custom_event(
  37. subghz->view_dispatcher, SubghzCustomEventViewReadRAWMore);
  38. } else {
  39. subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE;
  40. }
  41. subghz_scene_read_raw_update_statusbar(subghz);
  42. subghz_read_raw_set_callback(subghz->subghz_read_raw, subghz_scene_read_raw_callback, subghz);
  43. subghz->txrx->protocol_result = subghz_parser_get_by_name(subghz->txrx->parser, "RAW");
  44. furi_assert(subghz->txrx->protocol_result);
  45. subghz_worker_set_pair_callback(
  46. subghz->txrx->worker, (SubGhzWorkerPairCallback)subghz_parser_raw_parse);
  47. view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewReadRAW);
  48. }
  49. bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
  50. SubGhz* subghz = context;
  51. if(event.type == SceneManagerEventTypeCustom) {
  52. switch(event.event) {
  53. case SubghzCustomEventViewReadRAWBack:
  54. if(subghz->txrx->txrx_state == SubGhzTxRxStateRx) {
  55. subghz_rx_end(subghz);
  56. subghz_sleep(subghz);
  57. };
  58. subghz->txrx->frequency = subghz_frequencies[subghz_frequencies_433_92];
  59. subghz->txrx->preset = FuriHalSubGhzPresetOok650Async;
  60. subghz_protocol_raw_save_to_file_stop(
  61. (SubGhzProtocolRAW*)subghz->txrx->protocol_result);
  62. subghz->state_notifications = NOTIFICATION_IDLE_STATE;
  63. if(subghz->txrx->rx_key_state == SubGhzRxKeyStateAddKey) {
  64. subghz->txrx->rx_key_state = SubGhzRxKeyStateExit;
  65. scene_manager_next_scene(subghz->scene_manager, SubGhzSceneNeedSaving);
  66. } else {
  67. scene_manager_search_and_switch_to_previous_scene(
  68. subghz->scene_manager, SubGhzSceneStart);
  69. }
  70. return true;
  71. break;
  72. case SubghzCustomEventViewReadRAWConfig:
  73. scene_manager_set_scene_state(
  74. subghz->scene_manager, SubGhzSceneReadRAW, SubghzCustomEventManagerSet);
  75. scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReceiverConfig);
  76. return true;
  77. break;
  78. case SubghzCustomEventViewReadRAWIDLE:
  79. if(subghz->txrx->txrx_state == SubGhzTxRxStateRx) {
  80. subghz_rx_end(subghz);
  81. subghz_sleep(subghz);
  82. };
  83. subghz_protocol_raw_save_to_file_stop(
  84. (SubGhzProtocolRAW*)subghz->txrx->protocol_result);
  85. subghz->state_notifications = NOTIFICATION_IDLE_STATE;
  86. subghz->txrx->rx_key_state = SubGhzRxKeyStateAddKey;
  87. return true;
  88. break;
  89. case SubghzCustomEventViewReadRAWREC:
  90. if(subghz->txrx->rx_key_state != SubGhzRxKeyStateIDLE) {
  91. scene_manager_next_scene(subghz->scene_manager, SubGhzSceneNeedSaving);
  92. } else {
  93. if(subghz_protocol_raw_save_to_file_init(
  94. (SubGhzProtocolRAW*)subghz->txrx->protocol_result,
  95. "Raw_temp",
  96. subghz->txrx->frequency,
  97. subghz->txrx->preset)) {
  98. if((subghz->txrx->txrx_state == SubGhzTxRxStateIDLE) ||
  99. (subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) {
  100. subghz_begin(subghz, subghz->txrx->preset);
  101. subghz_rx(subghz, subghz->txrx->frequency);
  102. }
  103. subghz->state_notifications = NOTIFICATION_RX_STATE;
  104. } else {
  105. string_set(subghz->error_str, "No SD card");
  106. scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError);
  107. }
  108. }
  109. return true;
  110. break;
  111. case SubghzCustomEventViewReadRAWMore:
  112. if(strcmp(
  113. subghz_protocol_get_last_file_name(
  114. (SubGhzProtocolRAW*)subghz->txrx->protocol_result),
  115. "")) {
  116. strlcpy(
  117. subghz->file_name,
  118. subghz_protocol_get_last_file_name(
  119. (SubGhzProtocolRAW*)subghz->txrx->protocol_result),
  120. strlen(subghz_protocol_get_last_file_name(
  121. (SubGhzProtocolRAW*)subghz->txrx->protocol_result)) +
  122. 1);
  123. //set the path to read the file
  124. string_t temp_str;
  125. string_init_printf(
  126. temp_str,
  127. "%s/%s%s",
  128. SUBGHZ_APP_PATH_FOLDER,
  129. subghz->file_name,
  130. SUBGHZ_APP_EXTENSION);
  131. subghz_protocol_set_last_file_name(
  132. (SubGhzProtocolRAW*)subghz->txrx->protocol_result, string_get_cstr(temp_str));
  133. string_clear(temp_str);
  134. scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReadRAWMenu);
  135. }
  136. return true;
  137. break;
  138. default:
  139. break;
  140. }
  141. } else if(event.type == SceneManagerEventTypeTick) {
  142. switch(subghz->state_notifications) {
  143. case NOTIFICATION_RX_STATE:
  144. notification_message(subghz->notifications, &sequence_blink_blue_10);
  145. subghz_read_raw_update_sample_write(
  146. subghz->subghz_read_raw,
  147. subghz_protocol_raw_get_sample_write(
  148. (SubGhzProtocolRAW*)subghz->txrx->protocol_result));
  149. subghz_read_raw_add_data_rssi(subghz->subghz_read_raw, furi_hal_subghz_get_rssi());
  150. break;
  151. default:
  152. break;
  153. }
  154. }
  155. return false;
  156. }
  157. void subghz_scene_read_raw_on_exit(void* context) {
  158. SubGhz* subghz = context;
  159. //Stop CC1101
  160. if(subghz->txrx->txrx_state == SubGhzTxRxStateRx) {
  161. subghz_rx_end(subghz);
  162. subghz_sleep(subghz);
  163. };
  164. subghz->state_notifications = NOTIFICATION_IDLE_STATE;
  165. //Сallback restoration
  166. subghz_worker_set_pair_callback(
  167. subghz->txrx->worker, (SubGhzWorkerPairCallback)subghz_parser_parse);
  168. }