subbrute.c 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. #include "subbrute.h"
  2. #include "scene/subbrute_scene_load_file.h"
  3. #include "scene/subbrute_scene_select_field.h"
  4. #include "scene/subbrute_scene_run_attack.h"
  5. #include "scene/subbrute_scene_entrypoint.h"
  6. #include "scene/subbrute_scene_save_name.h"
  7. static void draw_callback(Canvas* const canvas, void* ctx) {
  8. SubBruteState* subbrute_state = (SubBruteState*)acquire_mutex((ValueMutex*)ctx, 100);
  9. if(subbrute_state == NULL) {
  10. return;
  11. }
  12. // Draw correct Canvas
  13. switch(subbrute_state->current_scene) {
  14. case NoneScene:
  15. case SceneSelectFile:
  16. subbrute_scene_load_file_on_draw(canvas, subbrute_state);
  17. break;
  18. case SceneSelectField:
  19. subbrute_scene_select_field_on_draw(canvas, subbrute_state);
  20. break;
  21. case SceneAttack:
  22. subbrute_scene_run_attack_on_draw(canvas, subbrute_state);
  23. break;
  24. case SceneEntryPoint:
  25. subbrute_scene_entrypoint_on_draw(canvas, subbrute_state);
  26. break;
  27. case SceneSaveName:
  28. break;
  29. }
  30. release_mutex((ValueMutex*)ctx, subbrute_state);
  31. }
  32. void input_callback(InputEvent* input_event, FuriMessageQueue* event_queue) {
  33. furi_assert(event_queue);
  34. SubBruteEvent event = {
  35. .evt_type = EventTypeKey, .key = input_event->key, .input_type = input_event->type};
  36. furi_message_queue_put(event_queue, &event, 100);
  37. }
  38. static void timer_callback(FuriMessageQueue* event_queue) {
  39. furi_assert(event_queue);
  40. SubBruteEvent event = {
  41. .evt_type = EventTypeTick, .key = InputKeyUp, .input_type = InputTypeRelease};
  42. furi_message_queue_put(event_queue, &event, 100);
  43. }
  44. SubBruteState* subbrute_alloc() {
  45. SubBruteState* subbrute = malloc(sizeof(SubBruteState));
  46. string_init(subbrute->protocol);
  47. string_init(subbrute->preset);
  48. string_init(subbrute->file_path);
  49. string_init(subbrute->file_path_tmp);
  50. string_init_set(subbrute->notification_msg, "");
  51. string_init(subbrute->candidate);
  52. string_init(subbrute->flipper_format_string);
  53. subbrute->previous_scene = NoneScene;
  54. subbrute->current_scene = SceneSelectFile;
  55. subbrute->is_running = true;
  56. subbrute->is_attacking = false;
  57. subbrute->key_index = 7;
  58. subbrute->notify = furi_record_open(RECORD_NOTIFICATION);
  59. subbrute->view_dispatcher = view_dispatcher_alloc();
  60. //Dialog
  61. subbrute->dialogs = furi_record_open(RECORD_DIALOGS);
  62. subbrute->preset_def = malloc(sizeof(SubGhzPresetDefinition));
  63. //subbrute->flipper_format = flipper_format_string_alloc();
  64. //subbrute->environment = subghz_environment_alloc();
  65. return subbrute;
  66. }
  67. void subbrute_free(SubBruteState* subbrute) {
  68. //Dialog
  69. furi_record_close(RECORD_DIALOGS);
  70. notification_message(subbrute->notify, &sequence_blink_stop);
  71. furi_record_close(RECORD_NOTIFICATION);
  72. view_dispatcher_free(subbrute->view_dispatcher);
  73. string_clear(subbrute->preset);
  74. string_clear(subbrute->candidate);
  75. // Path strings
  76. string_clear(subbrute->file_path);
  77. string_clear(subbrute->file_path_tmp);
  78. string_clear(subbrute->notification_msg);
  79. string_clear(subbrute->candidate);
  80. string_clear(subbrute->flipper_format_string);
  81. //flipper_format_free(subbrute->flipper_format);
  82. //subghz_environment_free(subbrute->environment);
  83. //subghz_receiver_free(subbrute->receiver);
  84. free(subbrute->preset_def);
  85. // The rest
  86. free(subbrute);
  87. }
  88. // ENTRYPOINT
  89. int32_t subbrute_start(void* p) {
  90. UNUSED(p);
  91. // Input
  92. FURI_LOG_I(TAG, "Initializing input");
  93. FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(SubBruteEvent));
  94. SubBruteState* subbrute_state = subbrute_alloc();
  95. ValueMutex subbrute_state_mutex;
  96. // Mutex
  97. FURI_LOG_I(TAG, "Initializing flipfrid mutex");
  98. if(!init_mutex(&subbrute_state_mutex, subbrute_state, sizeof(SubBruteState))) {
  99. FURI_LOG_E(TAG, "cannot create mutex\r\n");
  100. furi_message_queue_free(event_queue);
  101. subbrute_free(subbrute_state);
  102. return 255;
  103. }
  104. furi_hal_power_suppress_charge_enter();
  105. // Configure view port
  106. FURI_LOG_I(TAG, "Initializing viewport");
  107. ViewPort* view_port = view_port_alloc();
  108. view_port_draw_callback_set(view_port, draw_callback, &subbrute_state_mutex);
  109. view_port_input_callback_set(view_port, input_callback, event_queue);
  110. // Configure timer
  111. FURI_LOG_I(TAG, "Initializing timer");
  112. FuriTimer* timer = furi_timer_alloc(timer_callback, FuriTimerTypePeriodic, event_queue);
  113. furi_timer_start(timer, furi_kernel_get_tick_frequency() / 10); // 10 times per second
  114. // Register view port in GUI
  115. FURI_LOG_I(TAG, "Initializing gui");
  116. subbrute_state->gui = furi_record_open(RECORD_GUI);
  117. gui_add_view_port(subbrute_state->gui, view_port, GuiLayerFullscreen);
  118. view_dispatcher_attach_to_gui(
  119. subbrute_state->view_dispatcher, subbrute_state->gui, ViewDispatcherTypeFullscreen);
  120. subbrute_state->current_scene = SceneEntryPoint;
  121. // Init values
  122. SubBruteEvent event;
  123. while(subbrute_state->is_running) {
  124. // Get next event
  125. FuriStatus event_status = furi_message_queue_get(event_queue, &event, 25);
  126. if(event_status == FuriStatusOk) {
  127. if(event.evt_type == EventTypeKey) {
  128. //Handle event key
  129. FURI_LOG_D(TAG, "EVENT ###");
  130. switch(subbrute_state->current_scene) {
  131. case SceneSelectFile:
  132. subbrute_scene_load_file_on_event(event, subbrute_state);
  133. break;
  134. case SceneSelectField:
  135. subbrute_scene_select_field_on_event(event, subbrute_state);
  136. break;
  137. case SceneSaveName:
  138. subbrute_scene_save_name_on_event(event, subbrute_state);
  139. break;
  140. case SceneAttack:
  141. subbrute_scene_run_attack_on_event(event, subbrute_state);
  142. break;
  143. case NoneScene:
  144. case SceneEntryPoint:
  145. subbrute_scene_entrypoint_on_event(event, subbrute_state);
  146. break;
  147. }
  148. } else if(event.evt_type == EventTypeTick) {
  149. //Handle event tick
  150. if(subbrute_state->current_scene != subbrute_state->previous_scene) {
  151. // Trigger Exit Scene
  152. switch(subbrute_state->previous_scene) {
  153. case SceneSelectFile:
  154. subbrute_scene_load_file_on_exit(subbrute_state);
  155. break;
  156. case SceneSelectField:
  157. subbrute_scene_select_field_on_exit(subbrute_state);
  158. break;
  159. case SceneAttack:
  160. subbrute_scene_run_attack_on_exit(subbrute_state);
  161. break;
  162. case SceneEntryPoint:
  163. subbrute_scene_entrypoint_on_exit(subbrute_state);
  164. break;
  165. case SceneSaveName:
  166. subbrute_scene_save_name_on_exit(subbrute_state);
  167. break;
  168. case NoneScene:
  169. break;
  170. }
  171. // Trigger Entry Scene
  172. switch(subbrute_state->current_scene) {
  173. case NoneScene:
  174. case SceneSelectFile:
  175. subbrute_scene_load_file_on_enter(subbrute_state);
  176. break;
  177. case SceneSelectField:
  178. subbrute_scene_select_field_on_enter(subbrute_state);
  179. break;
  180. case SceneAttack:
  181. subbrute_scene_run_attack_on_enter(subbrute_state);
  182. break;
  183. case SceneSaveName:
  184. subbrute_scene_save_name_on_enter(subbrute_state);
  185. break;
  186. case SceneEntryPoint:
  187. subbrute_scene_entrypoint_on_enter(subbrute_state);
  188. break;
  189. }
  190. subbrute_state->previous_scene = subbrute_state->current_scene;
  191. }
  192. // Trigger Tick Scene
  193. switch(subbrute_state->current_scene) {
  194. case NoneScene:
  195. case SceneSelectFile:
  196. subbrute_scene_load_file_on_tick(subbrute_state);
  197. break;
  198. case SceneSelectField:
  199. subbrute_scene_select_field_on_tick(subbrute_state);
  200. break;
  201. case SceneAttack:
  202. //subbrute_scene_run_attack_on_tick(subbrute_state);
  203. break;
  204. case SceneEntryPoint:
  205. subbrute_scene_entrypoint_on_tick(subbrute_state);
  206. break;
  207. case SceneSaveName:
  208. subbrute_scene_save_name_on_tick(subbrute_state);
  209. break;
  210. }
  211. view_port_update(view_port);
  212. }
  213. }
  214. }
  215. // Cleanup
  216. furi_timer_stop(timer);
  217. furi_timer_free(timer);
  218. furi_hal_power_suppress_charge_exit();
  219. FURI_LOG_I(TAG, "Cleaning up");
  220. gui_remove_view_port(subbrute_state->gui, view_port);
  221. view_port_free(view_port);
  222. furi_message_queue_free(event_queue);
  223. furi_record_close(RECORD_GUI);
  224. subbrute_free(subbrute_state);
  225. return 0;
  226. }