X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fkernel%2Fao_ignite.c;h=e9d04dcce4ba848641e73d9fbfa06f5bac3d04e5;hb=HEAD;hp=a6ff997984e7e6cc20617ac753ef42c431eb7eba;hpb=0686a7b8aec524d81bda4c572549a3a068ce0eed;p=fw%2Faltos diff --git a/src/kernel/ao_ignite.c b/src/kernel/ao_ignite.c index a6ff9979..9e6df199 100644 --- a/src/kernel/ao_ignite.c +++ b/src/kernel/ao_ignite.c @@ -18,22 +18,11 @@ #include "ao.h" #include -#if AO_PYRO_NUM #include -#endif #if HAS_IGNITE struct ao_ignition ao_ignition[2]; -void -ao_ignite(enum ao_igniter igniter) -{ - ao_arch_block_interrupts(); - ao_ignition[igniter].request = 1; - ao_wakeup(&ao_ignition); - ao_arch_release_interrupts(); -} - #ifndef AO_SENSE_DROGUE #define AO_SENSE_DROGUE(p) ((p)->adc.sense_d) #define AO_SENSE_MAIN(p) ((p)->adc.sense_m) @@ -64,12 +53,7 @@ ao_igniter_status(enum ao_igniter igniter) value = AO_SENSE_MAIN(&packet); break; } - if (value < AO_IGNITER_OPEN) - return ao_igniter_open; - else if (value > AO_IGNITER_CLOSED) - return ao_igniter_ready; - else - return ao_igniter_unknown; + return ao_igniter_check(value, AO_SENSE_PBATT(&packet)); } #define AO_IGNITER_SET_DROGUE(v) ao_gpio_set(AO_IGNITER_DROGUE_PORT, AO_IGNITER_DROGUE_PIN, v) @@ -83,14 +67,17 @@ ao_igniter_status(enum ao_igniter igniter) #define AO_IGNITER_CHARGE_TIME AO_MS_TO_TICKS(2000) #endif -void -ao_igniter_fire(enum ao_igniter igniter) +static void +ao_igniter_fire(enum ao_igniter igniter, bool wait) { - ao_ignition[igniter].firing = 1; - switch(ao_config.ignite_mode) { - case AO_IGNITE_MODE_DUAL: + if (!ao_ignition[igniter].fired) { + ao_ignition[igniter].firing = 1; + ao_ignition[igniter].fired = 1; switch (igniter) { case ao_igniter_drogue: + if (wait && ao_config.apogee_delay && + ao_config.ignite_mode != AO_IGNITE_MODE_MAIN) + ao_delay(AO_SEC_TO_TICKS(ao_config.apogee_delay)); AO_IGNITER_SET_DROGUE(1); ao_delay(AO_IGNITER_FIRE_TIME); AO_IGNITER_SET_DROGUE(0); @@ -101,65 +88,55 @@ ao_igniter_fire(enum ao_igniter igniter) AO_IGNITER_SET_MAIN(0); break; } - break; - case AO_IGNITE_MODE_APOGEE: - switch (igniter) { - case ao_igniter_drogue: - AO_IGNITER_SET_DROGUE(1); - ao_delay(AO_IGNITER_FIRE_TIME); - AO_IGNITER_SET_DROGUE(0); - ao_delay(AO_IGNITER_CHARGE_TIME); - AO_IGNITER_SET_MAIN(1); - ao_delay(AO_IGNITER_FIRE_TIME); - AO_IGNITER_SET_MAIN(0); - break; - default: - break; - } - break; - case AO_IGNITE_MODE_MAIN: - switch (igniter) { - case ao_igniter_main: - AO_IGNITER_SET_DROGUE(1); - ao_delay(AO_IGNITER_FIRE_TIME); - AO_IGNITER_SET_DROGUE(0); + ao_ignition[igniter].firing = 0; + if (wait) ao_delay(AO_IGNITER_CHARGE_TIME); - AO_IGNITER_SET_MAIN(1); - ao_delay(AO_IGNITER_FIRE_TIME); - AO_IGNITER_SET_MAIN(0); - break; - default: - break; - } - break; } - ao_ignition[igniter].firing = 0; } -void +static void ao_igniter(void) { - enum ao_igniter igniter; - ao_config_get(); for (;;) { - ao_sleep(&ao_ignition); - for (igniter = ao_igniter_drogue; igniter <= ao_igniter_main; igniter++) { - if (ao_ignition[igniter].request && !ao_ignition[igniter].fired) { - if (igniter == ao_igniter_drogue && ao_config.apogee_delay) - ao_delay(AO_SEC_TO_TICKS(ao_config.apogee_delay)); - - ao_igniter_fire(igniter); - ao_delay(AO_IGNITER_CHARGE_TIME); - ao_ignition[igniter].fired = 1; + /* Wait for flight state change */ + ao_sleep(&ao_flight_state); + + /* Fire any igniters that are supposed to be triggered + * in this new state + */ + switch(ao_config.ignite_mode) { + case AO_IGNITE_MODE_DUAL: + if (ao_flight_drogue <= ao_flight_state && ao_flight_state < ao_flight_landed) + ao_igniter_fire(ao_igniter_drogue, true); + if (ao_flight_main <= ao_flight_state && ao_flight_state < ao_flight_landed) + ao_igniter_fire(ao_igniter_main, true); + break; + case AO_IGNITE_MODE_APOGEE: + if (ao_flight_drogue <= ao_flight_state && ao_flight_state < ao_flight_landed) { + ao_igniter_fire(ao_igniter_drogue, true); + ao_igniter_fire(ao_igniter_main, true); } + break; + case AO_IGNITE_MODE_MAIN: + if (ao_flight_main <= ao_flight_state && ao_flight_state < ao_flight_landed) { + ao_igniter_fire(ao_igniter_drogue, true); + ao_igniter_fire(ao_igniter_main, true); + } + break; + case AO_IGNITE_MODE_BOOSTER: + if (ao_flight_fast <= ao_flight_state && ao_flight_state < ao_flight_landed) + ao_igniter_fire(ao_igniter_main, true); + if (ao_flight_drogue <= ao_flight_state && ao_flight_state < ao_flight_landed) + ao_igniter_fire(ao_igniter_drogue, true); + break; } } } #endif -void +static void ao_ignite_manual(void) { ao_cmd_white(); @@ -168,11 +145,13 @@ ao_ignite_manual(void) ao_cmd_white(); #if HAS_IGNITE if (ao_cmd_lex_c == 'm' && ao_match_word("main")) { - ao_igniter_fire(ao_igniter_main); + ao_ignition[ao_igniter_main].fired = 0; + ao_igniter_fire(ao_igniter_main, false); return; } if (ao_cmd_lex_c == 'd' && ao_match_word("drogue")) { - ao_igniter_fire(ao_igniter_drogue); + ao_ignition[ao_igniter_drogue].fired = 0; + ao_igniter_fire(ao_igniter_drogue, false); return; } #endif @@ -190,7 +169,7 @@ const char * const ao_igniter_status_names[] = { }; #if HAS_IGNITE -void +static void ao_ignite_print_status(enum ao_igniter igniter, const char *name) { enum ao_igniter_status status = ao_igniter_status(igniter); @@ -200,7 +179,7 @@ ao_ignite_print_status(enum ao_igniter igniter, const char *name) } #endif -void +static void ao_ignite_test(void) { #if HAS_IGNITE @@ -236,5 +215,7 @@ ao_igniter_init(void) ao_ignite_set_pins(); ao_add_task(&ao_igniter_task, ao_igniter, "igniter"); #endif +#if HAS_IGNITE || AO_PYRO_NUM ao_cmd_register(&ao_ignite_cmds[0]); +#endif }