From 3945d8f986d8f4bd3186a2cbaed5186e49d59839 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 26 Mar 2011 23:15:36 -0700 Subject: [PATCH] altos: Variable log rate in full logging code too With the fixed ADC rate used to get better data during flight, the logging code now needs to vary the data storage rate so that descent data is recorded at 10 samples/second while ascent data is recorded at 1 sample per second. Having the logging code do this itself eliminates any interaction with the flight code. Signed-off-by: Keith Packard --- src/ao_log_big.c | 52 +++++++++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/src/ao_log_big.c b/src/ao_log_big.c index 6db4a0ff..8379ab5f 100644 --- a/src/ao_log_big.c +++ b/src/ao_log_big.c @@ -65,9 +65,16 @@ static __xdata uint8_t ao_log_adc_pos; /* a hack to make sure that ao_log_records fill the eeprom block in even units */ typedef uint8_t check_log_size[1-(256 % sizeof(struct ao_log_record))] ; +#define AO_SENSOR_INTERVAL_ASCENT 1 +#define AO_SENSOR_INTERVAL_DESCENT 10 +#define AO_OTHER_INTERVAL 32 + void ao_log(void) { + uint16_t next_sensor; + uint16_t next_other; + ao_storage_setup(); ao_log_scan(); @@ -76,7 +83,7 @@ ao_log(void) ao_sleep(&ao_log_running); log.type = AO_LOG_FLIGHT; - log.tick = ao_flight_tick; + next_other = next_sensor = log.tick = ao_flight_tick; #if HAS_ACCEL log.u.flight.ground_accel = ao_ground_accel; #endif @@ -90,36 +97,41 @@ ao_log(void) for (;;) { /* Write samples to EEPROM */ while (ao_log_adc_pos != ao_flight_adc) { - log.type = AO_LOG_SENSOR; log.tick = ao_adc_ring[ao_log_adc_pos].tick; - 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_log_adc_pos & 0x1f) == 0) { + if ((int16_t) (log.tick - next_sensor) >= 0) { + log.type = AO_LOG_SENSOR; + 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) + next_sensor = log.tick + AO_SENSOR_INTERVAL_ASCENT; + else + next_sensor = log.tick + AO_SENSOR_INTERVAL_DESCENT; + } + if ((int16_t) (log.tick - next_other) >= 0) { log.type = AO_LOG_TEMP_VOLT; - log.tick = ao_adc_ring[ao_log_adc_pos].tick; log.u.temp_volt.temp = ao_adc_ring[ao_log_adc_pos].temp; log.u.temp_volt.v_batt = ao_adc_ring[ao_log_adc_pos].v_batt; ao_log_data(&log); log.type = AO_LOG_DEPLOY; - log.tick = ao_adc_ring[ao_log_adc_pos].tick; log.u.deploy.drogue = ao_adc_ring[ao_log_adc_pos].sense_d; log.u.deploy.main = ao_adc_ring[ao_log_adc_pos].sense_m; ao_log_data(&log); + 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