altos: Pull igniter pins low as soon as possible at boot time
[fw/altos] / src / ao_flight.c
index 94fbf1784bf4cdbdc9885b5ad6054ac983fcafc6..af3d6bfa36c2292ecc07e366a6edb7574e4a8df3 100644 (file)
@@ -43,8 +43,7 @@ __pdata uint16_t              ao_launch_tick;         /* time of launch detect */
 __pdata uint16_t               ao_interval_end;
 __pdata int16_t                        ao_interval_min_height;
 __pdata int16_t                        ao_interval_max_height;
-
-__xdata uint8_t                        ao_flight_force_idle;
+__pdata uint8_t                        ao_flight_force_idle;
 
 /* We also have a clock, which can be used to sanity check things in
  * case of other failures
@@ -170,7 +169,6 @@ ao_flight(void)
 #endif
 
                                ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
-                               break;
                        }
                        break;
                case ao_flight_boost:
@@ -194,7 +192,6 @@ ao_flight(void)
                                ao_flight_state = ao_flight_coast;
 #endif
                                ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
-                               break;
                        }
                        break;
 #if HAS_ACCEL
@@ -208,7 +205,6 @@ ao_flight(void)
                        {
                                ao_flight_state = ao_flight_coast;
                                ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
-                               break;
                        }
                        break;
 #endif
@@ -234,15 +230,8 @@ ao_flight(void)
                                /* slow down the telemetry system */
                                ao_telemetry_set_interval(AO_TELEMETRY_INTERVAL_RECOVER);
 
-                               /*
-                                * 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_height;
+                               /* Turn the RDF beacon back on */
+                               ao_rdf_set(1);
 
                                /* and enter drogue state */
                                ao_flight_state = ao_flight_drogue;
@@ -267,37 +256,46 @@ 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_height < ao_interval_min_height)
-                               ao_interval_min_height = ao_height;
-                       if (ao_height > ao_interval_max_height)
-                               ao_interval_max_height = ao_height;
+                       if (ao_avg_height < ao_interval_min_height)
+                               ao_interval_min_height = ao_avg_height;
+                       if (ao_avg_height > ao_interval_max_height)
+                               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(5))
+                               if (ao_interval_max_height - ao_interval_min_height <= AO_M_TO_HEIGHT(2))
                                {
                                        ao_flight_state = ao_flight_landed;
 
                                        /* turn off the ADC capture */
                                        ao_timer_set_adc_interval(0);
-                                       /* Enable RDF beacon */
-                                       ao_rdf_set(1);
 
                                        ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
                                }
-                               ao_interval_min_height = ao_interval_max_height = ao_height;
+                               ao_interval_min_height = ao_interval_max_height = ao_avg_height;
                                ao_interval_end = ao_sample_tick + AO_INTERVAL_TICKS;
                        }
                        break;