add run-time dependency on libjfreechart-java
[fw/altos] / src / ao_ignite.c
index e1b91bea2134628de22d3a59bc74b5a8f2f361ff..5238beb4315663950e717f98629168b05bc4a419 100644 (file)
@@ -51,7 +51,7 @@ void
 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
@@ -91,16 +91,46 @@ void
 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;
@@ -172,11 +202,17 @@ __code struct ao_cmds ao_ignite_cmds[] = {
 __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");
 }