altos: Make sure pyro remains valid during delay
authorKeith Packard <keithp@keithp.com>
Fri, 29 Aug 2014 20:12:38 +0000 (15:12 -0500)
committerKeith Packard <keithp@keithp.com>
Fri, 29 Aug 2014 20:12:38 +0000 (15:12 -0500)
Keep checking pyro status while waiting for delay to expire to make
sure nothing changes. Disable pyro channel if something does.

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

index 0b286466fa3a7495d91406bedb91c1ebbe6cd3e9..154edad5f0f7e4436361644d52705efa941e3c0f 100644 (file)
@@ -252,7 +252,7 @@ ao_pyro_check(void)
        struct ao_pyro  *pyro;
        uint8_t         p, any_waiting;
        uint16_t        fire = 0;
-       
+
        any_waiting = 0;
        for (p = 0; p < AO_PYRO_NUM; p++) {
                pyro = &ao_config.pyro[p];
@@ -288,6 +288,16 @@ ao_pyro_check(void)
                 * the delay to expire
                 */
                if (pyro->delay_done) {
+
+                       /* Check to make sure the required conditions
+                        * remain valid. If not, inhibit the channel
+                        * by setting the fired bit
+                        */
+                       if (!ao_pyro_ready(pyro)) {
+                               pyro->fired = 1;
+                               continue;
+                       }
+
                        if ((int16_t) (ao_time() - pyro->delay_done) < 0)
                                continue;
                }
@@ -465,7 +475,7 @@ ao_pyro_set(void)
                printf ("invalid pyro channel %d\n", p);
                return;
        }
-       pyro_tmp.flags = 0;
+       memset(&pyro_tmp, '\0', sizeof (pyro_tmp));
        for (;;) {
                ao_cmd_white();
                if (ao_cmd_lex_c == '\n')