subghz_scene_transmitter.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include "../subghz_i.h"
  2. #include "../views/subghz_transmitter.h"
  3. #include <lib/subghz/protocols/subghz_protocol_keeloq.h>
  4. void subghz_scene_transmitter_callback(SubghzTransmitterEvent event, void* context) {
  5. furi_assert(context);
  6. SubGhz* subghz = context;
  7. view_dispatcher_send_custom_event(subghz->view_dispatcher, event);
  8. }
  9. static void subghz_scene_transmitter_update_data_show(void* context) {
  10. SubGhz* subghz = context;
  11. if(subghz->txrx->protocol_result && subghz->txrx->protocol_result->get_upload_protocol) {
  12. string_t key_str;
  13. string_init(key_str);
  14. char frequency_str[10];
  15. char preset_str[6];
  16. uint8_t show_button = 0;
  17. subghz->txrx->protocol_result->to_string(subghz->txrx->protocol_result, key_str);
  18. if((!strcmp(subghz->txrx->protocol_result->name, "KeeLoq")) &&
  19. (!strcmp(
  20. subghz_protocol_keeloq_get_manufacture_name(subghz->txrx->protocol_result),
  21. "Unknown"))) {
  22. show_button = 0;
  23. } else {
  24. show_button = 1;
  25. }
  26. snprintf(
  27. frequency_str,
  28. sizeof(frequency_str),
  29. "%03ld.%02ld",
  30. subghz->txrx->frequency / 1000000 % 1000,
  31. subghz->txrx->frequency / 10000 % 100);
  32. if(subghz->txrx->preset == FuriHalSubGhzPresetOok650Async ||
  33. subghz->txrx->preset == FuriHalSubGhzPresetOok270Async) {
  34. snprintf(preset_str, sizeof(preset_str), "AM");
  35. } else if(subghz->txrx->preset == FuriHalSubGhzPreset2FSKAsync) {
  36. snprintf(preset_str, sizeof(preset_str), "FM");
  37. } else {
  38. furi_crash(NULL);
  39. }
  40. subghz_transmitter_add_data_to_show(
  41. subghz->subghz_transmitter,
  42. string_get_cstr(key_str),
  43. frequency_str,
  44. preset_str,
  45. show_button);
  46. string_clear(key_str);
  47. } else {
  48. string_set(subghz->error_str, "Protocol not found");
  49. scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError);
  50. }
  51. }
  52. void subghz_scene_transmitter_on_enter(void* context) {
  53. SubGhz* subghz = context;
  54. subghz_transmitter_set_callback(
  55. subghz->subghz_transmitter, subghz_scene_transmitter_callback, subghz);
  56. subghz_scene_transmitter_update_data_show(subghz);
  57. subghz->state_notifications = NOTIFICATION_IDLE_STATE;
  58. view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewTransmitter);
  59. }
  60. bool subghz_scene_transmitter_on_event(void* context, SceneManagerEvent event) {
  61. SubGhz* subghz = context;
  62. if(event.type == SceneManagerEventTypeCustom) {
  63. if(event.event == SubghzTransmitterEventSendStart) {
  64. subghz->state_notifications = NOTIFICATION_IDLE_STATE;
  65. if(subghz->txrx->txrx_state == SubGhzTxRxStateRx) {
  66. subghz_rx_end(subghz);
  67. }
  68. if((subghz->txrx->txrx_state == SubGhzTxRxStateIdle) ||
  69. (subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) {
  70. if(!subghz_tx_start(subghz)) {
  71. scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowOnlyRx);
  72. } else {
  73. subghz->state_notifications = NOTIFICATION_TX_STATE;
  74. subghz_scene_transmitter_update_data_show(subghz);
  75. }
  76. }
  77. return true;
  78. } else if(event.event == SubghzTransmitterEventSendStop) {
  79. subghz->state_notifications = NOTIFICATION_IDLE_STATE;
  80. if(subghz->txrx->txrx_state == SubGhzTxRxStateTx) {
  81. subghz_tx_stop(subghz);
  82. subghz_sleep(subghz);
  83. }
  84. return true;
  85. } else if(event.event == SubghzTransmitterEventBack) {
  86. subghz->state_notifications = NOTIFICATION_IDLE_STATE;
  87. scene_manager_search_and_switch_to_previous_scene(
  88. subghz->scene_manager, SubGhzSceneStart);
  89. return true;
  90. }
  91. } else if(event.type == SceneManagerEventTypeTick) {
  92. if(subghz->state_notifications == NOTIFICATION_TX_STATE) {
  93. notification_message(subghz->notifications, &sequence_blink_red_10);
  94. }
  95. return true;
  96. }
  97. return false;
  98. }
  99. void subghz_scene_transmitter_on_exit(void* context) {
  100. SubGhz* subghz = context;
  101. subghz->state_notifications = NOTIFICATION_IDLE_STATE;
  102. }