#if PYRO_DBG
int pyro_dbg;
-#define DBG(...) do { if (pyro_dbg) printf("\t%d: ", (int) (pyro - ao_config.pyro)); printf(__VA_ARGS__); } while (0)
+#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
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) {
#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
}
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));
}
/* Ignore igniters which have already fired
*/
- if (pyro->fired)
+ if (ao_pyro_fired & (1 << p))
continue;
/* Ignore disabled igniters
* by setting the fired bit
*/
if (!ao_pyro_ready(pyro)) {
- pyro->fired = 1;
+ ao_pyro_fired |= (1 << p);
continue;
}
fire |= (1 << p);
}
- if (fire)
+ if (fire) {
+ ao_pyro_fired |= fire;
ao_pyro_pins_fire(fire);
+ }
return any_waiting;
}
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();