Prior to this, there was only ao_boost_tick, which got reset at each
motor burn start. That meant there wasn't any way to measure total
flight time for pyro channels and 'apogee lockout' was based on time
since most recent motor start instead of total flight time.
Now pyro channels and apogee lockout both use total flight time, while
motor burn length still uses time since most recent motor burn start
(as it should).
Docs and UI updated to use 'launch' instead of 'boost' to try and make
the change clear.
Signed-off-by: Keith Packard <keithp@keithp.com>
public static final int pyro_time_greater = 0x00000200;
public static final String pyro_time_less_string = "t<";
public static final String pyro_time_greater_string = "t>";
public static final int pyro_time_greater = 0x00000200;
public static final String pyro_time_less_string = "t<";
public static final String pyro_time_greater_string = "t>";
- public static final String pyro_time_less_name = "Time since boost less than (s)";
- public static final String pyro_time_greater_name = "Time since boost greater than (s)";
+ public static final String pyro_time_less_name = "Time since launch less than (s)";
+ public static final String pyro_time_greater_name = "Time since launch greater than (s)";
public static final double pyro_time_scale = 100.0;
public static final int pyro_ascending = 0x00000400;
public static final double pyro_time_scale = 100.0;
public static final int pyro_ascending = 0x00000400;
apogee_lockout_value.setEditable(true);
apogee_lockout_value.addItemListener(this);
pane.add(apogee_lockout_value, c);
apogee_lockout_value.setEditable(true);
apogee_lockout_value.addItemListener(this);
pane.add(apogee_lockout_value, c);
- apogee_lockout_value.setToolTipText("Time after boost while apogee detection is locked out");
+ apogee_lockout_value.setToolTipText("Time after launch while apogee detection is locked out");
- Apogee lockout is the number of seconds after boost
+ Apogee lockout is the number of seconds after launch
where the flight computer will not fire the apogee
charge, even if the rocket appears to be at
apogee. This is often called 'Mach Delay', as it is
where the flight computer will not fire the apogee
charge, even if the rocket appears to be at
apogee. This is often called 'Mach Delay', as it is
pressure increase, and so this setting should be left
at the default value of zero to disable it.
pressure increase, and so this setting should be left
at the default value of zero to disable it.
+ [WARNING]
+ Firmware versions older than 1.8.6 have a
+ bug which resets the time since launch to zero each
+ time a motor starts burning. Update firmware to get
+ the correct behavior.
+
endif::altusmetrum[]
ifdef::radio[]
endif::altusmetrum[]
ifdef::radio[]
of less than that value.
====
of less than that value.
====
-Flight Time:: Time since boost was detected. Select a value and choose
-whether to activate the pyro channel before or after that amount of
-time.
+Flight Time:: Time since launch. Select a value and choose whether to
+activate the pyro channel before or after that amount of time.
+
+[WARNING]
+Firmware versions older than 1.8.6 have a bug which resets the time
+since launch to zero each time a motor starts burning. Update firmware
+to get the correct behavior.
Ascending:: A deprecated configuration value which was the same as
setting Ascent rate > 0. Existing configurations using this will be
Ascending:: A deprecated configuration value which was the same as
setting Ascent rate > 0. Existing configurations using this will be
/* Main flight thread. */
__pdata enum ao_flight_state ao_flight_state; /* current flight state */
/* Main flight thread. */
__pdata enum ao_flight_state ao_flight_state; /* current flight state */
-__pdata uint16_t ao_boost_tick; /* time of launch detect */
+__pdata uint16_t ao_boost_tick; /* time of most recent boost detect */
+__pdata uint16_t ao_launch_tick; /* time of first boost detect */
__pdata uint16_t ao_motor_number; /* number of motors burned so far */
#if HAS_SENSOR_ERRORS
__pdata uint16_t ao_motor_number; /* number of motors burned so far */
#if HAS_SENSOR_ERRORS
)
{
ao_flight_state = ao_flight_boost;
)
{
ao_flight_state = ao_flight_boost;
- ao_boost_tick = ao_sample_tick;
+ ao_launch_tick = ao_boost_tick = ao_sample_tick;
/* start logging data */
ao_log_start();
/* start logging data */
ao_log_start();
* number of seconds.
*/
if (ao_config.apogee_lockout) {
* number of seconds.
*/
if (ao_config.apogee_lockout) {
- if ((int16_t) (ao_sample_tick - ao_boost_tick) <
+ if ((int16_t) (ao_sample_tick - ao_launch_tick) <
AO_SEC_TO_TICKS(ao_config.apogee_lockout))
break;
}
AO_SEC_TO_TICKS(ao_config.apogee_lockout))
break;
}
extern __pdata enum ao_flight_state ao_flight_state;
extern __pdata uint16_t ao_boost_tick;
extern __pdata enum ao_flight_state ao_flight_state;
extern __pdata uint16_t ao_boost_tick;
+extern __pdata uint16_t ao_launch_tick;
extern __pdata uint16_t ao_motor_number;
#if HAS_IMU || HAS_MMA655X
extern __pdata uint16_t ao_motor_number;
#if HAS_IMU || HAS_MMA655X
#endif
case ao_pyro_time_less:
#endif
case ao_pyro_time_less:
- if ((int16_t) (ao_time() - ao_boost_tick) <= pyro->time_less)
+ if ((int16_t) (ao_time() - ao_launch_tick) <= pyro->time_less)
- DBG("time %d > %d\n", (int16_t)(ao_time() - ao_boost_tick), pyro->time_less);
+ DBG("time %d > %d\n", (int16_t)(ao_time() - ao_launch_tick), pyro->time_less);
break;
case ao_pyro_time_greater:
break;
case ao_pyro_time_greater:
- if ((int16_t) (ao_time() - ao_boost_tick) >= pyro->time_greater)
+ if ((int16_t) (ao_time() - ao_launch_tick) >= pyro->time_greater)
- DBG("time %d < %d\n", (int16_t)(ao_time() - ao_boost_tick), pyro->time_greater);
+ DBG("time %d < %d\n", (int16_t)(ao_time() - ao_launch_tick), pyro->time_greater);
break;
case ao_pyro_ascending:
break;
case ao_pyro_ascending: