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;
- telemetry.generic.type = AO_TELEMETRY_MEGA_SENSOR;
+#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
#if HAS_MPU6000 || HAS_MPU9250
+ telemetry.generic.type = AO_TELEMETRY_MEGA_SENSOR_MPU;
+#else
+#error unknown IMU
+#endif
+#endif
+
+#if HAS_GYRO
telemetry.mega_sensor.orient = ao_sample_orient;
#endif
telemetry.mega_sensor.accel = ao_data_accel(packet);
telemetry.mega_sensor.mag_y = packet->mpu9250.mag_y;
#endif
+#if HAS_BMX160
+ telemetry.mega_sensor.accel_x = packet->bmx160.acc_x;
+ telemetry.mega_sensor.accel_y = packet->bmx160.acc_y;
+ telemetry.mega_sensor.accel_z = packet->bmx160.acc_z;
+
+ telemetry.mega_sensor.gyro_x = packet->bmx160.gyr_x;
+ telemetry.mega_sensor.gyro_y = packet->bmx160.gyr_y;
+ telemetry.mega_sensor.gyro_z = packet->bmx160.gyr_z;
+
+ telemetry.mega_sensor.mag_x = packet->bmx160.mag_x;
+ telemetry.mega_sensor.mag_z = packet->bmx160.mag_z;
+ telemetry.mega_sensor.mag_y = packet->bmx160.mag_y;
+#endif
+#endif
ao_telemetry_send();
}
}
#endif
+#if HAS_APRS
+static void
+ao_set_aprs_time(void)
+{
+ uint16_t interval = ao_config.aprs_interval;
+
+ if ((ao_gps_data.flags & AO_GPS_DATE_VALID) && interval != 0) {
+ int second = (ao_gps_data.second / interval + 1) * interval + ao_config.aprs_offset;
+ int delta;
+ if (second >= 60) {
+ second = ao_config.aprs_offset;
+ delta = second + 60 - ao_gps_data.second;
+ } else {
+ delta = second - ao_gps_data.second;
+ }
+ ao_aprs_time = ao_gps_tick + AO_SEC_TO_TICKS(delta);
+ } else {
+ ao_aprs_time += AO_SEC_TO_TICKS(ao_config.aprs_interval);
+ }
+}
+#endif
+
static void
ao_telemetry(void)
{
#endif
#if HAS_APRS
ao_aprs_time = time;
+ ao_set_aprs_time();
#endif
while (ao_telemetry_interval) {
time = ao_time() + AO_SEC_TO_TICKS(100);
#if HAS_APRS
if (ao_config.aprs_interval != 0) {
if ((int16_t) (ao_time() - ao_aprs_time) >= 0) {
- ao_aprs_time = ao_time() + AO_SEC_TO_TICKS(ao_config.aprs_interval);
+ ao_set_aprs_time();
ao_aprs_send();
}
if ((int16_t) (time - ao_aprs_time) > 0)