| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- #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);
|