altos: Use max of 64 previous orient values when checking pyro limits
[fw/altos] / src / kernel / ao_pyro.c
index 43e73de4a897cfa97ee6cdc851f4c7ef373727f1..5a556d594c75b5b8947d49757d68deb3a58bab5c 100644 (file)
@@ -3,7 +3,8 @@
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -74,11 +75,25 @@ uint16_t    ao_pyro_fired;
 #endif
 
 #if PYRO_DBG
-#define DBG(...)       do { printf("\t%d: ", (int) (pyro - ao_config.pyro)); printf(__VA_ARGS__); } while (0)
+int pyro_dbg;
+#define DBG(...)       do { if (pyro_dbg) { printf("\t%d: ", (int) (pyro - ao_config.pyro)); printf(__VA_ARGS__); } } while (0)
 #else
 #define DBG(...)
 #endif
 
+static angle_t
+ao_sample_max_orient(void)
+{
+       uint8_t i;
+       angle_t max = ao_sample_orients[0];
+
+       for (i = 1; i < AO_NUM_ORIENT; i++) {
+               angle_t a = ao_sample_orients[i];
+               if (a > max)
+                       max = a;
+       }
+       return max;
+}
 /*
  * Given a pyro structure, figure out
  * if the current flight state satisfies all
@@ -88,6 +103,9 @@ static uint8_t
 ao_pyro_ready(struct ao_pyro *pyro)
 {
        enum ao_pyro_flag flag, flags;
+#if HAS_GYRO
+       angle_t max_orient;
+#endif
 
        flags = pyro->flags;
        while (flags != ao_pyro_none) {
@@ -128,14 +146,16 @@ ao_pyro_ready(struct ao_pyro *pyro)
 
 #if HAS_GYRO
                case ao_pyro_orient_less:
-                       if (ao_sample_orient <= pyro->orient_less)
+                       max_orient = ao_sample_max_orient();
+                       if (max_orient <= pyro->orient_less)
                                continue;
-                       DBG("orient %d > %d\n", ao_sample_orient, pyro->orient_less);
+                       DBG("orient %d > %d\n", max_orient, pyro->orient_less);
                        break;
                case ao_pyro_orient_greater:
-                       if (ao_sample_orient >= pyro->orient_greater)
+                       max_orient = ao_sample_max_orient();
+                       if (max_orient >= pyro->orient_greater)
                                continue;
-                       DBG("orient %d < %d\n", ao_sample_orient, pyro->orient_greater);
+                       DBG("orient %d < %d\n", max_orient, pyro->orient_greater);
                        break;
 #endif
 
@@ -179,7 +199,7 @@ ao_pyro_ready(struct ao_pyro *pyro)
                case ao_pyro_state_greater_or_equal:
                        if (ao_flight_state >= pyro->state_greater_or_equal)
                                continue;
-                       DBG("state %d >= %d\n", ao_flight_state, pyro->state_less);
+                       DBG("state %d < %d\n", ao_flight_state, pyro->state_greater_or_equal);
                        break;
 
                default:
@@ -237,11 +257,8 @@ ao_pyro_pins_fire(uint16_t fire)
        }
        ao_delay(ao_config.pyro_time);
        for (p = 0; p < AO_PYRO_NUM; p++) {
-               if (fire & (1 << p)) {
+               if (fire & (1 << p))
                        ao_pyro_pin_set(p, 0);
-                       ao_config.pyro[p].fired = 1;
-                       ao_pyro_fired |= (1 << p);
-               }
        }
        ao_delay(AO_MS_TO_TICKS(50));
 }
@@ -259,7 +276,7 @@ ao_pyro_check(void)
 
                /* Ignore igniters which have already fired
                 */
-               if (pyro->fired)
+               if (ao_pyro_fired & (1 << p))
                        continue;
 
                /* Ignore disabled igniters
@@ -294,7 +311,7 @@ ao_pyro_check(void)
                         * by setting the fired bit
                         */
                        if (!ao_pyro_ready(pyro)) {
-                               pyro->fired = 1;
+                               ao_pyro_fired |= (1 << p);
                                continue;
                        }
 
@@ -305,8 +322,10 @@ ao_pyro_check(void)
                fire |= (1 << p);
        }
 
-       if (fire)
+       if (fire) {
+               ao_pyro_fired |= fire;
                ao_pyro_pins_fire(fire);
+       }
 
        return any_waiting;
 }
@@ -436,7 +455,7 @@ ao_pyro_show(void)
                                if (ao_pyro_values[v].flag & AO_PYRO_8_BIT_VALUE)
                                        value = *((uint8_t *) ((char *) pyro + ao_pyro_values[v].offset));
                                else
-                                       value = *((int16_t *) ((char *) pyro + ao_pyro_values[v].offset));
+                                       value = *((int16_t *) (void *) ((char *) pyro + ao_pyro_values[v].offset));
                                printf ("%6d ", value);
                        } else {
                                printf ("       ");
@@ -480,7 +499,7 @@ ao_pyro_set(void)
                        break;
 
                for (c = 0; c < AO_PYRO_NAME_LEN - 1; c++) {
-                       if (ao_cmd_is_white())
+                       if (ao_cmd_is_white() || ao_cmd_lex_c == '\n')
                                break;
                        name[c] = ao_cmd_lex_c;
                        ao_cmd_lex();
@@ -515,7 +534,7 @@ ao_pyro_set(void)
                        } else {
                                if (negative)
                                        ao_cmd_lex_i = -ao_cmd_lex_i;
-                               *((int16_t *) ((char *) &pyro_tmp + ao_pyro_values[v].offset)) = ao_cmd_lex_i;
+                               *((int16_t *) (void *) ((char *) &pyro_tmp + ao_pyro_values[v].offset)) = ao_cmd_lex_i;
                        }
                }
        }