From 6cc9513ab0cd5e21354c51ab83a89af9f2eb517e Mon Sep 17 00:00:00 2001 From: Ryan Date: Sun, 13 Nov 2022 10:28:11 +1100 Subject: Digitizer feature improvements (#19034) --- quantum/digitizer.c | 64 +++++++++++++++++++++++++++++++++++++++----------- quantum/digitizer.h | 67 ++++++++++++++++++++++++++++++++++++++++++++--------- quantum/keyboard.c | 7 ------ quantum/quantum.h | 4 ++++ 4 files changed, 111 insertions(+), 31 deletions(-) (limited to 'quantum') diff --git a/quantum/digitizer.c b/quantum/digitizer.c index 7925129d0c..f1b926181e 100644 --- a/quantum/digitizer.c +++ b/quantum/digitizer.c @@ -13,26 +13,64 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + #include "digitizer.h" -digitizer_t digitizerReport = {.tipswitch = 0, .inrange = 0, .id = 0, .x = 0, .y = 0, .status = DZ_INITIALIZED}; +digitizer_t digitizer_state = { + .in_range = false, + .tip = false, + .barrel = false, + .x = 0, + .y = 0, + .dirty = false, +}; -__attribute__((weak)) void digitizer_send(void) { - if (digitizerReport.status & DZ_UPDATED) { - host_digitizer_send(&digitizerReport); - digitizerReport.status &= ~DZ_UPDATED; +void digitizer_flush(void) { + if (digitizer_state.dirty) { + host_digitizer_send(&digitizer_state); + digitizer_state.dirty = false; } } -__attribute__((weak)) void digitizer_task(void) { - digitizer_send(); +void digitizer_in_range_on(void) { + digitizer_state.in_range = true; + digitizer_state.dirty = true; + digitizer_flush(); +} + +void digitizer_in_range_off(void) { + digitizer_state.in_range = false; + digitizer_state.dirty = true; + digitizer_flush(); +} + +void digitizer_tip_switch_on(void) { + digitizer_state.tip = true; + digitizer_state.dirty = true; + digitizer_flush(); } -digitizer_t digitizer_get_report(void) { - return digitizerReport; +void digitizer_tip_switch_off(void) { + digitizer_state.tip = false; + digitizer_state.dirty = true; + digitizer_flush(); } -void digitizer_set_report(digitizer_t newDigitizerReport) { - digitizerReport = newDigitizerReport; - digitizerReport.status |= DZ_UPDATED; -} \ No newline at end of file +void digitizer_barrel_switch_on(void) { + digitizer_state.barrel = true; + digitizer_state.dirty = true; + digitizer_flush(); +} + +void digitizer_barrel_switch_off(void) { + digitizer_state.barrel = false; + digitizer_state.dirty = true; + digitizer_flush(); +} + +void digitizer_set_position(float x, float y) { + digitizer_state.x = x; + digitizer_state.y = y; + digitizer_state.dirty = true; + digitizer_flush(); +} diff --git a/quantum/digitizer.h b/quantum/digitizer.h index cef551567e..b826ba8ac8 100644 --- a/quantum/digitizer.h +++ b/quantum/digitizer.h @@ -17,25 +17,70 @@ #include "quantum.h" +#include #include -enum digitizer_status { DZ_INITIALIZED = 1, DZ_UPDATED = 2 }; +/** + * \defgroup digitizer + * + * HID Digitizer + * \{ + */ typedef struct { - int8_t tipswitch; - int8_t inrange; - uint8_t id; - float x; - float y; - uint8_t status : 2; + bool in_range : 1; + bool tip : 1; + bool barrel : 1; + float x; + float y; + bool dirty; } digitizer_t; -extern digitizer_t digitizer; +extern digitizer_t digitizer_state; -digitizer_t digitizer_get_report(void); +/** + * \brief Send the digitizer report to the host if it is marked as dirty. + */ +void digitizer_flush(void); -void digitizer_set_report(digitizer_t newDigitizerReport); +/** + * \brief Assert the "in range" indicator, and flush the report. + */ +void digitizer_in_range_on(void); -void digitizer_task(void); +/** + * \brief Deassert the "in range" indicator, and flush the report. + */ +void digitizer_in_range_off(void); + +/** + * \brief Assert the tip switch, and flush the report. + */ +void digitizer_tip_switch_on(void); + +/** + * \brief Deassert the tip switch, and flush the report. + */ +void digitizer_tip_switch_off(void); + +/** + * \brief Assert the barrel switch, and flush the report. + */ +void digitizer_barrel_switch_on(void); + +/** + * \brief Deassert the barrel switch, and flush the report. + */ +void digitizer_barrel_switch_off(void); + +/** + * \brief Set the absolute X and Y position of the digitizer contact, and flush the report. + * + * \param x The X value of the contact position, from 0 to 1. + * \param y The Y value of the contact position, from 0 to 1. + */ +void digitizer_set_position(float x, float y); void host_digitizer_send(digitizer_t *digitizer); + +/** \} */ diff --git a/quantum/keyboard.c b/quantum/keyboard.c index eb5e4b583a..83ade7829a 100644 --- a/quantum/keyboard.c +++ b/quantum/keyboard.c @@ -90,9 +90,6 @@ along with this program. If not, see . #if defined(CRC_ENABLE) # include "crc.h" #endif -#ifdef DIGITIZER_ENABLE -# include "digitizer.h" -#endif #ifdef VIRTSER_ENABLE # include "virtser.h" #endif @@ -662,10 +659,6 @@ void keyboard_task(void) { joystick_task(); #endif -#ifdef DIGITIZER_ENABLE - digitizer_task(); -#endif - #ifdef BLUETOOTH_ENABLE bluetooth_task(); #endif diff --git a/quantum/quantum.h b/quantum/quantum.h index 4192b3fb16..c8dfdeca75 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -207,6 +207,10 @@ extern layer_state_t layer_state; # include "joystick.h" #endif +#ifdef DIGITIZER_ENABLE +# include "digitizer.h" +#endif + #ifdef VIA_ENABLE # include "via.h" #endif -- cgit v1.2.3