From e61d19cffcc77280088e1d85c0ebd0e19f8320cf Mon Sep 17 00:00:00 2001 From: a-chol Date: Sun, 9 May 2021 21:31:21 +0200 Subject: [PATCH 01/13] Add digitizer HID interface for setting the mouse cursor position at absolute screen coordinates. Tested on Pro Micro, Proton C and Blackpill. --- common_features.mk | 6 ++++ docs/_summary.md | 1 + docs/feature_digitizer.md | 34 +++++++++++++++++++ .../onekey/keymaps/digitizer/config.h | 2 ++ .../onekey/keymaps/digitizer/keymap.c | 24 +++++++++++++ .../onekey/keymaps/digitizer/rules.mk | 1 + quantum/digitizer.c | 9 +++++ quantum/digitizer.h | 20 +++++++++++ quantum/process_keycode/process_digitizer.c | 21 ++++++++++++ quantum/process_keycode/process_digitizer.h | 5 +++ tmk_core/common.mk | 4 +++ tmk_core/common/host.c | 14 ++++++++ tmk_core/common/host_driver.h | 1 + tmk_core/common/keyboard.c | 7 ++++ tmk_core/common/report.h | 12 ++++++- tmk_core/protocol/chibios/main.c | 3 +- tmk_core/protocol/chibios/usb_main.c | 22 ++++++++++++ tmk_core/protocol/lufa/lufa.c | 19 ++++++++++- tmk_core/protocol/usb_descriptor.c | 30 ++++++++++++++++ 19 files changed, 232 insertions(+), 3 deletions(-) create mode 100644 docs/feature_digitizer.md create mode 100644 keyboards/handwired/onekey/keymaps/digitizer/config.h create mode 100644 keyboards/handwired/onekey/keymaps/digitizer/keymap.c create mode 100644 keyboards/handwired/onekey/keymaps/digitizer/rules.mk create mode 100644 quantum/digitizer.c create mode 100644 quantum/digitizer.h create mode 100644 quantum/process_keycode/process_digitizer.c create mode 100644 quantum/process_keycode/process_digitizer.h diff --git a/common_features.mk b/common_features.mk index a790b8432851..7cc1f9890b9f 100644 --- a/common_features.mk +++ b/common_features.mk @@ -701,6 +701,12 @@ ifeq ($(strip $(JOYSTICK_ENABLE)), digital) OPT_DEFS += -DDIGITAL_JOYSTICK_ENABLE endif +DIGITIZER_ENABLE ?= no +ifneq ($(strip $(DIGITIZER_ENABLE)), no) + SRC += $(QUANTUM_DIR)/process_keycode/process_digitizer.c + SRC += $(QUANTUM_DIR)/digitizer.c +endif + USBPD_ENABLE ?= no VALID_USBPD_DRIVER_TYPES = custom vendor USBPD_DRIVER ?= vendor diff --git a/docs/_summary.md b/docs/_summary.md index 4141e01e7787..7d4d7296c17a 100644 --- a/docs/_summary.md +++ b/docs/_summary.md @@ -104,6 +104,7 @@ * [Bluetooth](feature_bluetooth.md) * [Bootmagic](feature_bootmagic.md) * [Custom Matrix](custom_matrix.md) + * [Digitizer](feature_digitizer.md) * [DIP Switch](feature_dip_switch.md) * [Encoders](feature_encoders.md) * [Haptic Feedback](feature_haptic_feedback.md) diff --git a/docs/feature_digitizer.md b/docs/feature_digitizer.md new file mode 100644 index 000000000000..e2cc789543f5 --- /dev/null +++ b/docs/feature_digitizer.md @@ -0,0 +1,34 @@ +## Digitizer + +The digitizer HID interface allows setting the mouse cursor position at absolute coordinates, unlike the Pointing Device feature that applies relative displacements. + +To enable the digitizer interface, add the following line to your rules.mk: + +```makefile +DIGITIZER_ENABLE = yes +``` + +In order to change the mouse cursor position from your keymap.c file, include the digitizer header : + +```c +#include +``` + +This gives you access to the `digitizer` structure which members allow you to change the cursor position. + +The coordinates are normalized, meaning there value must be set between 0 and 1. For the `x` coordinate, the value `0` is the leftmost position, whereas the value `1` is the rightmost position. +For the `y` coordinate, `0` is at the top and `1` at the bottom. + +Here is an example setting the cursor in the middle of the screen: + +```c +digitizer.x = 0.5; +digitizer.y = 0.5; +digitizer.tipswitch = 0; +digitizer.inrange = 1; +digitizer.status |= DZ_UPDATED; +``` + +The `tipswitch` member triggers what equates to a click when set to `1`. The `inrange` member is required for the change in coordinates to be taken. It can then be set to `0` in a new report to signal the end of the digitizer interaction. + +Once all members are set to the desired value, the `status` member needs its bitmask `DZ_UPDATED` to be set so the report is sent during the next main loop iteration. \ No newline at end of file diff --git a/keyboards/handwired/onekey/keymaps/digitizer/config.h b/keyboards/handwired/onekey/keymaps/digitizer/config.h new file mode 100644 index 000000000000..3f59c932d39b --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/digitizer/config.h @@ -0,0 +1,2 @@ +#pragma once + diff --git a/keyboards/handwired/onekey/keymaps/digitizer/keymap.c b/keyboards/handwired/onekey/keymaps/digitizer/keymap.c new file mode 100644 index 000000000000..b12636ab76ee --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/digitizer/keymap.c @@ -0,0 +1,24 @@ +#include QMK_KEYBOARD_H + +#include "digitizer.h" + +#include "math.h" + +#ifndef ADC_PIN +# define ADC_PIN F6 +#endif + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + LAYOUT_ortho_1x1(JS_BUTTON0) +}; + +void matrix_scan_user() { + if (((timer_read()/10) % 10) != 0){ + return; + } + digitizer.x = 0.5-0.2*cos(timer_read()/250./6.28); + digitizer.y = 0.5-0.2*sin(timer_read()/250./6.28); + digitizer.tipswitch = 0; + digitizer.inrange = 1; + digitizer.status |= DZ_UPDATED; +} diff --git a/keyboards/handwired/onekey/keymaps/digitizer/rules.mk b/keyboards/handwired/onekey/keymaps/digitizer/rules.mk new file mode 100644 index 000000000000..9b17f2fa2c94 --- /dev/null +++ b/keyboards/handwired/onekey/keymaps/digitizer/rules.mk @@ -0,0 +1 @@ +DIGITIZER_ENABLE = yes diff --git a/quantum/digitizer.c b/quantum/digitizer.c new file mode 100644 index 000000000000..e38122d3da27 --- /dev/null +++ b/quantum/digitizer.c @@ -0,0 +1,9 @@ +#include "digitizer.h" + +digitizer_t digitizer = {.tipswitch = 0, + .inrange = 0, + .id = 0, + .x = 0, + .y = 0, + .status = DZ_INITIALIZED|DZ_UPDATED}; + diff --git a/quantum/digitizer.h b/quantum/digitizer.h new file mode 100644 index 000000000000..224dff2421a3 --- /dev/null +++ b/quantum/digitizer.h @@ -0,0 +1,20 @@ +#pragma once + +#include "quantum.h" + +#include + +enum digitizer_status { DZ_INITIALIZED = 1, DZ_UPDATED = 2 }; + +typedef struct { + int8_t tipswitch; + int8_t inrange; + uint8_t id; + float x; + float y; + uint8_t status : 2; +} digitizer_t; + +extern digitizer_t digitizer; + +void host_digitizer_send(digitizer_t *digitizer); diff --git a/quantum/process_keycode/process_digitizer.c b/quantum/process_keycode/process_digitizer.c new file mode 100644 index 000000000000..4233ae30be65 --- /dev/null +++ b/quantum/process_keycode/process_digitizer.c @@ -0,0 +1,21 @@ +#include "digitizer.h" +#include "process_digitizer.h" + +__attribute__((weak)) void digitizer_task(void) { + if (digitizer.status & DZ_UPDATED) { + host_digitizer_send(&digitizer); + digitizer.status &= ~DZ_UPDATED; + + //send a mouse report to make the cursor show up again (on windows at least) + report_mouse_t newMouseReport; + newMouseReport.h = 0; + newMouseReport.v = 0; + newMouseReport.x = 1; + newMouseReport.y = 0; + newMouseReport.buttons = 0; + host_mouse_send(&newMouseReport); + } + + +} + diff --git a/quantum/process_keycode/process_digitizer.h b/quantum/process_keycode/process_digitizer.h new file mode 100644 index 000000000000..3d022384f2b6 --- /dev/null +++ b/quantum/process_keycode/process_digitizer.h @@ -0,0 +1,5 @@ +#pragma once + +#include "quantum.h" + +void digitizer_task(void); diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 2f8f81126ab6..71e362e4b40d 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -114,6 +114,10 @@ ifeq ($(strip $(NO_USB_STARTUP_CHECK)), yes) TMK_COMMON_DEFS += -DNO_USB_STARTUP_CHECK endif +ifeq ($(strip $(DIGITIZER_ENABLE)), yes) + TMK_COMMON_DEFS += -DDIGITIZER_ENABLE +endif + ifeq ($(strip $(SHARED_EP_ENABLE)), yes) TMK_COMMON_DEFS += -DSHARED_EP_ENABLE endif diff --git a/tmk_core/common/host.c b/tmk_core/common/host.c index a8b391e89381..0f2c4627f202 100644 --- a/tmk_core/common/host.c +++ b/tmk_core/common/host.c @@ -22,6 +22,7 @@ along with this program. If not, see . #include "host.h" #include "util.h" #include "debug.h" +#include "digitizer.h" #ifdef NKRO_ENABLE # include "keycode_config.h" @@ -103,6 +104,19 @@ void host_consumer_send(uint16_t report) { (*driver->send_consumer)(report); } +void host_digitizer_send(digitizer_t *digitizer){ + if (!driver) return; + + report_digitizer_t report = { + .report_id = REPORT_ID_DIGITIZER, + .tip = digitizer->tipswitch & 0x1, + .inrange = digitizer->inrange & 0x1, + .x = (uint16_t)(digitizer->x*0x7FFF), + .y = (uint16_t)(digitizer->y*0x7FFF), + }; + (*driver->send_digitizer)(&report); +} + uint16_t host_last_system_report(void) { return last_system_report; } 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 f34a22053066..42443b96f6c0 100644 --- a/tmk_core/common/host_driver.h +++ b/tmk_core/common/host_driver.h @@ -29,4 +29,5 @@ typedef struct { void (*send_mouse)(report_mouse_t *); void (*send_system)(uint16_t); void (*send_consumer)(uint16_t); + void (*send_digitizer)(report_digitizer_t*); } host_driver_t; diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 28fa97bc8fd8..b51dd832bbd7 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -106,6 +106,9 @@ along with this program. If not, see . #if defined(CRC_ENABLE) # include "crc.h" #endif +#ifdef DIGITIZER_ENABLE +# include "process_digitizer.h" +#endif static uint32_t last_input_modification_time = 0; uint32_t last_input_activity_time(void) { return last_input_modification_time; } @@ -537,6 +540,10 @@ void keyboard_task(void) { joystick_task(); #endif +#ifdef DIGITIZER_ENABLE + digitizer_task(); +#endif + // update LED if (led_status != host_keyboard_leds()) { led_status = host_keyboard_leds(); diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h index db6370657d53..c9ae4fbc0378 100644 --- a/tmk_core/common/report.h +++ b/tmk_core/common/report.h @@ -30,7 +30,8 @@ enum hid_report_ids { REPORT_ID_SYSTEM, REPORT_ID_CONSUMER, REPORT_ID_NKRO, - REPORT_ID_JOYSTICK + REPORT_ID_JOYSTICK, + REPORT_ID_DIGITIZER }; /* Mouse buttons */ @@ -205,6 +206,15 @@ typedef struct { int8_t h; } __attribute__((packed)) report_mouse_t; +typedef struct { + uint8_t report_id; + uint8_t tip : 1; + uint8_t inrange : 1; + uint8_t pad2 : 6; + uint16_t x; + uint16_t y; +} __attribute__((packed)) report_digitizer_t; + typedef struct { #if JOYSTICK_AXES_COUNT > 0 # if JOYSTICK_AXES_RESOLUTION > 8 diff --git a/tmk_core/protocol/chibios/main.c b/tmk_core/protocol/chibios/main.c index 199741594a5c..2ad1d1c28530 100644 --- a/tmk_core/protocol/chibios/main.c +++ b/tmk_core/protocol/chibios/main.c @@ -65,9 +65,10 @@ void send_keyboard(report_keyboard_t *report); void send_mouse(report_mouse_t *report); void send_system(uint16_t data); void send_consumer(uint16_t data); +void send_digitizer(report_digitizer_t* report); /* host struct */ -host_driver_t chibios_driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer}; +host_driver_t chibios_driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer, send_digitizer}; #ifdef VIRTSER_ENABLE void virtser_task(void); diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index 407b8ea75de9..137c8e4bdc1c 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -923,6 +923,28 @@ void send_consumer(uint16_t data) { #endif } +void send_digitizer(report_digitizer_t* report){ + osalSysLock(); + if (usbGetDriverStateI(&USB_DRIVER) != USB_ACTIVE) { + osalSysUnlock(); + return; + } + + if (usbGetTransmitStatusI(&USB_DRIVER, SHARED_IN_EPNUM)) { + /* Need to either suspend, or loop and call unlock/lock during + * every iteration - otherwise the system will remain locked, + * no interrupts served, so USB not going through as well. + * Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */ + if (osalThreadSuspendTimeoutS(&(&USB_DRIVER)->epc[SHARED_IN_EPNUM]->in_state->thread, TIME_MS2I(10)) == MSG_TIMEOUT) { + osalSysUnlock(); + return; + } + } + usbStartTransmitI(&USB_DRIVER, SHARED_IN_EPNUM, (uint8_t *)report, sizeof(report_digitizer_t)); + osalSysUnlock(); + +} + /* --------------------------------------------------------- * Console functions * --------------------------------------------------------- diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 4ac079e16872..b42086496b94 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -142,8 +142,9 @@ static void send_keyboard(report_keyboard_t *report); static void send_mouse(report_mouse_t *report); static void send_system(uint16_t data); static void send_consumer(uint16_t data); +static void send_digitizer(report_digitizer_t* report); host_driver_t lufa_driver = { - keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer, + keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer, send_digitizer }; #ifdef VIRTSER_ENABLE @@ -983,6 +984,22 @@ void virtser_send(const uint8_t byte) { } #endif +static void send_digitizer(report_digitizer_t* report){ + uint8_t timeout = 255; + + if (USB_DeviceState != DEVICE_STATE_Configured) return; + + Endpoint_SelectEndpoint(SHARED_IN_EPNUM); + + /* Check if write ready for a polling interval around 10ms */ + while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40); + if (!Endpoint_IsReadWriteAllowed()) return; + + Endpoint_Write_Stream_LE(report, sizeof(report_digitizer_t), NULL); + Endpoint_ClearIN(); + +} + /******************************************************************************* * main ******************************************************************************/ diff --git a/tmk_core/protocol/usb_descriptor.c b/tmk_core/protocol/usb_descriptor.c index c88aceb6ed5c..684f6ab80ca2 100644 --- a/tmk_core/protocol/usb_descriptor.c +++ b/tmk_core/protocol/usb_descriptor.c @@ -227,6 +227,36 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = { HID_RI_OUTPUT(8, HID_IOF_CONSTANT), HID_RI_END_COLLECTION(0), #endif +#if DIGITIZER_ENABLE + HID_RI_USAGE_PAGE(8, 0x0D),//Digitizer Device Page + HID_RI_USAGE(8, 0x02), + HID_RI_COLLECTION(8, 0x01), + HID_RI_REPORT_ID(8, REPORT_ID_DIGITIZER), + HID_RI_USAGE(8, 0x20),//Finger + HID_RI_COLLECTION(8, 0x00), + HID_RI_USAGE(8, 0x42),//Tip Switch + HID_RI_LOGICAL_MINIMUM(8, 0x00), + HID_RI_LOGICAL_MAXIMUM(8, 0x01), + HID_RI_REPORT_SIZE(8, 0x01), + HID_RI_REPORT_COUNT(8, 0x01), + HID_RI_INPUT(8, HID_IOF_VARIABLE), + HID_RI_USAGE(8, 0x32),//In Range + HID_RI_INPUT(8, HID_IOF_VARIABLE), + HID_RI_REPORT_COUNT(8, 0x06),//padding + HID_RI_INPUT(8, HID_IOF_CONSTANT | HID_IOF_VARIABLE), + HID_RI_USAGE_PAGE(8, 0x01),//Generic Desktop Page + HID_RI_LOGICAL_MAXIMUM(16, 0x7FFF),//(32767) + HID_RI_REPORT_SIZE(8, 0x10), + HID_RI_REPORT_COUNT(8, 0x01), + HID_RI_UNIT(8, 0x33), + HID_RI_UNIT_EXPONENT(8, 0x0E), + HID_RI_USAGE(8, 0x30),//X + HID_RI_INPUT(8, HID_IOF_VARIABLE), + HID_RI_USAGE(8, 0x31),//Y + HID_RI_INPUT(8, HID_IOF_VARIABLE), + HID_RI_END_COLLECTION(0), + HID_RI_END_COLLECTION(0) +#endif #ifdef SHARED_EP_ENABLE }; #endif From 5092282b08501a3821d597dad9400f1a2c3af127 Mon Sep 17 00:00:00 2001 From: a-chol Date: Thu, 13 May 2021 18:39:07 +0200 Subject: [PATCH 02/13] Update docs/feature_digitizer.md Co-authored-by: Ryan --- docs/feature_digitizer.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/feature_digitizer.md b/docs/feature_digitizer.md index e2cc789543f5..4a09c9a3c989 100644 --- a/docs/feature_digitizer.md +++ b/docs/feature_digitizer.md @@ -11,7 +11,7 @@ DIGITIZER_ENABLE = yes In order to change the mouse cursor position from your keymap.c file, include the digitizer header : ```c -#include +#include "digitizer.h" ``` This gives you access to the `digitizer` structure which members allow you to change the cursor position. @@ -31,4 +31,4 @@ digitizer.status |= DZ_UPDATED; The `tipswitch` member triggers what equates to a click when set to `1`. The `inrange` member is required for the change in coordinates to be taken. It can then be set to `0` in a new report to signal the end of the digitizer interaction. -Once all members are set to the desired value, the `status` member needs its bitmask `DZ_UPDATED` to be set so the report is sent during the next main loop iteration. \ No newline at end of file +Once all members are set to the desired value, the `status` member needs its bitmask `DZ_UPDATED` to be set so the report is sent during the next main loop iteration. From 9f2f6bd65ed424816ee9c987eaa7b7fa97c9c2e3 Mon Sep 17 00:00:00 2001 From: a-chol Date: Thu, 13 May 2021 18:44:51 +0200 Subject: [PATCH 03/13] Update tmk_core/protocol/usb_descriptor.c Co-authored-by: Ryan --- tmk_core/protocol/usb_descriptor.c | 60 ++++++++++++++++-------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/tmk_core/protocol/usb_descriptor.c b/tmk_core/protocol/usb_descriptor.c index 684f6ab80ca2..f16b27e6388b 100644 --- a/tmk_core/protocol/usb_descriptor.c +++ b/tmk_core/protocol/usb_descriptor.c @@ -227,34 +227,40 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = { HID_RI_OUTPUT(8, HID_IOF_CONSTANT), HID_RI_END_COLLECTION(0), #endif + #if DIGITIZER_ENABLE - HID_RI_USAGE_PAGE(8, 0x0D),//Digitizer Device Page - HID_RI_USAGE(8, 0x02), - HID_RI_COLLECTION(8, 0x01), - HID_RI_REPORT_ID(8, REPORT_ID_DIGITIZER), - HID_RI_USAGE(8, 0x20),//Finger - HID_RI_COLLECTION(8, 0x00), - HID_RI_USAGE(8, 0x42),//Tip Switch - HID_RI_LOGICAL_MINIMUM(8, 0x00), - HID_RI_LOGICAL_MAXIMUM(8, 0x01), - HID_RI_REPORT_SIZE(8, 0x01), - HID_RI_REPORT_COUNT(8, 0x01), - HID_RI_INPUT(8, HID_IOF_VARIABLE), - HID_RI_USAGE(8, 0x32),//In Range - HID_RI_INPUT(8, HID_IOF_VARIABLE), - HID_RI_REPORT_COUNT(8, 0x06),//padding - HID_RI_INPUT(8, HID_IOF_CONSTANT | HID_IOF_VARIABLE), - HID_RI_USAGE_PAGE(8, 0x01),//Generic Desktop Page - HID_RI_LOGICAL_MAXIMUM(16, 0x7FFF),//(32767) - HID_RI_REPORT_SIZE(8, 0x10), - HID_RI_REPORT_COUNT(8, 0x01), - HID_RI_UNIT(8, 0x33), - HID_RI_UNIT_EXPONENT(8, 0x0E), - HID_RI_USAGE(8, 0x30),//X - HID_RI_INPUT(8, HID_IOF_VARIABLE), - HID_RI_USAGE(8, 0x31),//Y - HID_RI_INPUT(8, HID_IOF_VARIABLE), - HID_RI_END_COLLECTION(0), + HID_RI_USAGE_PAGE(8, 0x0D), // Digitizers + HID_RI_USAGE(8, 0x02), // Pen + HID_RI_COLLECTION(8, 0x01), // Application + HID_RI_REPORT_ID(8, REPORT_ID_DIGITIZER), + HID_RI_USAGE(8, 0x20), // Stylus + HID_RI_COLLECTION(8, 0x00), // Physical + // Tip Switch (1 bit) + HID_RI_USAGE(8, 0x42), // Tip Switch + HID_RI_LOGICAL_MINIMUM(8, 0x00), + HID_RI_LOGICAL_MAXIMUM(8, 0x01), + HID_RI_REPORT_SIZE(8, 0x01), + HID_RI_REPORT_COUNT(8, 0x01), + HID_RI_INPUT(8, HID_IOF_VARIABLE), + // In Range (1 bit) + HID_RI_USAGE(8, 0x32), // In Range + HID_RI_INPUT(8, HID_IOF_VARIABLE), + // Padding (6 bits) + HID_RI_REPORT_COUNT(8, 0x06), + HID_RI_INPUT(8, HID_IOF_CONSTANT | HID_IOF_VARIABLE), + + // X/Y Position (4 bytes) + HID_RI_USAGE_PAGE(8, 0x01), // Generic Desktop + HID_RI_LOGICAL_MAXIMUM(16, 0x7FFF), + HID_RI_REPORT_SIZE(8, 0x10), + HID_RI_REPORT_COUNT(8, 0x01), + HID_RI_UNIT(8, 0x33), // Inch, English Linear + HID_RI_UNIT_EXPONENT(8, 0x0E), // -2 + HID_RI_USAGE(8, 0x30), // X + HID_RI_INPUT(8, HID_IOF_VARIABLE), + HID_RI_USAGE(8, 0x31), // Y + HID_RI_INPUT(8, HID_IOF_VARIABLE), + HID_RI_END_COLLECTION(0), HID_RI_END_COLLECTION(0) #endif #ifdef SHARED_EP_ENABLE From 1673f308190831677bdc59123a6057a4d8a0d0ec Mon Sep 17 00:00:00 2001 From: a-chol Date: Tue, 11 May 2021 23:45:48 +0200 Subject: [PATCH 04/13] Add missing copyrights Add V-USB support --- quantum/digitizer.c | 15 +++++++ quantum/digitizer.h | 15 +++++++ quantum/process_keycode/process_digitizer.c | 15 +++++++ quantum/process_keycode/process_digitizer.h | 15 +++++++ tmk_core/protocol/lufa/lufa.c | 3 +- tmk_core/protocol/vusb/vusb.c | 45 ++++++++++++++++++++- 6 files changed, 105 insertions(+), 3 deletions(-) diff --git a/quantum/digitizer.c b/quantum/digitizer.c index e38122d3da27..b85a656bfdda 100644 --- a/quantum/digitizer.c +++ b/quantum/digitizer.c @@ -1,3 +1,18 @@ +/* Copyright 2021 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "digitizer.h" digitizer_t digitizer = {.tipswitch = 0, diff --git a/quantum/digitizer.h b/quantum/digitizer.h index 224dff2421a3..c0f6eedc04fc 100644 --- a/quantum/digitizer.h +++ b/quantum/digitizer.h @@ -1,3 +1,18 @@ +/* Copyright 2021 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #pragma once #include "quantum.h" diff --git a/quantum/process_keycode/process_digitizer.c b/quantum/process_keycode/process_digitizer.c index 4233ae30be65..16deecb0f659 100644 --- a/quantum/process_keycode/process_digitizer.c +++ b/quantum/process_keycode/process_digitizer.c @@ -1,3 +1,18 @@ +/* Copyright 2021 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "digitizer.h" #include "process_digitizer.h" diff --git a/quantum/process_keycode/process_digitizer.h b/quantum/process_keycode/process_digitizer.h index 3d022384f2b6..6366c776a027 100644 --- a/quantum/process_keycode/process_digitizer.h +++ b/quantum/process_keycode/process_digitizer.h @@ -1,3 +1,18 @@ +/* Copyright 2021 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #pragma once #include "quantum.h" diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index b42086496b94..9d895eaf6b2f 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -985,6 +985,7 @@ void virtser_send(const uint8_t byte) { #endif static void send_digitizer(report_digitizer_t* report){ +#ifdef DIGITIZER_ENABLE uint8_t timeout = 255; if (USB_DeviceState != DEVICE_STATE_Configured) return; @@ -997,7 +998,7 @@ static void send_digitizer(report_digitizer_t* report){ Endpoint_Write_Stream_LE(report, sizeof(report_digitizer_t), NULL); Endpoint_ClearIN(); - +#endif } /******************************************************************************* diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c index 876a31378613..5e1055fe830e 100644 --- a/tmk_core/protocol/vusb/vusb.c +++ b/tmk_core/protocol/vusb/vusb.c @@ -226,8 +226,9 @@ static void send_keyboard(report_keyboard_t *report); static void send_mouse(report_mouse_t *report); static void send_system(uint16_t data); static void send_consumer(uint16_t data); +static void send_digitizer(report_digitizer_t* report); -static host_driver_t driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer}; +static host_driver_t driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer, send_digitizer}; host_driver_t *vusb_driver(void) { return &driver; } @@ -292,6 +293,14 @@ static void send_consumer(uint16_t data) { #endif } +static void send_digitizer(report_digitizer_t* report){ +#ifdef DIGITIZER_ENABLE + if (usbInterruptIsReadyShared()) { + usbSetInterruptShared((void *)&report, sizeof(report_digitizer_t)); + } +#endif +} + /*------------------------------------------------------------------* * Request from host * *------------------------------------------------------------------*/ @@ -510,8 +519,40 @@ const PROGMEM uchar shared_hid_report[] = { 0x95, 0x01, // Report Count (1) 0x75, 0x10, // Report Size (16) 0x81, 0x00, // Input (Data, Array, Absolute) - 0xC0 // End Collection + 0xC0, // End Collection +#endif + +#ifdef DIGITIZER_ENABLE + 0x05, 0x0d, // USAGE_PAGE (Digitizers) + 0x09, 0x02, // USAGE (Pen) + 0xa1, 0x01, // COLLECTION (Application) + 0x85, REPORT_ID_DIGITIZER, // REPORT_ID (7) + 0x09, 0x22, // USAGE (Finger) + 0xa1, 0x00, // COLLECTION (Physical) + 0x09, 0x42, // USAGE (Tip Switch) + 0x25, 0x01, // LOGICAL_MAXIMUM (1) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x01, // REPORT_SIZE (1) + 0x81, 0x02, // INPUT (Data,Var,Abs) + 0x09, 0x32, // USAGE (In Range) + 0x81, 0x02, // INPUT (Data,Var,Abs) + 0x95, 0x06, // REPORT_COUNT (6) + 0x81, 0x03, // INPUT (Cnst,Var,Abs) + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) + 0x26, 0xff, 0x7f, // LOGICAL_MAXIMUM (32767) + 0x75, 0x10, // REPORT_SIZE (16) + 0x95, 0x01, // REPORT_COUNT (1) + 0x65, 0x33, // UNIT (Eng Lin:Distance) + 0x55, 0x0e, // UNIT_EXPONENT (-2) + 0x09, 0x30, // USAGE (X) + 0x81, 0x02, // INPUT (Data,Var,Abs) + 0x09, 0x31, // USAGE (Y) + 0x81, 0x02, // INPUT (Data,Var,Abs) + 0xc0, // END_COLLECTION + 0xc0, // END_COLLECTION #endif + #ifdef SHARED_EP_ENABLE }; #endif From 3a6e97bb4e4612653c57a9df3d1db941feb21f53 Mon Sep 17 00:00:00 2001 From: a-chol Date: Thu, 13 May 2021 21:20:07 +0200 Subject: [PATCH 05/13] Add support for digitizer dedicated endpoint for lufa and chibios. Fix formatting issues Move digitizer_task definition to the feature's base implementation file --- common_features.mk | 1 - .../onekey/keymaps/digitizer/config.h | 1 - .../onekey/keymaps/digitizer/keymap.c | 14 +- .../onekey/keymaps/digitizer/rules.mk | 2 +- quantum/digitizer.c | 20 ++- quantum/digitizer.h | 2 + quantum/process_keycode/process_digitizer.c | 36 ----- quantum/process_keycode/process_digitizer.h | 20 --- tmk_core/common.mk | 9 ++ tmk_core/common/host.c | 23 +-- tmk_core/common/keyboard.c | 2 +- tmk_core/common/report.h | 2 + tmk_core/protocol/chibios/usb_main.c | 32 +++-- tmk_core/protocol/lufa/lufa.c | 7 +- tmk_core/protocol/usb_descriptor.c | 135 +++++++++++++----- tmk_core/protocol/usb_descriptor.h | 25 ++++ tmk_core/protocol/vusb/vusb.c | 2 +- 17 files changed, 202 insertions(+), 131 deletions(-) delete mode 100644 quantum/process_keycode/process_digitizer.c delete mode 100644 quantum/process_keycode/process_digitizer.h diff --git a/common_features.mk b/common_features.mk index 7cc1f9890b9f..56abbf37bacb 100644 --- a/common_features.mk +++ b/common_features.mk @@ -703,7 +703,6 @@ endif DIGITIZER_ENABLE ?= no ifneq ($(strip $(DIGITIZER_ENABLE)), no) - SRC += $(QUANTUM_DIR)/process_keycode/process_digitizer.c SRC += $(QUANTUM_DIR)/digitizer.c endif diff --git a/keyboards/handwired/onekey/keymaps/digitizer/config.h b/keyboards/handwired/onekey/keymaps/digitizer/config.h index 3f59c932d39b..8b137891791f 100644 --- a/keyboards/handwired/onekey/keymaps/digitizer/config.h +++ b/keyboards/handwired/onekey/keymaps/digitizer/config.h @@ -1,2 +1 @@ -#pragma once diff --git a/keyboards/handwired/onekey/keymaps/digitizer/keymap.c b/keyboards/handwired/onekey/keymaps/digitizer/keymap.c index b12636ab76ee..a515c0d8a8f6 100644 --- a/keyboards/handwired/onekey/keymaps/digitizer/keymap.c +++ b/keyboards/handwired/onekey/keymaps/digitizer/keymap.c @@ -9,15 +9,19 @@ #endif const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - LAYOUT_ortho_1x1(JS_BUTTON0) + LAYOUT_ortho_1x1(KC_A) }; +uint32_t timer = 0; + void matrix_scan_user() { - if (((timer_read()/10) % 10) != 0){ - return; + if (timer_elapsed32(timer) < 200){ + return; } - digitizer.x = 0.5-0.2*cos(timer_read()/250./6.28); - digitizer.y = 0.5-0.2*sin(timer_read()/250./6.28); + + timer = timer_read32(); + digitizer.x = 0.5 - 0.2 * cos(timer_read() / 250. / 6.28); + digitizer.y = 0.5 - 0.2 * sin(timer_read() / 250. / 6.28); digitizer.tipswitch = 0; digitizer.inrange = 1; digitizer.status |= DZ_UPDATED; diff --git a/keyboards/handwired/onekey/keymaps/digitizer/rules.mk b/keyboards/handwired/onekey/keymaps/digitizer/rules.mk index 9b17f2fa2c94..ea9f9bd9ac62 100644 --- a/keyboards/handwired/onekey/keymaps/digitizer/rules.mk +++ b/keyboards/handwired/onekey/keymaps/digitizer/rules.mk @@ -1 +1 @@ -DIGITIZER_ENABLE = yes +DIGITIZER_ENABLE = yes \ No newline at end of file diff --git a/quantum/digitizer.c b/quantum/digitizer.c index b85a656bfdda..045e4237dcde 100644 --- a/quantum/digitizer.c +++ b/quantum/digitizer.c @@ -15,10 +15,18 @@ */ #include "digitizer.h" -digitizer_t digitizer = {.tipswitch = 0, - .inrange = 0, - .id = 0, - .x = 0, - .y = 0, - .status = DZ_INITIALIZED|DZ_UPDATED}; +digitizer_t digitizer = { + .tipswitch = 0, + .inrange = 0, + .id = 0, + .x = 0, + .y = 0, + .status = DZ_INITIALIZED|DZ_UPDATED +}; +__attribute__((weak)) void digitizer_task(void) { + if (digitizer.status & DZ_UPDATED) { + host_digitizer_send(&digitizer); + digitizer.status &= ~DZ_UPDATED; + } +} \ No newline at end of file diff --git a/quantum/digitizer.h b/quantum/digitizer.h index c0f6eedc04fc..72ac3161c17b 100644 --- a/quantum/digitizer.h +++ b/quantum/digitizer.h @@ -32,4 +32,6 @@ typedef struct { extern digitizer_t digitizer; +void digitizer_task(void); + void host_digitizer_send(digitizer_t *digitizer); diff --git a/quantum/process_keycode/process_digitizer.c b/quantum/process_keycode/process_digitizer.c deleted file mode 100644 index 16deecb0f659..000000000000 --- a/quantum/process_keycode/process_digitizer.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright 2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -#include "digitizer.h" -#include "process_digitizer.h" - -__attribute__((weak)) void digitizer_task(void) { - if (digitizer.status & DZ_UPDATED) { - host_digitizer_send(&digitizer); - digitizer.status &= ~DZ_UPDATED; - - //send a mouse report to make the cursor show up again (on windows at least) - report_mouse_t newMouseReport; - newMouseReport.h = 0; - newMouseReport.v = 0; - newMouseReport.x = 1; - newMouseReport.y = 0; - newMouseReport.buttons = 0; - host_mouse_send(&newMouseReport); - } - - -} - diff --git a/quantum/process_keycode/process_digitizer.h b/quantum/process_keycode/process_digitizer.h deleted file mode 100644 index 6366c776a027..000000000000 --- a/quantum/process_keycode/process_digitizer.h +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright 2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -#pragma once - -#include "quantum.h" - -void digitizer_task(void); diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 71e362e4b40d..7610d718c9ec 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -114,8 +114,17 @@ ifeq ($(strip $(NO_USB_STARTUP_CHECK)), yes) TMK_COMMON_DEFS += -DNO_USB_STARTUP_CHECK endif +ifeq ($(strip $(DIGITIZER_SHARED_EP)), yes) + TMK_COMMON_DEFS += -DDIGITIZER_SHARED_EP + SHARED_EP_ENABLE = yes +endif + ifeq ($(strip $(DIGITIZER_ENABLE)), yes) TMK_COMMON_DEFS += -DDIGITIZER_ENABLE + ifeq ($(strip $(SHARED_EP_ENABLE)), yes) + TMK_COMMON_DEFS += -DDIGITIZER_SHARED_EP + SHARED_EP_ENABLE = yes + endif endif ifeq ($(strip $(SHARED_EP_ENABLE)), yes) diff --git a/tmk_core/common/host.c b/tmk_core/common/host.c index 0f2c4627f202..e4e5c30d9167 100644 --- a/tmk_core/common/host.c +++ b/tmk_core/common/host.c @@ -105,16 +105,19 @@ void host_consumer_send(uint16_t report) { } void host_digitizer_send(digitizer_t *digitizer){ - if (!driver) return; - - report_digitizer_t report = { - .report_id = REPORT_ID_DIGITIZER, - .tip = digitizer->tipswitch & 0x1, - .inrange = digitizer->inrange & 0x1, - .x = (uint16_t)(digitizer->x*0x7FFF), - .y = (uint16_t)(digitizer->y*0x7FFF), - }; - (*driver->send_digitizer)(&report); + if (!driver) return; + + report_digitizer_t report = { +#ifdef DIGITIZER_SHARED_EP + .report_id = REPORT_ID_DIGITIZER, +#endif + .tip = digitizer->tipswitch & 0x1, + .inrange = digitizer->inrange & 0x1, + .x = (uint16_t)(digitizer->x*0x7FFF), + .y = (uint16_t)(digitizer->y*0x7FFF), + }; + + (*driver->send_digitizer)(&report); } uint16_t host_last_system_report(void) { return last_system_report; } diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index b51dd832bbd7..fcc51973fda3 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -107,7 +107,7 @@ along with this program. If not, see . # include "crc.h" #endif #ifdef DIGITIZER_ENABLE -# include "process_digitizer.h" +# include "digitizer.h" #endif static uint32_t last_input_modification_time = 0; diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h index c9ae4fbc0378..902ce8c3625f 100644 --- a/tmk_core/common/report.h +++ b/tmk_core/common/report.h @@ -207,7 +207,9 @@ typedef struct { } __attribute__((packed)) report_mouse_t; typedef struct { +#ifdef DIGITIZER_SHARED_EP uint8_t report_id; +#endif uint8_t tip : 1; uint8_t inrange : 1; uint8_t pad2 : 6; diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index 137c8e4bdc1c..07fdbace2635 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -315,6 +315,9 @@ typedef struct { #endif #ifdef JOYSTICK_ENABLE usb_driver_config_t joystick_driver; +#endif +#if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP) + usb_driver_config_t digitizer_driver; #endif }; usb_driver_config_t array[0]; @@ -360,6 +363,14 @@ static usb_driver_configs_t drivers = { # define JOYSTICK_OUT_MODE USB_EP_MODE_TYPE_BULK .joystick_driver = QMK_USB_DRIVER_CONFIG(JOYSTICK, 0, false), #endif + +#if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP) +# define DIGITIZER_IN_CAPACITY 4 +# define DIGITIZER_OUT_CAPACITY 4 +# define DIGITIZER_IN_MODE USB_EP_MODE_TYPE_BULK +# define DIGITIZER_OUT_MODE USB_EP_MODE_TYPE_BULK + .digitizer_driver = QMK_USB_DRIVER_CONFIG(DIGITIZER, 0, false), +#endif }; #define NUM_USB_DRIVERS (sizeof(drivers) / sizeof(usb_driver_config_t)) @@ -924,25 +935,20 @@ void send_consumer(uint16_t data) { } void send_digitizer(report_digitizer_t* report){ +#ifdef DIGITIZER_ENABLE +# ifdef DIGITIZER_SHARED_EP osalSysLock(); if (usbGetDriverStateI(&USB_DRIVER) != USB_ACTIVE) { osalSysUnlock(); return; } - - if (usbGetTransmitStatusI(&USB_DRIVER, SHARED_IN_EPNUM)) { - /* Need to either suspend, or loop and call unlock/lock during - * every iteration - otherwise the system will remain locked, - * no interrupts served, so USB not going through as well. - * Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */ - if (osalThreadSuspendTimeoutS(&(&USB_DRIVER)->epc[SHARED_IN_EPNUM]->in_state->thread, TIME_MS2I(10)) == MSG_TIMEOUT) { - osalSysUnlock(); - return; - } - } - usbStartTransmitI(&USB_DRIVER, SHARED_IN_EPNUM, (uint8_t *)report, sizeof(report_digitizer_t)); - osalSysUnlock(); + usbStartTransmitI(&USB_DRIVER, DIGITIZER_IN_EPNUM, (uint8_t *)report, sizeof(report_digitizer_t)); + osalSysUnlock(); +# else + chnWrite(&drivers.digitizer_driver.driver, (uint8_t *)report, sizeof(report_digitizer_t)); +# endif +#endif } /* --------------------------------------------------------- diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 9d895eaf6b2f..556905cd7f3b 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -526,6 +526,11 @@ void EVENT_USB_Device_ConfigurationChanged(void) { /* Setup joystick endpoint */ ConfigSuccess &= Endpoint_ConfigureEndpoint((JOYSTICK_IN_EPNUM | ENDPOINT_DIR_IN), EP_TYPE_INTERRUPT, JOYSTICK_EPSIZE, 1); #endif + +#if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP) + /* Setup digitizer endpoint */ + ConfigSuccess &= Endpoint_ConfigureEndpoint((DIGITIZER_IN_EPNUM | ENDPOINT_DIR_IN), EP_TYPE_INTERRUPT, DIGITIZER_EPSIZE, 1); +#endif } /* FIXME: Expose this table in the docs somehow @@ -990,7 +995,7 @@ static void send_digitizer(report_digitizer_t* report){ if (USB_DeviceState != DEVICE_STATE_Configured) return; - Endpoint_SelectEndpoint(SHARED_IN_EPNUM); + Endpoint_SelectEndpoint(DIGITIZER_IN_EPNUM); /* Check if write ready for a polling interval around 10ms */ while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40); diff --git a/tmk_core/protocol/usb_descriptor.c b/tmk_core/protocol/usb_descriptor.c index f16b27e6388b..8f4f33423fd7 100644 --- a/tmk_core/protocol/usb_descriptor.c +++ b/tmk_core/protocol/usb_descriptor.c @@ -158,6 +158,53 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = { # endif #endif +#ifdef DIGITIZER_ENABLE +# ifndef DIGITIZER_SHARED_EP +const USB_Descriptor_HIDReport_Datatype_t PROGMEM DigitizerReport[] = { +# elif !defined(SHARED_REPORT_STARTED) +const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = { +# define SHARED_REPORT_STARTED +# endif + HID_RI_USAGE_PAGE(8, 0x0D), // Digitizers + HID_RI_USAGE(8, 0x02), // Pen + HID_RI_COLLECTION(8, 0x01), // Application +# ifdef DIGITIZER_SHARED_EP + HID_RI_REPORT_ID(8, REPORT_ID_DIGITIZER), +# endif + HID_RI_USAGE(8, 0x20), // Stylus + HID_RI_COLLECTION(8, 0x00), // Physical + // Tip Switch (1 bit) + HID_RI_USAGE(8, 0x42), // Tip Switch + HID_RI_LOGICAL_MINIMUM(8, 0x00), + HID_RI_LOGICAL_MAXIMUM(8, 0x01), + HID_RI_REPORT_SIZE(8, 0x01), + HID_RI_REPORT_COUNT(8, 0x01), + HID_RI_INPUT(8, HID_IOF_VARIABLE), + // In Range (1 bit) + HID_RI_USAGE(8, 0x32), // In Range + HID_RI_INPUT(8, HID_IOF_VARIABLE), + // Padding (6 bits) + HID_RI_REPORT_COUNT(8, 0x06), + HID_RI_INPUT(8, HID_IOF_CONSTANT | HID_IOF_VARIABLE), + + // X/Y Position (4 bytes) + HID_RI_USAGE_PAGE(8, 0x01), // Generic Desktop + HID_RI_LOGICAL_MAXIMUM(16, 0x7FFF), + HID_RI_REPORT_SIZE(8, 0x10), + HID_RI_REPORT_COUNT(8, 0x01), + HID_RI_UNIT(8, 0x33), // Inch, English Linear + HID_RI_UNIT_EXPONENT(8, 0x0E), // -2 + HID_RI_USAGE(8, 0x30), // X + HID_RI_INPUT(8, HID_IOF_VARIABLE), + HID_RI_USAGE(8, 0x31), // Y + HID_RI_INPUT(8, HID_IOF_VARIABLE), + HID_RI_END_COLLECTION(0), + HID_RI_END_COLLECTION(0) +# ifndef DIGITIZER_SHARED_EP +}; +# endif +#endif + #if defined(SHARED_EP_ENABLE) && !defined(SHARED_REPORT_STARTED) const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = { #endif @@ -228,41 +275,6 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = { HID_RI_END_COLLECTION(0), #endif -#if DIGITIZER_ENABLE - HID_RI_USAGE_PAGE(8, 0x0D), // Digitizers - HID_RI_USAGE(8, 0x02), // Pen - HID_RI_COLLECTION(8, 0x01), // Application - HID_RI_REPORT_ID(8, REPORT_ID_DIGITIZER), - HID_RI_USAGE(8, 0x20), // Stylus - HID_RI_COLLECTION(8, 0x00), // Physical - // Tip Switch (1 bit) - HID_RI_USAGE(8, 0x42), // Tip Switch - HID_RI_LOGICAL_MINIMUM(8, 0x00), - HID_RI_LOGICAL_MAXIMUM(8, 0x01), - HID_RI_REPORT_SIZE(8, 0x01), - HID_RI_REPORT_COUNT(8, 0x01), - HID_RI_INPUT(8, HID_IOF_VARIABLE), - // In Range (1 bit) - HID_RI_USAGE(8, 0x32), // In Range - HID_RI_INPUT(8, HID_IOF_VARIABLE), - // Padding (6 bits) - HID_RI_REPORT_COUNT(8, 0x06), - HID_RI_INPUT(8, HID_IOF_CONSTANT | HID_IOF_VARIABLE), - - // X/Y Position (4 bytes) - HID_RI_USAGE_PAGE(8, 0x01), // Generic Desktop - HID_RI_LOGICAL_MAXIMUM(16, 0x7FFF), - HID_RI_REPORT_SIZE(8, 0x10), - HID_RI_REPORT_COUNT(8, 0x01), - HID_RI_UNIT(8, 0x33), // Inch, English Linear - HID_RI_UNIT_EXPONENT(8, 0x0E), // -2 - HID_RI_USAGE(8, 0x30), // X - HID_RI_INPUT(8, HID_IOF_VARIABLE), - HID_RI_USAGE(8, 0x31), // Y - HID_RI_INPUT(8, HID_IOF_VARIABLE), - HID_RI_END_COLLECTION(0), - HID_RI_END_COLLECTION(0) -#endif #ifdef SHARED_EP_ENABLE }; #endif @@ -957,6 +969,46 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = { .PollingIntervalMS = USB_POLLING_INTERVAL_MS } #endif + +#if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP) + /* + * Digitizer + */ + .Digitizer_Interface = { + .Header = { + .Size = sizeof(USB_Descriptor_Interface_t), + .Type = DTYPE_Interface + }, + .InterfaceNumber = DIGITIZER_INTERFACE, + .AlternateSetting = 0x00, + .TotalEndpoints = 1, + .Class = HID_CSCP_HIDClass, + .SubClass = HID_CSCP_NonBootSubclass, + .Protocol = HID_CSCP_NonBootProtocol, + .InterfaceStrIndex = NO_DESCRIPTOR + }, + .Digitizer_HID = { + .Header = { + .Size = sizeof(USB_HID_Descriptor_HID_t), + .Type = HID_DTYPE_HID + }, + .HIDSpec = VERSION_BCD(1, 1, 1), + .CountryCode = 0x00, + .TotalReportDescriptors = 1, + .HIDReportType = HID_DTYPE_Report, + .HIDReportLength = sizeof(DigitizerReport) + }, + .Digitizer_INEndpoint = { + .Header = { + .Size = sizeof(USB_Descriptor_Endpoint_t), + .Type = DTYPE_Endpoint + }, + .EndpointAddress = (ENDPOINT_DIR_IN | DIGITIZER_IN_EPNUM), + .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), + .EndpointSize = DIGITIZER_EPSIZE, + .PollingIntervalMS = USB_POLLING_INTERVAL_MS + }, +#endif }; /* @@ -1095,6 +1147,13 @@ uint16_t get_usb_descriptor(const uint16_t wValue, const uint16_t wIndex, const Size = sizeof(USB_HID_Descriptor_HID_t); break; #endif +#if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP) + case DIGITIZER_INTERFACE: + Address = &ConfigurationDescriptor.Digitizer_HID; + Size = sizeof(USB_HID_Descriptor_HID_t); + + break; +#endif } break; @@ -1144,6 +1203,12 @@ uint16_t get_usb_descriptor(const uint16_t wValue, const uint16_t wIndex, const Address = &JoystickReport; Size = sizeof(JoystickReport); break; +#endif +#if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP) + case DIGITIZER_INTERFACE: + Address = &DigitizerReport; + Size = sizeof(DigitizerReport); + break; #endif } diff --git a/tmk_core/protocol/usb_descriptor.h b/tmk_core/protocol/usb_descriptor.h index 867e549b4f84..47a13e7885da 100644 --- a/tmk_core/protocol/usb_descriptor.h +++ b/tmk_core/protocol/usb_descriptor.h @@ -135,6 +135,13 @@ typedef struct { USB_HID_Descriptor_HID_t Joystick_HID; USB_Descriptor_Endpoint_t Joystick_INEndpoint; #endif + +#if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP) + // Digitizer HID Interface + USB_Descriptor_Interface_t Digitizer_Interface; + USB_HID_Descriptor_HID_t Digitizer_HID; + USB_Descriptor_Endpoint_t Digitizer_INEndpoint; +#endif } USB_Descriptor_Configuration_t; /* @@ -180,6 +187,10 @@ enum usb_interfaces { #if defined(JOYSTICK_ENABLE) JOYSTICK_INTERFACE, #endif + +#if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP) + DIGITIZER_INTERFACE, +#endif TOTAL_INTERFACES }; @@ -259,6 +270,19 @@ enum usb_endpoints { JOYSTICK_OUT_EPNUM = NEXT_EPNUM, # endif #endif + +#ifdef DIGITIZER_ENABLE +#if !defined(DIGITIZER_SHARED_EP) + DIGITIZER_IN_EPNUM = NEXT_EPNUM, +# if STM32_USB_USE_OTG1 + DIGITIZER_OUT_EPNUM = DIGITIZER_IN_EPNUM, +# else + DIGITIZER_OUT_EPNUM = NEXT_EPNUM, +# endif +#else +# define DIGITIZER_IN_EPNUM SHARED_IN_EPNUM +#endif +#endif }; #ifdef PROTOCOL_LUFA @@ -284,5 +308,6 @@ enum usb_endpoints { #define CDC_NOTIFICATION_EPSIZE 8 #define CDC_EPSIZE 16 #define JOYSTICK_EPSIZE 8 +#define DIGITIZER_EPSIZE 8 uint16_t get_usb_descriptor(const uint16_t wValue, const uint16_t wIndex, const void** const DescriptorAddress); diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c index 5e1055fe830e..3711882aa3f0 100644 --- a/tmk_core/protocol/vusb/vusb.c +++ b/tmk_core/protocol/vusb/vusb.c @@ -296,7 +296,7 @@ static void send_consumer(uint16_t data) { static void send_digitizer(report_digitizer_t* report){ #ifdef DIGITIZER_ENABLE if (usbInterruptIsReadyShared()) { - usbSetInterruptShared((void *)&report, sizeof(report_digitizer_t)); + usbSetInterruptShared((void *)report, sizeof(report_digitizer_t)); } #endif } From 327aeec6a55e785b85acf06c7af0b47096dc95e8 Mon Sep 17 00:00:00 2001 From: a-chol Date: Fri, 14 May 2021 13:51:41 +0200 Subject: [PATCH 06/13] Run cformat on modified files --- quantum/digitizer.c | 9 +--- quantum/digitizer.h | 8 ++-- tmk_core/common/host.c | 12 +++--- tmk_core/common/host_driver.h | 2 +- tmk_core/common/report.h | 10 ++--- tmk_core/protocol/chibios/main.c | 2 +- tmk_core/protocol/chibios/usb_main.c | 20 ++++----- tmk_core/protocol/lufa/lufa.c | 8 ++-- tmk_core/protocol/usb_descriptor.h | 18 ++++---- tmk_core/protocol/vusb/vusb.c | 62 ++++++++++++++-------------- 10 files changed, 71 insertions(+), 80 deletions(-) diff --git a/quantum/digitizer.c b/quantum/digitizer.c index 045e4237dcde..2bde64f85a16 100644 --- a/quantum/digitizer.c +++ b/quantum/digitizer.c @@ -15,14 +15,7 @@ */ #include "digitizer.h" -digitizer_t digitizer = { - .tipswitch = 0, - .inrange = 0, - .id = 0, - .x = 0, - .y = 0, - .status = DZ_INITIALIZED|DZ_UPDATED -}; +digitizer_t digitizer = {.tipswitch = 0, .inrange = 0, .id = 0, .x = 0, .y = 0, .status = DZ_INITIALIZED | DZ_UPDATED}; __attribute__((weak)) void digitizer_task(void) { if (digitizer.status & DZ_UPDATED) { diff --git a/quantum/digitizer.h b/quantum/digitizer.h index 72ac3161c17b..2648d2db9770 100644 --- a/quantum/digitizer.h +++ b/quantum/digitizer.h @@ -22,11 +22,11 @@ enum digitizer_status { DZ_INITIALIZED = 1, DZ_UPDATED = 2 }; typedef struct { - int8_t tipswitch; - int8_t inrange; + int8_t tipswitch; + int8_t inrange; uint8_t id; - float x; - float y; + float x; + float y; uint8_t status : 2; } digitizer_t; diff --git a/tmk_core/common/host.c b/tmk_core/common/host.c index e4e5c30d9167..c7767be2814f 100644 --- a/tmk_core/common/host.c +++ b/tmk_core/common/host.c @@ -104,19 +104,19 @@ void host_consumer_send(uint16_t report) { (*driver->send_consumer)(report); } -void host_digitizer_send(digitizer_t *digitizer){ +void host_digitizer_send(digitizer_t *digitizer) { if (!driver) return; - + report_digitizer_t report = { #ifdef DIGITIZER_SHARED_EP .report_id = REPORT_ID_DIGITIZER, #endif - .tip = digitizer->tipswitch & 0x1, + .tip = digitizer->tipswitch & 0x1, .inrange = digitizer->inrange & 0x1, - .x = (uint16_t)(digitizer->x*0x7FFF), - .y = (uint16_t)(digitizer->y*0x7FFF), + .x = (uint16_t)(digitizer->x * 0x7FFF), + .y = (uint16_t)(digitizer->y * 0x7FFF), }; - + (*driver->send_digitizer)(&report); } diff --git a/tmk_core/common/host_driver.h b/tmk_core/common/host_driver.h index 42443b96f6c0..373121bb5522 100644 --- a/tmk_core/common/host_driver.h +++ b/tmk_core/common/host_driver.h @@ -29,5 +29,5 @@ typedef struct { void (*send_mouse)(report_mouse_t *); void (*send_system)(uint16_t); void (*send_consumer)(uint16_t); - void (*send_digitizer)(report_digitizer_t*); + void (*send_digitizer)(report_digitizer_t *); } host_driver_t; diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h index 902ce8c3625f..f2223e80639e 100644 --- a/tmk_core/common/report.h +++ b/tmk_core/common/report.h @@ -210,11 +210,11 @@ typedef struct { #ifdef DIGITIZER_SHARED_EP uint8_t report_id; #endif - uint8_t tip : 1; - uint8_t inrange : 1; - uint8_t pad2 : 6; - uint16_t x; - uint16_t y; + uint8_t tip : 1; + uint8_t inrange : 1; + uint8_t pad2 : 6; + uint16_t x; + uint16_t y; } __attribute__((packed)) report_digitizer_t; typedef struct { diff --git a/tmk_core/protocol/chibios/main.c b/tmk_core/protocol/chibios/main.c index 2ad1d1c28530..d18fede27ca5 100644 --- a/tmk_core/protocol/chibios/main.c +++ b/tmk_core/protocol/chibios/main.c @@ -65,7 +65,7 @@ void send_keyboard(report_keyboard_t *report); void send_mouse(report_mouse_t *report); void send_system(uint16_t data); void send_consumer(uint16_t data); -void send_digitizer(report_digitizer_t* report); +void send_digitizer(report_digitizer_t *report); /* host struct */ host_driver_t chibios_driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer, send_digitizer}; diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index 07fdbace2635..d3f7cc193456 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -612,7 +612,7 @@ static bool usb_request_hook_cb(USBDriver *usbp) { #ifdef NKRO_ENABLE keymap_config.nkro = !!keyboard_protocol; if (!keymap_config.nkro && keyboard_idle) { -#else /* NKRO_ENABLE */ +#else /* NKRO_ENABLE */ if (keyboard_idle) { #endif /* NKRO_ENABLE */ /* arm the idle timer if boot protocol & idle */ @@ -630,7 +630,7 @@ static bool usb_request_hook_cb(USBDriver *usbp) { /* arm the timer */ #ifdef NKRO_ENABLE if (!keymap_config.nkro && keyboard_idle) { -#else /* NKRO_ENABLE */ +#else /* NKRO_ENABLE */ if (keyboard_idle) { #endif /* NKRO_ENABLE */ osalSysLockFromISR(); @@ -768,7 +768,7 @@ static void keyboard_idle_timer_cb(void *arg) { #ifdef NKRO_ENABLE if (!keymap_config.nkro && keyboard_idle && keyboard_protocol) { -#else /* NKRO_ENABLE */ +#else /* NKRO_ENABLE */ if (keyboard_idle && keyboard_protocol) { #endif /* NKRO_ENABLE */ /* TODO: are we sure we want the KBD_ENDPOINT? */ @@ -817,7 +817,7 @@ void send_keyboard(report_keyboard_t *report) { usbStartTransmitI(&USB_DRIVER, SHARED_IN_EPNUM, (uint8_t *)report, sizeof(struct nkro_report)); } else #endif /* NKRO_ENABLE */ - { /* regular protocol */ + { /* regular protocol */ /* need to wait until the previous packet has made it through */ /* busy wait, should be short and not very common */ if (usbGetTransmitStatusI(&USB_DRIVER, KEYBOARD_IN_EPNUM)) { @@ -884,7 +884,7 @@ void send_mouse(report_mouse_t *report) { osalSysUnlock(); } -#else /* MOUSE_ENABLE */ +#else /* MOUSE_ENABLE */ void send_mouse(report_mouse_t *report) { (void)report; } #endif /* MOUSE_ENABLE */ @@ -934,20 +934,20 @@ void send_consumer(uint16_t data) { #endif } -void send_digitizer(report_digitizer_t* report){ +void send_digitizer(report_digitizer_t *report) { #ifdef DIGITIZER_ENABLE -# ifdef DIGITIZER_SHARED_EP +# ifdef DIGITIZER_SHARED_EP osalSysLock(); if (usbGetDriverStateI(&USB_DRIVER) != USB_ACTIVE) { osalSysUnlock(); return; } - + usbStartTransmitI(&USB_DRIVER, DIGITIZER_IN_EPNUM, (uint8_t *)report, sizeof(report_digitizer_t)); osalSysUnlock(); -# else +# else chnWrite(&drivers.digitizer_driver.driver, (uint8_t *)report, sizeof(report_digitizer_t)); -# endif +# endif #endif } diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 556905cd7f3b..5e34d355a4af 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -142,10 +142,8 @@ static void send_keyboard(report_keyboard_t *report); static void send_mouse(report_mouse_t *report); static void send_system(uint16_t data); static void send_consumer(uint16_t data); -static void send_digitizer(report_digitizer_t* report); -host_driver_t lufa_driver = { - keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer, send_digitizer -}; +static void send_digitizer(report_digitizer_t *report); +host_driver_t lufa_driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer, send_digitizer}; #ifdef VIRTSER_ENABLE // clang-format off @@ -989,7 +987,7 @@ void virtser_send(const uint8_t byte) { } #endif -static void send_digitizer(report_digitizer_t* report){ +static void send_digitizer(report_digitizer_t *report) { #ifdef DIGITIZER_ENABLE uint8_t timeout = 255; diff --git a/tmk_core/protocol/usb_descriptor.h b/tmk_core/protocol/usb_descriptor.h index 47a13e7885da..92311daeadd6 100644 --- a/tmk_core/protocol/usb_descriptor.h +++ b/tmk_core/protocol/usb_descriptor.h @@ -219,7 +219,7 @@ enum usb_endpoints { # if STM32_USB_USE_OTG1 # define RAW_OUT_EPNUM RAW_IN_EPNUM # else - RAW_OUT_EPNUM = NEXT_EPNUM, + RAW_OUT_EPNUM = NEXT_EPNUM, # endif #endif @@ -259,7 +259,7 @@ enum usb_endpoints { # if STM32_USB_USE_OTG1 # define CDC_OUT_EPNUM CDC_IN_EPNUM # else - CDC_OUT_EPNUM = NEXT_EPNUM, + CDC_OUT_EPNUM = NEXT_EPNUM, # endif #endif #ifdef JOYSTICK_ENABLE @@ -267,21 +267,21 @@ enum usb_endpoints { # if STM32_USB_USE_OTG1 JOYSTICK_OUT_EPNUM = JOYSTICK_IN_EPNUM, # else - JOYSTICK_OUT_EPNUM = NEXT_EPNUM, + JOYSTICK_OUT_EPNUM = NEXT_EPNUM, # endif #endif #ifdef DIGITIZER_ENABLE -#if !defined(DIGITIZER_SHARED_EP) +# if !defined(DIGITIZER_SHARED_EP) DIGITIZER_IN_EPNUM = NEXT_EPNUM, -# if STM32_USB_USE_OTG1 +# if STM32_USB_USE_OTG1 DIGITIZER_OUT_EPNUM = DIGITIZER_IN_EPNUM, +# else + DIGITIZER_OUT_EPNUM = NEXT_EPNUM, +# endif # else - DIGITIZER_OUT_EPNUM = NEXT_EPNUM, +# define DIGITIZER_IN_EPNUM SHARED_IN_EPNUM # endif -#else -# define DIGITIZER_IN_EPNUM SHARED_IN_EPNUM -#endif #endif }; diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c index 3711882aa3f0..60451bf4a9a4 100644 --- a/tmk_core/protocol/vusb/vusb.c +++ b/tmk_core/protocol/vusb/vusb.c @@ -226,7 +226,7 @@ static void send_keyboard(report_keyboard_t *report); static void send_mouse(report_mouse_t *report); static void send_system(uint16_t data); static void send_consumer(uint16_t data); -static void send_digitizer(report_digitizer_t* report); +static void send_digitizer(report_digitizer_t *report); static host_driver_t driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer, send_digitizer}; @@ -293,7 +293,7 @@ static void send_consumer(uint16_t data) { #endif } -static void send_digitizer(report_digitizer_t* report){ +static void send_digitizer(report_digitizer_t *report) { #ifdef DIGITIZER_ENABLE if (usbInterruptIsReadyShared()) { usbSetInterruptShared((void *)report, sizeof(report_digitizer_t)); @@ -519,38 +519,38 @@ const PROGMEM uchar shared_hid_report[] = { 0x95, 0x01, // Report Count (1) 0x75, 0x10, // Report Size (16) 0x81, 0x00, // Input (Data, Array, Absolute) - 0xC0, // End Collection + 0xC0, // End Collection #endif #ifdef DIGITIZER_ENABLE - 0x05, 0x0d, // USAGE_PAGE (Digitizers) - 0x09, 0x02, // USAGE (Pen) - 0xa1, 0x01, // COLLECTION (Application) - 0x85, REPORT_ID_DIGITIZER, // REPORT_ID (7) - 0x09, 0x22, // USAGE (Finger) - 0xa1, 0x00, // COLLECTION (Physical) - 0x09, 0x42, // USAGE (Tip Switch) - 0x25, 0x01, // LOGICAL_MAXIMUM (1) - 0x15, 0x00, // LOGICAL_MINIMUM (0) - 0x95, 0x01, // REPORT_COUNT (1) - 0x75, 0x01, // REPORT_SIZE (1) - 0x81, 0x02, // INPUT (Data,Var,Abs) - 0x09, 0x32, // USAGE (In Range) - 0x81, 0x02, // INPUT (Data,Var,Abs) - 0x95, 0x06, // REPORT_COUNT (6) - 0x81, 0x03, // INPUT (Cnst,Var,Abs) - 0x05, 0x01, // USAGE_PAGE (Generic Desktop) - 0x26, 0xff, 0x7f, // LOGICAL_MAXIMUM (32767) - 0x75, 0x10, // REPORT_SIZE (16) - 0x95, 0x01, // REPORT_COUNT (1) - 0x65, 0x33, // UNIT (Eng Lin:Distance) - 0x55, 0x0e, // UNIT_EXPONENT (-2) - 0x09, 0x30, // USAGE (X) - 0x81, 0x02, // INPUT (Data,Var,Abs) - 0x09, 0x31, // USAGE (Y) - 0x81, 0x02, // INPUT (Data,Var,Abs) - 0xc0, // END_COLLECTION - 0xc0, // END_COLLECTION + 0x05, 0x0d, // USAGE_PAGE (Digitizers) + 0x09, 0x02, // USAGE (Pen) + 0xa1, 0x01, // COLLECTION (Application) + 0x85, REPORT_ID_DIGITIZER, // REPORT_ID (7) + 0x09, 0x22, // USAGE (Finger) + 0xa1, 0x00, // COLLECTION (Physical) + 0x09, 0x42, // USAGE (Tip Switch) + 0x25, 0x01, // LOGICAL_MAXIMUM (1) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x01, // REPORT_SIZE (1) + 0x81, 0x02, // INPUT (Data,Var,Abs) + 0x09, 0x32, // USAGE (In Range) + 0x81, 0x02, // INPUT (Data,Var,Abs) + 0x95, 0x06, // REPORT_COUNT (6) + 0x81, 0x03, // INPUT (Cnst,Var,Abs) + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) + 0x26, 0xff, 0x7f, // LOGICAL_MAXIMUM (32767) + 0x75, 0x10, // REPORT_SIZE (16) + 0x95, 0x01, // REPORT_COUNT (1) + 0x65, 0x33, // UNIT (Eng Lin:Distance) + 0x55, 0x0e, // UNIT_EXPONENT (-2) + 0x09, 0x30, // USAGE (X) + 0x81, 0x02, // INPUT (Data,Var,Abs) + 0x09, 0x31, // USAGE (Y) + 0x81, 0x02, // INPUT (Data,Var,Abs) + 0xc0, // END_COLLECTION + 0xc0, // END_COLLECTION #endif #ifdef SHARED_EP_ENABLE From a1f4fc97fc78630096a23e32fb3091ff869a356a Mon Sep 17 00:00:00 2001 From: a-chol Date: Fri, 14 May 2021 14:08:51 +0200 Subject: [PATCH 07/13] Change digitizer report usage to Digitizer instead of Pen to avoid pointer disappearing on Windows. --- tmk_core/protocol/usb_descriptor.c | 2 +- tmk_core/protocol/vusb/vusb.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tmk_core/protocol/usb_descriptor.c b/tmk_core/protocol/usb_descriptor.c index 8f4f33423fd7..ccd48b72c7b3 100644 --- a/tmk_core/protocol/usb_descriptor.c +++ b/tmk_core/protocol/usb_descriptor.c @@ -166,7 +166,7 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = { # define SHARED_REPORT_STARTED # endif HID_RI_USAGE_PAGE(8, 0x0D), // Digitizers - HID_RI_USAGE(8, 0x02), // Pen + HID_RI_USAGE(8, 0x01), // Digitizer HID_RI_COLLECTION(8, 0x01), // Application # ifdef DIGITIZER_SHARED_EP HID_RI_REPORT_ID(8, REPORT_ID_DIGITIZER), diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c index 60451bf4a9a4..f0aa3c7cea72 100644 --- a/tmk_core/protocol/vusb/vusb.c +++ b/tmk_core/protocol/vusb/vusb.c @@ -524,7 +524,7 @@ const PROGMEM uchar shared_hid_report[] = { #ifdef DIGITIZER_ENABLE 0x05, 0x0d, // USAGE_PAGE (Digitizers) - 0x09, 0x02, // USAGE (Pen) + 0x09, 0x01, // USAGE (Digitizer) 0xa1, 0x01, // COLLECTION (Application) 0x85, REPORT_ID_DIGITIZER, // REPORT_ID (7) 0x09, 0x22, // USAGE (Finger) From 7c29bfb50a260314c8c56e934e9bf5624e8bbb95 Mon Sep 17 00:00:00 2001 From: a-chol Date: Fri, 14 May 2021 14:45:14 +0200 Subject: [PATCH 08/13] Update tmk_core/protocol/vusb/vusb.c Co-authored-by: Ryan --- tmk_core/protocol/vusb/vusb.c | 62 +++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c index f0aa3c7cea72..c516560313d9 100644 --- a/tmk_core/protocol/vusb/vusb.c +++ b/tmk_core/protocol/vusb/vusb.c @@ -523,34 +523,40 @@ const PROGMEM uchar shared_hid_report[] = { #endif #ifdef DIGITIZER_ENABLE - 0x05, 0x0d, // USAGE_PAGE (Digitizers) - 0x09, 0x01, // USAGE (Digitizer) - 0xa1, 0x01, // COLLECTION (Application) - 0x85, REPORT_ID_DIGITIZER, // REPORT_ID (7) - 0x09, 0x22, // USAGE (Finger) - 0xa1, 0x00, // COLLECTION (Physical) - 0x09, 0x42, // USAGE (Tip Switch) - 0x25, 0x01, // LOGICAL_MAXIMUM (1) - 0x15, 0x00, // LOGICAL_MINIMUM (0) - 0x95, 0x01, // REPORT_COUNT (1) - 0x75, 0x01, // REPORT_SIZE (1) - 0x81, 0x02, // INPUT (Data,Var,Abs) - 0x09, 0x32, // USAGE (In Range) - 0x81, 0x02, // INPUT (Data,Var,Abs) - 0x95, 0x06, // REPORT_COUNT (6) - 0x81, 0x03, // INPUT (Cnst,Var,Abs) - 0x05, 0x01, // USAGE_PAGE (Generic Desktop) - 0x26, 0xff, 0x7f, // LOGICAL_MAXIMUM (32767) - 0x75, 0x10, // REPORT_SIZE (16) - 0x95, 0x01, // REPORT_COUNT (1) - 0x65, 0x33, // UNIT (Eng Lin:Distance) - 0x55, 0x0e, // UNIT_EXPONENT (-2) - 0x09, 0x30, // USAGE (X) - 0x81, 0x02, // INPUT (Data,Var,Abs) - 0x09, 0x31, // USAGE (Y) - 0x81, 0x02, // INPUT (Data,Var,Abs) - 0xc0, // END_COLLECTION - 0xc0, // END_COLLECTION + // Digitizer report descriptor + 0x05, 0x0D, // Usage Page (Digitizers) + 0x09, 0x01, // Usage (Digitizer) + 0xA1, 0x01, // Collection (Application) + 0x85, REPORT_ID_DIGITIZER, // Report ID + 0x09, 0x22, // Usage (Finger) + 0xA1, 0x00, // Collection (Physical) + // Tip Switch (1 bit) + 0x09, 0x42, // Usage (Tip Switch) + 0x15, 0x00, // Logical Minimum + 0x25, 0x01, // Logical Maximum + 0x95, 0x01, // Report Count (1) + 0x75, 0x01, // Report Size (16) + 0x81, 0x02, // Input (Data, Variable, Absolute) + // In Range (1 bit) + 0x09, 0x32, // Usage (In Range) + 0x81, 0x02, // Input (Data, Variable, Absolute) + // Padding (6 bits) + 0x95, 0x06, // Report Count (6) + 0x81, 0x03, // Input (Constant) + + // X/Y Position (4 bytes) + 0x05, 0x01, // Usage Page (Generic Desktop) + 0x26, 0xFF, 0x7F, // Logical Maximum (32767) + 0x95, 0x01, // Report Count (1) + 0x75, 0x10, // Report Size (16) + 0x65, 0x33, // Unit (Inch, English Linear) + 0x55, 0x0E, // Unit Exponent (-2) + 0x09, 0x30, // Usage (X) + 0x81, 0x02, // Input (Data, Variable, Absolute) + 0x09, 0x31, // Usage (Y) + 0x81, 0x02, // Input (Data, Variable, Absolute) + 0xC0, // End Collection + 0xC0 // End Collection #endif #ifdef SHARED_EP_ENABLE From 092f81a2b17e779952cfea47d7619bec166fbed0 Mon Sep 17 00:00:00 2001 From: a-chol Date: Sun, 16 May 2021 19:22:14 +0200 Subject: [PATCH 09/13] Run cformat from docker image --- .../handwired/onekey/keymaps/digitizer/config.h | 1 - .../handwired/onekey/keymaps/digitizer/keymap.c | 14 ++++++-------- tmk_core/protocol/chibios/usb_main.c | 10 +++++----- tmk_core/protocol/usb_descriptor.h | 8 ++++---- 4 files changed, 15 insertions(+), 18 deletions(-) delete mode 100644 keyboards/handwired/onekey/keymaps/digitizer/config.h diff --git a/keyboards/handwired/onekey/keymaps/digitizer/config.h b/keyboards/handwired/onekey/keymaps/digitizer/config.h deleted file mode 100644 index 8b137891791f..000000000000 --- a/keyboards/handwired/onekey/keymaps/digitizer/config.h +++ /dev/null @@ -1 +0,0 @@ - diff --git a/keyboards/handwired/onekey/keymaps/digitizer/keymap.c b/keyboards/handwired/onekey/keymaps/digitizer/keymap.c index a515c0d8a8f6..8e79887c50ea 100644 --- a/keyboards/handwired/onekey/keymaps/digitizer/keymap.c +++ b/keyboards/handwired/onekey/keymaps/digitizer/keymap.c @@ -8,21 +8,19 @@ # define ADC_PIN F6 #endif -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - LAYOUT_ortho_1x1(KC_A) -}; +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {LAYOUT_ortho_1x1(KC_A)}; uint32_t timer = 0; void matrix_scan_user() { - if (timer_elapsed32(timer) < 200){ + if (timer_elapsed32(timer) < 200) { return; } - timer = timer_read32(); - digitizer.x = 0.5 - 0.2 * cos(timer_read() / 250. / 6.28); - digitizer.y = 0.5 - 0.2 * sin(timer_read() / 250. / 6.28); + timer = timer_read32(); + digitizer.x = 0.5 - 0.2 * cos(timer_read() / 250. / 6.28); + digitizer.y = 0.5 - 0.2 * sin(timer_read() / 250. / 6.28); digitizer.tipswitch = 0; - digitizer.inrange = 1; + digitizer.inrange = 1; digitizer.status |= DZ_UPDATED; } diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index d3f7cc193456..06795a915b09 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -612,7 +612,7 @@ static bool usb_request_hook_cb(USBDriver *usbp) { #ifdef NKRO_ENABLE keymap_config.nkro = !!keyboard_protocol; if (!keymap_config.nkro && keyboard_idle) { -#else /* NKRO_ENABLE */ +#else /* NKRO_ENABLE */ if (keyboard_idle) { #endif /* NKRO_ENABLE */ /* arm the idle timer if boot protocol & idle */ @@ -630,7 +630,7 @@ static bool usb_request_hook_cb(USBDriver *usbp) { /* arm the timer */ #ifdef NKRO_ENABLE if (!keymap_config.nkro && keyboard_idle) { -#else /* NKRO_ENABLE */ +#else /* NKRO_ENABLE */ if (keyboard_idle) { #endif /* NKRO_ENABLE */ osalSysLockFromISR(); @@ -768,7 +768,7 @@ static void keyboard_idle_timer_cb(void *arg) { #ifdef NKRO_ENABLE if (!keymap_config.nkro && keyboard_idle && keyboard_protocol) { -#else /* NKRO_ENABLE */ +#else /* NKRO_ENABLE */ if (keyboard_idle && keyboard_protocol) { #endif /* NKRO_ENABLE */ /* TODO: are we sure we want the KBD_ENDPOINT? */ @@ -817,7 +817,7 @@ void send_keyboard(report_keyboard_t *report) { usbStartTransmitI(&USB_DRIVER, SHARED_IN_EPNUM, (uint8_t *)report, sizeof(struct nkro_report)); } else #endif /* NKRO_ENABLE */ - { /* regular protocol */ + { /* regular protocol */ /* need to wait until the previous packet has made it through */ /* busy wait, should be short and not very common */ if (usbGetTransmitStatusI(&USB_DRIVER, KEYBOARD_IN_EPNUM)) { @@ -884,7 +884,7 @@ void send_mouse(report_mouse_t *report) { osalSysUnlock(); } -#else /* MOUSE_ENABLE */ +#else /* MOUSE_ENABLE */ void send_mouse(report_mouse_t *report) { (void)report; } #endif /* MOUSE_ENABLE */ diff --git a/tmk_core/protocol/usb_descriptor.h b/tmk_core/protocol/usb_descriptor.h index 92311daeadd6..0f0c78f66c40 100644 --- a/tmk_core/protocol/usb_descriptor.h +++ b/tmk_core/protocol/usb_descriptor.h @@ -219,7 +219,7 @@ enum usb_endpoints { # if STM32_USB_USE_OTG1 # define RAW_OUT_EPNUM RAW_IN_EPNUM # else - RAW_OUT_EPNUM = NEXT_EPNUM, + RAW_OUT_EPNUM = NEXT_EPNUM, # endif #endif @@ -237,7 +237,7 @@ enum usb_endpoints { # if STM32_USB_USE_OTG1 # define CONSOLE_OUT_EPNUM CONSOLE_IN_EPNUM # else - CONSOLE_OUT_EPNUM = NEXT_EPNUM, + CONSOLE_OUT_EPNUM = NEXT_EPNUM, # endif # else # define CONSOLE_OUT_EPNUM CONSOLE_IN_EPNUM @@ -259,7 +259,7 @@ enum usb_endpoints { # if STM32_USB_USE_OTG1 # define CDC_OUT_EPNUM CDC_IN_EPNUM # else - CDC_OUT_EPNUM = NEXT_EPNUM, + CDC_OUT_EPNUM = NEXT_EPNUM, # endif #endif #ifdef JOYSTICK_ENABLE @@ -267,7 +267,7 @@ enum usb_endpoints { # if STM32_USB_USE_OTG1 JOYSTICK_OUT_EPNUM = JOYSTICK_IN_EPNUM, # else - JOYSTICK_OUT_EPNUM = NEXT_EPNUM, + JOYSTICK_OUT_EPNUM = NEXT_EPNUM, # endif #endif From 8426a4802f19e32fb4399fe15b2ce213d5492479 Mon Sep 17 00:00:00 2001 From: a-chol Date: Fri, 21 May 2021 20:42:01 +0200 Subject: [PATCH 10/13] 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. --- tmk_core/common/host.c | 2 +- tmk_core/common/host_driver.h | 3 ++- tmk_core/protocol/chibios/main.c | 2 +- tmk_core/protocol/lufa/lufa.c | 5 ++--- tmk_core/protocol/usb_descriptor.c | 2 +- tmk_core/protocol/vusb/vusb.c | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tmk_core/common/host.c b/tmk_core/common/host.c index c7767be2814f..00dd70284c95 100644 --- a/tmk_core/common/host.c +++ b/tmk_core/common/host.c @@ -117,7 +117,7 @@ void host_digitizer_send(digitizer_t *digitizer) { .y = (uint16_t)(digitizer->y * 0x7FFF), }; - (*driver->send_digitizer)(&report); + send_digitizer(&report); } uint16_t host_last_system_report(void) { return last_system_report; } diff --git a/tmk_core/common/host_driver.h b/tmk_core/common/host_driver.h index 373121bb5522..2aebca043d99 100644 --- a/tmk_core/common/host_driver.h +++ b/tmk_core/common/host_driver.h @@ -29,5 +29,6 @@ typedef struct { void (*send_mouse)(report_mouse_t *); void (*send_system)(uint16_t); void (*send_consumer)(uint16_t); - void (*send_digitizer)(report_digitizer_t *); } host_driver_t; + +void send_digitizer(report_digitizer_t *report); \ No newline at end of file diff --git a/tmk_core/protocol/chibios/main.c b/tmk_core/protocol/chibios/main.c index d18fede27ca5..e41d6ff195c1 100644 --- a/tmk_core/protocol/chibios/main.c +++ b/tmk_core/protocol/chibios/main.c @@ -68,7 +68,7 @@ void send_consumer(uint16_t data); void send_digitizer(report_digitizer_t *report); /* host struct */ -host_driver_t chibios_driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer, send_digitizer}; +host_driver_t chibios_driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer}; #ifdef VIRTSER_ENABLE void virtser_task(void); diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 5e34d355a4af..8ddb8b1c4ba0 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -142,8 +142,7 @@ static void send_keyboard(report_keyboard_t *report); static void send_mouse(report_mouse_t *report); static void send_system(uint16_t data); static void send_consumer(uint16_t data); -static void send_digitizer(report_digitizer_t *report); -host_driver_t lufa_driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer, send_digitizer}; +host_driver_t lufa_driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer}; #ifdef VIRTSER_ENABLE // clang-format off @@ -987,7 +986,7 @@ void virtser_send(const uint8_t byte) { } #endif -static void send_digitizer(report_digitizer_t *report) { +void send_digitizer(report_digitizer_t *report) { #ifdef DIGITIZER_ENABLE uint8_t timeout = 255; diff --git a/tmk_core/protocol/usb_descriptor.c b/tmk_core/protocol/usb_descriptor.c index ccd48b72c7b3..5e4976b6e6ed 100644 --- a/tmk_core/protocol/usb_descriptor.c +++ b/tmk_core/protocol/usb_descriptor.c @@ -199,7 +199,7 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = { HID_RI_USAGE(8, 0x31), // Y HID_RI_INPUT(8, HID_IOF_VARIABLE), HID_RI_END_COLLECTION(0), - HID_RI_END_COLLECTION(0) + HID_RI_END_COLLECTION(0), # ifndef DIGITIZER_SHARED_EP }; # endif diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c index c516560313d9..c7b3ba4bb3dd 100644 --- a/tmk_core/protocol/vusb/vusb.c +++ b/tmk_core/protocol/vusb/vusb.c @@ -228,7 +228,7 @@ static void send_system(uint16_t data); static void send_consumer(uint16_t data); static void send_digitizer(report_digitizer_t *report); -static host_driver_t driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer, send_digitizer}; +static host_driver_t driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer}; host_driver_t *vusb_driver(void) { return &driver; } From 0de70e4a4f35232905b883a54ec36a34566ada28 Mon Sep 17 00:00:00 2001 From: a-chol Date: Fri, 21 May 2021 21:35:39 +0200 Subject: [PATCH 11/13] Fix build : send_digitizer shouldn't be static in vusb and add weak-linkage implementation for tests without usb implementation --- tmk_core/common/host.c | 2 ++ tmk_core/protocol/vusb/vusb.c | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tmk_core/common/host.c b/tmk_core/common/host.c index 00dd70284c95..f0c396b189a2 100644 --- a/tmk_core/common/host.c +++ b/tmk_core/common/host.c @@ -120,6 +120,8 @@ void host_digitizer_send(digitizer_t *digitizer) { send_digitizer(&report); } +__attribute__((weak)) void send_digitizer(report_digitizer_t *report) {} + uint16_t host_last_system_report(void) { return last_system_report; } uint16_t host_last_consumer_report(void) { return last_consumer_report; } diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c index c7b3ba4bb3dd..ba2c75e01b4b 100644 --- a/tmk_core/protocol/vusb/vusb.c +++ b/tmk_core/protocol/vusb/vusb.c @@ -226,7 +226,6 @@ static void send_keyboard(report_keyboard_t *report); static void send_mouse(report_mouse_t *report); static void send_system(uint16_t data); static void send_consumer(uint16_t data); -static void send_digitizer(report_digitizer_t *report); static host_driver_t driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer}; @@ -293,7 +292,7 @@ static void send_consumer(uint16_t data) { #endif } -static void send_digitizer(report_digitizer_t *report) { +void send_digitizer(report_digitizer_t *report) { #ifdef DIGITIZER_ENABLE if (usbInterruptIsReadyShared()) { usbSetInterruptShared((void *)report, sizeof(report_digitizer_t)); From f7baaefd8d7342b0370c0e9a1e4ec8e7a5906d2d Mon Sep 17 00:00:00 2001 From: a-chol Date: Fri, 28 May 2021 21:55:20 +0200 Subject: [PATCH 12/13] Change digitizer user interface to match pointing device's --- .../onekey/keymaps/digitizer/keymap.c | 22 ++++++++++++++----- quantum/digitizer.c | 19 +++++++++++----- quantum/digitizer.h | 4 ++++ 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/keyboards/handwired/onekey/keymaps/digitizer/keymap.c b/keyboards/handwired/onekey/keymaps/digitizer/keymap.c index 8e79887c50ea..6b304e86fe99 100644 --- a/keyboards/handwired/onekey/keymaps/digitizer/keymap.c +++ b/keyboards/handwired/onekey/keymaps/digitizer/keymap.c @@ -1,13 +1,24 @@ + /* Copyright 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include QMK_KEYBOARD_H #include "digitizer.h" #include "math.h" -#ifndef ADC_PIN -# define ADC_PIN F6 -#endif - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {LAYOUT_ortho_1x1(KC_A)}; uint32_t timer = 0; @@ -18,9 +29,10 @@ void matrix_scan_user() { } timer = timer_read32(); + digitizer_t digitizer; digitizer.x = 0.5 - 0.2 * cos(timer_read() / 250. / 6.28); digitizer.y = 0.5 - 0.2 * sin(timer_read() / 250. / 6.28); digitizer.tipswitch = 0; digitizer.inrange = 1; - digitizer.status |= DZ_UPDATED; + digitizer_set_report(digitizer); } diff --git a/quantum/digitizer.c b/quantum/digitizer.c index 2bde64f85a16..e29986742916 100644 --- a/quantum/digitizer.c +++ b/quantum/digitizer.c @@ -15,11 +15,20 @@ */ #include "digitizer.h" -digitizer_t digitizer = {.tipswitch = 0, .inrange = 0, .id = 0, .x = 0, .y = 0, .status = DZ_INITIALIZED | DZ_UPDATED}; +digitizer_t digitizerReport = {.tipswitch = 0, .inrange = 0, .id = 0, .x = 0, .y = 0, .status = DZ_INITIALIZED}; -__attribute__((weak)) void digitizer_task(void) { - if (digitizer.status & DZ_UPDATED) { - host_digitizer_send(&digitizer); - digitizer.status &= ~DZ_UPDATED; +__attribute__((weak)) void digitizer_send(void) { + if (digitizerReport.status & DZ_UPDATED) { + host_digitizer_send(&digitizerReport); + digitizerReport.status &= ~DZ_UPDATED; } +} + +__attribute__((weak)) void digitizer_task(void) { digitizer_send(); } + +digitizer_t digitizer_get_report(void) { return digitizerReport; } + +void digitizer_set_report(digitizer_t newDigitizerReport) { + digitizerReport = newDigitizerReport; + digitizerReport.status |= DZ_UPDATED; } \ No newline at end of file diff --git a/quantum/digitizer.h b/quantum/digitizer.h index 2648d2db9770..cef551567e0e 100644 --- a/quantum/digitizer.h +++ b/quantum/digitizer.h @@ -32,6 +32,10 @@ typedef struct { extern digitizer_t digitizer; +digitizer_t digitizer_get_report(void); + +void digitizer_set_report(digitizer_t newDigitizerReport); + void digitizer_task(void); void host_digitizer_send(digitizer_t *digitizer); From f66fdd87326a3220fce92c2e4cb18a4e0129f4e4 Mon Sep 17 00:00:00 2001 From: a-chol Date: Wed, 23 Jun 2021 22:09:05 +0200 Subject: [PATCH 13/13] Update documentation with new API --- docs/feature_digitizer.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/feature_digitizer.md b/docs/feature_digitizer.md index 4a09c9a3c989..9b6aeddbaa9e 100644 --- a/docs/feature_digitizer.md +++ b/docs/feature_digitizer.md @@ -22,13 +22,14 @@ For the `y` coordinate, `0` is at the top and `1` at the bottom. Here is an example setting the cursor in the middle of the screen: ```c +digitizer_t digitizer; digitizer.x = 0.5; digitizer.y = 0.5; digitizer.tipswitch = 0; digitizer.inrange = 1; -digitizer.status |= DZ_UPDATED; +digitizer_set_report(digitizer); ``` -The `tipswitch` member triggers what equates to a click when set to `1`. The `inrange` member is required for the change in coordinates to be taken. It can then be set to `0` in a new report to signal the end of the digitizer interaction. +The `tipswitch` member triggers what equates to a click when set to `1`. The `inrange` member is required for the change in coordinates to be taken. It can then be set to `0` in a new report to signal the end of the digitizer interaction, but it is not strictly required. Once all members are set to the desired value, the `status` member needs its bitmask `DZ_UPDATED` to be set so the report is sent during the next main loop iteration.