altos: Fetch current quadrature status at startup time
authorKeith Packard <keithp@keithp.com>
Wed, 4 Jul 2018 23:08:31 +0000 (16:08 -0700)
committerKeith Packard <keithp@keithp.com>
Wed, 4 Jul 2018 23:08:31 +0000 (16:08 -0700)
This avoids having the state appear to change the first time we look
at the device.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/drivers/ao_quadrature.c

index 59e845181ceea6f5f43f0fe1c854f185e2806076..250e035fc3171f167c438da9ef92ba35e8668cd5 100644 (file)
@@ -111,7 +111,8 @@ static const struct {
 };
 
 static void
-_ao_quadrature_set(uint8_t q, uint8_t new) {
+_ao_quadrature_set(uint8_t q, uint8_t new)
+{
        uint8_t old;
 
        ao_arch_block_interrupts();
@@ -136,6 +137,14 @@ ao_quadrature_isr(void)
 #endif
 }
 
+static void
+_ao_quadrature_start_one(uint8_t q, uint8_t new)
+{
+       ao_arch_block_interrupts();
+       ao_quadrature_state[q] = new;
+       ao_arch_release_interrupts();
+}
+
 int32_t
 ao_quadrature_poll(uint8_t q)
 {
@@ -204,9 +213,10 @@ static const struct ao_cmds ao_quadrature_cmds[] = {
        { 0, NULL }
 };
 
-#define init(q) do {                                   \
-               ao_enable_input(port(q), bita(q), 0);   \
-               ao_enable_input(port(q), bitb(q), 0);   \
+#define init(q) do {                                                   \
+               ao_enable_input(port(q), bita(q), 0);                   \
+               ao_enable_input(port(q), bitb(q), 0);                   \
+               _ao_quadrature_start_one(q, _ao_quadrature_get(q));     \
        } while (0)
 
 void