altos, altosui: Add igniter mode (dual, apogee, main)
[fw/altos] / src / ao_ignite.c
index 603fcd25f3e37105487ad1005894cfdbabcc9815..598877a8b5a5f1ea2db36baf4fe6156a15b260f3 100644 (file)
 
 #include "ao.h"
 
+#if IGNITE_ON_P2
 #define AO_IGNITER_DROGUE      P2_3
 #define AO_IGNITER_MAIN                P2_4
 #define AO_IGNITER_DIR         P2DIR
 #define AO_IGNITER_DROGUE_BIT  (1 << 3)
 #define AO_IGNITER_MAIN_BIT    (1 << 4)
+#endif
+
+#if IGNITE_ON_P0
+#define AO_IGNITER_DROGUE      P0_5
+#define AO_IGNITER_MAIN                P0_4
+#define AO_IGNITER_DIR         P0DIR
+#define AO_IGNITER_DROGUE_BIT  (1 << 5)
+#define AO_IGNITER_MAIN_BIT    (1 << 4)
+#endif
 
 /* test these values with real igniters */
 #define AO_IGNITER_OPEN                1000
@@ -41,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
@@ -81,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;
@@ -154,9 +194,9 @@ ao_ignite_test(void)
 }
 
 __code struct ao_cmds ao_ignite_cmds[] = {
-       { 'i',  ao_ignite_manual,       "i <key> {main|drogue}              Fire igniter. <key> is doit with D&I" },
-       { 't',  ao_ignite_test,         "t                                  Test igniter continuity" },
-       { 0,    ao_ignite_manual,       NULL },
+       { ao_ignite_manual,     "i <key> {main|drogue}\0Fire igniter. <key> is doit with D&I" },
+       { ao_ignite_test,       "t\0Test igniter continuity" },
+       { 0,    NULL },
 };
 
 __xdata struct ao_task ao_igniter_task;