ao_ignite(enum ao_igniter igniter) __critical
{
ao_ignition[igniter].request = 1;
- ao_wakeup(&ao_ignition[0]);
+ ao_wakeup(&ao_ignition);
}
enum ao_igniter_status
ao_igniter_fire(enum ao_igniter igniter) __critical
{
ao_ignition[igniter].firing = 1;
- switch (igniter) {
- case ao_igniter_drogue:
- AO_IGNITER_DROGUE = 1;
- ao_delay(AO_IGNITER_FIRE_TIME);
- AO_IGNITER_DROGUE = 0;
+ switch(ao_config.ignite_mode) {
+ case AO_IGNITE_MODE_DUAL:
+ switch (igniter) {
+ case ao_igniter_drogue:
+ AO_IGNITER_DROGUE = 1;
+ ao_delay(AO_IGNITER_FIRE_TIME);
+ AO_IGNITER_DROGUE = 0;
+ break;
+ case ao_igniter_main:
+ AO_IGNITER_MAIN = 1;
+ ao_delay(AO_IGNITER_FIRE_TIME);
+ AO_IGNITER_MAIN = 0;
+ break;
+ }
break;
- case ao_igniter_main:
- AO_IGNITER_MAIN = 1;
- ao_delay(AO_IGNITER_FIRE_TIME);
- AO_IGNITER_MAIN = 0;
+ case AO_IGNITE_MODE_APOGEE:
+ switch (igniter) {
+ case ao_igniter_drogue:
+ AO_IGNITER_DROGUE = 1;
+ ao_delay(AO_IGNITER_FIRE_TIME);
+ AO_IGNITER_DROGUE = 0;
+ ao_delay(AO_IGNITER_CHARGE_TIME);
+ AO_IGNITER_MAIN = 1;
+ ao_delay(AO_IGNITER_FIRE_TIME);
+ AO_IGNITER_MAIN = 0;
+ break;
+ }
+ break;
+ case AO_IGNITE_MODE_MAIN:
+ switch (igniter) {
+ case ao_igniter_main:
+ AO_IGNITER_DROGUE = 1;
+ ao_delay(AO_IGNITER_FIRE_TIME);
+ AO_IGNITER_DROGUE = 0;
+ ao_delay(AO_IGNITER_CHARGE_TIME);
+ AO_IGNITER_MAIN = 1;
+ ao_delay(AO_IGNITER_FIRE_TIME);
+ AO_IGNITER_MAIN = 0;
+ break;
+ }
break;
}
ao_ignition[igniter].firing = 0;
__xdata struct ao_task ao_igniter_task;
void
-ao_igniter_init(void)
+ao_ignite_set_pins(void)
{
AO_IGNITER_DROGUE = 0;
AO_IGNITER_MAIN = 0;
AO_IGNITER_DIR |= AO_IGNITER_DROGUE_BIT | AO_IGNITER_MAIN_BIT;
+}
+
+void
+ao_igniter_init(void)
+{
+ ao_ignite_set_pins();
ao_cmd_register(&ao_ignite_cmds[0]);
ao_add_task(&ao_igniter_task, ao_igniter, "igniter");
}