altos: Share common logging code. Deal with corrupt initial flight records
authorKeith Packard <keithp@keithp.com>
Sun, 22 Oct 2017 20:44:32 +0000 (15:44 -0500)
committerKeith Packard <keithp@keithp.com>
Sat, 28 Oct 2017 15:42:18 +0000 (08:42 -0700)
Move common logging APIs from per-format files into ao_log.c. Then,
change that code to check the first log record in a slot (containing
the flight number) to see if it's invalid and deal with it. That
involves not re-using that slot, and allowing it to be erased.

Corrupted log blocks are reported with a negative flight number.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/kernel/ao_gps_report.c
src/kernel/ao_gps_report_mega.c
src/kernel/ao_gps_report_metrum.c
src/kernel/ao_log.c
src/kernel/ao_log.h
src/kernel/ao_log_big.c
src/kernel/ao_log_gps.c
src/kernel/ao_log_mega.c
src/kernel/ao_log_metrum.c
src/kernel/ao_log_mini.c
src/kernel/ao_log_tiny.c

index 39688fea70693816b1cd70630f9b7265a18e4830..75c2f367ec390a7b2a2311da9909793b0fa52d98 100644 (file)
@@ -45,13 +45,13 @@ ao_gps_report(void)
                        gps_log.u.gps_time.minute = gps_data.minute;
                        gps_log.u.gps_time.second = gps_data.second;
                        gps_log.u.gps_time.flags = gps_data.flags;
-                       ao_log_data(&gps_log);
+                       ao_log_write(&gps_log);
                        gps_log.type = AO_LOG_GPS_LAT;
                        gps_log.u.gps_latitude = gps_data.latitude;
-                       ao_log_data(&gps_log);
+                       ao_log_write(&gps_log);
                        gps_log.type = AO_LOG_GPS_LON;
                        gps_log.u.gps_longitude = gps_data.longitude;
-                       ao_log_data(&gps_log);
+                       ao_log_write(&gps_log);
                        gps_log.type = AO_LOG_GPS_ALT;
                        gps_log.u.gps_altitude.altitude_low = gps_data.altitude_low;
 #if HAS_WIDE_GPS
@@ -59,14 +59,14 @@ ao_gps_report(void)
 #else
                        gps_log.u.gps_altitude.altitude_high = 0xffff;
 #endif
-                       ao_log_data(&gps_log);
+                       ao_log_write(&gps_log);
                        if (!date_reported && (gps_data.flags & AO_GPS_DATE_VALID)) {
                                gps_log.type = AO_LOG_GPS_DATE;
                                gps_log.u.gps_date.year = gps_data.year;
                                gps_log.u.gps_date.month = gps_data.month;
                                gps_log.u.gps_date.day = gps_data.day;
                                gps_log.u.gps_date.extra = 0;
-                               date_reported = ao_log_data(&gps_log);
+                               date_reported = ao_log_write(&gps_log);
                        }
                }
                if (new & AO_GPS_NEW_TRACKING) {
@@ -78,7 +78,7 @@ ao_gps_report(void)
                                        if ((gps_log.u.gps_sat.svid = gps_tracking_data.sats[c].svid))
                                        {
                                                gps_log.u.gps_sat.c_n = gps_tracking_data.sats[c].c_n_1;
-                                               ao_log_data(&gps_log);
+                                               ao_log_write(&gps_log);
                                        }
                        }
                }
index 8a29865577b19a31ec0a7970031a69b20dd9dc4d..85614b85bd3eea31ec2c773e85c146620adaa4a0 100644 (file)
@@ -105,7 +105,7 @@ ao_gps_report_mega(void)
                        gps_log.u.gps.hdop = gps_data.hdop;
                        gps_log.u.gps.vdop = gps_data.vdop;
                        gps_log.u.gps.mode = gps_data.mode;
-                       ao_log_mega(&gps_log);
+                       ao_log_write(&gps_log);
                }
                if ((new & AO_GPS_NEW_TRACKING) && (n = gps_tracking_data.channels) != 0) {
                        gps_log.tick = ao_gps_tick;
@@ -120,7 +120,7 @@ ao_gps_report_mega(void)
                                                break;
                                }
                        gps_log.u.gps_sat.channels = i;
-                       ao_log_mega(&gps_log);
+                       ao_log_write(&gps_log);
                }
        }
 }
index 508f151950bd9730e76b0f2ca1a3b02932f0868c..523fb17fe8529615ce4932d45e3c35012e11d86a 100644 (file)
@@ -47,7 +47,7 @@ ao_gps_report_metrum(void)
                        gps_log.u.gps.longitude = gps_data.longitude;
                        gps_log.u.gps.altitude_low = gps_data.altitude_low;
                        gps_log.u.gps.altitude_high = gps_data.altitude_high;
