altos: Use max of 64 previous orient values when checking pyro limits
[fw/altos] / src / kernel / ao_pyro.c
index c9920ab335cd681369ad8e78e893f8b1bd49b021..5a556d594c75b5b8947d49757d68deb3a58bab5c 100644 (file)
@@ -75,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
@@ -89,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) {
@@ -129,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
 
@@ -180,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:
@@ -238,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));
 }
@@ -260,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
@@ -295,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;
                        }
 
@@ -306,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;
 }
@@ -437,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 ("       ");
@@ -481,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();
@@ -516,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;
                        }
                }
        }