altos: Add normalized telemetry support
authorKeith Packard <keithp@keithp.com>
Sun, 19 Sep 2021 21:53:47 +0000 (14:53 -0700)
committerKeith Packard <keithp@keithp.com>
Sun, 19 Sep 2021 21:53:47 +0000 (14:53 -0700)
Just like logs

Signed-off-by: Keith Packard <keithp@keithp.com>
src/kernel/ao_telemetry.c
src/kernel/ao_telemetry.h

index c2b2eb5a1bad0569d909481c21caf20773269457..3074e4791dfc4c89e305ee924b4cc0ca00591d73 100644 (file)
@@ -136,9 +136,41 @@ ao_send_sensor(void)
 static void
 ao_send_mega_sensor(void)
 {
-               struct ao_data *packet = (struct ao_data *) &ao_data_ring[ao_data_ring_prev(ao_sample_data)];
+       struct ao_data *packet = (struct ao_data *) &ao_data_ring[ao_data_ring_prev(ao_sample_data)];
 
        telemetry.generic.tick = packet->tick;
+#if AO_LOG_NORMALIZED
+#if AO_LOG_FORMAT == AO_LOG_FORMAT_TELEMEGA_5
+       telemetry.generic.type = AO_TELEMETRY_MEGA_NORM_MPU6000_MMC5983;
+#else
+#error unknown normalized log type
+#endif
+
+#if HAS_GYRO
+       telemetry.mega_norm.orient = ao_sample_orient;
+#endif
+       telemetry.mega_norm.accel = ao_data_accel(packet);
+       telemetry.mega_norm.pres = ao_data_pres(packet);
+       telemetry.mega_norm.temp = ao_data_temp(packet);
+
+#if HAS_MPU6000
+       telemetry.mega_norm.accel_along = ao_data_along(packet);
+       telemetry.mega_norm.accel_across = ao_data_across(packet);
+       telemetry.mega_norm.accel_through = ao_data_through(packet);
+
+       telemetry.mega_norm.gyro_roll = ao_data_roll(packet);
+       telemetry.mega_norm.gyro_pitch = ao_data_pitch(packet);
+       telemetry.mega_norm.gyro_yaw = ao_data_yaw(packet);
+#endif
+
+#if HAS_MMC5983
+       telemetry.mega_norm.mag_along = ao_data_mag_along(packet);
+       telemetry.mega_norm.mag_across = ao_data_mag_across(packet);
+       telemetry.mega_norm.mag_through = ao_data_mag_through(packet);
+#endif
+
+#else
+
 #if HAS_BMX160
        telemetry.generic.type = AO_TELEMETRY_MEGA_SENSOR_BMX160;
 #else
@@ -199,7 +231,7 @@ ao_send_mega_sensor(void)
        telemetry.mega_sensor.mag_z = packet->bmx160.mag_z;
        telemetry.mega_sensor.mag_y = packet->bmx160.mag_y;
 #endif
-
+#endif
        ao_telemetry_send();
 }
 
index c7aebe599a317d86de65b5d8675f4694ea43cca8..b718085f8e11eb83d295322c135416bc785ec852 100644 (file)
@@ -297,6 +297,33 @@ struct ao_telemetry_mini {
        /* 32 */
 };
 
+#define AO_TELEMETRY_MEGA_NORM_MPU6000_MMC5983 0x13
+
+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
@@ -334,6 +361,7 @@ 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];