summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2011-03-26 23:38:54 -0700
committerKeith Packard <keithp@keithp.com>2011-03-26 23:38:54 -0700
commit7ce8c9081e703d1405c2595ab9bda0cfa218c6c4 (patch)
treef6fbfe4b2ae18646d6fc56e80b7053d6f32a8b5d
parent3945d8f986d8f4bd3186a2cbaed5186e49d59839 (diff)
altos: full logging must flush pending data before checking state
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>
-rw-r--r--src/ao_log_big.c33
1 files changed, 17 insertions, 16 deletions
diff --git a/src/ao_log_big.c b/src/ao_log_big.c
index 8379ab5f..ab6b02f5 100644
--- a/src/ao_log_big.c
+++ b/src/ao_log_big.c
@@ -72,8 +72,7 @@ typedef uint8_t check_log_size[1-(256 % sizeof(struct ao_log_record))] ;
void
ao_log(void)
{
- uint16_t next_sensor;
- uint16_t next_other;
+ uint16_t next_sensor, next_other;
ao_storage_setup();
@@ -83,7 +82,7 @@ ao_log(void)
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
@@ -94,6 +93,8 @@ ao_log(void)
* 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) {
@@ -103,7 +104,7 @@ ao_log(void)
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;
@@ -120,18 +121,18 @@ ao_log(void)
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();
}
/* Wait for a while */