hid_mouse_jiggler.c 4.5 KB

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