add run-time dependency on libjfreechart-java
[fw/altos] / src / ao_ignite.c
index 8206e342ef2f5c119a41ddb1420d1531f7d7522e..5238beb4315663950e717f98629168b05bc4a419 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
 #define AO_IGNITER_CLOSED      7000
-#define AO_IGNITER_FIRE_TIME   AO_MS_TO_TICKS(500)
+#define AO_IGNITER_FIRE_TIME   AO_MS_TO_TICKS(50)
 #define AO_IGNITER_CHARGE_TIME AO_MS_TO_TICKS(2000)
 
 struct ao_ignition {
@@ -41,18 +51,17 @@ 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_sleep();
                ao_adc_get(&adc);
                request = ao_ignition[igniter].request;
                fired = ao_ignition[igniter].fired;
@@ -82,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;
@@ -101,7 +140,6 @@ void
 ao_igniter(void)
 {
        __xdata enum ao_ignter igniter;
-       __xdata enum ao_igniter_status status;
 
        ao_config_get();
        for (;;) {
@@ -113,28 +151,12 @@ ao_igniter(void)
 
                                ao_igniter_fire(igniter);
                                ao_delay(AO_IGNITER_CHARGE_TIME);
-                               status = ao_igniter_status(igniter);
-                               if (status == ao_igniter_open)
-                                       ao_ignition[igniter].fired = 1;
+                               ao_ignition[igniter].fired = 1;
                        }
                }
        }
 }
 
-static uint8_t
-ao_match_word(__code char *word)
-{
-       while (*word) {
-               if (ao_cmd_lex_c != *word) {
-                       ao_cmd_status = ao_cmd_syntax_error;
-                       return 0;
-               }
-               word++;
-               ao_cmd_lex();
-       }
-       return 1;
-}
-
 void
 ao_ignite_manual(void)
 {
@@ -151,7 +173,7 @@ ao_ignite_manual(void)
        }
 }
 
-static __code char *igniter_status_names[] = {
+static __code char * __code igniter_status_names[] = {
        "unknown", "ready", "active", "open"
 };
 
@@ -172,19 +194,25 @@ 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" },
+       { 0,    NULL },
 };
 
 __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");
 }