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 <keithp@keithp.com>
/* 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))] ;
/* 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
+
+ uint16_t next_sensor;
+ uint16_t next_other;
+
ao_storage_setup();
ao_log_scan();
ao_storage_setup();
ao_log_scan();
ao_sleep(&ao_log_running);
log.type = AO_LOG_FLIGHT;
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
#if HAS_ACCEL
log.u.flight.ground_accel = ao_ground_accel;
#endif
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.type = AO_LOG_SENSOR;
log.tick = ao_adc_ring[ao_log_adc_pos].tick;
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.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.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);
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);
}
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();
+ }