#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
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);
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;
}
}
-static __code char *igniter_status_names[] = {
+static __code char * __code igniter_status_names[] = {
"unknown", "ready", "active", "open"
};
}
__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;