subghz_scene_transmitter.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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(SubghzCustomEvent event, void* context) {
  5. furi_assert(context);
  6. SubGhz* subghz = context;
  7. view_dispatcher_send_custom_event(subghz->view_dispatcher, event);
  8. }
  9. bool 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. return true;
  50. }
  51. return false;
  52. }
  53. void subghz_scene_transmitter_on_enter(void* context) {
  54. SubGhz* subghz = context;
  55. if(!subghz_scene_transmitter_update_data_show(subghz)) {
  56. view_dispatcher_send_custom_event(
  57. subghz->view_dispatcher, SubghzCustomEventViewTransmitterError);
  58. }
  59. subghz_transmitter_set_callback(
  60. subghz->subghz_transmitter, subghz_scene_transmitter_callback, subghz);
  61. subghz->state_notifications = NOTIFICATION_IDLE_STATE;
  62. view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewTransmitter);
  63. }
  64. bool subghz_scene_transmitter_on_event(void* context, SceneManagerEvent event) {
  65. SubGhz* subghz = context;
  66. if(event.type == SceneManagerEventTypeCustom) {
  67. if(event.event == SubghzCustomEventViewTransmitterSendStart) {
  68. subghz->state_notifications = NOTIFICATION_IDLE_STATE;
  69. if(subghz->txrx->txrx_state == SubGhzTxRxStateRx) {
  70. subghz_rx_end(subghz);
  71. }
  72. if((subghz->txrx->txrx_state == SubGhzTxRxStateIDLE) ||
  73. (subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) {
  74. if(!subghz_tx_start(subghz)) {
  75. scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowOnlyRx);
  76. } else {
  77. subghz->state_notifications = NOTIFICATION_TX_STATE;
  78. subghz_scene_transmitter_update_data_show(subghz);
  79. }
  80. }
  81. return true;
  82. } else if(event.event == SubghzCustomEventViewTransmitterSendStop) {
  83. subghz->state_notifications = NOTIFICATION_IDLE_STATE;
  84. if(subghz->txrx->txrx_state == SubGhzTxRxStateTx) {
  85. subghz_tx_stop(subghz);
  86. subghz_sleep(subghz);
  87. }
  88. return true;
  89. } else if(event.event == SubghzCustomEventViewTransmitterBack) {
  90. subghz->state_notifications = NOTIFICATION_IDLE_STATE;
  91. scene_manager_search_and_switch_to_previous_scene(
  92. subghz->scene_manager, SubGhzSceneStart);
  93. return true;
  94. } else if(event.event == SubghzCustomEventViewTransmitterError) {
  95. string_set(subghz->error_str, "Protocol not found");
  96. scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError);
  97. }
  98. } else if(event.type == SceneManagerEventTypeTick) {
  99. if(subghz->state_notifications == NOTIFICATION_TX_STATE) {
  100. notification_message(subghz->notifications, &sequence_blink_red_10);
  101. }
  102. return true;
  103. }
  104. return false;
  105. }
  106. void subghz_scene_transmitter_on_exit(void* context) {
  107. SubGhz* subghz = context;
  108. subghz->state_notifications = NOTIFICATION_IDLE_STATE;
  109. }