subbrute.c 5.9 KB

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