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 @@
#include "gpio.h"
#include "util.h"
+#ifdef ENCODER_ENABLE
+
+__attribute__((weak)) bool should_process_encoder(void);
+
void encoder_init(void);
-bool encoder_read(void);
+bool encoder_task(void);
+bool encoder_queue_event(uint8_t index, bool clockwise);
bool encoder_update_kb(uint8_t index, bool clockwise);
bool encoder_update_user(uint8_t index, bool clockwise);
-#ifdef SPLIT_KEYBOARD
+# ifdef SPLIT_KEYBOARD
+
+# if defined(ENCODERS_PAD_A_RIGHT)
+# ifndef NUM_ENCODERS_LEFT
+# define NUM_ENCODERS_LEFT ARRAY_SIZE(((pin_t[])ENCODERS_PAD_A))
+# endif
+# ifndef NUM_ENCODERS_RIGHT
+# define NUM_ENCODERS_RIGHT ARRAY_SIZE(((pin_t[])ENCODERS_PAD_A_RIGHT))
+# endif
+# else
+# ifndef NUM_ENCODERS_LEFT
+# define NUM_ENCODERS_LEFT ARRAY_SIZE(((pin_t[])ENCODERS_PAD_A))
+# endif
+# ifndef NUM_ENCODERS_RIGHT
+# define NUM_ENCODERS_RIGHT NUM_ENCODERS_LEFT
+# endif
+# endif
+# ifndef NUM_ENCODERS
+# define NUM_ENCODERS (NUM_ENCODERS_LEFT + NUM_ENCODERS_RIGHT)
+# endif
+
+# else // SPLIT_KEYBOARD
-void encoder_state_raw(uint8_t* slave_state);
-void encoder_update_raw(uint8_t* slave_state);
+# ifndef NUM_ENCODERS
+# define NUM_ENCODERS ARRAY_SIZE(((pin_t[])ENCODERS_PAD_A))
+# endif
+# define NUM_ENCODERS_LEFT NUM_ENCODERS
+# define NUM_ENCODERS_RIGHT 0
-# if defined(ENCODERS_PAD_A_RIGHT)
-# define NUM_ENCODERS_LEFT ARRAY_SIZE(((pin_t[])ENCODERS_PAD_A))
-# define NUM_ENCODERS_RIGHT ARRAY_SIZE(((pin_t[])ENCODERS_PAD_A_RIGHT))
-# else
-# define NUM_ENCODERS_LEFT ARRAY_SIZE(((pin_t[])ENCODERS_PAD_A))
-# define NUM_ENCODERS_RIGHT NUM_ENCODERS_LEFT
-# endif
-# define NUM_ENCODERS (NUM_ENCODERS_LEFT + NUM_ENCODERS_RIGHT)
+# endif // SPLIT_KEYBOARD
-#else // SPLIT_KEYBOARD
+# ifndef NUM_ENCODERS
+# define NUM_ENCODERS 0
+# define NUM_ENCODERS_LEFT 0
+# define NUM_ENCODERS_RIGHT 0
+# endif // NUM_ENCODERS
-# define NUM_ENCODERS ARRAY_SIZE(((pin_t[])ENCODERS_PAD_A))
-# define NUM_ENCODERS_LEFT NUM_ENCODERS
-# define NUM_ENCODERS_RIGHT 0
+# define NUM_ENCODERS_MAX_PER_SIDE MAX(NUM_ENCODERS_LEFT, NUM_ENCODERS_RIGHT)
-#endif // SPLIT_KEYBOARD
+# ifndef MAX_QUEUED_ENCODER_EVENTS
+# define MAX_QUEUED_ENCODER_EVENTS MAX(4, ((NUM_ENCODERS_MAX_PER_SIDE) + 1))
+# endif // MAX_QUEUED_ENCODER_EVENTS
-#ifndef NUM_ENCODERS
-# define NUM_ENCODERS 0
-# define NUM_ENCODERS_LEFT 0
-# define NUM_ENCODERS_RIGHT 0
-#endif // NUM_ENCODERS
+typedef struct encoder_event_t {
+ uint8_t index : 7;
+ uint8_t clockwise : 1;
+} encoder_event_t;
-#define NUM_ENCODERS_MAX_PER_SIDE MAX(NUM_ENCODERS_LEFT, NUM_ENCODERS_RIGHT)
+typedef struct encoder_events_t {
+ uint8_t head;
+ uint8_t tail;
+ encoder_event_t queue[MAX_QUEUED_ENCODER_EVENTS];
+} encoder_events_t;
-#ifdef ENCODER_MAP_ENABLE
-# define NUM_DIRECTIONS 2
-# define ENCODER_CCW_CW(ccw, cw) \
- { (cw), (ccw) }
+// Get the current queued events
+void encoder_retrieve_events(encoder_events_t *events);
+
+# ifdef SPLIT_KEYBOARD
+void encoder_set_tail_index(uint8_t tail_index);
+void encoder_handle_slave_events(encoder_events_t *events);
+# endif // SPLIT_KEYBOARD
+
+# ifdef ENCODER_MAP_ENABLE
+# define NUM_DIRECTIONS 2
+# define ENCODER_CCW_CW(ccw, cw) \
+ { (cw), (ccw) }
extern const uint16_t encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS];
-#endif // ENCODER_MAP_ENABLE
+# endif // ENCODER_MAP_ENABLE
+
+// "Custom encoder lite" support
+void encoder_driver_init(void);
+void encoder_driver_task(void);
+
+#endif // ENCODER_ENABLE