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