subbrute.c 9.5 KB

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