subbrute.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. #include <furi.h>
  2. #include <furi_hal.h>
  3. #include <input/input.h>
  4. #include <m-string.h>
  5. #include <gui/gui.h>
  6. #include <gui/view_dispatcher.h>
  7. #include <gui/view_stack.h>
  8. #include <gui/scene_manager.h>
  9. #include <gui/modules/text_input.h>
  10. #include <gui/modules/popup.h>
  11. #include <gui/modules/widget.h>
  12. #include <gui/modules/loading.h>
  13. #include <dialogs/dialogs.h>
  14. #include "subbrute.h"
  15. #include "subbrute_i.h"
  16. #include "subbrute_custom_event.h"
  17. #define TAG "SubBruteApp"
  18. static const char* subbrute_menu_names[] = {
  19. [SubBruteAttackCAME12bit307] = "CAME 12bit 307mhz",
  20. [SubBruteAttackCAME12bit433] = "CAME 12bit 433mhz",
  21. [SubBruteAttackCAME12bit868] = "CAME 12bit 868mhz",
  22. [SubBruteAttackChamberlain9bit315] = "Chamberlain 9bit 315mhz",
  23. [SubBruteAttackChamberlain9bit390] = "Chamberlain 9bit 390mhz",
  24. [SubBruteAttackLinear10bit300] = "Linear 10bit 300mhz",
  25. [SubBruteAttackLinear10bit310] = "Linear 10bit 310mhz",
  26. [SubBruteAttackNICE12bit433] = "NICE 12bit 433mhz",
  27. [SubBruteAttackNICE12bit868] = "NICE 12bit 868mhz",
  28. [SubBruteAttackLoadFile] = "BF existing dump",
  29. [SubBruteAttackTotalCount] = "Total Count",
  30. };
  31. static const char* subbrute_menu_names_small[] = {
  32. [SubBruteAttackCAME12bit307] = "CAME 307mhz",
  33. [SubBruteAttackCAME12bit433] = "CAME 433mhz",
  34. [SubBruteAttackCAME12bit868] = "CAME 868mhz",
  35. [SubBruteAttackChamberlain9bit315] = "Cham 315mhz",
  36. [SubBruteAttackChamberlain9bit390] = "Cham 390mhz",
  37. [SubBruteAttackLinear10bit300] = "Linear 300mhz",
  38. [SubBruteAttackLinear10bit310] = "Linear 310mhz",
  39. [SubBruteAttackNICE12bit433] = "NICE 433mhz",
  40. [SubBruteAttackNICE12bit868] = "NICE 868mhz",
  41. [SubBruteAttackLoadFile] = "Existing",
  42. [SubBruteAttackTotalCount] = "Total Count",
  43. };
  44. static bool subbrute_custom_event_callback(void* context, uint32_t event) {
  45. furi_assert(context);
  46. SubBruteState* instance = context;
  47. return scene_manager_handle_custom_event(instance->scene_manager, event);
  48. }
  49. static bool subbrute_back_event_callback(void* context) {
  50. furi_assert(context);
  51. SubBruteState* instance = context;
  52. return scene_manager_handle_back_event(instance->scene_manager);
  53. }
  54. static void subbrute_tick_event_callback(void* context) {
  55. furi_assert(context);
  56. SubBruteState* instance = context;
  57. scene_manager_handle_tick_event(instance->scene_manager);
  58. }
  59. SubBruteState* subbrute_alloc() {
  60. SubBruteState* instance = malloc(sizeof(SubBruteState));
  61. instance->scene_manager = scene_manager_alloc(&subbrute_scene_handlers, instance);
  62. instance->view_dispatcher = view_dispatcher_alloc();
  63. instance->gui = furi_record_open(RECORD_GUI);
  64. view_dispatcher_enable_queue(instance->view_dispatcher);
  65. view_dispatcher_set_event_callback_context(instance->view_dispatcher, instance);
  66. view_dispatcher_set_custom_event_callback(
  67. instance->view_dispatcher, subbrute_custom_event_callback);
  68. view_dispatcher_set_navigation_event_callback(
  69. instance->view_dispatcher, subbrute_back_event_callback);
  70. view_dispatcher_set_tick_event_callback(
  71. instance->view_dispatcher, subbrute_tick_event_callback, 10);
  72. //Dialog
  73. instance->dialogs = furi_record_open(RECORD_DIALOGS);
  74. // Notifications
  75. instance->notifications = furi_record_open(RECORD_NOTIFICATION);
  76. // Devices
  77. instance->device = subbrute_device_alloc();
  78. // Worker
  79. instance->worker = subbrute_worker_alloc();
  80. // TextInput
  81. instance->text_input = text_input_alloc();
  82. view_dispatcher_add_view(
  83. instance->view_dispatcher,
  84. SubBruteViewTextInput,
  85. text_input_get_view(instance->text_input));
  86. // Custom Widget
  87. instance->widget = widget_alloc();
  88. view_dispatcher_add_view(
  89. instance->view_dispatcher, SubBruteViewWidget, widget_get_view(instance->widget));
  90. // Popup
  91. instance->popup = popup_alloc();
  92. view_dispatcher_add_view(
  93. instance->view_dispatcher, SubBruteViewPopup, popup_get_view(instance->popup));
  94. // ViewStack
  95. instance->view_stack = view_stack_alloc();
  96. view_dispatcher_add_view(
  97. instance->view_dispatcher, SubBruteViewStack, view_stack_get_view(instance->view_stack));
  98. // SubBruteMainView
  99. instance->view_main = subbrute_main_view_alloc();
  100. view_dispatcher_add_view(
  101. instance->view_dispatcher,
  102. SubBruteViewMain,
  103. subbrute_main_view_get_view(instance->view_main));
  104. // SubBruteAttackView
  105. instance->view_attack = subbrute_attack_view_alloc();
  106. view_dispatcher_add_view(
  107. instance->view_dispatcher,
  108. SubBruteViewAttack,
  109. subbrute_attack_view_get_view(instance->view_attack));
  110. // Loading
  111. instance->loading = loading_alloc();
  112. //instance->flipper_format = flipper_format_string_alloc();
  113. //instance->environment = subghz_environment_alloc();
  114. return instance;
  115. }
  116. void subbrute_free(SubBruteState* instance) {
  117. furi_assert(instance);
  118. // SubBruteWorker
  119. #ifdef FURI_DEBUG
  120. FURI_LOG_D(TAG, "free SubBruteDevice");
  121. #endif
  122. subbrute_worker_stop(instance->worker);
  123. subbrute_worker_free(instance->worker);
  124. // SubBruteDevice
  125. #ifdef FURI_DEBUG
  126. FURI_LOG_D(TAG, "free SubBruteDevice");
  127. #endif
  128. subbrute_device_free(instance->device);
  129. // Notifications
  130. #ifdef FURI_DEBUG
  131. FURI_LOG_D(TAG, "free Notifications");
  132. #endif
  133. notification_message(instance->notifications, &sequence_blink_stop);
  134. furi_record_close(RECORD_NOTIFICATION);
  135. instance->notifications = NULL;
  136. // Loading
  137. #ifdef FURI_DEBUG
  138. FURI_LOG_D(TAG, "free loading");
  139. #endif
  140. loading_free(instance->loading);
  141. // View Main
  142. #ifdef FURI_DEBUG
  143. FURI_LOG_D(TAG, "free SubBruteViewMain");
  144. #endif
  145. view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewMain);
  146. subbrute_main_view_free(instance->view_main);
  147. // View Attack
  148. #ifdef FURI_DEBUG
  149. FURI_LOG_D(TAG, "free SubBruteViewAttack");
  150. #endif
  151. view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewAttack);
  152. subbrute_attack_view_free(instance->view_attack);
  153. // TextInput
  154. #ifdef FURI_DEBUG
  155. FURI_LOG_D(TAG, "free SubBruteViewTextInput");
  156. #endif
  157. view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewTextInput);
  158. text_input_free(instance->text_input);
  159. // Custom Widget
  160. #ifdef FURI_DEBUG
  161. FURI_LOG_D(TAG, "free SubBruteViewWidget");
  162. #endif
  163. view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewWidget);
  164. widget_free(instance->widget);
  165. // Popup
  166. #ifdef FURI_DEBUG
  167. FURI_LOG_D(TAG, "free SubBruteViewPopup");
  168. #endif
  169. view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewPopup);
  170. popup_free(instance->popup);
  171. // ViewStack
  172. #ifdef FURI_DEBUG
  173. FURI_LOG_D(TAG, "free SubBruteViewStack");
  174. #endif
  175. view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewStack);
  176. view_stack_free(instance->view_stack);
  177. //Dialog
  178. #ifdef FURI_DEBUG
  179. FURI_LOG_D(TAG, "free RECORD_DIALOGS");
  180. #endif
  181. furi_record_close(RECORD_DIALOGS);
  182. instance->dialogs = NULL;
  183. // Scene manager
  184. #ifdef FURI_DEBUG
  185. FURI_LOG_D(TAG, "free scene_manager");
  186. #endif
  187. scene_manager_free(instance->scene_manager);
  188. // View Dispatcher
  189. #ifdef FURI_DEBUG
  190. FURI_LOG_D(TAG, "free view_dispatcher");
  191. #endif
  192. view_dispatcher_free(instance->view_dispatcher);
  193. // GUI
  194. #ifdef FURI_DEBUG
  195. FURI_LOG_D(TAG, "free RECORD_GUI");
  196. #endif
  197. furi_record_close(RECORD_GUI);
  198. instance->gui = NULL;
  199. // The rest
  200. #ifdef FURI_DEBUG
  201. FURI_LOG_D(TAG, "free instance");
  202. #endif
  203. free(instance);
  204. }
  205. void subbrute_show_loading_popup(void* context, bool show) {
  206. TaskHandle_t timer_task = xTaskGetHandle(configTIMER_SERVICE_TASK_NAME);
  207. SubBruteState* instance = context;
  208. ViewStack* view_stack = instance->view_stack;
  209. Loading* loading = instance->loading;
  210. if(show) {
  211. // Raise timer priority so that animations can play
  212. vTaskPrioritySet(timer_task, configMAX_PRIORITIES - 1);
  213. view_stack_add_view(view_stack, loading_get_view(loading));
  214. } else {
  215. view_stack_remove_view(view_stack, loading_get_view(loading));
  216. // Restore default timer priority
  217. vTaskPrioritySet(timer_task, configTIMER_TASK_PRIORITY);
  218. }
  219. }
  220. void subbrute_text_input_callback(void* context) {
  221. furi_assert(context);
  222. SubBruteState* instance = context;
  223. view_dispatcher_send_custom_event(
  224. instance->view_dispatcher, SubBruteCustomEventTypeTextEditDone);
  225. }
  226. void subbrute_popup_closed_callback(void* context) {
  227. furi_assert(context);
  228. SubBruteState* instance = context;
  229. view_dispatcher_send_custom_event(
  230. instance->view_dispatcher, SubBruteCustomEventTypePopupClosed);
  231. }
  232. const char* subbrute_get_menu_name(SubBruteAttacks index) {
  233. furi_assert(index < SubBruteAttackTotalCount);
  234. return subbrute_menu_names[index];
  235. }
  236. const char* subbrute_get_small_menu_name(SubBruteAttacks index) {
  237. furi_assert(index < SubBruteAttackTotalCount);
  238. return subbrute_menu_names_small[index];
  239. }
  240. // ENTRYPOINT
  241. int32_t subbrute_app(void* p) {
  242. UNUSED(p);
  243. SubBruteState* instance = subbrute_alloc();
  244. view_dispatcher_attach_to_gui(
  245. instance->view_dispatcher, instance->gui, ViewDispatcherTypeFullscreen);
  246. scene_manager_next_scene(instance->scene_manager, SubBruteSceneStart);
  247. furi_hal_power_suppress_charge_enter();
  248. notification_message(instance->notifications, &sequence_display_backlight_on);
  249. view_dispatcher_run(instance->view_dispatcher);
  250. furi_hal_power_suppress_charge_exit();
  251. subbrute_free(instance);
  252. return 0;
  253. }