summaryrefslogtreecommitdiff
path: root/quantum/encoder.h
diff options
context:
space:
mode:
authorNick Brassel <nick@tzarc.org>2024-02-18 21:17:15 +1100
committerGitHub <noreply@github.com>2024-02-18 21:17:15 +1100
commit9d9cdaaa2d035787b0b50c26f2975695fdbc16f4 (patch)
tree1a9f5d16ffc0e3bd27bc14791c25405a79ccd069 /quantum/encoder.h
parent2eb9ff8efd1df2c98724481c71c8ab8a5b62e31e (diff)
Add encoder abstraction. (#21548)
Diffstat (limited to 'quantum/encoder.h')
-rw-r--r--quantum/encoder.h99
1 files changed, 71 insertions, 28 deletions
diff --git a/quantum/encoder.h b/quantum/encoder.h
index 1cbac98cb5..90414a43a0 100644
--- a/quantum/encoder.h
+++ b/quantum/encoder.h
@@ -22,45 +22,88 @@
22#include "gpio.h" 22#include "gpio.h"
23#include "util.h" 23#include "util.h"
24 24
25#ifdef ENCODER_ENABLE
26
27__attribute__((weak)) bool should_process_encoder(void);
28
25void encoder_init(void); 29void encoder_init(void);
26bool encoder_read(void); 30bool encoder_task(void);
31bool encoder_queue_event(uint8_t index, bool clockwise);
27 32
28bool encoder_update_kb(uint8_t index, bool clockwise); 33bool encoder_update_kb(uint8_t index, bool clockwise);
29bool encoder_update_user(uint8_t index, bool clockwise); 34bool encoder_update_user(uint8_t index, bool clockwise);
30 35
31#ifdef SPLIT_KEYBOARD 36# ifdef SPLIT_KEYBOARD
37
38# if defined(ENCODERS_PAD_A_RIGHT)
39# ifndef NUM_ENCODERS_LEFT
40# define NUM_ENCODERS_LEFT ARRAY_SIZE(((pin_t[])ENCODERS_PAD_A))
41# endif
42# ifndef NUM_ENCODERS_RIGHT
43# define NUM_ENCODERS_RIGHT ARRAY_SIZE(((pin_t[])ENCODERS_PAD_A_RIGHT))
44# endif
45# else
46# ifndef NUM_ENCODERS_LEFT
47# define NUM_ENCODERS_LEFT ARRAY_SIZE(((pin_t[])ENCODERS_PAD_A))
48# endif
49# ifndef NUM_ENCODERS_RIGHT
50# define NUM_ENCODERS_RIGHT NUM_ENCODERS_LEFT
51# endif
52# endif
53# ifndef NUM_ENCODERS
54# define NUM_ENCODERS (NUM_ENCODERS_LEFT + NUM_ENCODERS_RIGHT)
55# endif
56
57# else // SPLIT_KEYBOARD
32 58
33void encoder_state_raw(uint8_t* slave_state); 59# ifndef NUM_ENCODERS
34void encoder_update_raw(uint8_t* slave_state); 60# define NUM_ENCODERS ARRAY_SIZE(((pin_t[])ENCODERS_PAD_A))
61# endif
62# define NUM_ENCODERS_LEFT NUM_ENCODERS
63# define NUM_ENCODERS_RIGHT 0
35 64
36# if defined(ENCODERS_PAD_A_RIGHT) 65# endif // SPLIT_KEYBOARD
37# define NUM_ENCODERS_LEFT ARRAY_SIZE(((pin_t[])ENCODERS_PAD_A))
38# define NUM_ENCODERS_RIGHT ARRAY_SIZE(((pin_t[])ENCODERS_PAD_A_RIGHT))
39# else
40# define NUM_ENCODERS_LEFT ARRAY_SIZE(((pin_t[])ENCODERS_PAD_A))
41# define NUM_ENCODERS_RIGHT NUM_ENCODERS_LEFT
42# endif
43# define NUM_ENCODERS (NUM_ENCODERS_LEFT + NUM_ENCODERS_RIGHT)
44 66
45#else // SPLIT_KEYBOARD 67# ifndef NUM_ENCODERS
68# define NUM_ENCODERS 0
69# define NUM_ENCODERS_LEFT 0
70# define NUM_ENCODERS_RIGHT 0
71# endif // NUM_ENCODERS
46 72
47# define NUM_ENCODERS ARRAY_SIZE(((pin_t[])ENCODERS_PAD_A)) 73# define NUM_ENCODERS_MAX_PER_SIDE MAX(NUM_ENCODERS_LEFT, NUM_ENCODERS_RIGHT)
48# define NUM_ENCODERS_LEFT NUM_ENCODERS
49# define NUM_ENCODERS_RIGHT 0
50 74
51#endif // SPLIT_KEYBOARD 75# ifndef MAX_QUEUED_ENCODER_EVENTS
76# define MAX_QUEUED_ENCODER_EVENTS MAX(4, ((NUM_ENCODERS_MAX_PER_SIDE) + 1))
77# endif // MAX_QUEUED_ENCODER_EVENTS
52 78
53#ifndef NUM_ENCODERS 79typedef struct encoder_event_t {
54# define NUM_ENCODERS 0 80 uint8_t index : 7;
55# define NUM_ENCODERS_LEFT 0 81 uint8_t clockwise : 1;
56# define NUM_ENCODERS_RIGHT 0 82} encoder_event_t;
57#endif // NUM_ENCODERS
58 83
59#define NUM_ENCODERS_MAX_PER_SIDE MAX(NUM_ENCODERS_LEFT, NUM_ENCODERS_RIGHT) 84typedef struct encoder_events_t {
85 uint8_t head;
86 uint8_t tail;
87 encoder_event_t queue[MAX_QUEUED_ENCODER_EVENTS];
88} encoder_events_t;
60 89
61#ifdef ENCODER_MAP_ENABLE 90// Get the current queued events
62# define NUM_DIRECTIONS 2 91void encoder_retrieve_events(encoder_events_t *events);
63# define ENCODER_CCW_CW(ccw, cw) \ 92
64 { (cw), (ccw) } 93# ifdef SPLIT_KEYBOARD
94void encoder_set_tail_index(uint8_t tail_index);
95void encoder_handle_slave_events(encoder_events_t *events);
96# endif // SPLIT_KEYBOARD
97
98# ifdef ENCODER_MAP_ENABLE
99# define NUM_DIRECTIONS 2
100# define ENCODER_CCW_CW(ccw, cw) \
101 { (cw), (ccw) }
65extern const uint16_t encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS]; 102extern const uint16_t encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS];
66#endif // ENCODER_MAP_ENABLE 103# endif // ENCODER_MAP_ENABLE
104
105// "Custom encoder lite" support
106void encoder_driver_init(void);
107void encoder_driver_task(void);
108
109#endif // ENCODER_ENABLE