subbrute.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. #include "subbrute_i.h"
  2. #include "scenes/subbrute_scene.h"
  3. #define TAG "SubBruteApp"
  4. static bool subbrute_custom_event_callback(void* context, uint32_t event) {
  5. furi_assert(context);
  6. SubBruteState* instance = context;
  7. return scene_manager_handle_custom_event(instance->scene_manager, event);
  8. }
  9. static bool subbrute_back_event_callback(void* context) {
  10. furi_assert(context);
  11. SubBruteState* instance = context;
  12. return scene_manager_handle_back_event(instance->scene_manager);
  13. }
  14. static void subbrute_tick_event_callback(void* context) {
  15. furi_assert(context);
  16. SubBruteState* instance = context;
  17. scene_manager_handle_tick_event(instance->scene_manager);
  18. }
  19. SubBruteState* subbrute_alloc() {
  20. SubBruteState* instance = malloc(sizeof(SubBruteState));
  21. memset(instance->text_store, 0, sizeof(instance->text_store));
  22. instance->file_path = furi_string_alloc();
  23. instance->scene_manager = scene_manager_alloc(&subbrute_scene_handlers, instance);
  24. instance->view_dispatcher = view_dispatcher_alloc();
  25. instance->gui = furi_record_open(RECORD_GUI);
  26. view_dispatcher_enable_queue(instance->view_dispatcher);
  27. view_dispatcher_set_event_callback_context(instance->view_dispatcher, instance);
  28. view_dispatcher_set_custom_event_callback(
  29. instance->view_dispatcher, subbrute_custom_event_callback);
  30. view_dispatcher_set_navigation_event_callback(
  31. instance->view_dispatcher, subbrute_back_event_callback);
  32. view_dispatcher_set_tick_event_callback(
  33. instance->view_dispatcher, subbrute_tick_event_callback, 100);
  34. //Dialog
  35. instance->dialogs = furi_record_open(RECORD_DIALOGS);
  36. // Notifications
  37. instance->notifications = furi_record_open(RECORD_NOTIFICATION);
  38. subghz_devices_init();
  39. // init radio device
  40. instance->radio_device = subbrute_radio_device_loader_set(
  41. instance->radio_device, SubGhzRadioDeviceTypeExternalCC1101);
  42. subghz_devices_reset(instance->radio_device);
  43. subghz_devices_idle(instance->radio_device);
  44. // Devices
  45. instance->device = subbrute_device_alloc(instance->radio_device);
  46. // SubBruteWorker
  47. instance->worker = subbrute_worker_alloc(instance->radio_device);
  48. // TextInput
  49. instance->text_input = text_input_alloc();
  50. view_dispatcher_add_view(
  51. instance->view_dispatcher,
  52. SubBruteViewTextInput,
  53. text_input_get_view(instance->text_input));
  54. // Custom Widget
  55. instance->widget = widget_alloc();
  56. view_dispatcher_add_view(
  57. instance->view_dispatcher, SubBruteViewWidget, widget_get_view(instance->widget));
  58. // VarList
  59. instance->var_list = variable_item_list_alloc();
  60. view_dispatcher_add_view(
  61. instance->view_dispatcher,
  62. SubBruteViewVarList,
  63. variable_item_list_get_view(instance->var_list));
  64. // Popup
  65. instance->popup = popup_alloc();
  66. view_dispatcher_add_view(
  67. instance->view_dispatcher, SubBruteViewPopup, popup_get_view(instance->popup));
  68. // ViewStack
  69. instance->view_stack = view_stack_alloc();
  70. view_dispatcher_add_view(
  71. instance->view_dispatcher, SubBruteViewStack, view_stack_get_view(instance->view_stack));
  72. // SubBruteMainView
  73. instance->view_main = subbrute_main_view_alloc();
  74. view_dispatcher_add_view(
  75. instance->view_dispatcher,
  76. SubBruteViewMain,
  77. subbrute_main_view_get_view(instance->view_main));
  78. // SubBruteAttackView
  79. instance->view_attack = subbrute_attack_view_alloc();
  80. view_dispatcher_add_view(
  81. instance->view_dispatcher,
  82. SubBruteViewAttack,
  83. subbrute_attack_view_get_view(instance->view_attack));
  84. instance->settings = subbrute_settings_alloc();
  85. subbrute_settings_load(instance->settings);
  86. // Uncomment to enable Debug pin output on PIN 17(1W)
  87. // subghz_devices_set_async_mirror_pin(instance->radio_device, &gpio_ibutton);
  88. return instance;
  89. }
  90. void subbrute_free(SubBruteState* instance) {
  91. furi_assert(instance);
  92. // Uncomment to enable Debug pin output on PIN 17(1W)
  93. // subghz_devices_set_async_mirror_pin(instance->radio_device, NULL);
  94. // SubBruteWorker
  95. subbrute_worker_stop(instance->worker);
  96. subbrute_worker_free(instance->worker);
  97. // SubBruteDevice
  98. subbrute_device_free(instance->device);
  99. subghz_devices_deinit();
  100. //subbrute_settings_save(instance->settings);
  101. subbrute_settings_free(instance->settings);
  102. // Notifications
  103. notification_message(instance->notifications, &sequence_blink_stop);
  104. furi_record_close(RECORD_NOTIFICATION);
  105. instance->notifications = NULL;
  106. // View Main
  107. view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewMain);
  108. subbrute_main_view_free(instance->view_main);
  109. // View Attack
  110. view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewAttack);
  111. subbrute_attack_view_free(instance->view_attack);
  112. // TextInput
  113. view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewTextInput);
  114. text_input_free(instance->text_input);
  115. // Custom Widget
  116. view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewWidget);
  117. widget_free(instance->widget);
  118. // VarList
  119. view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewVarList);
  120. variable_item_list_free(instance->var_list);
  121. // Popup
  122. view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewPopup);
  123. popup_free(instance->popup);
  124. // ViewStack
  125. view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewStack);
  126. view_stack_free(instance->view_stack);
  127. // Dialog
  128. furi_record_close(RECORD_DIALOGS);
  129. instance->dialogs = NULL;
  130. // Scene manager
  131. scene_manager_free(instance->scene_manager);
  132. // View Dispatcher
  133. view_dispatcher_free(instance->view_dispatcher);
  134. // GUI
  135. furi_record_close(RECORD_GUI);
  136. instance->gui = NULL;
  137. furi_string_free(instance->file_path);
  138. // The rest
  139. free(instance);
  140. }
  141. void subbrute_text_input_callback(void* context) {
  142. furi_assert(context);
  143. SubBruteState* instance = context;
  144. view_dispatcher_send_custom_event(
  145. instance->view_dispatcher, SubBruteCustomEventTypeTextEditDone);
  146. }
  147. void subbrute_popup_closed_callback(void* context) {
  148. furi_assert(context);
  149. SubBruteState* instance = context;
  150. view_dispatcher_send_custom_event(
  151. instance->view_dispatcher, SubBruteCustomEventTypePopupClosed);
  152. }
  153. // ENTRYPOINT
  154. int32_t subbrute_app(void* p) {
  155. UNUSED(p);
  156. furi_hal_power_suppress_charge_enter();
  157. SubBruteState* instance = subbrute_alloc();
  158. view_dispatcher_attach_to_gui(
  159. instance->view_dispatcher, instance->gui, ViewDispatcherTypeFullscreen);
  160. scene_manager_next_scene(instance->scene_manager, SubBruteSceneStart);
  161. notification_message(instance->notifications, &sequence_display_backlight_on);
  162. view_dispatcher_run(instance->view_dispatcher);
  163. subbrute_free(instance);
  164. furi_hal_power_suppress_charge_exit();
  165. return 0;
  166. }