This increases the default debounce time for quadrature encoders to
30ms, which cleans up the mechanical encoders on TeleLCO v0.2. Also
change state tracking to explicitly check for expected state values to
avoid mis-triggering.
Signed-off-by: Keith Packard <keithp@keithp.com>
#define pinb(q) AO_QUADRATURE_ ## q ## _B ## _PIN
#define isr(q) ao_quadrature_isr_ ## q
#define pinb(q) AO_QUADRATURE_ ## q ## _B ## _PIN
#define isr(q) ao_quadrature_isr_ ## q
+#ifndef AO_QUADRATURE_DEBOUNCE
+#define AO_QUADRATURE_DEBOUNCE 30
+#endif
static uint8_t
ao_debounce(uint8_t cur, struct ao_debounce *debounce)
{
static uint8_t
ao_debounce(uint8_t cur, struct ao_debounce *debounce)
{
- if (cur == debounce->state)
- debounce->count = 0;
- else {
- if (++debounce->count == DEBOUNCE) {
- debounce->state = cur;
- debounce->count = 0;
- }
+#if AO_QUADRATURE_DEBOUNCE > 0
+ if (debounce->count > 0) {
+ debounce->count--;
+ } else if (cur != debounce->state) {
+ debounce->state = cur;
+ debounce->count = AO_QUADRATURE_DEBOUNCE;
}
return debounce->state;
}
return debounce->state;
+#else
+ return cur;
+#endif
uint8_t old = ao_quadrature_state[q];
if (old != new && new == 0) {
uint8_t old = ao_quadrature_state[q];
if (old != new && new == 0) {
_ao_quadrature_queue(q, 1);
_ao_quadrature_queue(q, 1);
_ao_quadrature_queue(q, -1);
}
ao_quadrature_state[q] = new;
_ao_quadrature_queue(q, -1);
}
ao_quadrature_state[q] = new;