subghz.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  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. // Open Notification record
  56. subghz->notifications = furi_record_open("notification");
  57. // SubMenu
  58. subghz->submenu = submenu_alloc();
  59. view_dispatcher_add_view(
  60. subghz->view_dispatcher, SubGhzViewMenu, submenu_get_view(subghz->submenu));
  61. // Analyze
  62. subghz->subghz_analyze = subghz_analyze_alloc();
  63. view_dispatcher_add_view(
  64. subghz->view_dispatcher,
  65. SubGhzViewAnalyze,
  66. subghz_analyze_get_view(subghz->subghz_analyze));
  67. // Receiver
  68. subghz->subghz_receiver = subghz_receiver_alloc();
  69. view_dispatcher_add_view(
  70. subghz->view_dispatcher,
  71. SubGhzViewReceiver,
  72. subghz_receiver_get_view(subghz->subghz_receiver));
  73. // Dialog
  74. subghz->dialog_ex = dialog_ex_alloc();
  75. view_dispatcher_add_view(
  76. subghz->view_dispatcher, SubGhzViewDialogEx, dialog_ex_get_view(subghz->dialog_ex));
  77. // Popup
  78. subghz->popup = popup_alloc();
  79. view_dispatcher_add_view(
  80. subghz->view_dispatcher, SubGhzViewPopup, popup_get_view(subghz->popup));
  81. // Text Input
  82. subghz->text_input = text_input_alloc();
  83. view_dispatcher_add_view(
  84. subghz->view_dispatcher, SubGhzViewTextInput, text_input_get_view(subghz->text_input));
  85. // Transmitter
  86. subghz->subghz_transmitter = subghz_transmitter_alloc();
  87. view_dispatcher_add_view(
  88. subghz->view_dispatcher,
  89. SubGhzViewTransmitter,
  90. subghz_transmitter_get_view(subghz->subghz_transmitter));
  91. // Carrier Test Module
  92. subghz->subghz_test_carrier = subghz_test_carrier_alloc();
  93. view_dispatcher_add_view(
  94. subghz->view_dispatcher,
  95. SubGhzViewTestCarrier,
  96. subghz_test_carrier_get_view(subghz->subghz_test_carrier));
  97. // Packet Test
  98. subghz->subghz_test_packet = subghz_test_packet_alloc();
  99. view_dispatcher_add_view(
  100. subghz->view_dispatcher,
  101. SubGhzViewTestPacket,
  102. subghz_test_packet_get_view(subghz->subghz_test_packet));
  103. // Static send
  104. subghz->subghz_static = subghz_static_alloc();
  105. view_dispatcher_add_view(
  106. subghz->view_dispatcher, SubGhzViewStatic, subghz_static_get_view(subghz->subghz_static));
  107. //init Worker & Protocol
  108. subghz->worker = subghz_worker_alloc();
  109. subghz->protocol = subghz_protocol_alloc();
  110. subghz_worker_set_overrun_callback(
  111. subghz->worker, (SubGhzWorkerOverrunCallback)subghz_protocol_reset);
  112. subghz_worker_set_pair_callback(
  113. subghz->worker, (SubGhzWorkerPairCallback)subghz_protocol_parse);
  114. subghz_worker_set_context(subghz->worker, subghz->protocol);
  115. subghz_protocol_load_keeloq_file(subghz->protocol, "/ext/assets/subghz/keeloq_mfcodes");
  116. subghz_protocol_load_nice_flor_s_file(subghz->protocol, "/ext/assets/subghz/nice_floor_s_rx");
  117. //subghz_protocol_enable_dump_text(subghz->protocol, subghz_text_callback, subghz);
  118. return subghz;
  119. }
  120. void subghz_free(SubGhz* subghz) {
  121. furi_assert(subghz);
  122. // Packet Test
  123. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewTestPacket);
  124. subghz_test_packet_free(subghz->subghz_test_packet);
  125. // Carrier Test
  126. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewTestCarrier);
  127. subghz_test_carrier_free(subghz->subghz_test_carrier);
  128. // Static
  129. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewStatic);
  130. subghz_static_free(subghz->subghz_static);
  131. // Analyze
  132. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewAnalyze);
  133. subghz_analyze_free(subghz->subghz_analyze);
  134. // Receiver
  135. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewReceiver);
  136. subghz_receiver_free(subghz->subghz_receiver);
  137. // TextInput
  138. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewTextInput);
  139. text_input_free(subghz->text_input);
  140. // Receiver
  141. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewTransmitter);
  142. subghz_transmitter_free(subghz->subghz_transmitter);
  143. // Submenu
  144. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewMenu);
  145. submenu_free(subghz->submenu);
  146. // DialogEx
  147. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewDialogEx);
  148. dialog_ex_free(subghz->dialog_ex);
  149. // Popup
  150. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewPopup);
  151. popup_free(subghz->popup);
  152. // Scene manager
  153. scene_manager_free(subghz->scene_manager);
  154. // View Dispatcher
  155. view_dispatcher_free(subghz->view_dispatcher);
  156. // GUI
  157. furi_record_close("gui");
  158. subghz->gui = NULL;
  159. //Worker & Protocol
  160. subghz_protocol_free(subghz->protocol);
  161. subghz_worker_free(subghz->worker);
  162. // Notifications
  163. furi_record_close("notification");
  164. subghz->notifications = NULL;
  165. // The rest
  166. free(subghz);
  167. }
  168. int32_t subghz_app(void* p) {
  169. SubGhz* subghz = subghz_alloc();
  170. // Check argument and run corresponding scene
  171. if(p && subghz_key_load(subghz, p)) {
  172. scene_manager_next_scene(subghz->scene_manager, SubGhzSceneTransmitter);
  173. } else {
  174. scene_manager_next_scene(subghz->scene_manager, SubGhzSceneStart);
  175. }
  176. view_dispatcher_run(subghz->view_dispatcher);
  177. subghz_free(subghz);
  178. return 0;
  179. }