diff options
author | Drashna Jaelre <[email protected]> | 2021-07-25 18:18:39 -0700 |
---|---|---|
committer | GitHub <[email protected]> | 2021-07-25 18:18:39 -0700 |
commit | 4bb595f94b5c77e7a961ff69d2b4d9c53a9094fc (patch) | |
tree | aef7208a8afee7f2f33c5a91b4613537c7ccb8ea /keyboards/splitkb/kyria/keymaps/gotham/thumbstick.h | |
parent | d90897052243808863bcab3b07e16d5b6a0b08f0 (diff) | |
download | qmk_firmware-4bb595f94b5c77e7a961ff69d2b4d9c53a9094fc.tar.gz qmk_firmware-4bb595f94b5c77e7a961ff69d2b4d9c53a9094fc.zip |
[Keyboard] Fix up SplitKB keyboards (#13511)
Diffstat (limited to 'keyboards/splitkb/kyria/keymaps/gotham/thumbstick.h')
-rw-r--r-- | keyboards/splitkb/kyria/keymaps/gotham/thumbstick.h | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/keyboards/splitkb/kyria/keymaps/gotham/thumbstick.h b/keyboards/splitkb/kyria/keymaps/gotham/thumbstick.h new file mode 100644 index 0000000000..aff939c746 --- /dev/null +++ b/keyboards/splitkb/kyria/keymaps/gotham/thumbstick.h @@ -0,0 +1,98 @@ +#pragma once + +typedef enum { + THUMBSTICK_MODE_MOUSE = 0, + THUMBSTICK_MODE_ARROWS, + THUMBSTICK_MODE_SCROLL, + _THUMBSTICK_MODE_LAST // Do not use, except for looping through enum values +} thumbstick_mode_t; + +// Parameters +#define THUMBSTICK_DEAD_ZONE 90 // Values below this are ignored (deadzone) +#define THUMBSTICK_FINE_ZONE 180 // Values below this enable fine movement + +#define THUMBSTICK_MODE THUMBSTICK_MODE_MOUSE +#define THUMBSTICK_SPEED 256 +#define THUMBSTICK_FINE_SPEED 96 +#define THUMBSTICK_SCROLL_SPEED 1 + +#define THUMBSTICK_EIGHT_AXIS true +#define THUMBSTICK_AXIS_SEPARATION 0.5f + +// Implicit and derived constants +#define THUMBSTICK_TIMEOUT 10 // Mouse report throttling time in ms +#define THUMBSTICK_SCROLL_TIMEOUT 200 // Mouse scroll throttling time in ms +#define THUMBSTICK_RANGE_START 0 +#define THUMBSTICK_RANGE_STOP 1023 +#define THUMBSTICK_RANGE_CENTER (THUMBSTICK_RANGE_STOP - THUMBSTICK_RANGE_START + 1) / 2 +#define THUMBSTICK_RANGE_MOVEMENT (THUMBSTICK_RANGE_CENTER - THUMBSTICK_DEAD_ZONE) + +#include "timer.h" +#include "analog.h" +#include "split_util.h" +#include "pointing_device.h" + +#if defined THUMBSTICK_DEBUG +# include "print.h" +uint16_t rawX; +uint16_t rawY; +uint16_t distX; +uint16_t distY; +uint16_t thumbstickLogTimer; +#endif + +typedef struct { + thumbstick_mode_t mode; + uint16_t deadZone; + uint16_t fineZone; + uint16_t speed; + uint16_t fineSpeed; + float axisSeparation; + bool eightAxis; +} thumbstick_config_t; + +typedef struct { + int16_t x; + int16_t y; +} thumbstick_vector_t; + +typedef struct { + bool up; + bool right; + bool down; + bool left; +} thumbstick_direction_t; + +typedef struct { + thumbstick_config_t config; + thumbstick_vector_t vector; + thumbstick_direction_t direction; + thumbstick_direction_t lastDirection; + report_mouse_t report; +} thumbstick_state_t; + +uint16_t thumbstickTimer; +uint16_t thumbstickScrollTimer; + +thumbstick_state_t thumbstick_state; + +void thumbstick_mode_set(thumbstick_mode_t mode); + +thumbstick_mode_t thumbstick_mode_get(void); + +void thumbstick_mode_cycle(bool reverse); + +void thumbstick_init(void); + +// Axis-level wrapper to read raw value, do logging and calculate speed +int16_t thumbstick_get_component(uint8_t pin); + +// Get mouse speed +int16_t thumbstick_get_mouse_speed(int16_t component); + +// Fix direction within one of 8 axes (or 4 if 8-axis is disabled) +thumbstick_direction_t thumbstick_get_discretized_direction(thumbstick_vector_t vector, float axisSeparation, bool eightAxis); + +void thumbstick_process(void); + +void update_keycode_status(uint16_t keycode, bool last, bool current); |