subghz_scene_transmitter.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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(
  36. subghz->txrx->preset == FuriHalSubGhzPreset2FSKDev238Async ||
  37. subghz->txrx->preset == FuriHalSubGhzPreset2FSKDev476Async) {
  38. snprintf(preset_str, sizeof(preset_str), "FM");
  39. } else {
  40. furi_crash(NULL);
  41. }
  42. subghz_transmitter_add_data_to_show(
  43. subghz->subghz_transmitter,
  44. string_get_cstr(key_str),
  45. frequency_str,
  46. preset_str,
  47. show_button);
  48. string_clear(key_str);
  49. } else {
  50. string_set(subghz->error_str, "Protocol not found");
  51. scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError);
  52. }
  53. }
  54. void subghz_scene_transmitter_on_enter(void* context) {
  55. SubGhz* subghz = context;
  56. subghz_transmitter_set_callback(
  57. subghz->subghz_transmitter, subghz_scene_transmitter_callback, subghz);
  58. subghz_scene_transmitter_update_data_show(subghz);
  59. subghz->state_notifications = NOTIFICATION_IDLE_STATE;
  60. view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewTransmitter);
  61. }
  62. bool subghz_scene_transmitter_on_event(void* context, SceneManagerEvent event) {
  63. SubGhz* subghz = context;
  64. if(event.type == SceneManagerEventTypeCustom) {
  65. if(event.event == SubghzTransmitterEventSendStart) {
  66. subghz->state_notifications = NOTIFICATION_IDLE_STATE;
  67. if(subghz->txrx->txrx_state == SubGhzTxRxStateRx) {
  68. subghz_rx_end(subghz);
  69. }
  70. if((subghz->txrx->txrx_state == SubGhzTxRxStateIdle) ||
  71. (subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) {
  72. if(!subghz_tx_start(subghz)) {
  73. scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowOnlyRx);
  74. } else {
  75. subghz->state_notifications = NOTIFICATION_TX_STATE;
  76. subghz_scene_transmitter_update_data_show(subghz);
  77. }
  78. }
  79. return true;
  80. } else if(event.event == SubghzTransmitterEventSendStop) {
  81. subghz->state_notifications = NOTIFICATION_IDLE_STATE;
  82. if(subghz->txrx->txrx_state == SubGhzTxRxStateTx) {
  83. subghz_tx_stop(subghz);
  84. subghz_sleep(subghz);
  85. }
  86. return true;
  87. } else if(event.event == SubghzTransmitterEventBack) {
  88. subghz->state_notifications = NOTIFICATION_IDLE_STATE;
  89. scene_manager_search_and_switch_to_previous_scene(
  90. subghz->scene_manager, SubGhzSceneStart);
  91. return true;
  92. }
  93. } else if(event.type == SceneManagerEventTypeTick) {
  94. if(subghz->state_notifications == NOTIFICATION_TX_STATE) {
  95. notification_message(subghz->notifications, &sequence_blink_red_10);
  96. }
  97. return true;
  98. }
  99. return false;
  100. }
  101. void subghz_scene_transmitter_on_exit(void* context) {
  102. SubGhz* subghz = context;
  103. subghz->state_notifications = NOTIFICATION_IDLE_STATE;
  104. }