98 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #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);
 | 
