first cut at turnon scripts for EasyTimer v2
[fw/altos] / src / kernel / ao_telemetry.h
index 83d432cf95f39db62dc9f602d8011c58a46f49ae..983a99b8fd1cba7ef4adf0b4d41a047f9bb5f1e8 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
@@ -116,18 +117,22 @@ struct ao_telemetry_location {
        /* 32 */
 };
 
-#if HAS_GPS
-
 #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)))
+                                                ((l)->altitude_high = (int8_t) ((a) >> 16)), \
+                                                ((l)->altitude_low = (uint16_t) (a)))
 #else
 typedef int16_t                gps_alt_t;
 #define AO_TELEMETRY_LOCATION_ALTITUDE(l)      ((gps_alt_t) (l)->altitude_low)
@@ -135,8 +140,6 @@ typedef int16_t             gps_alt_t;
                                                  (l)->altitude_low = (a)))
 #endif /* HAS_WIDE_GPS */
 
-#endif /* HAS_GPS */
-
 #define AO_TELEMETRY_SATELLITE         0x06
 
 struct ao_telemetry_satellite_info {
@@ -173,7 +176,8 @@ struct ao_telemetry_companion {
        /* 32 */
 };
 
-#define AO_TELEMETRY_MEGA_SENSOR       0x08
+#define AO_TELEMETRY_MEGA_SENSOR_MPU           0x08    /* Invensense IMU */
+#define AO_TELEMETRY_MEGA_SENSOR_BMX160                0x12    /* BMX160 IMU */
 
 struct ao_telemetry_mega_sensor {
        uint16_t        serial;         /*  0 */
@@ -195,8 +199,8 @@ struct ao_telemetry_mega_sensor {
        int16_t         gyro_z;         /* 24 */
 
        int16_t         mag_x;          /* 26 */
-       int16_t         mag_y;          /* 28 */
-       int16_t         mag_z;          /* 30 */
+       int16_t         mag_z;          /* 28 */
+       int16_t         mag_y;          /* 30 */
        /* 32 */
 };
 
@@ -256,17 +260,19 @@ 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 */
 };
 
-#define AO_TELEMETRY_MINI              0x10
+#define AO_TELEMETRY_MINI2             0x10    /* CC1111 based */
+#define AO_TELEMETRY_MINI3             0x11    /* STMF042 based */
 
 struct ao_telemetry_mini {
        uint16_t        serial;         /*  0 */
@@ -291,6 +297,34 @@ struct ao_telemetry_mini {
        /* 32 */
 };
 
+#define AO_TELEMETRY_MEGA_NORM_MPU6000_MMC5983 0x13
+#define AO_TELEMETRY_MEGA_NORM_BMI088_MMC5983  0x14
+
+struct ao_telemetry_mega_norm {
+       uint16_t        serial;         /*  0 */
+       uint16_t        tick;           /*  2 */
+       uint8_t         type;           /*  4 */
+
+       uint8_t         orient;         /*  5 angle from vertical */
+       int16_t         accel;          /*  6 Z axis */
+
+       int32_t         pres;           /*  8 Pa * 10 */
+       int16_t         temp;           /* 12 °C * 100 */
+
+       int16_t         accel_along;    /* 14 */
+       int16_t         accel_across;   /* 16 */
+       int16_t         accel_through;  /* 18 */
+
+       int16_t         gyro_roll;      /* 20 */
+       int16_t         gyro_pitch;     /* 22 */
+       int16_t         gyro_yaw;       /* 24 */
+
+       int16_t         mag_along;      /* 26 */
+       int16_t         mag_across;     /* 28 */
+       int16_t         mag_through;    /* 30 */
+       /* 32 */
+};
+
 /* #define AO_SEND_ALL_BARO */
 
 #define AO_TELEMETRY_BARO              0x80
@@ -328,8 +362,11 @@ union ao_telemetry_all {
        struct ao_telemetry_metrum_data         metrum_data;
        struct ao_telemetry_mini                mini;
        struct ao_telemetry_baro                baro;
+       struct ao_telemetry_mega_norm           mega_norm;
 };
 
+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;