-                       ao_log_metrum(&gps_log);
+                       ao_log_write(&gps_log);
 
                        gps_log.type = AO_LOG_GPS_TIME;
                        gps_log.u.gps_time.hour = gps_data.hour;
@@ -58,7 +58,7 @@ ao_gps_report_metrum(void)
                        gps_log.u.gps_time.month = gps_data.month;
                        gps_log.u.gps_time.day = gps_data.day;
                        gps_log.u.gps_time.pdop = gps_data.pdop;
-                       ao_log_metrum(&gps_log);
+                       ao_log_write(&gps_log);
                }
 
                if ((new & AO_GPS_NEW_TRACKING) && (n = gps_tracking_data.channels)) {
@@ -71,7 +71,7 @@ ao_gps_report_metrum(void)
                                        if (i == 4) {
                                                gps_log.u.gps_sat.channels = i;
                                                gps_log.u.gps_sat.more = 1;
-                                               ao_log_metrum(&gps_log);
+                                               ao_log_write(&gps_log);
                                                i = 0;
                                        }
                                        gps_log.u.gps_sat.sats[i].svid = svid;
@@ -82,7 +82,7 @@ ao_gps_report_metrum(void)
                        if (i) {
                                gps_log.u.gps_sat.channels = i;
                                gps_log.u.gps_sat.more = 0;
-                               ao_log_metrum(&gps_log);
+                               ao_log_write(&gps_log);
                        }
                }
        }
index 0589b4b00513b4fb8b80b03d22b7275dfc510a2b..08af5b583028b04903bf8ede5dd62e9c677f9e64 100644 (file)
@@ -29,7 +29,7 @@ __pdata uint32_t ao_log_end_pos;
 __pdata uint32_t ao_log_start_pos;
 __xdata uint8_t        ao_log_running;
 __pdata enum ao_flight_state ao_log_state;
-__xdata uint16_t ao_flight_number;
+__xdata int16_t ao_flight_number;
 
 void
 ao_log_flush(void)
@@ -111,6 +111,85 @@ ao_log_erase_mark(void)
        ao_config_put();
 }
 
+#ifndef AO_LOG_UNCOMMON
+/*
+ * Common logging functions which depend on the type of the log data
+ * structure.
+ */
+
+__xdata ao_log_type log;
+
+static uint8_t
+ao_log_csum(__xdata uint8_t *b) __reentrant
+{
+       uint8_t sum = 0x5a;
+       uint8_t i;
+
+       for (i = 0; i < sizeof (ao_log_type); i++)
+               sum += *b++;
+       return -sum;
+}
+
+uint8_t
+ao_log_write(__xdata ao_log_type *log) __reentrant
+{
+       uint8_t wrote = 0;
+       /* set checksum */
+       log->csum = 0;
+       log->csum = ao_log_csum((__xdata uint8_t *) log);
+       ao_mutex_get(&ao_log_mutex); {
+               if (ao_log_current_pos >= ao_log_end_pos && ao_log_running)
+                       ao_log_stop();
+               if (ao_log_running) {
+                       wrote = 1;
+                       ao_storage_write(ao_log_current_pos,
+                                        log,
+                                        sizeof (ao_log_type));
+                       ao_log_current_pos += sizeof (ao_log_type);
+               }
+       } ao_mutex_put(&ao_log_mutex);
+       return wrote;
+}
+
+uint8_t
+ao_log_check_data(void)
+{
+       if (ao_log_csum((uint8_t *) &log) != 0)
+               return 0;
+       return 1;
+}
+
+uint8_t
+ao_log_check_clear(void)
+{
+       uint8_t *b = (uint8_t *) &log;
+       uint8_t i;
+
+       for (i = 0; i < sizeof (ao_log_type); i++) {
+               if (*b++ != 0xff)
+                       return 0;
+       }
+       return 1;
+}
+
+int16_t
+ao_log_flight(uint8_t slot)
+{
+       if (!ao_storage_read(ao_log_pos(slot),
+                            &log,
+                            sizeof (ao_log_type)))
+               return -(int16_t) (slot + 1);
+
+       if (ao_log_check_clear())
+               return 0;
+
+       if (ao_log_check_data() || log.type != AO_LOG_FLIGHT)
+               return -(int16_t) (slot + 1);
+
+       return log.u.flight.flight;
+}
+#endif
+
 static uint8_t
 ao_log_slots()
 {
@@ -123,21 +202,21 @@ ao_log_pos(uint8_t slot)
        return ((slot) * ao_config.flight_log_max);
 }
 
