- for (q = 0; q < AO_QUADRATURE_COUNT; q++) {
- switch (ao_quadrature_state[q]) {
- case STATE(0, 1, 0, 0):
- ao_quadrature_count[q]++;
- break;
- case STATE(1, 0, 0, 0):
- ao_quadrature_count[q]--;
- break;
- default:
- continue;
- }
- ao_quadrature_queue(q);
- ao_wakeup(&ao_quadrature_count[q]);
+static void
+_ao_quadrature_queue(uint8_t q, int8_t step)
+{
+ ao_quadrature_count[q] += step;
+#if AO_EVENT
+ ao_event_put_isr(AO_EVENT_QUADRATURE, q, step);
+#endif
+ ao_wakeup(&ao_quadrature_count[q]);
+}
+
+uint8_t quad_history[64];
+uint8_t quad_h;
+
+static void
+_ao_quadrature_set(struct ao_debounce *debounce, uint8_t value) {
+ uint8_t q = debounce_id(debounce);
+
+ ao_quadrature_state[q] = ((ao_quadrature_state[q] & 3) << 2);
+ ao_quadrature_state[q] |= value;
+
+ if (q == 0) {
+ quad_history[quad_h] = ao_quadrature_state[0];
+ quad_h = (quad_h + 1) & 63;
+ }
+
+ switch (ao_quadrature_state[q]) {
+ case STATE(0, 1, 0, 0):
+ _ao_quadrature_queue(q, 1);
+ break;
+ case STATE(1, 0, 0, 0):
+ _ao_quadrature_queue(q, -1);
+ break;