summaryrefslogtreecommitdiff
path: root/src/drivers/ao_quadrature.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2018-05-28 14:15:34 -0700
committerKeith Packard <keithp@keithp.com>2018-05-28 14:15:34 -0700
commitccad6e970c5c7416561443f1e6e2fa8f80698957 (patch)
tree12284239d1f5d661232a07ca19dd2e8a2a502c88 /src/drivers/ao_quadrature.c
parentf172b139ddc3fcc17cf89b57e5126264c0faa45e (diff)
altos/driver: Add support for one-step-per-click quadrature encoder
The mechanical encoders go through all four steps per click while the optical ones have a single step per click. Support both kinds. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/drivers/ao_quadrature.c')
-rw-r--r--src/drivers/ao_quadrature.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/drivers/ao_quadrature.c b/src/drivers/ao_quadrature.c
index d9cdfe7c..98bd7c08 100644
--- a/src/drivers/ao_quadrature.c
+++ b/src/drivers/ao_quadrature.c
@@ -55,6 +55,7 @@ ao_debounce(uint8_t cur, struct ao_debounce *debounce)
}
return debounce->state;
#else
+ (void) debounce;
return cur;
#endif
}
@@ -83,16 +84,38 @@ _ao_quadrature_queue(uint8_t q, int8_t step)
ao_wakeup(&ao_quadrature_count[q]);
}
+#if AO_QUADRATURE_SINGLE_CODE
+struct ao_quadrature_step {
+ uint8_t inc;
+ uint8_t dec;
+};
+
+static struct ao_quadrature_step ao_quadrature_steps[4] = {
+ [0] = { .inc = 1, .dec = 2 },
+ [1] = { .inc = 3, .dec = 0 },
+ [3] = { .inc = 2, .dec = 1 },
+ [2] = { .inc = 0, .dec = 3 },
+};
+#endif
+
static void
_ao_quadrature_set(uint8_t q, uint8_t new) {
uint8_t old = ao_quadrature_state[q];
+#ifdef AO_QUADRATURE_SINGLE_CODE
+ if (new == ao_quadrature_steps[old].inc) {
+ _ao_quadrature_queue(q, 1);
+ } else if (new == ao_quadrature_steps[old].dec) {
+ _ao_quadrature_queue(q, -1);
+ }
+#else
if (old != new && new == 0) {
if (old == 2)
_ao_quadrature_queue(q, 1);
else if (old == 1)
_ao_quadrature_queue(q, -1);
}
+#endif
ao_quadrature_state[q] = new;
}