-static uint16_t
+static int16_t
 ao_log_max_flight(void)
 {
        uint8_t         log_slot;
        uint8_t         log_slots;
-       uint16_t        log_flight;
-       uint16_t        max_flight = 0;
+       int16_t         log_flight;
+       int16_t         max_flight = 0;
 
        /* Scan the log space looking for the biggest flight number */
        log_slots = ao_log_slots();
        for (log_slot = 0; log_slot < log_slots; log_slot++) {
                log_flight = ao_log_flight(log_slot);
-               if (!log_flight)
+               if (log_flight <= 0)
                        continue;
-               if (max_flight == 0 || (int16_t) (log_flight - max_flight) > 0)
+               if (max_flight == 0 || log_flight > max_flight)
                        max_flight = log_flight;
        }
        return max_flight;
@@ -228,24 +307,24 @@ ao_log_scan(void) __reentrant
 
        if (ao_flight_number) {
                uint32_t        full = ao_log_current_pos;
-               uint32_t        empty = ao_log_end_pos - ao_log_size;
+               uint32_t        empty = ao_log_end_pos - AO_LOG_SIZE;
 
                /* If there's already a flight started, then find the
                 * end of it
                 */
                for (;;) {
                        ao_log_current_pos = (full + empty) >> 1;
-                       ao_log_current_pos -= ao_log_current_pos % ao_log_size;
+                       ao_log_current_pos -= ao_log_current_pos % AO_LOG_SIZE;
 
                        if (ao_log_current_pos == full) {
-                               if (ao_log_check(ao_log_current_pos))
-                                       ao_log_current_pos += ao_log_size;
+                               if (ao_log_check(ao_log_current_pos) != AO_LOG_EMPTY)
+                                       ao_log_current_pos += AO_LOG_SIZE;
                                break;
                        }
                        if (ao_log_current_pos == empty)
                                break;
 
-                       if (ao_log_check(ao_log_current_pos)) {
+                       if (ao_log_check(ao_log_current_pos) != AO_LOG_EMPTY) {
                                full = ao_log_current_pos;
                        } else {
                                empty = ao_log_current_pos;
@@ -259,10 +338,11 @@ ao_log_scan(void) __reentrant
        ao_wakeup(&ao_flight_number);
        return ret;
 #else
-
-       if (ao_flight_number)
-               if (++ao_flight_number == 0)
+       if (ao_flight_number) {
+               ++ao_flight_number;
+               if (ao_flight_number <= 0)
                        ao_flight_number = 1;
+       }
 
        ao_log_find_max_erase_flight();
 
@@ -330,7 +410,7 @@ ao_log_list(void) __reentrant
 {
        uint8_t slot;
        uint8_t slots;
-       uint16_t flight;
+       int16_t flight;
 
        slots = ao_log_slots();
        for (slot = 0; slot < slots; slot++)
@@ -350,18 +430,25 @@ ao_log_delete(void) __reentrant
 {
        uint8_t slot;
        uint8_t slots;
+       int16_t cmd_flight = 1;
 
+       ao_cmd_white();
+       if (ao_cmd_lex_c == '-') {
+               cmd_flight = -1;
+               ao_cmd_lex();
+       }
        ao_cmd_decimal();
        if (ao_cmd_status != ao_cmd_success)
                return;
+       cmd_flight *= (int16_t) ao_cmd_lex_i;
 
        slots = ao_log_slots();
        /* Look for the flight log matching the requested flight */
-       if (ao_cmd_lex_i) {
+       if (cmd_flight) {
                for (slot = 0; slot < slots; slot++) {
-                       if (ao_log_flight(slot) == ao_cmd_lex_i) {
+                       if (ao_log_flight(slot) == cmd_flight) {
 #if HAS_TRACKER
-                               ao_tracker_erase_start(ao_cmd_lex_i);
+                               ao_tracker_erase_start(cmd_flight);
 #endif
                                ao_log_erase(slot);
 #if HAS_TRACKER
@@ -372,7 +459,7 @@ ao_log_delete(void) __reentrant
                        }
                }
        }
-       printf("No such flight: %d\n", ao_cmd_lex_i);
+       printf("No such flight: %d\n", cmd_flight);
 }
 
 __code struct ao_cmds ao_log_cmds[] = {
index aca669db668c84e5aabbc818f588a59fe299c4a0..1c186364a4e1fe3a854d99e4b56c18356902b1d1 100644 (file)
@@ -29,7 +29,7 @@
  * the log. Tasks may wait for this to be initialized
  * by sleeping on this variable.
  */
-extern __xdata uint16_t ao_flight_number;
+extern __xdata int16_t ao_flight_number;
 extern __xdata uint8_t ao_log_mutex;
 extern __pdata uint32_t ao_log_current_pos;
 extern __pdata uint32_t ao_log_end_pos;
@@ -56,15 +56,25 @@ extern __pdata enum ao_flight_state ao_log_state;
 #define AO_LOG_FORMAT_EASYMINI2                14      /* 16-byte MS5607 baro only, 3.3V supply, stm32f042 SoC */
 #define AO_LOG_FORMAT_NONE             127     /* No log at all */
 
-extern __code uint8_t ao_log_format;
-extern __code uint8_t ao_log_size;
+/* Return the flight number from the given log slot, 0 if none, -slot on failure */
 
-/* Return the flight number from the given log slot, 0 if none */
-uint16_t
+int16_t
 ao_log_flight(uint8_t slot);
 
-/* Check if there is valid log data at the specified location */
+/* Checksum the loaded log record */
+uint8_t
+ao_log_check_data(void);
+
+/* Check to see if the loaded log record is empty */
 uint8_t
+ao_log_check_clear(void);
+
+/* Check if there is valid log data at the specified location */
+#define AO_LOG_VALID   1
+#define AO_LOG_EMPTY   0
+#define AO_LOG_INVALID         -1
+
+int8_t
 ao_log_check(uint32_t pos);
 
 /* Flush the log */
@@ -463,21 +473,48 @@ struct ao_log_gps {
        } u;
 };
 
-/* Write a record to the eeprom log */
-uint8_t
-ao_log_data(__xdata struct ao_log_record *log) __reentrant;
+#if AO_LOG_FORMAT == AO_LOG_FOMAT_TELEMEGA_OLD || AO_LOG_FORMAT == AO_LOG_FORMAT_TELEMEGA
+typedef struct ao_log_mega ao_log_type;
+#endif
 
-uint8_t
-ao_log_mega(__xdata struct ao_log_mega *log) __reentrant;
+#if AO_LOG_FORMAT == AO_LOG_FORMAT_TELEMETRUM
+typedef struct ao_log_metrum ao_log_type;
+#endif
 
-uint8_t
-ao_log_metrum(__xdata struct ao_log_metrum *log) __reentrant;
+#if AO_LOG_FORMAT == AO_LOG_FORMAT_EASYMINI1 || AO_LOG_FORMAT == AO_LOG_FORMAT_EASYMINI2 || AO_LOG_FORMAT == AO_LOG_FORMAT_TELEMINI2 || AO_LOG_FORMAT == AO_LOG_FORMAT_TELEMINI3
+typedef struct ao_log_mini ao_log_type;
+#endif
 
-uint8_t
-ao_log_mini(__xdata struct ao_log_mini *log) __reentrant;
+#if AO_LOG_FORMAT == AO_LOG_FORMAT_TELEGPS
+typedef struct ao_log_gps ao_log_type;
+#endif
+
+#if AO_LOG_FORMAT == AO_LOG_FORMAT_FULL
+typedef struct ao_log_record ao_log_type;
+#endif
+
+#if AO_LOG_FORMAT == AO_LOG_FORMAT_TINY
+#define AO_LOG_UNCOMMON        1
+#endif
+
+#if AO_LOG_FORMAT == AO_LOG_FORMAT_TELEMETRY
+#define AO_LOG_UNCOMMON        1
+#endif
+
+#if AO_LOG_FORMAT == AO_LOG_FORMAT_TELESCIENCE
+#define AO_LOG_UNCOMMON        1
+#endif
+
+#ifndef AO_LOG_UNCOMMON
+extern __xdata ao_log_type log;
+
+#define AO_LOG_SIZE sizeof(ao_log_type)
+
+/* Write a record to the eeprom log */
 
 uint8_t
-ao_log_gps(__xdata struct ao_log_gps *log) __reentrant;
+ao_log_write(__xdata ao_log_type *log) __reentrant;
+#endif
 
 void
 ao_log_flush(void);
index e32abd1a69cc7dc18214c3d506d1470b6ffca62e..28a893c700e11a609b2043c85db289c206c5297c 100644 (file)
 
 #include "ao.h"
 
-static __xdata struct ao_log_record log;
-
-__code uint8_t ao_log_format = AO_LOG_FORMAT_FULL;
-
-static uint8_t
-ao_log_csum(__xdata uint8_t *b) __reentrant
-{
-       uint8_t sum = 0x5a;
-       uint8_t i;
-
-       for (i = 0; i < sizeof (struct ao_log_record); i++)
-               sum += *b++;
-       return -sum;
-}
-
-uint8_t
-ao_log_data(__xdata struct ao_log_record *log) __reentrant
-{
-       uint8_t wrote = 0;
-       /* set checksum */
-       log->csum = 0;
-       log->csum = ao_log_csum((__xdata uint8_t *) log);
-       ao_mutex_get(&ao_log_mutex); {
-               if (ao_log_current_pos >= ao_log_end_pos && ao_log_running)
-                       ao_log_stop();
-               if (ao_log_running) {
-                       wrote = 1;
-                       ao_storage_write(ao_log_current_pos,
-                                        log,
-                                        sizeof (struct ao_log_record));
-                       ao_log_current_pos += sizeof (struct ao_log_record);
-               }
-       } ao_mutex_put(&ao_log_mutex);
-       return wrote;
-}
-
-static uint8_t
-ao_log_dump_check_data(void)
-{
-       if (ao_log_csum((uint8_t *) &log) != 0)
-               return 0;
-       return 1;
-}
-
 static __data uint8_t  ao_log_data_pos;
 
 /* a hack to make sure that ao_log_records fill the eeprom block in even units */
@@ -91,7 +47,7 @@ ao_log(void)
        log.u.flight.ground_accel = ao_ground_accel;
 #endif
        log.u.flight.flight = ao_flight_number;
-       ao_log_data(&log);
+       ao_log_write(&log);
 
        /* Write the whole contents of the ring to the log
         * when starting up.
@@ -107,7 +63,7 @@ ao_log(void)
                                log.type = AO_LOG_SENSOR;
                                log.u.sensor.accel = ao_data_ring[ao_log_data_pos].adc.accel;
                                log.u.sensor.pres = ao_data_ring[ao_log_data_pos].adc.pres;
-                               ao_log_data(&log);
+                               ao_log_write(&log);
                                if (ao_log_state <= ao_flight_coast)
                                        next_sensor = log.tick + AO_SENSOR_INTERVAL_ASCENT;
                                else
@@ -117,11 +73,11 @@ ao_log(void)
                                log.type = AO_LOG_TEMP_VOLT;
                                log.u.temp_volt.temp = ao_data_ring[ao_log_data_pos].adc.temp;
                                log.u.temp_volt.v_batt = ao_data_ring[ao_log_data_pos].adc.v_batt;
-                               ao_log_data(&log);
+                               ao_log_write(&log);
                                log.type = AO_LOG_DEPLOY;
                                log.u.deploy.drogue = ao_data_ring[ao_log_data_pos].adc.sense_d;
                                log.u.deploy.main = ao_data_ring[ao_log_data_pos].adc.sense_m;
-                               ao_log_data(&log);
+                               ao_log_write(&log);
                                next_other = log.tick + AO_OTHER_INTERVAL;
                        }
                        ao_log_data_pos = ao_data_ring_next(ao_log_data_pos);
@@ -133,7 +89,7 @@ ao_log(void)
                        log.tick = ao_sample_tick;
                        log.u.state.state = ao_log_state;
                        log.u.state.reason = 0;
-                       ao_log_data(&log);
+                       ao_log_write(&log);
 
                        if (ao_log_state == ao_flight_landed)
                                ao_log_stop();
@@ -147,16 +103,3 @@ ao_log(void)
                        ao_sleep(&ao_log_running);
        }
 }
-
-uint16_t
-ao_log_flight(uint8_t slot)
-{
-       if (!ao_storage_read(ao_log_pos(slot),
-                            &log,
-                            sizeof (struct ao_log_record)))
-               return 0;
-
-       if (ao_log_dump_check_data() && log.type == AO_LOG_FLIGHT)
-               return log.u.flight.flight;
-       return 0;
-}
index 02551169fd46f80a18a8839f5518ef9d63c22da1..a55d93f115791b0d391e249a03e6e20cd4e9de7e 100644 (file)
 #include <ao_distance.h>
 #include <ao_tracker.h>
 
-static __xdata struct ao_log_gps log;
-
-__code uint8_t ao_log_format = AO_LOG_FORMAT_TELEGPS;
-__code uint8_t ao_log_size = sizeof (struct ao_log_gps);
-
-static uint8_t
-ao_log_csum(__xdata uint8_t *b) __reentrant
-{
-       uint8_t sum = 0x5a;
-       uint8_t i;
-
-       for (i = 0; i < sizeof (struct ao_log_gps); i++)
-               sum += *b++;
-       return -sum;
-}
-
-uint8_t
-ao_log_gps(__xdata struct ao_log_gps *log) __reentrant
-{
-       uint8_t wrote = 0;
-       /* set checksum */
-       log->csum = 0;
-       log->csum = ao_log_csum((__xdata uint8_t *) log);
-       ao_mutex_get(&ao_log_mutex); {
-               if (ao_log_current_pos >= ao_log_end_pos && ao_log_running)
-                       ao_log_stop();
-               if (ao_log_running) {
-                       wrote = 1;
-                       ao_storage_write(ao_log_current_pos,
-                                        log,
-                                        sizeof (struct ao_log_gps));
-                       ao_log_current_pos += sizeof (struct ao_log_gps);
-               }
-       } ao_mutex_put(&ao_log_mutex);
-       return wrote;
-}
-
 void
 ao_log_gps_flight(void)
 {
        log.type = AO_LOG_FLIGHT;
        log.tick = ao_time();
        log.u.flight.flight = ao_flight_number;
-       ao_log_gps(&log);
+       ao_log_write(&log);
 }
 
 void
@@ -94,7 +57,7 @@ ao_log_gps_data(uint16_t tick, struct ao_telemetry_location *gps_data)
        log.u.gps.hdop = gps_data->hdop;
        log.u.gps.vdop = gps_data->vdop;
        log.u.gps.mode = gps_data->mode;
-       ao_log_gps(&log);
+       ao_log_write(&log);
 }
 
 void
@@ -115,39 +78,21 @@ ao_log_gps_tracking(uint16_t tick, struct ao_telemetry_satellite *gps_tracking_d
                                break;
                }
        log.u.gps_sat.channels = i;
-       ao_log_gps(&log);
+       ao_log_write(&log);
 }
 
-static uint8_t
-ao_log_dump_check_data(void)
-{
-       if (ao_log_csum((uint8_t *) &log) != 0)
-               return 0;
-       return 1;
-}
-
-uint16_t
-ao_log_flight(uint8_t slot)
-{
-       if (!ao_storage_read(ao_log_pos(slot),
-                            &log,
-                            sizeof (struct ao_log_gps)))
-               return 0;
-
-       if (ao_log_dump_check_data() && log.type == AO_LOG_FLIGHT)
-               return log.u.flight.flight;
-       return 0;
-}
-
-uint8_t
+int8_t
 ao_log_check(uint32_t pos)
 {
        if (!ao_storage_read(pos,
                             &log,
                             sizeof (struct ao_log_gps)))
-               return 0;
+               return AO_LOG_INVALID;
+
+       if (ao_log_check_clear())
+               return AO_LOG_EMPTY;
 
-       if (ao_log_dump_check_data())
-               return 1;
-       return 0;
+       if (!ao_log_check_data())
+               return AO_LOG_INVALID;
+       return AO_LOG_VALID;
 }
index b86abe7af8ebec882225c88c4f5e34619ff13195..d1cf4f13f16ba89a1e496c2f37e5a8e9002d8144 100644 (file)
 #include <ao_data.h>
 #include <ao_flight.h>
 
-static __xdata struct ao_log_mega log;
-
-__code uint8_t ao_log_format = AO_LOG_FORMAT_TELEMEGA;
-
-static uint8_t
-ao_log_csum(__xdata uint8_t *b) __reentrant
-{
-       uint8_t sum = 0x5a;
-       uint8_t i;
-
-       for (i = 0; i < sizeof (struct ao_log_mega); i++)
-               sum += *b++;
-       return -sum;
-}
-
-uint8_t
-ao_log_mega(__xdata struct ao_log_mega *log) __reentrant
-{
-       uint8_t wrote = 0;
-       /* set checksum */
-       log->csum = 0;
-       log->csum = ao_log_csum((__xdata uint8_t *) log);
-       ao_mutex_get(&ao_log_mutex); {
-               if (ao_log_current_pos >= ao_log_end_pos && ao_log_running)
-                       ao_log_stop();
-               if (ao_log_running) {
-                       wrote = 1;
-                       ao_storage_write(ao_log_current_pos,
-                                        log,
-                                        sizeof (struct ao_log_mega));
-                       ao_log_current_pos += sizeof (struct ao_log_mega);
-               }
-       } ao_mutex_put(&ao_log_mutex);
-       return wrote;
-}
-
-static uint8_t
-ao_log_dump_check_data(void)
-{
-       if (ao_log_csum((uint8_t *) &log) != 0)
-               return 0;
-       return 1;
-}
-
 #if HAS_FLIGHT
 static __data uint8_t  ao_log_data_pos;
 
@@ -106,7 +62,7 @@ ao_log(void)
 #endif
        log.u.flight.ground_pres = ao_ground_pres;
        log.u.flight.flight = ao_flight_number;
-       ao_log_mega(&log);
+       ao_log_write(&log);
 #endif
 
        /* Write the whole contents of the ring to the log
@@ -139,7 +95,7 @@ ao_log(void)
                                log.u.sensor.mag_y = ao_data_ring[ao_log_data_pos].hmc5883.y;
 #endif
                                log.u.sensor.accel = ao_data_accel(&ao_data_ring[ao_log_data_pos]);
-                               ao_log_mega(&log);
+                               ao_log_write(&log);
                                if (ao_log_state <= ao_flight_coast)
                                        next_sensor = log.tick + AO_SENSOR_INTERVAL_ASCENT;
                                else
@@ -153,7 +109,7 @@ ao_log(void)
                                for (i = 0; i < AO_ADC_NUM_SENSE; i++)
                                        log.u.volt.sense[i] = ao_data_ring[ao_log_data_pos].adc.sense[i];
                                log.u.volt.pyro = ao_pyro_fired;
-                               ao_log_mega(&log);
+                               ao_log_write(&log);
                                next_other = log.tick + AO_OTHER_INTERVAL;
                        }
                        ao_log_data_pos = ao_data_ring_next(ao_log_data_pos);
@@ -166,7 +122,7 @@ ao_log(void)
                        log.tick = ao_time();
                        log.u.state.state = ao_log_state;
                        log.u.state.reason = 0;
-                       ao_log_mega(&log);
+                       ao_log_write(&log);
 
                        if (ao_log_state == ao_flight_landed)
                                ao_log_stop();
@@ -185,15 +141,3 @@ ao_log(void)
 }
 #endif /* HAS_FLIGHT */
 
-uint16_t
-ao_log_flight(uint8_t slot)
-{
-       if (!ao_storage_read(ao_log_pos(slot),
-                            &log,
-                            sizeof (struct ao_log_mega)))
-               return 0;
-
-       if (ao_log_dump_check_data() && log.type == AO_LOG_FLIGHT)
-               return log.u.flight.flight;
-       return 0;
-}
index 154b1740c6b41cfe93b40ab865fe84c309f72960..afb8f637d292316a393aa4db5e70d056166c435a 100644 (file)
 #include <ao_data.h>
 #include <ao_flight.h>
 
-static __xdata struct ao_log_metrum log;
-
-__code uint8_t ao_log_format = AO_LOG_FORMAT_TELEMETRUM;
-
-static uint8_t
-ao_log_csum(__xdata uint8_t *b) __reentrant
-{
-       uint8_t sum = 0x5a;
-       uint8_t i;
-
-       for (i = 0; i < sizeof (struct ao_log_metrum); i++)
-               sum += *b++;
-       return -sum;
-}
-
-uint8_t
-ao_log_metrum(__xdata struct ao_log_metrum *log) __reentrant
-{
-       uint8_t wrote = 0;
-       /* set checksum */
-       log->csum = 0;
-       log->csum = ao_log_csum((__xdata uint8_t *) log);
-       ao_mutex_get(&ao_log_mutex); {
-               if (ao_log_current_pos >= ao_log_end_pos && ao_log_running)
-                       ao_log_stop();
-               if (ao_log_running) {
-                       wrote = 1;
-                       ao_storage_write(ao_log_current_pos,
-                                        log,
-                                        sizeof (struct ao_log_metrum));
-                       ao_log_current_pos += sizeof (struct ao_log_metrum);
-               }
-       } ao_mutex_put(&ao_log_mutex);
-       return wrote;
-}
-
-static uint8_t
-ao_log_dump_check_data(void)
-{
-       if (ao_log_csum((uint8_t *) &log) != 0)
-               return 0;
-       return 1;
-}
-
 #if HAS_ADC
 static __data uint8_t  ao_log_data_pos;
 
@@ -97,7 +53,7 @@ ao_log(void)
 #endif
        log.u.flight.ground_pres = ao_ground_pres;
        log.u.flight.flight = ao_flight_number;
-       ao_log_metrum(&log);
+       ao_log_write(&log);
 #endif
 
        /* Write the whole contents of the ring to the log
@@ -119,7 +75,7 @@ ao_log(void)
 #if HAS_ACCEL
                                log.u.sensor.accel = ao_data_accel(&ao_data_ring[ao_log_data_pos]);
 #endif
-                               ao_log_metrum(&log);
+                               ao_log_write(&log);
                                if (ao_log_state <= ao_flight_coast)
                                        next_sensor = log.tick + AO_SENSOR_INTERVAL_ASCENT;
                                else
@@ -130,7 +86,7 @@ ao_log(void)
                                log.u.volt.v_batt = ao_data_ring[ao_log_data_pos].adc.v_batt;
                                log.u.volt.sense_a = ao_data_ring[ao_log_data_pos].adc.sense_a;
                                log.u.volt.sense_m = ao_data_ring[ao_log_data_pos].adc.sense_m;
-                               ao_log_metrum(&log);
+                               ao_log_write(&log);
                                next_other = log.tick + AO_OTHER_INTERVAL;
                        }
                        ao_log_data_pos = ao_data_ring_next(ao_log_data_pos);
@@ -143,7 +99,7 @@ ao_log(void)
                        log.tick = ao_time();
                        log.u.state.state = ao_log_state;
                        log.u.state.reason = 0;
-                       ao_log_metrum(&log);
+                       ao_log_write(&log);
 
                        if (ao_log_state == ao_flight_landed)
                                ao_log_stop();
@@ -161,16 +117,3 @@ ao_log(void)
        }
 }
 #endif
-
-uint16_t
-ao_log_flight(uint8_t slot)
-{
-       if (!ao_storage_read(ao_log_pos(slot),
-                            &log,
-                            sizeof (struct ao_log_metrum)))
-               return 0;
-
-       if (ao_log_dump_check_data() && log.type == AO_LOG_FLIGHT)
-               return log.u.flight.flight;
-       return 0;
-}
index d5735cdc4a8c66a0c7cc3c24a907ec967aaa64db..af2fa6059e11ca33c66fc8f8817d1b6126717031 100644 (file)
 #include <ao_data.h>
 #include <ao_flight.h>
 
-static __xdata struct ao_log_mini log;
-
-__code uint8_t ao_log_format = AO_LOG_FORMAT;
-
-static uint8_t
-ao_log_csum(__xdata uint8_t *b) __reentrant
-{
-       uint8_t sum = 0x5a;
-       uint8_t i;
-
-       for (i = 0; i < sizeof (struct ao_log_mini); i++)
-               sum += *b++;
-       return -sum;
-}
-
-uint8_t
-ao_log_mini(__xdata struct ao_log_mini *log) __reentrant
-{
-       uint8_t wrote = 0;
-       /* set checksum */
-       log->csum = 0;
-       log->csum = ao_log_csum((__xdata uint8_t *) log);
-       ao_mutex_get(&ao_log_mutex); {
-               if (ao_log_current_pos >= ao_log_end_pos && ao_log_running)
-                       ao_log_stop();
-               if (ao_log_running) {
-                       wrote = 1;
-                       ao_storage_write(ao_log_current_pos,
-                                        log,
-                                        sizeof (struct ao_log_mini));
-                       ao_log_current_pos += sizeof (struct ao_log_mini);
-               }
-       } ao_mutex_put(&ao_log_mutex);
-       return wrote;
-}
-
-static uint8_t
-ao_log_dump_check_data(void)
-{
-       if (ao_log_csum((uint8_t *) &log) != 0)
-               return 0;
-       return 1;
-}
-
 static __data uint8_t  ao_log_data_pos;
 
 /* a hack to make sure that ao_log_minis fill the eeprom block in even units */
@@ -92,7 +48,7 @@ ao_log(void)
        log.tick = ao_sample_tick;
        log.u.flight.flight = ao_flight_number;
        log.u.flight.ground_pres = ao_ground_pres;
-       ao_log_mini(&log);
+       ao_log_write(&log);
 #endif
 
        /* Write the whole contents of the ring to the log
@@ -116,7 +72,7 @@ ao_log(void)
                                log.u.sensor.sense_m = ao_data_ring[ao_log_data_pos].adc.sense_m;
                                log.u.sensor.v_batt = ao_data_ring[ao_log_data_pos].adc.v_batt;
 #endif
-                               ao_log_mini(&log);
+                               ao_log_write(&log);
                                if (ao_log_state <= ao_flight_coast)
                                        next_sensor = log.tick + AO_SENSOR_INTERVAL_ASCENT;
                                else
@@ -132,7 +88,7 @@ ao_log(void)
                        log.tick = ao_time();
                        log.u.state.state = ao_log_state;
                        log.u.state.reason = 0;
-                       ao_log_mini(&log);
+                       ao_log_write(&log);
 
                        if (ao_log_state == ao_flight_landed)
                                ao_log_stop();
@@ -149,16 +105,3 @@ ao_log(void)
                        ao_sleep(&ao_log_running);
        }
 }
-
-uint16_t
-ao_log_flight(uint8_t slot)
-{
-       if (!ao_storage_read(ao_log_pos(slot),
-                            &log,
-                            sizeof (struct ao_log_mini)))
-               return 0;
-
-       if (ao_log_dump_check_data() && log.type == AO_LOG_FLIGHT)
-               return log.u.flight.flight;
-       return 0;
-}
index 7769b7b5749773c3ffa51a42c90e138d83297172..0b8e39d6aa4d74dc9cad9d6861ac1a8972b062e3 100644 (file)
@@ -29,8 +29,6 @@ static __data uint16_t        ao_log_tiny_interval;
 #define AO_PAD_RING    2
 #endif
 
-__code uint8_t ao_log_format = AO_LOG_FORMAT_TINY;
-
 void
 ao_log_tiny_set_interval(uint16_t ticks)
 {
@@ -149,7 +147,7 @@ ao_log(void)
        }
 }
 
-uint16_t
+int16_t
 ao_log_flight(uint8_t slot)
 {
        static __xdata uint16_t flight;