subghz.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. #include "subghz_i.h"
  2. const uint32_t subghz_frequencies[] = {
  3. /* 300 - 348 */
  4. 300000000,
  5. 315000000,
  6. 348000000,
  7. /* 387 - 464 */
  8. 387000000,
  9. 433075000, /* LPD433 first */
  10. 433920000, /* LPD433 mid */
  11. 434775000, /* LPD433 last channels */
  12. 438900000,
  13. 464000000,
  14. /* 779 - 928 */
  15. 779000000,
  16. 868350000,
  17. 915000000,
  18. 925000000,
  19. 928000000,
  20. };
  21. const uint32_t subghz_frequencies_count = sizeof(subghz_frequencies) / sizeof(uint32_t);
  22. const uint32_t subghz_frequencies_433_92 = 5;
  23. bool subghz_custom_event_callback(void* context, uint32_t event) {
  24. furi_assert(context);
  25. SubGhz* subghz = context;
  26. return scene_manager_handle_custom_event(subghz->scene_manager, event);
  27. }
  28. bool subghz_back_event_callback(void* context) {
  29. furi_assert(context);
  30. SubGhz* subghz = context;
  31. return scene_manager_handle_back_event(subghz->scene_manager);
  32. }
  33. void subghz_tick_event_callback(void* context) {
  34. furi_assert(context);
  35. SubGhz* subghz = context;
  36. scene_manager_handle_tick_event(subghz->scene_manager);
  37. }
  38. SubGhz* subghz_alloc() {
  39. SubGhz* subghz = furi_alloc(sizeof(SubGhz));
  40. // GUI
  41. subghz->gui = furi_record_open("gui");
  42. // View Dispatcher
  43. subghz->view_dispatcher = view_dispatcher_alloc();
  44. view_dispatcher_enable_queue(subghz->view_dispatcher);
  45. view_dispatcher_attach_to_gui(
  46. subghz->view_dispatcher, subghz->gui, ViewDispatcherTypeFullscreen);
  47. subghz->scene_manager = scene_manager_alloc(&subghz_scene_handlers, subghz);
  48. view_dispatcher_set_event_callback_context(subghz->view_dispatcher, subghz);
  49. view_dispatcher_set_custom_event_callback(
  50. subghz->view_dispatcher, subghz_custom_event_callback);
  51. view_dispatcher_set_navigation_event_callback(
  52. subghz->view_dispatcher, subghz_back_event_callback);
  53. view_dispatcher_set_tick_event_callback(
  54. subghz->view_dispatcher, subghz_tick_event_callback, 100);
  55. // SubMenu
  56. subghz->submenu = submenu_alloc();
  57. view_dispatcher_add_view(
  58. subghz->view_dispatcher, SubGhzViewMenu, submenu_get_view(subghz->submenu));
  59. // Analyze
  60. subghz->subghz_analyze = subghz_analyze_alloc();
  61. view_dispatcher_add_view(
  62. subghz->view_dispatcher,
  63. SubGhzViewAnalyze,
  64. subghz_analyze_get_view(subghz->subghz_analyze));
  65. // Receiver
  66. subghz->subghz_receiver = subghz_receiver_alloc();
  67. view_dispatcher_add_view(
  68. subghz->view_dispatcher,
  69. SubGhzViewReceiver,
  70. subghz_receiver_get_view(subghz->subghz_receiver));
  71. // Dialog
  72. subghz->dialog_ex = dialog_ex_alloc();
  73. view_dispatcher_add_view(
  74. subghz->view_dispatcher, SubGhzViewDialogEx, dialog_ex_get_view(subghz->dialog_ex));
  75. // Popup
  76. subghz->popup = popup_alloc();
  77. view_dispatcher_add_view(
  78. subghz->view_dispatcher, SubGhzViewPopup, popup_get_view(subghz->popup));
  79. // Text Input
  80. subghz->text_input = text_input_alloc();
  81. view_dispatcher_add_view(
  82. subghz->view_dispatcher, SubGhzViewTextInput, text_input_get_view(subghz->text_input));
  83. // Transmitter
  84. subghz->subghz_transmitter = subghz_transmitter_alloc();
  85. view_dispatcher_add_view(
  86. subghz->view_dispatcher,
  87. SubGhzViewTransmitter,
  88. subghz_transmitter_get_view(subghz->subghz_transmitter));
  89. // Carrier Test Module
  90. subghz->subghz_test_carrier = subghz_test_carrier_alloc();
  91. view_dispatcher_add_view(
  92. subghz->view_dispatcher,
  93. SubGhzViewTestCarrier,
  94. subghz_test_carrier_get_view(subghz->subghz_test_carrier));
  95. // Packet Test
  96. subghz->subghz_test_packet = subghz_test_packet_alloc();
  97. view_dispatcher_add_view(
  98. subghz->view_dispatcher,
  99. SubGhzViewTestPacket,
  100. subghz_test_packet_get_view(subghz->subghz_test_packet));
  101. // Static send
  102. subghz->subghz_static = subghz_static_alloc();
  103. view_dispatcher_add_view(
  104. subghz->view_dispatcher, SubGhzViewStatic, subghz_static_get_view(subghz->subghz_static));
  105. //init Worker & Protocol
  106. subghz->worker = subghz_worker_alloc();
  107. subghz->protocol = subghz_protocol_alloc();
  108. subghz_worker_set_overrun_callback(
  109. subghz->worker, (SubGhzWorkerOverrunCallback)subghz_protocol_reset);
  110. subghz_worker_set_pair_callback(
  111. subghz->worker, (SubGhzWorkerPairCallback)subghz_protocol_parse);
  112. subghz_worker_set_context(subghz->worker, subghz->protocol);
  113. subghz_protocol_load_keeloq_file(subghz->protocol, "/ext/assets/subghz/keeloq_mfcodes");
  114. subghz_protocol_load_nice_flor_s_file(subghz->protocol, "/ext/assets/subghz/nice_floor_s_rx");
  115. //subghz_protocol_enable_dump_text(subghz->protocol, subghz_text_callback, subghz);
  116. return subghz;
  117. }
  118. void subghz_free(SubGhz* subghz) {
  119. furi_assert(subghz);
  120. // Packet Test
  121. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewTestPacket);
  122. subghz_test_packet_free(subghz->subghz_test_packet);
  123. // Carrier Test
  124. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewTestCarrier);
  125. subghz_test_carrier_free(subghz->subghz_test_carrier);
  126. // Static
  127. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewStatic);
  128. subghz_static_free(subghz->subghz_static);
  129. // Analyze
  130. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewAnalyze);
  131. subghz_analyze_free(subghz->subghz_analyze);
  132. // Receiver
  133. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewReceiver);
  134. subghz_receiver_free(subghz->subghz_receiver);
  135. // TextInput
  136. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewTextInput);
  137. text_input_free(subghz->text_input);
  138. // Receiver
  139. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewTransmitter);
  140. subghz_transmitter_free(subghz->subghz_transmitter);
  141. // Submenu
  142. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewMenu);
  143. submenu_free(subghz->submenu);
  144. // DialogEx
  145. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewDialogEx);
  146. dialog_ex_free(subghz->dialog_ex);
  147. // Popup
  148. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewPopup);
  149. popup_free(subghz->popup);
  150. // Scene manager
  151. scene_manager_free(subghz->scene_manager);
  152. // View Dispatcher
  153. view_dispatcher_free(subghz->view_dispatcher);
  154. // GUI
  155. furi_record_close("gui");
  156. subghz->gui = NULL;
  157. //Worker & Protocol
  158. subghz_protocol_free(subghz->protocol);
  159. subghz_worker_free(subghz->worker);
  160. // The rest
  161. free(subghz);
  162. }
  163. int32_t subghz_app(void* p) {
  164. SubGhz* subghz = subghz_alloc();
  165. // Check argument and run corresponding scene
  166. if(p && subghz_key_load(subghz, p)) {
  167. scene_manager_next_scene(subghz->scene_manager, SubGhzSceneTransmitter);
  168. } else {
  169. scene_manager_next_scene(subghz->scene_manager, SubGhzSceneStart);
  170. }
  171. view_dispatcher_run(subghz->view_dispatcher);
  172. subghz_free(subghz);
  173. return 0;
  174. }