altos: Require sequencing through 'main' state before landing
[fw/altos] / src / ao_ignite.c
index 7874ee01fcdffe359597d726ad599fcc8b8776e8..512ec6224ef2461f8b5c9799188ac7c645d3705e 100644 (file)
@@ -51,15 +51,15 @@ 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
 ao_igniter_status(enum ao_igniter igniter)
 {
        __xdata struct ao_adc adc;
-       __xdata int16_t value;
-       __xdata uint8_t request, firing, fired;
+       __pdata int16_t value;
+       __pdata uint8_t request, firing, fired;
 
        __critical {
                ao_adc_get(&adc);
@@ -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;
@@ -143,7 +173,7 @@ ao_ignite_manual(void)
        }
 }
 
-static __code char *igniter_status_names[] = {
+static __code char * __code igniter_status_names[] = {
        "unknown", "ready", "active", "open"
 };
 
@@ -165,7 +195,7 @@ ao_ignite_test(void)
 
 __code struct ao_cmds ao_ignite_cmds[] = {
        { ao_ignite_manual,     "i <key> {main|drogue}\0Fire igniter. <key> is doit with D&I" },
-       { ao_ignite_test,       "t\0Test igniter continuity" },
+       { ao_ignite_test,       "t\0Test igniter" },
        { 0,    NULL },
 };