subghz_scene_receiver_info.c 6.7 KB

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