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