pointing_device_driver.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // Copyright 2024 Dasky (@daskygit)
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "report.h"
  4. #include "test_pointing_device_driver.h"
  5. #include <string.h>
  6. typedef struct {
  7. bool pressed;
  8. bool dirty;
  9. } pd_button_state_t;
  10. typedef struct {
  11. int16_t x;
  12. int16_t y;
  13. int16_t h;
  14. int16_t v;
  15. pd_button_state_t button_state[8];
  16. uint16_t cpi;
  17. bool initiated;
  18. } pd_config_t;
  19. static pd_config_t pd_config = {0};
  20. bool pointing_device_driver_init(void) {
  21. pd_set_init(true);
  22. return pd_config.initiated;
  23. }
  24. report_mouse_t pointing_device_driver_get_report(report_mouse_t mouse_report) {
  25. for (uint8_t i = 0; i < 8; i++) {
  26. if (pd_config.button_state[i].dirty) {
  27. pd_config.button_state[i].dirty = false;
  28. if (pd_config.button_state[i].pressed) {
  29. mouse_report.buttons |= 1 << (i);
  30. } else {
  31. mouse_report.buttons &= ~(1 << (i));
  32. }
  33. }
  34. }
  35. mouse_report.x = pd_config.x;
  36. mouse_report.y = pd_config.y;
  37. mouse_report.h = pd_config.h;
  38. mouse_report.v = pd_config.v;
  39. return mouse_report;
  40. }
  41. __attribute__((weak)) uint16_t pointing_device_driver_get_cpi(void) {
  42. return pd_config.cpi;
  43. }
  44. __attribute__((weak)) void pointing_device_driver_set_cpi(uint16_t cpi) {
  45. pd_config.cpi = cpi;
  46. }
  47. void pd_press_button(uint8_t btn) {
  48. pd_config.button_state[btn].dirty = true;
  49. pd_config.button_state[btn].pressed = true;
  50. }
  51. void pd_release_button(uint8_t btn) {
  52. pd_config.button_state[btn].dirty = true;
  53. pd_config.button_state[btn].pressed = false;
  54. }
  55. void pd_clear_all_buttons(void) {
  56. for (uint8_t i = 0; i < 8; i++) {
  57. pd_config.button_state[i].dirty = true;
  58. pd_config.button_state[i].pressed = false;
  59. }
  60. }
  61. void pd_set_x(int16_t x) {
  62. pd_config.x = x;
  63. }
  64. void pd_clear_x(void) {
  65. pd_set_x(0);
  66. }
  67. void pd_set_y(int16_t y) {
  68. pd_config.y = y;
  69. }
  70. void pd_clear_y(void) {
  71. pd_set_y(0);
  72. }
  73. void pd_set_h(int16_t h) {
  74. pd_config.h = h;
  75. }
  76. void pd_clear_h(void) {
  77. pd_set_h(0);
  78. }
  79. void pd_set_v(int16_t v) {
  80. pd_config.v = v;
  81. }
  82. void pd_clear_v(void) {
  83. pd_set_v(0);
  84. }
  85. void pd_clear_movement(void) {
  86. pd_set_x(0);
  87. pd_set_y(0);
  88. pd_set_h(0);
  89. pd_set_v(0);
  90. }
  91. void pd_set_init(bool success) {
  92. pd_config.initiated = success;
  93. }