diff options
author | a-chol <a-chol@users.noreply.github.com> | 2021-08-17 20:52:44 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-18 04:52:44 +1000 |
commit | 75b49aff56436c57a424e622c91f6d80e1d0ecc2 (patch) | |
tree | 1968a4e939efef6aec0451d4bc991f4494292e22 /tmk_core/common | |
parent | 7794e97f32fb9dcb07e7fa928cde08691b257fbe (diff) | |
download | qmk_firmware-75b49aff56436c57a424e622c91f6d80e1d0ecc2.tar.gz qmk_firmware-75b49aff56436c57a424e622c91f6d80e1d0ecc2.zip |
Digitizer HID interface : absolute coordinates for mouse cursor (#12851)
* Add digitizer HID interface for setting the mouse cursor position at
absolute screen coordinates. Tested on Pro Micro, Proton C and
Blackpill.
* Update docs/feature_digitizer.md
Co-authored-by: Ryan <fauxpark@gmail.com>
* Update tmk_core/protocol/usb_descriptor.c
Co-authored-by: Ryan <fauxpark@gmail.com>
* Add missing copyrights
Add V-USB support
* Add support for digitizer dedicated endpoint for lufa and chibios.
Fix formatting issues
Move digitizer_task definition to the feature's base implementation file
* Run cformat on modified files
* Change digitizer report usage to Digitizer instead of Pen to avoid
pointer disappearing on Windows.
* Update tmk_core/protocol/vusb/vusb.c
Co-authored-by: Ryan <fauxpark@gmail.com>
* Run cformat from docker image
* Remove send_digitizer from host_driver_t and instead rely on the
declaration being the interface to the implementation in each
HW-specific usb implementation.
* Fix build : send_digitizer shouldn't be static in vusb and add
weak-linkage implementation for tests without usb implementation
* Change digitizer user interface to match pointing device's
* Update documentation with new API
Co-authored-by: a-chol <nothing@none.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
Diffstat (limited to 'tmk_core/common')
-rw-r--r-- | tmk_core/common/host.c | 19 | ||||
-rw-r--r-- | tmk_core/common/host_driver.h | 2 | ||||
-rw-r--r-- | tmk_core/common/keyboard.c | 7 | ||||
-rw-r--r-- | tmk_core/common/report.h | 14 |
4 files changed, 41 insertions, 1 deletions
diff --git a/tmk_core/common/host.c b/tmk_core/common/host.c index a8b391e89..f0c396b18 100644 --- a/tmk_core/common/host.c +++ b/tmk_core/common/host.c | |||
@@ -22,6 +22,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
22 | #include "host.h" | 22 | #include "host.h" |
23 | #include "util.h" | 23 | #include "util.h" |
24 | #include "debug.h" | 24 | #include "debug.h" |
25 | #include "digitizer.h" | ||
25 | 26 | ||
26 | #ifdef NKRO_ENABLE | 27 | #ifdef NKRO_ENABLE |
27 | # include "keycode_config.h" | 28 | # include "keycode_config.h" |
@@ -103,6 +104,24 @@ void host_consumer_send(uint16_t report) { | |||
103 | (*driver->send_consumer)(report); | 104 | (*driver->send_consumer)(report); |
104 | } | 105 | } |
105 | 106 | ||
107 | void host_digitizer_send(digitizer_t *digitizer) { | ||
108 | if (!driver) return; | ||
109 | |||
110 | report_digitizer_t report = { | ||
111 | #ifdef DIGITIZER_SHARED_EP | ||
112 | .report_id = REPORT_ID_DIGITIZER, | ||
113 | #endif | ||
114 | .tip = digitizer->tipswitch & 0x1, | ||
115 | .inrange = digitizer->inrange & 0x1, | ||
116 | .x = (uint16_t)(digitizer->x * 0x7FFF), | ||
117 | .y = (uint16_t)(digitizer->y * 0x7FFF), | ||
118 | }; | ||
119 | |||
120 | send_digitizer(&report); | ||
121 | } | ||
122 | |||
123 | __attribute__((weak)) void send_digitizer(report_digitizer_t *report) {} | ||
124 | |||
106 | uint16_t host_last_system_report(void) { return last_system_report; } | 125 | uint16_t host_last_system_report(void) { return last_system_report; } |
107 | 126 | ||
108 | uint16_t host_last_consumer_report(void) { return last_consumer_report; } | 127 | uint16_t host_last_consumer_report(void) { return last_consumer_report; } |
diff --git a/tmk_core/common/host_driver.h b/tmk_core/common/host_driver.h index f34a22053..2aebca043 100644 --- a/tmk_core/common/host_driver.h +++ b/tmk_core/common/host_driver.h | |||
@@ -30,3 +30,5 @@ typedef struct { | |||
30 | void (*send_system)(uint16_t); | 30 | void (*send_system)(uint16_t); |
31 | void (*send_consumer)(uint16_t); | 31 | void (*send_consumer)(uint16_t); |
32 | } host_driver_t; | 32 | } host_driver_t; |
33 | |||
34 | void send_digitizer(report_digitizer_t *report); \ No newline at end of file | ||
diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 28fa97bc8..fcc51973f 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c | |||
@@ -106,6 +106,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
106 | #if defined(CRC_ENABLE) | 106 | #if defined(CRC_ENABLE) |
107 | # include "crc.h" | 107 | # include "crc.h" |
108 | #endif | 108 | #endif |
109 | #ifdef DIGITIZER_ENABLE | ||
110 | # include "digitizer.h" | ||
111 | #endif | ||
109 | 112 | ||
110 | static uint32_t last_input_modification_time = 0; | 113 | static uint32_t last_input_modification_time = 0; |
111 | uint32_t last_input_activity_time(void) { return last_input_modification_time; } | 114 | uint32_t last_input_activity_time(void) { return last_input_modification_time; } |
@@ -537,6 +540,10 @@ MATRIX_LOOP_END: | |||
537 | joystick_task(); | 540 | joystick_task(); |
538 | #endif | 541 | #endif |
539 | 542 | ||
543 | #ifdef DIGITIZER_ENABLE | ||
544 | digitizer_task(); | ||
545 | #endif | ||
546 | |||
540 | // update LED | 547 | // update LED |
541 | if (led_status != host_keyboard_leds()) { | 548 | if (led_status != host_keyboard_leds()) { |
542 | led_status = host_keyboard_leds(); | 549 | led_status = host_keyboard_leds(); |
diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h index db6370657..f2223e806 100644 --- a/tmk_core/common/report.h +++ b/tmk_core/common/report.h | |||
@@ -30,7 +30,8 @@ enum hid_report_ids { | |||
30 | REPORT_ID_SYSTEM, | 30 | REPORT_ID_SYSTEM, |
31 | REPORT_ID_CONSUMER, | 31 | REPORT_ID_CONSUMER, |
32 | REPORT_ID_NKRO, | 32 | REPORT_ID_NKRO, |
33 | REPORT_ID_JOYSTICK | 33 | REPORT_ID_JOYSTICK, |
34 | REPORT_ID_DIGITIZER | ||
34 | }; | 35 | }; |
35 | 36 | ||
36 | /* Mouse buttons */ | 37 | /* Mouse buttons */ |
@@ -206,6 +207,17 @@ typedef struct { | |||
206 | } __attribute__((packed)) report_mouse_t; | 207 | } __attribute__((packed)) report_mouse_t; |
207 | 208 | ||
208 | typedef struct { | 209 | typedef struct { |
210 | #ifdef DIGITIZER_SHARED_EP | ||
211 | uint8_t report_id; | ||
212 | #endif | ||
213 | uint8_t tip : 1; | ||
214 | uint8_t inrange : 1; | ||
215 | uint8_t pad2 : 6; | ||
216 | uint16_t x; | ||
217 | uint16_t y; | ||
218 | } __attribute__((packed)) report_digitizer_t; | ||
219 | |||
220 | typedef struct { | ||
209 | #if JOYSTICK_AXES_COUNT > 0 | 221 | #if JOYSTICK_AXES_COUNT > 0 |
210 | # if JOYSTICK_AXES_RESOLUTION > 8 | 222 | # if JOYSTICK_AXES_RESOLUTION > 8 |
211 | int16_t axes[JOYSTICK_AXES_COUNT]; | 223 | int16_t axes[JOYSTICK_AXES_COUNT]; |