air_mouse_view.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #include "air_mouse_view.h"
  2. #include <gui/elements.h>
  3. #include "../imu_mouse.h"
  4. #include "vgm_air_mouse_icons.h"
  5. struct AirMouseView {
  6. View* view;
  7. void* imu_device;
  8. ImuThread* imu;
  9. const ImuHidApi* hid_api;
  10. void* hid_inst;
  11. AirMouseViewExit exit_callback;
  12. void* context;
  13. };
  14. typedef struct {
  15. bool left_pressed;
  16. bool up_pressed;
  17. bool ok_pressed;
  18. bool connected;
  19. bool show_ble_icon;
  20. } AirMouseModel;
  21. static void air_mouse_view_draw_callback(Canvas* canvas, void* context) {
  22. furi_assert(context);
  23. AirMouseModel* model = context;
  24. canvas_set_color(canvas, ColorBlack);
  25. if(model->show_ble_icon) {
  26. if(model->connected) {
  27. canvas_draw_icon(canvas, 0, 0, &I_Ble_connected_15x15);
  28. } else {
  29. canvas_draw_icon(canvas, 0, 0, &I_Ble_disconnected_15x15);
  30. }
  31. }
  32. canvas_draw_icon(canvas, 78, 8, &I_Circles_47x47);
  33. if(model->ok_pressed) {
  34. canvas_set_bitmap_mode(canvas, true);
  35. canvas_draw_icon(canvas, 95, 25, &I_Pressed_Button_13x13);
  36. canvas_set_bitmap_mode(canvas, false);
  37. canvas_set_color(canvas, ColorWhite);
  38. }
  39. canvas_draw_icon(canvas, 97, 27, &I_Left_mouse_icon_9x9);
  40. canvas_set_color(canvas, ColorBlack);
  41. if(model->up_pressed) {
  42. canvas_set_bitmap_mode(canvas, true);
  43. canvas_draw_icon(canvas, 95, 9, &I_Pressed_Button_13x13);
  44. canvas_set_bitmap_mode(canvas, false);
  45. canvas_set_color(canvas, ColorWhite);
  46. }
  47. canvas_draw_icon(canvas, 97, 11, &I_Right_mouse_icon_9x9);
  48. canvas_set_color(canvas, ColorBlack);
  49. if(model->left_pressed) {
  50. canvas_set_bitmap_mode(canvas, true);
  51. canvas_draw_icon(canvas, 79, 25, &I_Pressed_Button_13x13);
  52. canvas_set_bitmap_mode(canvas, false);
  53. canvas_set_color(canvas, ColorWhite);
  54. }
  55. canvas_draw_icon(canvas, 81, 27, &I_Scroll_icon_9x9);
  56. canvas_set_color(canvas, ColorBlack);
  57. canvas_set_font(canvas, FontPrimary);
  58. canvas_draw_str(canvas, 17, 12, "Air Mouse");
  59. canvas_set_font(canvas, FontSecondary);
  60. canvas_draw_str(canvas, 0, 56, "Press Back to exit");
  61. }
  62. static bool air_mouse_view_input_callback(InputEvent* event, void* context) {
  63. furi_assert(context);
  64. AirMouseView* air_mouse = context;
  65. bool consumed = false;
  66. if(event->key == InputKeyOk) {
  67. if((event->type == InputTypePress) || (event->type == InputTypeRelease)) {
  68. bool state = (event->type == InputTypePress);
  69. imu_mouse_key_press(air_mouse->imu, ImuMouseKeyLeft, state);
  70. with_view_model(
  71. air_mouse->view, AirMouseModel * model, { model->ok_pressed = state; }, true);
  72. }
  73. consumed = true;
  74. } else if(event->key == InputKeyUp) {
  75. if((event->type == InputTypePress) || (event->type == InputTypeRelease)) {
  76. bool state = (event->type == InputTypePress);
  77. imu_mouse_key_press(air_mouse->imu, ImuMouseKeyRight, state);
  78. with_view_model(
  79. air_mouse->view, AirMouseModel * model, { model->up_pressed = state; }, true);
  80. }
  81. consumed = true;
  82. } else if(event->key == InputKeyLeft) {
  83. if((event->type == InputTypePress) || (event->type == InputTypeRelease)) {
  84. bool state = (event->type == InputTypePress);
  85. imu_mouse_scroll_mode(air_mouse->imu, state);
  86. with_view_model(
  87. air_mouse->view, AirMouseModel * model, { model->left_pressed = state; }, true);
  88. }
  89. consumed = true;
  90. }
  91. return consumed;
  92. }
  93. static void air_mouse_view_enter(void* context) {
  94. furi_assert(context);
  95. AirMouseView* air_mouse = context;
  96. furi_assert(air_mouse->imu == NULL);
  97. air_mouse->imu = imu_start(air_mouse->imu_device, air_mouse->hid_api, air_mouse->hid_inst);
  98. }
  99. static void air_mouse_view_exit(void* context) {
  100. furi_assert(context);
  101. AirMouseView* air_mouse = context;
  102. imu_stop(air_mouse->imu);
  103. air_mouse->imu = NULL;
  104. if(air_mouse->exit_callback) {
  105. air_mouse->exit_callback(air_mouse->context);
  106. }
  107. }
  108. AirMouseView* air_mouse_view_alloc(AirMouseViewExit exit_callback, void* context) {
  109. AirMouseView* air_mouse = malloc(sizeof(AirMouseView));
  110. air_mouse->view = view_alloc();
  111. air_mouse->exit_callback = exit_callback;
  112. air_mouse->context = context;
  113. view_set_context(air_mouse->view, air_mouse);
  114. view_allocate_model(air_mouse->view, ViewModelTypeLocking, sizeof(AirMouseModel));
  115. view_set_draw_callback(air_mouse->view, air_mouse_view_draw_callback);
  116. view_set_input_callback(air_mouse->view, air_mouse_view_input_callback);
  117. view_set_enter_callback(air_mouse->view, air_mouse_view_enter);
  118. view_set_exit_callback(air_mouse->view, air_mouse_view_exit);
  119. with_view_model(air_mouse->view, AirMouseModel * model, { model->connected = true; }, true);
  120. return air_mouse;
  121. }
  122. void air_mouse_view_free(AirMouseView* air_mouse) {
  123. furi_assert(air_mouse);
  124. view_free(air_mouse->view);
  125. free(air_mouse);
  126. }
  127. View* air_mouse_view_get_view(AirMouseView* air_mouse) {
  128. furi_assert(air_mouse);
  129. return air_mouse->view;
  130. }
  131. void air_mouse_view_set_device(AirMouseView* air_mouse, void* imu_device) {
  132. furi_assert(air_mouse);
  133. air_mouse->imu_device = imu_device;
  134. }
  135. void air_mouse_view_set_hid_api(
  136. AirMouseView* air_mouse,
  137. const ImuHidApi* hid,
  138. void* hid_inst,
  139. bool is_ble_interface) {
  140. furi_assert(air_mouse);
  141. air_mouse->hid_api = hid;
  142. air_mouse->hid_inst = hid_inst;
  143. with_view_model(
  144. air_mouse->view,
  145. AirMouseModel * model,
  146. { model->show_ble_icon = is_ble_interface; },
  147. false);
  148. }
  149. void air_mouse_view_set_connected_status(AirMouseView* air_mouse, bool connected) {
  150. furi_assert(air_mouse);
  151. with_view_model(
  152. air_mouse->view, AirMouseModel * model, { model->connected = connected; }, true);
  153. }