subghz_scene_receiver_info.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #include "../subghz_i.h"
  2. typedef enum {
  3. SubGhzSceneReceiverInfoCustomEventTxStart,
  4. SubGhzSceneReceiverInfoCustomEventTxStop,
  5. SubGhzSceneReceiverInfoCustomEventSave,
  6. } SubGhzSceneReceiverInfoCustomEvent;
  7. void subghz_scene_receiver_info_callback(GuiButtonType result, InputType type, void* context) {
  8. furi_assert(context);
  9. SubGhz* subghz = context;
  10. if((result == GuiButtonTypeCenter) && (type == InputTypePress)) {
  11. view_dispatcher_send_custom_event(
  12. subghz->view_dispatcher, SubGhzSceneReceiverInfoCustomEventTxStart);
  13. } else if((result == GuiButtonTypeCenter) && (type == InputTypeRelease)) {
  14. view_dispatcher_send_custom_event(
  15. subghz->view_dispatcher, SubGhzSceneReceiverInfoCustomEventTxStop);
  16. } else if((result == GuiButtonTypeRight) && (type == InputTypeShort)) {
  17. view_dispatcher_send_custom_event(
  18. subghz->view_dispatcher, SubGhzSceneReceiverInfoCustomEventSave);
  19. }
  20. }
  21. static bool subghz_scene_receiver_info_update_parser(void* context) {
  22. SubGhz* subghz = context;
  23. subghz->txrx->protocol_result = subghz_parser_get_by_name(
  24. subghz->txrx->parser,
  25. subghz_history_get_name(subghz->txrx->history, subghz->txrx->idx_menu_chosen));
  26. if(subghz->txrx->protocol_result->to_load_protocol != NULL) {
  27. subghz->txrx->protocol_result->to_load_protocol(
  28. subghz->txrx->protocol_result,
  29. subghz_history_get_raw_data(subghz->txrx->history, subghz->txrx->idx_menu_chosen));
  30. subghz->txrx->frequency =
  31. subghz_history_get_frequency(subghz->txrx->history, subghz->txrx->idx_menu_chosen);
  32. subghz->txrx->preset =
  33. subghz_history_get_preset(subghz->txrx->history, subghz->txrx->idx_menu_chosen);
  34. return true;
  35. }
  36. return false;
  37. }
  38. void subghz_scene_receiver_info_on_enter(void* context) {
  39. SubGhz* subghz = context;
  40. if(subghz_scene_receiver_info_update_parser(subghz)) {
  41. char buffer_str[16];
  42. snprintf(
  43. buffer_str,
  44. sizeof(buffer_str),
  45. "%03ld.%02ld",
  46. subghz->txrx->frequency / 1000000 % 1000,
  47. subghz->txrx->frequency / 10000 % 100);
  48. widget_add_string_element(
  49. subghz->widget, 78, 0, AlignLeft, AlignTop, FontSecondary, buffer_str);
  50. if(subghz->txrx->preset == FuriHalSubGhzPresetOok650Async ||
  51. subghz->txrx->preset == FuriHalSubGhzPresetOok270Async) {
  52. snprintf(buffer_str, sizeof(buffer_str), "AM");
  53. } else if(
  54. subghz->txrx->preset == FuriHalSubGhzPreset2FSKDev238Async ||
  55. subghz->txrx->preset == FuriHalSubGhzPreset2FSKDev476Async) {
  56. snprintf(buffer_str, sizeof(buffer_str), "FM");
  57. } else {
  58. furi_crash(NULL);
  59. }
  60. widget_add_string_element(
  61. subghz->widget, 113, 0, AlignLeft, AlignTop, FontSecondary, buffer_str);
  62. string_t text;
  63. string_init(text);
  64. subghz->txrx->protocol_result->to_string(subghz->txrx->protocol_result, text);
  65. widget_add_string_multiline_element(
  66. subghz->widget, 0, 0, AlignLeft, AlignTop, FontSecondary, string_get_cstr(text));
  67. string_clear(text);
  68. if(subghz->txrx->protocol_result && subghz->txrx->protocol_result->to_save_string &&
  69. strcmp(subghz->txrx->protocol_result->name, "KeeLoq")) {
  70. widget_add_button_element(
  71. subghz->widget,
  72. GuiButtonTypeRight,
  73. "Save",
  74. subghz_scene_receiver_info_callback,
  75. subghz);
  76. widget_add_button_element(
  77. subghz->widget,
  78. GuiButtonTypeCenter,
  79. "Send",
  80. subghz_scene_receiver_info_callback,
  81. subghz);
  82. }
  83. } else {
  84. widget_add_icon_element(subghz->widget, 32, 12, &I_DolphinFirstStart7_61x51);
  85. widget_add_string_element(
  86. subghz->widget, 13, 8, AlignLeft, AlignBottom, FontSecondary, "Error history parse.");
  87. }
  88. view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewWidget);
  89. }
  90. bool subghz_scene_receiver_info_on_event(void* context, SceneManagerEvent event) {
  91. SubGhz* subghz = context;
  92. if(event.type == SceneManagerEventTypeCustom) {
  93. if(event.event == SubGhzSceneReceiverInfoCustomEventTxStart) {
  94. //CC1101 Stop RX -> Start TX
  95. if(subghz->txrx->hopper_state != SubGhzHopperStateOFF) {
  96. subghz->txrx->hopper_state = SubGhzHopperStatePause;
  97. }
  98. if(subghz->txrx->txrx_state == SubGhzTxRxStateRx) {
  99. subghz_rx_end(subghz);
  100. }
  101. if(!subghz_scene_receiver_info_update_parser(subghz)) {
  102. return false;
  103. }
  104. if(subghz->txrx->txrx_state == SubGhzTxRxStateIdle) {
  105. if(!subghz_tx_start(subghz)) {
  106. scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowOnlyRx);
  107. } else {
  108. subghz->state_notifications = NOTIFICATION_TX_STATE;
  109. }
  110. }
  111. return true;
  112. } else if(event.event == SubGhzSceneReceiverInfoCustomEventTxStop) {
  113. //CC1101 Stop Tx -> Start RX
  114. subghz->state_notifications = NOTIFICATION_IDLE_STATE;
  115. if(subghz->txrx->txrx_state == SubGhzTxRxStateTx) {
  116. subghz_tx_stop(subghz);
  117. }
  118. if(subghz->txrx->txrx_state == SubGhzTxRxStateIdle) {
  119. subghz_begin(subghz, subghz->txrx->preset);
  120. subghz_rx(subghz, subghz->txrx->frequency);
  121. }
  122. if(subghz->txrx->hopper_state == SubGhzHopperStatePause) {
  123. subghz->txrx->hopper_state = SubGhzHopperStateRunnig;
  124. }
  125. subghz->state_notifications = NOTIFICATION_RX_STATE;
  126. return true;
  127. } else if(event.event == SubGhzSceneReceiverInfoCustomEventSave) {
  128. //CC1101 Stop RX -> Save
  129. subghz->state_notifications = NOTIFICATION_IDLE_STATE;
  130. if(subghz->txrx->hopper_state != SubGhzHopperStateOFF) {
  131. subghz->txrx->hopper_state = SubGhzHopperStateOFF;
  132. }
  133. if(subghz->txrx->txrx_state == SubGhzTxRxStateRx) {
  134. subghz_rx_end(subghz);
  135. subghz_sleep(subghz);
  136. }
  137. if(!subghz_scene_receiver_info_update_parser(subghz)) {
  138. return false;
  139. }
  140. if(subghz->txrx->protocol_result && subghz->txrx->protocol_result->to_save_string &&
  141. strcmp(subghz->txrx->protocol_result->name, "KeeLoq")) {
  142. subghz_file_name_clear(subghz);
  143. scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaveName);
  144. }
  145. return true;
  146. }
  147. } else if(event.type == SceneManagerEventTypeTick) {
  148. if(subghz->txrx->hopper_state != SubGhzHopperStateOFF) {
  149. subghz_hopper_update(subghz);
  150. }
  151. switch(subghz->state_notifications) {
  152. case NOTIFICATION_TX_STATE:
  153. notification_message(subghz->notifications, &sequence_blink_red_10);
  154. break;
  155. case NOTIFICATION_RX_STATE:
  156. notification_message(subghz->notifications, &sequence_blink_blue_10);
  157. break;
  158. default:
  159. break;
  160. }
  161. }
  162. return false;
  163. }
  164. void subghz_scene_receiver_info_on_exit(void* context) {
  165. SubGhz* subghz = context;
  166. widget_clear(subghz->widget);
  167. }