From 7ce8c9081e703d1405c2595ab9bda0cfa218c6c4 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 26 Mar 2011 23:38:54 -0700 Subject: [PATCH] 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 --- src/ao_log_big.c | 33 +++++++++++++++++---------------- 1 file 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 */ -- 2.30.2