summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2011-08-02 02:09:23 -0700
committerKeith Packard <keithp@keithp.com>2011-08-02 02:09:23 -0700
commit82e04a0e3a3296288a524ec582785a36fd644331 (patch)
treee04401147abdd76273e48f891d45f95dc9150d15
parent6c55bf35b11ae3ddae152795072d69e98184bac1 (diff)
altos: Require sequencing through 'main' state before landing
The old version of the code would permit the flight to go straight from 'drogue' to 'landed' without passing through 'main' at all. This meant that a false landing detection would leave the main charge unfired, potentially causing the airframe to land on drogue alone. Requiring that the flight sequence pass through main ensures that the main charge will get fired at the right time, although if the airframe lands higher than that altitude, it will not go to 'landed' mode ever. Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--src/ao_flight.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/src/ao_flight.c b/src/ao_flight.c
index a8760ff0..af3d6bfa 100644
--- a/src/ao_flight.c
+++ b/src/ao_flight.c
@@ -233,16 +233,6 @@ ao_flight(void)
/* Turn the RDF beacon back on */
ao_rdf_set(1);
- /*
- * Start recording min/max height
- * to figure out when the rocket has landed
- */
-
- /* initialize interval values */
- ao_interval_end = ao_sample_tick + AO_INTERVAL_TICKS;
-
- ao_interval_min_height = ao_interval_max_height = ao_avg_height;
-
/* and enter drogue state */
ao_flight_state = ao_flight_drogue;
ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
@@ -266,16 +256,28 @@ ao_flight(void)
if (ao_height <= ao_config.main_deploy)
{
ao_ignite(ao_igniter_main);
+
+ /*
+ * Start recording min/max height
+ * to figure out when the rocket has landed
+ */
+
+ /* initialize interval values */
+ ao_interval_end = ao_sample_tick + AO_INTERVAL_TICKS;
+
+ ao_interval_min_height = ao_interval_max_height = ao_avg_height;
+
ao_flight_state = ao_flight_main;
ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
}
+ break;
/* fall through... */
case ao_flight_main:
- /* drogue/main to land:
+ /* main to land:
*
- * barometer: altitude stable and within 1000m of the launch altitude
+ * barometer: altitude stable
*/
if (ao_avg_height < ao_interval_min_height)
@@ -284,8 +286,7 @@ ao_flight(void)
ao_interval_max_height = ao_avg_height;
if ((int16_t) (ao_sample_tick - ao_interval_end) >= 0) {
- if (ao_height < AO_M_TO_HEIGHT(1000) &&
- ao_interval_max_height - ao_interval_min_height <= AO_M_TO_HEIGHT(2))
+ if (ao_interval_max_height - ao_interval_min_height <= AO_M_TO_HEIGHT(2))
{
ao_flight_state = ao_flight_landed;