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
telemetry.mega_sensor.mag_z = packet->bmx160.mag_z;
telemetry.mega_sensor.mag_y = packet->bmx160.mag_y;
#endif
-
+#endif
ao_telemetry_send();
}
/* 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
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];