Flight state must be checked only after any pending data have been
written to the log as the 'current' flight state is only valid when
the pending data values have been processed. This ensures that the
'boost' state is not marked until the full ring of data is
written. This ensures that the data processing code can find the
barometer values from before boost to get an idea of the ground
pressure value.
Signed-off-by: Keith Packard <keithp@keithp.com>
- uint16_t next_sensor;
- uint16_t next_other;
+ uint16_t next_sensor, next_other;
ao_sleep(&ao_log_running);
log.type = AO_LOG_FLIGHT;
ao_sleep(&ao_log_running);
log.type = AO_LOG_FLIGHT;
- next_other = next_sensor = log.tick = ao_flight_tick;
+ log.tick = ao_flight_tick;
#if HAS_ACCEL
log.u.flight.ground_accel = ao_ground_accel;
#endif
#if HAS_ACCEL
log.u.flight.ground_accel = ao_ground_accel;
#endif
* when starting up.
*/
ao_log_adc_pos = ao_adc_ring_next(ao_flight_adc);
* when starting up.
*/
ao_log_adc_pos = ao_adc_ring_next(ao_flight_adc);
+ next_other = next_sensor = ao_adc_ring[ao_log_adc_pos].tick;
+ ao_log_state = ao_flight_startup;
for (;;) {
/* Write samples to EEPROM */
while (ao_log_adc_pos != ao_flight_adc) {
for (;;) {
/* Write samples to EEPROM */
while (ao_log_adc_pos != ao_flight_adc) {
log.u.sensor.accel = ao_adc_ring[ao_log_adc_pos].accel;
log.u.sensor.pres = ao_adc_ring[ao_log_adc_pos].pres;
ao_log_data(&log);
log.u.sensor.accel = ao_adc_ring[ao_log_adc_pos].accel;
log.u.sensor.pres = ao_adc_ring[ao_log_adc_pos].pres;
ao_log_data(&log);
- if (ao_flight_state <= ao_flight_coast)
+ if (ao_log_state <= ao_flight_coast)
next_sensor = log.tick + AO_SENSOR_INTERVAL_ASCENT;
else
next_sensor = log.tick + AO_SENSOR_INTERVAL_DESCENT;
next_sensor = log.tick + AO_SENSOR_INTERVAL_ASCENT;
else
next_sensor = log.tick + AO_SENSOR_INTERVAL_DESCENT;
next_other = log.tick + AO_OTHER_INTERVAL;
}
ao_log_adc_pos = ao_adc_ring_next(ao_log_adc_pos);
next_other = log.tick + AO_OTHER_INTERVAL;
}
ao_log_adc_pos = ao_adc_ring_next(ao_log_adc_pos);
- /* Write state change to EEPROM */
- if (ao_flight_state != ao_log_state) {
- ao_log_state = ao_flight_state;
- log.type = AO_LOG_STATE;
- log.tick = ao_flight_tick;
- log.u.state.state = ao_log_state;
- log.u.state.reason = 0;
- ao_log_data(&log);
-
- if (ao_log_state == ao_flight_landed)
- ao_log_stop();
- }
+ }
+ /* Write state change to EEPROM */
+ if (ao_flight_state != ao_log_state) {
+ ao_log_state = ao_flight_state;
+ log.type = AO_LOG_STATE;
+ log.tick = ao_flight_tick;
+ log.u.state.state = ao_log_state;
+ log.u.state.reason = 0;
+ ao_log_data(&log);
+
+ if (ao_log_state == ao_flight_landed)
+ ao_log_stop();