hid_mouse_jiggler.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. #include "hid_mouse_jiggler.h"
  2. #include <gui/elements.h>
  3. #include "../hid.h"
  4. #include "hid_icons.h"
  5. #define TAG "HidMouseJiggler"
  6. struct HidMouseJiggler {
  7. View* view;
  8. Hid* hid;
  9. FuriTimer* timer;
  10. };
  11. typedef struct {
  12. bool connected;
  13. bool running;
  14. uint8_t counter;
  15. HidTransport transport;
  16. } HidMouseJigglerModel;
  17. static void hid_mouse_jiggler_draw_callback(Canvas* canvas, void* context) {
  18. furi_assert(context);
  19. HidMouseJigglerModel* model = context;
  20. // Header
  21. if(model->transport == HidTransportBle) {
  22. if(model->connected) {
  23. canvas_draw_icon(canvas, 0, 0, &I_Ble_connected_15x15);
  24. } else {
  25. canvas_draw_icon(canvas, 0, 0, &I_Ble_disconnected_15x15);
  26. }
  27. }
  28. canvas_set_font(canvas, FontPrimary);
  29. elements_multiline_text_aligned(canvas, 17, 3, AlignLeft, AlignTop, "Mouse Jiggler");
  30. canvas_set_font(canvas, FontPrimary);
  31. elements_multiline_text(canvas, AlignLeft, 35, "Press Start\nto jiggle");
  32. canvas_set_font(canvas, FontSecondary);
  33. // Ok
  34. canvas_draw_icon(canvas, 63, 25, &I_Space_65x18);
  35. if(model->running) {
  36. elements_slightly_rounded_box(canvas, 66, 27, 60, 13);
  37. canvas_set_color(canvas, ColorWhite);
  38. }
  39. canvas_draw_icon(canvas, 74, 29, &I_Ok_btn_9x9);
  40. if(model->running) {
  41. elements_multiline_text_aligned(canvas, 91, 36, AlignLeft, AlignBottom, "Stop");
  42. } else {
  43. elements_multiline_text_aligned(canvas, 91, 36, AlignLeft, AlignBottom, "Start");
  44. }
  45. canvas_set_color(canvas, ColorBlack);
  46. // Back
  47. canvas_draw_icon(canvas, 74, 49, &I_Pin_back_arrow_10x8);
  48. elements_multiline_text_aligned(canvas, 91, 57, AlignLeft, AlignBottom, "Quit");
  49. }
  50. static void hid_mouse_jiggler_timer_callback(void* context) {
  51. furi_assert(context);
  52. HidMouseJiggler* hid_mouse_jiggler = context;
  53. with_view_model(
  54. hid_mouse_jiggler->view,
  55. HidMouseJigglerModel * model,
  56. {
  57. if(model->running) {
  58. model->counter++;
  59. hid_hal_mouse_move(
  60. hid_mouse_jiggler->hid,
  61. (model->counter % 2 == 0) ? MOUSE_MOVE_SHORT : -MOUSE_MOVE_SHORT,
  62. 0);
  63. }
  64. },
  65. false);
  66. }
  67. static void hid_mouse_jiggler_enter_callback(void* context) {
  68. furi_assert(context);
  69. HidMouseJiggler* hid_mouse_jiggler = context;
  70. furi_timer_start(hid_mouse_jiggler->timer, 500);
  71. }
  72. static void hid_mouse_jiggler_exit_callback(void* context) {
  73. furi_assert(context);
  74. HidMouseJiggler* hid_mouse_jiggler = context;
  75. furi_timer_stop(hid_mouse_jiggler->timer);
  76. }
  77. static bool hid_mouse_jiggler_input_callback(InputEvent* event, void* context) {
  78. furi_assert(context);
  79. HidMouseJiggler* hid_mouse_jiggler = context;
  80. bool consumed = false;
  81. if(event->key == InputKeyOk) {
  82. with_view_model(
  83. hid_mouse_jiggler->view,
  84. HidMouseJigglerModel * model,
  85. { model->running = !model->running; },
  86. true);
  87. consumed = true;
  88. }
  89. return consumed;
  90. }
  91. HidMouseJiggler* hid_mouse_jiggler_alloc(Hid* hid) {
  92. HidMouseJiggler* hid_mouse_jiggler = malloc(sizeof(HidMouseJiggler));
  93. hid_mouse_jiggler->view = view_alloc();
  94. view_set_context(hid_mouse_jiggler->view, hid_mouse_jiggler);
  95. view_allocate_model(
  96. hid_mouse_jiggler->view, ViewModelTypeLocking, sizeof(HidMouseJigglerModel));
  97. view_set_draw_callback(hid_mouse_jiggler->view, hid_mouse_jiggler_draw_callback);
  98. view_set_input_callback(hid_mouse_jiggler->view, hid_mouse_jiggler_input_callback);
  99. view_set_enter_callback(hid_mouse_jiggler->view, hid_mouse_jiggler_enter_callback);
  100. view_set_exit_callback(hid_mouse_jiggler->view, hid_mouse_jiggler_exit_callback);
  101. hid_mouse_jiggler->hid = hid;
  102. hid_mouse_jiggler->timer = furi_timer_alloc(
  103. hid_mouse_jiggler_timer_callback, FuriTimerTypePeriodic, hid_mouse_jiggler);
  104. with_view_model(
  105. hid_mouse_jiggler->view,
  106. HidMouseJigglerModel * model,
  107. { model->transport = hid->transport; },
  108. true);
  109. return hid_mouse_jiggler;
  110. }
  111. void hid_mouse_jiggler_free(HidMouseJiggler* hid_mouse_jiggler) {
  112. furi_assert(hid_mouse_jiggler);
  113. furi_timer_stop(hid_mouse_jiggler->timer);
  114. furi_timer_free(hid_mouse_jiggler->timer);
  115. view_free(hid_mouse_jiggler->view);
  116. free(hid_mouse_jiggler);
  117. }
  118. View* hid_mouse_jiggler_get_view(HidMouseJiggler* hid_mouse_jiggler) {
  119. furi_assert(hid_mouse_jiggler);
  120. return hid_mouse_jiggler->view;
  121. }
  122. void hid_mouse_jiggler_set_connected_status(HidMouseJiggler* hid_mouse_jiggler, bool connected) {
  123. furi_assert(hid_mouse_jiggler);
  124. with_view_model(
  125. hid_mouse_jiggler->view,
  126. HidMouseJigglerModel * model,
  127. { model->connected = connected; },
  128. true);
  129. }