projects
/
fw
/
altos
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
altos/drivers: Make quadrature debounce longer by default. Fix state tracking
[fw/altos]
/
src
/
drivers
/
ao_quadrature.c
diff --git
a/src/drivers/ao_quadrature.c
b/src/drivers/ao_quadrature.c
index deecfb79422b9c2980507a0a00e9eb3344b64842..d9cdfe7c154334419679fdef2de7c58ec35caec8 100644
(file)
--- a/
src/drivers/ao_quadrature.c
+++ b/
src/drivers/ao_quadrature.c
@@
-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;