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)
/* 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 */
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 */
};
/* 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
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];