subghz.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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_test_static = subghz_test_static_alloc();
  105. view_dispatcher_add_view(
  106. subghz->view_dispatcher,
  107. SubGhzViewStatic,
  108. subghz_test_static_get_view(subghz->subghz_test_static));
  109. //init Worker & Protocol
  110. subghz->worker = subghz_worker_alloc();
  111. subghz->protocol = subghz_protocol_alloc();
  112. subghz_worker_set_overrun_callback(
  113. subghz->worker, (SubGhzWorkerOverrunCallback)subghz_protocol_reset);
  114. subghz_worker_set_pair_callback(
  115. subghz->worker, (SubGhzWorkerPairCallback)subghz_protocol_parse);
  116. subghz_worker_set_context(subghz->worker, subghz->protocol);
  117. subghz_protocol_load_keeloq_file(subghz->protocol, "/ext/assets/subghz/keeloq_mfcodes");
  118. subghz_protocol_load_nice_flor_s_file(subghz->protocol, "/ext/assets/subghz/nice_floor_s_rx");
  119. //subghz_protocol_enable_dump_text(subghz->protocol, subghz_text_callback, subghz);
  120. return subghz;
  121. }
  122. void subghz_free(SubGhz* subghz) {
  123. furi_assert(subghz);
  124. // Packet Test
  125. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewTestPacket);
  126. subghz_test_packet_free(subghz->subghz_test_packet);
  127. // Carrier Test
  128. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewTestCarrier);
  129. subghz_test_carrier_free(subghz->subghz_test_carrier);
  130. // Static
  131. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewStatic);
  132. subghz_test_static_free(subghz->subghz_test_static);
  133. // Analyze
  134. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewAnalyze);
  135. subghz_analyze_free(subghz->subghz_analyze);
  136. // Receiver
  137. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewReceiver);
  138. subghz_receiver_free(subghz->subghz_receiver);
  139. // TextInput
  140. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewTextInput);
  141. text_input_free(subghz->text_input);
  142. // Receiver
  143. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewTransmitter);
  144. subghz_transmitter_free(subghz->subghz_transmitter);
  145. // Submenu
  146. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewMenu);
  147. submenu_free(subghz->submenu);
  148. // DialogEx
  149. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewDialogEx);
  150. dialog_ex_free(subghz->dialog_ex);
  151. // Popup
  152. view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewPopup);
  153. popup_free(subghz->popup);
  154. // Scene manager
  155. scene_manager_free(subghz->scene_manager);
  156. // View Dispatcher
  157. view_dispatcher_free(subghz->view_dispatcher);
  158. // GUI
  159. furi_record_close("gui");
  160. subghz->gui = NULL;
  161. //Worker & Protocol
  162. subghz_protocol_free(subghz->protocol);
  163. subghz_worker_free(subghz->worker);
  164. // Notifications
  165. furi_record_close("notification");
  166. subghz->notifications = NULL;
  167. // The rest
  168. free(subghz);
  169. }
  170. int32_t subghz_app(void* p) {
  171. SubGhz* subghz = subghz_alloc();
  172. // Check argument and run corresponding scene
  173. if(p && subghz_key_load(subghz, p)) {
  174. scene_manager_next_scene(subghz->scene_manager, SubGhzSceneTransmitter);
  175. } else {
  176. scene_manager_next_scene(subghz->scene_manager, SubGhzSceneStart);
  177. }
  178. view_dispatcher_run(subghz->view_dispatcher);
  179. subghz_free(subghz);
  180. return 0;
  181. }