Switch from GPLv2 to GPLv2+
[fw/altos] / src / kernel / ao_telemetry.h
index be7d0340745352d20505dc265a00e1f8390cf8da..c0f5e3c532cb7ff7c46796a1dd9aa292b48e02ac 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
@@ -86,12 +87,9 @@ struct ao_telemetry_configuration {
 
 #define AO_TELEMETRY_LOCATION          0x05
 
-#define AO_GPS_MODE_NOT_VALID          'N'
-#define AO_GPS_MODE_AUTONOMOUS         'A'
-#define AO_GPS_MODE_DIFFERENTIAL       'D'
-#define AO_GPS_MODE_ESTIMATED          'E'
-#define AO_GPS_MODE_MANUAL             'M'
-#define AO_GPS_MODE_SIMULATED          'S'
+/* Mode bits */
+
+#define AO_GPS_MODE_ALTITUDE_24                (1 << 0)        /* reports 24-bits of altitude */
 
 struct ao_telemetry_location {
        uint16_t        serial;         /*  0 */
@@ -99,7 +97,7 @@ struct ao_telemetry_location {
        uint8_t         type;           /*  4 */
 
        uint8_t         flags;          /*  5 Number of sats and other flags */
-       int16_t         altitude;       /*  6 GPS reported altitude (m) */
+       uint16_t        altitude_low;   /*  6 GPS reported altitude (m) */
        int32_t         latitude;       /*  8 latitude (degrees * 10⁷) */
        int32_t         longitude;      /* 12 longitude (degrees * 10⁷) */
        uint8_t         year;           /* 16 (- 2000) */
@@ -115,10 +113,33 @@ struct ao_telemetry_location {
        uint16_t        ground_speed;   /* 26 cm/s */
        int16_t         climb_rate;     /* 28 cm/s */
        uint8_t         course;         /* 30 degrees / 2 */
-       uint8_t         unused;         /* 31 unused */
+       int8_t          altitude_high;  /* 31 high byte of altitude */
        /* 32 */
 };
 
+#ifndef HAS_WIDE_GPS
+#define HAS_WIDE_GPS   1
+#endif
+
+#ifdef HAS_TELEMETRY
+#ifndef HAS_RDF
+#define HAS_RDF                1
+#endif
+#endif
+
+#if HAS_WIDE_GPS
+typedef int32_t                gps_alt_t;
+#define AO_TELEMETRY_LOCATION_ALTITUDE(l)      (((gps_alt_t) (l)->altitude_high << 16) | ((l)->altitude_low))
+#define AO_TELEMETRY_LOCATION_SET_ALTITUDE(l,a) (((l)->mode |= AO_GPS_MODE_ALTITUDE_24), \
+                                                ((l)->altitude_high = (a) >> 16), \
+                                                ((l)->altitude_low = (a)))
+#else
+typedef int16_t                gps_alt_t;
+#define AO_TELEMETRY_LOCATION_ALTITUDE(l)      ((gps_alt_t) (l)->altitude_low)
+#define AO_TELEMETRY_LOCATION_SET_ALTITUDE(l,a)        (((l)->mode = 0, \
+                                                 (l)->altitude_low = (a)))
+#endif /* HAS_WIDE_GPS */
+
 #define AO_TELEMETRY_SATELLITE         0x06
 
 struct ao_telemetry_satellite_info {
@@ -238,13 +259,14 @@ struct ao_telemetry_metrum_data {
        uint16_t        serial;         /*  0 */
        uint16_t        tick;           /*  2 */
        uint8_t         type;           /*  4 */
+       uint8_t         pad5[3];        /*  5 */
 
-       int32_t         ground_pres;    /* 8 average pres on pad */
+       int32_t         ground_pres;    /*  8 average pres on pad */
        int16_t         ground_accel;   /* 12 average accel on pad */
        int16_t         accel_plus_g;   /* 14 accel calibration at +1g */
        int16_t         accel_minus_g;  /* 16 accel calibration at -1g */
 
-       uint8_t         pad[14];        /* 18 */
+       uint8_t         pad18[14];      /* 18 */
        /* 32 */
 };
 
@@ -312,6 +334,8 @@ union ao_telemetry_all {
        struct ao_telemetry_baro                baro;
 };
 
+typedef char ao_check_telemetry_size[sizeof(union ao_telemetry_all) == 32 ? 1 : -1];
+
 struct ao_telemetry_all_recv {
        union ao_telemetry_all          telemetry;
        int8_t                          rssi;