altos/test: Adjust CRC error rate after FEC fix
[fw/altos] / src / kernel / ao_log.h
index c13a2580f71e3bdae2af7be7d978b71d6d921eff..b8aa6a8c589541759f50a34885cff2edf53897e5 100644 (file)
@@ -3,7 +3,8 @@
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
  * the log. Tasks may wait for this to be initialized
  * by sleeping on this variable.
  */
-extern __xdata uint16_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;
-extern __pdata uint32_t ao_log_start_pos;
-extern __xdata uint8_t ao_log_running;
-extern __pdata enum ao_flight_state ao_log_state;
+extern uint16_t ao_flight_number;
+extern uint8_t ao_log_mutex;
+extern uint32_t ao_log_current_pos;
+extern uint32_t ao_log_end_pos;
+extern uint32_t ao_log_start_pos;
+extern uint8_t ao_log_running;
+extern enum ao_flight_state ao_log_state;
 
 /* required functions from the underlying log system */
 
@@ -43,22 +44,47 @@ extern __pdata enum ao_flight_state ao_log_state;
 #define AO_LOG_FORMAT_TINY             2       /* two byte state/baro records */
 #define AO_LOG_FORMAT_TELEMETRY                3       /* 32 byte ao_telemetry records */
 #define AO_LOG_FORMAT_TELESCIENCE      4       /* 32 byte typed telescience records */
-#define AO_LOG_FORMAT_TELEMEGA         5       /* 32 byte typed telemega records */
-#define AO_LOG_FORMAT_EASYMINI         6       /* 16-byte MS5607 baro only, 3.0V supply */
+#define AO_LOG_FORMAT_TELEMEGA_OLD     5       /* 32 byte typed telemega records */
+#define AO_LOG_FORMAT_EASYMINI1                6       /* 16-byte MS5607 baro only, 3.0V supply */
 #define AO_LOG_FORMAT_TELEMETRUM       7       /* 16-byte typed telemetrum records */
-#define AO_LOG_FORMAT_TELEMINI         8       /* 16-byte MS5607 baro only, 3.3V supply */
+#define AO_LOG_FORMAT_TELEMINI2                8       /* 16-byte MS5607 baro only, 3.3V supply, cc1111 SoC */
 #define AO_LOG_FORMAT_TELEGPS          9       /* 32 byte telegps records */
+#define AO_LOG_FORMAT_TELEMEGA         10      /* 32 byte typed telemega records with 32 bit gyro cal */
+#define AO_LOG_FORMAT_DETHERM          11      /* 16-byte MS5607 baro only, no ADC */
+#define AO_LOG_FORMAT_TELEMINI3                12      /* 16-byte MS5607 baro only, 3.3V supply, stm32f042 SoC */
+#define AO_LOG_FORMAT_TELEFIRETWO      13      /* 32-byte test stand data */
+#define AO_LOG_FORMAT_EASYMINI2                14      /* 16-byte MS5607 baro only, 3.3V supply, stm32f042 SoC */
+#define AO_LOG_FORMAT_TELEMEGA_3       15      /* 32 byte typed telemega records with 32 bit gyro cal and mpu9250 */
+#define AO_LOG_FORMAT_EASYMEGA_2       16      /* 32 byte typed telemega records with 32 bit gyro cal, mpu9250 rotated 90° and adxl375 */
+#define AO_LOG_FORMAT_TELESTATIC       17      /* 32 byte typed telestatic records */
+#define AO_LOG_FORMAT_MICROPEAK2       18      /* 2-byte baro values with header */
+#define AO_LOG_FORMAT_TELEMEGA_4       19      /* 32 byte typed telemega records with 32 bit gyro cal and Bmx160 */
+#define AO_LOG_FORMAT_EASYMOTOR                20      /* 16 byte typed easymotor records with pressure sensor and adxl375 */
+#define AO_LOG_FORMAT_TELEMEGA_5       21      /* 32 byte typed telemega records with 32 bit gyro cal, mpu6000 and mmc5983 */
+#define AO_LOG_FORMAT_TELEMEGA_6       22      /* 32 byte typed telemega records with 32 bit gyro cal, bmi088 and mmc5983 */
+#define AO_LOG_FORMAT_EASYTIMER_2      23      /* 32 byte typed easytimer records with 32 bit gyro cal, bmi088 and mmc5983 */
+#define AO_LOG_FORMAT_EASYMEGA_3       24      /* 32 byte typed telemega records with 32 bit gyro cal, bmi088 and mmc5983 */
 #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
