altos: Variable log rate in full logging code too
authorKeith Packard <keithp@keithp.com>
Sun, 27 Mar 2011 06:15:36 +0000 (23:15 -0700)
committerKeith Packard <keithp@keithp.com>
Sun, 27 Mar 2011 06:15:36 +0000 (23:15 -0700)
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>
src/ao_log_big.c

index 6db4a0ff26f13232a9444a06dfb69d7a6b6cb40b..8379ab5f1e36488463db092f93a2933a2b6bf21c 100644 (file)
@@ -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 */