altos/drivers: Make quadrature debounce longer by default. Fix state tracking
authorKeith Packard <keithp@keithp.com>
Mon, 28 May 2018 20:07:06 +0000 (13:07 -0700)
committerKeith Packard <keithp@keithp.com>
Mon, 28 May 2018 20:07:06 +0000 (13:07 -0700)
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>
src/drivers/ao_quadrature.c

index deecfb79422b9c2980507a0a00e9eb3344b64842..d9cdfe7c154334419679fdef2de7c58ec35caec8 100644 (file)
@@ -39,20 +39,24 @@ static struct ao_debounce ao_debounce_state[AO_QUADRATURE_COUNT][2];
 #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
 
-#define DEBOUNCE       10
+#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
 }
 
 static uint16_t
 }
 
 static uint16_t
@@ -84,9 +88,9 @@ _ao_quadrature_set(uint8_t q, uint8_t new) {
        uint8_t old = ao_quadrature_state[q];
 
        if (old != new && new == 0) {
        uint8_t old = ao_quadrature_state[q];
 
        if (old != new && new == 0) {
-               if (old & 2)
+               if (old == 2)
                        _ao_quadrature_queue(q, 1);
                        _ao_quadrature_queue(q, 1);
-               else if (old & 1)
+               else if (old == 1)
                        _ao_quadrature_queue(q, -1);
        }
        ao_quadrature_state[q] = new;
                        _ao_quadrature_queue(q, -1);
        }
        ao_quadrature_state[q] = new;