diff options
| author | Nick Brassel <nick@tzarc.org> | 2024-02-18 21:17:15 +1100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-18 21:17:15 +1100 |
| commit | 9d9cdaaa2d035787b0b50c26f2975695fdbc16f4 (patch) | |
| tree | 1a9f5d16ffc0e3bd27bc14791c25405a79ccd069 /quantum/encoder.h | |
| parent | 2eb9ff8efd1df2c98724481c71c8ab8a5b62e31e (diff) | |
Add encoder abstraction. (#21548)
Diffstat (limited to 'quantum/encoder.h')
| -rw-r--r-- | quantum/encoder.h | 99 |
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 | |||
| 25 | void encoder_init(void); | 29 | void encoder_init(void); |
| 26 | bool encoder_read(void); | 30 | bool encoder_task(void); |
| 31 | bool encoder_queue_event(uint8_t index, bool clockwise); | ||
| 27 | 32 | ||
| 28 | bool encoder_update_kb(uint8_t index, bool clockwise); | 33 | bool encoder_update_kb(uint8_t index, bool clockwise); |
| 29 | bool encoder_update_user(uint8_t index, bool clockwise); | 34 | bool 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 | ||
| 33 | void encoder_state_raw(uint8_t* slave_state); | 59 | # ifndef NUM_ENCODERS |
| 34 | void 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 | 79 | typedef 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) | 84 | typedef 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 | 91 | void encoder_retrieve_events(encoder_events_t *events); |
| 63 | # define ENCODER_CCW_CW(ccw, cw) \ | 92 | |
| 64 | { (cw), (ccw) } | 93 | # ifdef SPLIT_KEYBOARD |
| 94 | void encoder_set_tail_index(uint8_t tail_index); | ||
| 95 | void 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) } | ||
| 65 | extern const uint16_t encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS]; | 102 | extern 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 | ||
| 106 | void encoder_driver_init(void); | ||
| 107 | void encoder_driver_task(void); | ||
| 108 | |||
| 109 | #endif // ENCODER_ENABLE | ||
