Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
[fw/altos] / src / kernel / ao_telemetry.c
index 2092c84f403cd65606eeb78078a3d64d7f689ab6..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();
 }
 
@@ -443,6 +475,28 @@ ao_send_companion(void)
 }
 #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)
 {
@@ -471,6 +525,7 @@ 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);
@@ -539,7 +594,7 @@ ao_telemetry(void)
 #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)