subghz.c 6.7 KB

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