ao_telemetry: Use int16_t types for telemetry packet intervals
[fw/altos] / src / kernel / ao_telemetry.c
index 2092c84f403cd65606eeb78078a3d64d7f689ab6..61156c0d2f41558ae2136af423690477c09642da 100644 (file)
@@ -40,16 +40,16 @@ static uint16_t ao_telemetry_desired_interval;
 #define RDF_SPACE      
 #else
 #define RDF_SPACE      
-static uint16_t ao_telemetry_time;
+static AO_TICK_TYPE    ao_telemetry_time;
 #endif
 
 #if HAS_RDF
 static RDF_SPACE uint8_t ao_rdf = 0;
-static RDF_SPACE uint16_t ao_rdf_time;
+static RDF_SPACE AO_TICK_TYPE  ao_rdf_time;
 #endif
 
 #if HAS_APRS
-static uint16_t ao_aprs_time;
+static AO_TICK_TYPE ao_aprs_time;
 
 #include <ao_aprs.h>
 #endif
@@ -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,12 +231,12 @@ 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();
 }
 
-static int8_t ao_telemetry_mega_data_max;
-static int8_t ao_telemetry_mega_data_cur;
+static int16_t ao_telemetry_mega_data_max;
+static int16_t ao_telemetry_mega_data_cur;
 
 /* Send mega data packet */
 static void
@@ -268,8 +300,8 @@ ao_send_metrum_sensor(void)
        ao_telemetry_send();
 }
 
-static int8_t ao_telemetry_metrum_data_max;
-static int8_t ao_telemetry_metrum_data_cur;
+static int16_t ao_telemetry_metrum_data_max;
+static int16_t ao_telemetry_metrum_data_cur;
 
 /* Send telemetrum data packet */
 static void
@@ -328,8 +360,8 @@ ao_send_mini(void)
 
 #endif /* AO_SEND_MINI */
 
-static int8_t ao_telemetry_config_max;
-static int8_t ao_telemetry_config_cur;
+static int16_t ao_telemetry_config_max;
+static int16_t ao_telemetry_config_cur;
 static uint16_t ao_telemetry_flight_number;
 
 #ifndef ao_telemetry_battery_convert
@@ -368,9 +400,9 @@ ao_send_configuration(void)
 
 #if HAS_GPS
 
-static int8_t ao_telemetry_gps_max;
-static int8_t ao_telemetry_loc_cur;
-static int8_t ao_telemetry_sat_cur;
+static int16_t ao_telemetry_gps_max;
+static int16_t ao_telemetry_loc_cur;
+static int16_t ao_telemetry_sat_cur;
 
 static inline void *
 telemetry_bits(struct ao_telemetry_location *l)
@@ -421,8 +453,8 @@ ao_send_satellite(void)
 
 #if HAS_COMPANION
 
-static int8_t ao_telemetry_companion_max;
-static int8_t ao_telemetry_companion_cur;
+static int16_t ao_telemetry_companion_max;
+static int16_t ao_telemetry_companion_cur;
 
 static void
 ao_send_companion(void)
@@ -443,11 +475,33 @@ 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)
 {
-       uint16_t        time;
-       int16_t         delay;
+       AO_TICK_TYPE    time;
+       AO_TICK_SIGNED  delay;
 
        ao_config_get();
        if (!ao_config.radio_enable)
@@ -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,16 +594,16 @@ 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)
                                        time = ao_aprs_time;
                        }
 #endif /* HAS_APRS */
-                       delay = time - ao_time();
+                       delay = (AO_TICK_SIGNED) (time - ao_time());
                        if (delay > 0) {
-                               ao_sleep_for(&telemetry, delay);
+                               ao_sleep_for(&telemetry, (AO_TICK_TYPE) delay);
                        }
                }
        }
@@ -565,7 +620,7 @@ ao_telemetry_reset_interval(void)
 void
 ao_telemetry_set_interval(uint16_t interval)
 {
-       int8_t  cur = 0;
+       int16_t cur = 0;
 
 #if HAS_RADIO_RATE
        /* Limit max telemetry rate based on available radio bandwidth.
@@ -591,7 +646,7 @@ ao_telemetry_set_interval(uint16_t interval)
        ao_telemetry_mega_data_cur = cur;
 #endif
 #if AO_SEND_METRUM
-       ao_telemetry_metrum_data_max = AO_SEC_TO_TICKS(1) / interval;
+       ao_telemetry_metrum_data_max = (int16_t) (AO_SEC_TO_TICKS(1) / interval);
        if (ao_telemetry_metrum_data_max > cur)
                cur++;
        ao_telemetry_metrum_data_cur = cur;
@@ -600,14 +655,14 @@ ao_telemetry_set_interval(uint16_t interval)
 #if HAS_COMPANION
        if (!ao_companion_setup.update_period)
                ao_companion_setup.update_period = AO_SEC_TO_TICKS(1);
-       ao_telemetry_companion_max = ao_companion_setup.update_period / interval;
+       ao_telemetry_companion_max = (int16_t) (ao_companion_setup.update_period / interval);
        if (ao_telemetry_companion_max > cur)
                cur++;
        ao_telemetry_companion_cur = cur;
 #endif
 
 #if HAS_GPS
-       ao_telemetry_gps_max = AO_SEC_TO_TICKS(1) / interval;
+       ao_telemetry_gps_max = (int16_t) (AO_SEC_TO_TICKS(1) / interval);
        if (ao_telemetry_gps_max > cur)
                cur++;
        ao_telemetry_loc_cur = cur;
@@ -616,7 +671,7 @@ ao_telemetry_set_interval(uint16_t interval)
        ao_telemetry_sat_cur = cur;
 #endif
 
-       ao_telemetry_config_max = AO_SEC_TO_TICKS(5) / interval;
+       ao_telemetry_config_max = (int16_t) (AO_SEC_TO_TICKS(5) / interval);
        if (ao_telemetry_config_max > cur)
                cur++;
        ao_telemetry_config_cur = cur;