subbrute_scene_run_attack.c 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. static void subbrute_scene_run_attack_callback(SubBruteCustomEvent event, void* context) {
  6. furi_assert(context);
  7. SubBruteState* instance = (SubBruteState*)context;
  8. view_dispatcher_send_custom_event(instance->view_dispatcher, event);
  9. }
  10. void subbrute_scene_run_attack_on_exit(void* context) {
  11. furi_assert(context);
  12. SubBruteState* instance = (SubBruteState*)context;
  13. notification_message(instance->notifications, &sequence_blink_stop);
  14. }
  15. void subbrute_scene_run_attack_on_enter(void* context) {
  16. furi_assert(context);
  17. SubBruteState* instance = (SubBruteState*)context;
  18. SubBruteAttackView* view = instance->view_attack;
  19. instance->current_view = SubBruteViewAttack;
  20. subbrute_attack_view_set_callback(view, subbrute_scene_run_attack_callback, instance);
  21. view_dispatcher_switch_to_view(instance->view_dispatcher, instance->current_view);
  22. subbrute_attack_view_init_values(
  23. view,
  24. (uint8_t)instance->device->attack,
  25. instance->device->max_value,
  26. instance->device->key_index,
  27. true);
  28. // Start worker if not started
  29. subbrute_worker_init_manual_transmit(
  30. instance->worker,
  31. instance->device->frequency,
  32. instance->device->preset,
  33. string_get_cstr(instance->device->protocol_name));
  34. notification_message(instance->notifications, &sequence_blink_start_magenta);
  35. }
  36. bool subbrute_scene_run_attack_on_event(void* context, SceneManagerEvent event) {
  37. SubBruteState* instance = (SubBruteState*)context;
  38. SubBruteAttackView* view = instance->view_attack;
  39. bool consumed = false;
  40. if(event.type == SceneManagerEventTypeCustom) {
  41. if(event.event == SubBruteCustomEventTypeTransmitNotStarted ||
  42. event.event == SubBruteCustomEventTypeTransmitFinished ||
  43. event.event == SubBruteCustomEventTypeBackPressed) {
  44. // Stop transmit
  45. scene_manager_next_scene(instance->scene_manager, SubBruteSceneSetupAttack);
  46. consumed = true;
  47. }
  48. } else if(event.type == SceneManagerEventTypeTick) {
  49. if(subbrute_worker_can_transmit(instance->worker)) {
  50. // Blink
  51. if(subbrute_worker_manual_transmit(instance->worker, instance->device->payload)) {
  52. // Make payload for new iteration or exit
  53. if(instance->device->key_index + 1 > instance->device->max_value) {
  54. // End of list
  55. notification_message(instance->notifications, &sequence_single_vibro);
  56. notification_message(instance->notifications, &sequence_blink_stop);
  57. scene_manager_next_scene(instance->scene_manager, SubBruteSceneSetupAttack);
  58. } else {
  59. instance->device->key_index++;
  60. subbrute_attack_view_set_current_step(view, instance->device->key_index);
  61. subbrute_device_create_packet_parsed(
  62. instance->device, instance->device->key_index);
  63. }
  64. }
  65. // Stop
  66. }
  67. consumed = true;
  68. }
  69. return consumed;
  70. }