subbrute_scene_run_attack.c 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. #include "../subbrute_i.h"
  2. #include "../subbrute_custom_event.h"
  3. #include "../views/subbrute_attack_view.h"
  4. #include "../helpers/subbrute_worker.h"
  5. #define TAG "SubBruteSceneRunAttack"
  6. static void subbrute_scene_run_attack_callback(SubBruteCustomEvent event, void* context) {
  7. furi_assert(context);
  8. SubBruteState* instance = (SubBruteState*)context;
  9. view_dispatcher_send_custom_event(instance->view_dispatcher, event);
  10. }
  11. //static void subbrute_scene_run_attack_worker_callback(void* context) {
  12. // SubBruteState* instance = (SubBruteState*)context;
  13. //
  14. // if(instance->locked || instance->device->key_index + 1 > instance->device->max_value) {
  15. // return;
  16. // }
  17. // instance->locked = true;
  18. //
  19. // if(subbrute_worker_can_manual_transmit(instance->worker)) {
  20. // // Blink
  21. // notification_message(instance->notifications, &sequence_blink_yellow_100);
  22. // subbrute_device_create_packet_parsed(instance->device, instance->device->key_index, true);
  23. //
  24. //#ifdef FURI_DEBUG
  25. // FURI_LOG_I(TAG, "subbrute_worker_manual_transmit");
  26. //#endif
  27. // if(subbrute_worker_manual_transmit(instance->worker, instance->device->payload)) {
  28. //#ifdef FURI_DEBUG
  29. // FURI_LOG_I(TAG, "transmit ok");
  30. //#endif
  31. // // Make payload for new iteration or exit
  32. // if(instance->device->key_index + 1 <= instance->device->max_value) {
  33. // instance->device->key_index++;
  34. // } else {
  35. // view_dispatcher_send_custom_event(
  36. // instance->view_dispatcher, SubBruteCustomEventTypeTransmitFinished);
  37. // }
  38. // }
  39. //
  40. // // Stop
  41. // notification_message(instance->notifications, &sequence_blink_stop);
  42. // }
  43. //
  44. // instance->locked = false;
  45. // subbrute_attack_view_set_current_step(instance->view_attack, instance->device->key_index);
  46. //}
  47. void subbrute_scene_run_attack_on_exit(void* context) {
  48. furi_assert(context);
  49. SubBruteState* instance = (SubBruteState*)context;
  50. // SubBruteAttackState* state = (SubBruteAttackState*)scene_manager_get_scene_state(
  51. // instance->scene_manager, SubBruteSceneRunAttack);
  52. // furi_assert(state);
  53. //
  54. // furi_timer_free(state->timer);
  55. // free(state);
  56. if(subbrute_worker_get_continuous_worker(instance->worker)) {
  57. subbrute_worker_stop(instance->worker);
  58. }
  59. notification_message(instance->notifications, &sequence_blink_stop);
  60. }
  61. void subbrute_scene_run_attack_on_enter(void* context) {
  62. furi_assert(context);
  63. SubBruteState* instance = (SubBruteState*)context;
  64. SubBruteAttackView* view = instance->view_attack;
  65. //
  66. // SubBruteAttackState* state = malloc(sizeof(SubBruteAttackState));
  67. // scene_manager_set_scene_state(
  68. // instance->scene_manager, SubBruteSceneRunAttack, (uint32_t)state);
  69. instance->current_view = SubBruteViewAttack;
  70. subbrute_attack_view_set_callback(view, subbrute_scene_run_attack_callback, instance);
  71. view_dispatcher_switch_to_view(instance->view_dispatcher, instance->current_view);
  72. subbrute_attack_view_init_values(
  73. view,
  74. (uint8_t)instance->device->attack,
  75. instance->device->max_value,
  76. instance->device->key_index,
  77. true);
  78. if(subbrute_worker_get_continuous_worker(instance->worker)) {
  79. // Init Continuous worker with values!
  80. if(!subbrute_worker_start(
  81. instance->worker,
  82. instance->device->frequency,
  83. instance->device->preset,
  84. string_get_cstr(instance->device->protocol_name))) {
  85. FURI_LOG_W(TAG, "Worker Continuous init failed!");
  86. }
  87. } else {
  88. // Init worker with values
  89. if(!subbrute_worker_init_manual_transmit(
  90. instance->worker,
  91. instance->device->frequency,
  92. instance->device->preset,
  93. string_get_cstr(instance->device->protocol_name))) {
  94. FURI_LOG_W(TAG, "Worker init failed!");
  95. }
  96. // state->timer = furi_timer_alloc(
  97. // subbrute_scene_run_attack_worker_callback, FuriTimerTypePeriodic, instance);
  98. // furi_timer_start(state->timer, pdMS_TO_TICKS(100)); // 20 ms
  99. }
  100. }
  101. bool subbrute_scene_run_attack_on_event(void* context, SceneManagerEvent event) {
  102. SubBruteState* instance = (SubBruteState*)context;
  103. // SubBruteAttackState* state = (SubBruteAttackState*)scene_manager_get_scene_state(
  104. // instance->scene_manager, SubBruteSceneRunAttack);
  105. // furi_assert(state);
  106. bool consumed = false;
  107. if(event.type == SceneManagerEventTypeCustom) {
  108. SubBruteAttackView* view = instance->view_attack;
  109. if(event.event == SubBruteCustomEventTypeTransmitNotStarted ||
  110. event.event == SubBruteCustomEventTypeTransmitFinished ||
  111. event.event == SubBruteCustomEventTypeBackPressed) {
  112. // furi_timer_stop(state->timer);
  113. // Stop transmit
  114. notification_message(instance->notifications, &sequence_display_backlight_on);
  115. notification_message(instance->notifications, &sequence_single_vibro);
  116. subbrute_attack_view_set_current_step(view, instance->device->key_index);
  117. scene_manager_search_and_switch_to_previous_scene(
  118. instance->scene_manager, SubBruteSceneSetupAttack);
  119. consumed = true;
  120. } else if(event.event == SubBruteCustomEventTypeUpdateView) {
  121. subbrute_attack_view_set_current_step(view, instance->device->key_index);
  122. }
  123. } else if(event.type == SceneManagerEventTypeTick) {
  124. if(subbrute_worker_get_continuous_worker(instance->worker)) {
  125. if(subbrute_worker_can_transmit(instance->worker)) {
  126. // Blink
  127. notification_message(instance->notifications, &sequence_blink_yellow_100);
  128. subbrute_device_create_packet_parsed(
  129. instance->device, instance->device->key_index, true);
  130. if(subbrute_worker_transmit(instance->worker, instance->device->payload)) {
  131. // Make payload for new iteration or exit
  132. if(instance->device->key_index + 1 > instance->device->max_value) {
  133. // End of list
  134. view_dispatcher_send_custom_event(
  135. instance->view_dispatcher, SubBruteCustomEventTypeTransmitFinished);
  136. } else {
  137. instance->device->key_index++;
  138. view_dispatcher_send_custom_event(
  139. instance->view_dispatcher, SubBruteCustomEventTypeUpdateView);
  140. //subbrute_attack_view_set_current_step(view, instance->device->key_index);
  141. }
  142. }
  143. // Stop
  144. notification_message(instance->notifications, &sequence_blink_stop);
  145. }
  146. } else {
  147. if(subbrute_worker_can_manual_transmit(instance->worker, false)) {
  148. // Blink
  149. notification_message(instance->notifications, &sequence_blink_yellow_100);
  150. subbrute_device_create_packet_parsed(
  151. instance->device, instance->device->key_index, true);
  152. if(subbrute_worker_manual_transmit(instance->worker, instance->device->payload)) {
  153. // Make payload for new iteration or exit
  154. if(instance->device->key_index + 1 > instance->device->max_value) {
  155. // End of list
  156. view_dispatcher_send_custom_event(
  157. instance->view_dispatcher, SubBruteCustomEventTypeTransmitFinished);
  158. } else {
  159. instance->device->key_index++;
  160. view_dispatcher_send_custom_event(
  161. instance->view_dispatcher, SubBruteCustomEventTypeUpdateView);
  162. //subbrute_attack_view_set_current_step(view, instance->device->key_index);
  163. }
  164. }
  165. // Stop
  166. notification_message(instance->notifications, &sequence_blink_stop);
  167. }
  168. }
  169. consumed = true;
  170. }
  171. return consumed;
  172. }