+int32_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 */
@@ -73,11 +99,7 @@ ao_log(void);
 
 /* Figure out the current flight number */
 uint8_t
-ao_log_scan(void) __reentrant;
-
-/* Return the position of the start of the given log slot */
-uint32_t
-ao_log_pos(uint8_t slot);
+ao_log_scan(void);
 
 /* Start logging to eeprom */
 void
@@ -211,14 +233,26 @@ struct ao_log_mega {
                struct {
                        uint16_t        flight;                 /* 4 */
                        int16_t         ground_accel;           /* 6 */
-                       uint32_t        ground_pres;            /* 8 */
+                       int32_t         ground_pres;            /* 8 */
+                       int16_t         ground_accel_along;     /* 12 */
+                       int16_t         ground_accel_across;    /* 14 */
+                       int16_t         ground_accel_through;   /* 16 */
+                       int16_t         pad_18;                 /* 18 */
+                       int32_t         ground_roll;            /* 20 */
+                       int32_t         ground_pitch;           /* 24 */
+                       int32_t         ground_yaw;             /* 28 */
+               } flight;                                       /* 32 */
+               struct {
+                       uint16_t        flight;                 /* 4 */
+                       int16_t         ground_accel;           /* 6 */
+                       int32_t         ground_pres;            /* 8 */
                        int16_t         ground_accel_along;     /* 12 */
                        int16_t         ground_accel_across;    /* 14 */
                        int16_t         ground_accel_through;   /* 16 */
                        int16_t         ground_roll;            /* 18 */
                        int16_t         ground_pitch;           /* 20 */
                        int16_t         ground_yaw;             /* 22 */
-               } flight;                                       /* 24 */
+               } flight_old;                                   /* 24 */
                /* AO_LOG_STATE */
                struct {
                        uint16_t        state;
@@ -228,15 +262,30 @@ struct ao_log_mega {
                struct {
                        uint32_t        pres;           /* 4 */
                        uint32_t        temp;           /* 8 */
-                       int16_t         accel_x;        /* 12 */
-                       int16_t         accel_y;        /* 14 */
-                       int16_t         accel_z;        /* 16 */
-                       int16_t         gyro_x;         /* 18 */
-                       int16_t         gyro_y;         /* 20 */
-                       int16_t         gyro_z;         /* 22 */
-                       int16_t         mag_x;          /* 24 */
-                       int16_t         mag_y;          /* 26 */
-                       int16_t         mag_z;          /* 28 */
+                       union {
+                               struct {
+                                       int16_t         accel_along;    /* 12 */
+                                       int16_t         accel_across;   /* 14 */
+                                       int16_t         accel_through;  /* 16 */
+                                       int16_t         gyro_roll;      /* 18 */
+                                       int16_t         gyro_pitch;     /* 20 */
+                                       int16_t         gyro_yaw;       /* 22 */
+                                       int16_t         mag_along;      /* 24 */
+                                       int16_t         mag_across;     /* 26 */
+                                       int16_t         mag_through;    /* 28 */
+                               };
+                               struct {
+                                       int16_t         accel_x;        /* 12 */
+                                       int16_t         accel_y;        /* 14 */
+                                       int16_t         accel_z;        /* 16 */
+                                       int16_t         gyro_x;         /* 18 */
+                                       int16_t         gyro_y;         /* 20 */
+                                       int16_t         gyro_z;         /* 22 */
+                                       int16_t         mag_x;          /* 24 */
+                                       int16_t         mag_z;          /* 26 */
+                                       int16_t         mag_y;          /* 28 */
+                               };
+                       };
                        int16_t         accel;          /* 30 */
                } sensor;       /* 32 */
                /* AO_LOG_TEMP_VOLT */
@@ -284,6 +333,57 @@ struct ao_log_mega {
                                                 ((l)->u.gps.altitude_high = (a) >> 16), \
                                                 (l)->u.gps.altitude_low = (a))
 
+struct ao_log_firetwo {
+       char                    type;                   /* 0 */
+       uint8_t                 csum;                   /* 1 */
+       uint16_t                tick;                   /* 2 */
+       union {                                         /* 4 */
+               /* AO_LOG_FLIGHT */
+               struct {
+                       uint16_t        flight;         /* 4 */
+               } flight;       /* 6 */
+               /* AO_LOG_STATE */
+               struct {
+                       uint16_t        state;          /* 4 */
+                       uint16_t        reason;         /* 6 */
+               } state;        /* 8 */
+               /* AO_LOG_SENSOR */
+               struct {
+                       uint16_t        pressure;       /* 4 */
+                       uint16_t        thrust;         /* 6 */
+                       uint16_t        thermistor[4];  /* 8 */
+               } sensor;       /* 24 */
+               uint8_t         align[28];              /* 4 */
+       } u;    /* 32 */
+};
+
+struct ao_log_telestatic {
+       char                    type;                   /* 0 */
+       uint8_t                 csum;                   /* 1 */
+       uint16_t                tick;                   /* 2 */
+       union {                                         /* 4 */
+               /* AO_LOG_FLIGHT */
+               struct {
+                       uint16_t        flight;         /* 4 */
+               } flight;       /* 6 */
+               /* AO_LOG_STATE */
+               struct {
+                       uint16_t        state;          /* 4 */
+                       uint16_t        reason;         /* 6 */
+               } state;        /* 8 */
+               /* AO_LOG_SENSOR */
+               struct {
+                       uint32_t        pressure;       /* 4 */
+                       uint32_t        pressure2;      /* 8 */
+                       uint32_t        thrust;         /* 12 */
+                       uint32_t        mass;           /* 16 */
+                       uint16_t        t_low;          /* 20 */
+                       uint16_t        t_high[4];      /* 22 */
+               } sensor;       /* 30 */
+               uint8_t         align[28];              /* 4 */
+       } u;    /* 32 */
+};
+
 struct ao_log_metrum {
        char                    type;                   /* 0 */
        uint8_t                 csum;                   /* 1 */
@@ -293,7 +393,7 @@ struct ao_log_metrum {
                struct {
                        uint16_t        flight;         /* 4 */
                        int16_t         ground_accel;   /* 6 */
-                       uint32_t        ground_pres;    /* 8 */
+                       int32_t         ground_pres;    /* 8 */
                        uint32_t        ground_temp;    /* 12 */
                } flight;       /* 16 */
                /* AO_LOG_STATE */
@@ -353,7 +453,7 @@ struct ao_log_mini {
                struct {
                        uint16_t        flight;         /* 4 */
                        uint16_t        r6;
-                       uint32_t        ground_pres;    /* 8 */
+                       int32_t         ground_pres;    /* 8 */
                } flight;
                /* AO_LOG_STATE */
                struct {
@@ -372,9 +472,9 @@ struct ao_log_mini {
 };                                                     /* 16 */
 
 #define ao_log_pack24(dst,value) do {          \
-               (dst)[0] = (value);             \
-               (dst)[1] = (value) >> 8;        \
-               (dst)[2] = (value) >> 16;       \
+               (dst)[0] = (uint8_t) (value);   \
+               (dst)[1] = (uint8_t) ((value) >> 8);    \
+               (dst)[2] = (uint8_t) ((value) >> 16);   \
        } while (0)
 
 struct ao_log_gps {
@@ -421,21 +521,136 @@ struct ao_log_gps {
        } u;
 };
 
-/* Write a record to the eeprom log */
-uint8_t
-ao_log_data(__xdata struct ao_log_record *log) __reentrant;
+struct ao_log_motor {
+       char                    type;                   /* 0 */
+       uint8_t                 csum;                   /* 1 */
+       uint16_t                tick;                   /* 2 */
+       union {                                         /* 4 */
+               /* AO_LOG_FLIGHT */
+               struct {
+                       uint16_t        flight;                 /* 4 */
+                       int16_t         ground_accel;           /* 6 */
+                       int16_t         ground_accel_along;     /* 8 */
+                       int16_t         ground_accel_across;    /* 10 */
+                       int16_t         ground_accel_through;   /* 12 */
+                       int16_t         ground_motor_pressure;  /* 14 */
+               } flight;                                       /* 16 */
+               /* AO_LOG_STATE */
+               struct {
+                       uint16_t        state;                  /* 4 */
+                       uint16_t        reason;                 /* 6 */
+               } state;
+               /* AO_LOG_SENSOR */
+               struct {
+                       uint16_t        pressure;               /* 4 */
+                       uint16_t        v_batt;                 /* 6 */
+                       int16_t         accel;                  /* 8 */
+                       int16_t         accel_across;           /* 10 */
+                       int16_t         accel_along;            /* 12 */
+                       int16_t         accel_through;          /* 14 */
+               } sensor;                                       /* 16 */
+       } u;
+};
 
-uint8_t
-ao_log_mega(__xdata struct ao_log_mega *log) __reentrant;
+struct ao_log_timer {
+       char                    type;                   /* 0 */
+       uint8_t                 csum;                   /* 1 */
+       uint16_t                tick;                   /* 2 */
+       union {                                         /* 4 */
+               /* AO_LOG_FLIGHT */
+               struct {
+                       uint16_t        flight;                 /* 4 */
+                       int16_t         ground_accel;           /* 6 */
+                       int16_t         ground_accel_along;     /* 8 */
+                       int16_t         ground_accel_across;    /* 10 */
+                       int16_t         ground_accel_through;   /* 12 */
+                       int16_t         pad_14;                 /* 14 */
+                       int32_t         ground_roll;            /* 16 */
+                       int32_t         ground_pitch;           /* 20 */
+                       int32_t         ground_yaw;             /* 24 */
+               } flight;                                       /* 32 */
+               /* AO_LOG_STATE */
+               struct {
+                       uint16_t        state;                  /* 4 */
+                       uint16_t        reason;                 /* 6 */
+               } state;
+               /* AO_LOG_SENSOR */
+               struct {
+                       int16_t         accel_along;    /* 4 */
+                       int16_t         accel_across;   /* 6 */
+                       int16_t         accel_through;  /* 8 */
+                       int16_t         gyro_roll;      /* 10 */
+                       int16_t         gyro_pitch;     /* 12 */
+                       int16_t         gyro_yaw;       /* 14 */
+                       int16_t         mag_along;      /* 16 */
+                       int16_t         mag_across;     /* 18 */
+                       int16_t         mag_through;    /* 20 */
+                       int16_t         v_batt;         /* 22 */
+                       int16_t         v_pbatt;        /* 24 */
+                       int16_t         sense[2];       /* 26 */
+                       uint16_t        pyro;           /* 30 */
+               } sensor;       /* 32 */
+       } u;
+};
 
-uint8_t
-ao_log_metrum(__xdata struct ao_log_metrum *log) __reentrant;
+#if AO_LOG_FORMAT == AO_LOG_FOMAT_TELEMEGA_OLD || AO_LOG_FORMAT == AO_LOG_FORMAT_TELEMEGA || AO_LOG_FORMAT == AO_LOG_FORMAT_TELEMEGA_3 || AO_LOG_FORMAT == AO_LOG_FORMAT_EASYMEGA_2 || AO_LOG_FORMAT == AO_LOG_FORMAT_TELEMEGA_4 || AO_LOG_FORMAT == AO_LOG_FORMAT_TELEMEGA_5 || AO_LOG_FORMAT == AO_LOG_FORMAT_TELEMEGA_6 || AO_LOG_FORMAT == AO_LOG_FORMAT_EASYMEGA_3
+typedef struct ao_log_mega ao_log_type;
+#endif
 
-uint8_t
-ao_log_mini(__xdata struct ao_log_mini *log) __reentrant;
+#if AO_LOG_FORMAT == AO_LOG_FORMAT_TELEMETRUM
+typedef struct ao_log_metrum ao_log_type;
+#endif
+
+#if AO_LOG_FORMAT == AO_LOG_FORMAT_TELEFIRETWO
+typedef struct ao_log_firetwo ao_log_type;
+#endif
+
+#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
+
+#if AO_LOG_FORMAT == AO_LOG_FORMAT_EASYMOTOR
+typedef struct ao_log_motor ao_log_type;
+#endif 
+
+#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
+
+#if AO_LOG_FORMAT == AO_LOG_FORMAT_MICROPEAK2
+#define AO_LOG_UNCOMMON        1
+#endif
+
+#if AO_LOG_FORMAT == AO_LOG_FORMAT_EASYTIMER_2
+typedef struct ao_log_timer ao_log_type;
+#endif
+
+#ifndef AO_LOG_UNCOMMON
+extern ao_log_type ao_log_data;
+
+#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(ao_log_type *log);
+#endif
 
 void
 ao_log_flush(void);