Merge branch 'master' into micropeak-logging
[fw/altos] / src / core / ao_telemetry.c
index 9000a149347a9e6956aa25b4dfc3c4452cb095ae..8d440e15410ff4bd7833bcd5da6e1380d8ba46f9 100644 (file)
@@ -22,8 +22,11 @@ static __pdata uint16_t ao_telemetry_interval;
 static __pdata uint8_t ao_rdf = 0;
 static __pdata uint16_t ao_rdf_time;
 
-#define AO_RDF_INTERVAL_TICKS  AO_SEC_TO_TICKS(5)
-#define AO_RDF_LENGTH_MS       500
+#if HAS_APRS
+static __pdata uint16_t ao_aprs_time;
+
+#include <ao_aprs.h>
+#endif
 
 #if defined(MEGAMETRUM)
 #define AO_SEND_MEGA   1
@@ -104,6 +107,7 @@ ao_send_mega_sensor(void)
        telemetry.mega_sensor.pres = ao_data_pres(packet);
        telemetry.mega_sensor.temp = ao_data_temp(packet);
 
+#if HAS_MPU6000
        telemetry.mega_sensor.accel_x = packet->mpu6000.accel_x;
        telemetry.mega_sensor.accel_y = packet->mpu6000.accel_y;
        telemetry.mega_sensor.accel_z = packet->mpu6000.accel_z;
@@ -111,10 +115,13 @@ ao_send_mega_sensor(void)
        telemetry.mega_sensor.gyro_x = packet->mpu6000.gyro_x;
        telemetry.mega_sensor.gyro_y = packet->mpu6000.gyro_y;
        telemetry.mega_sensor.gyro_z = packet->mpu6000.gyro_z;
+#endif
 
+#if HAS_HMC5883
        telemetry.mega_sensor.mag_x = packet->hmc5883.x;
        telemetry.mega_sensor.mag_y = packet->hmc5883.y;
        telemetry.mega_sensor.mag_z = packet->hmc5883.z;
+#endif
 
        ao_radio_send(&telemetry, sizeof (telemetry));
 }
@@ -137,9 +144,9 @@ ao_send_mega_data(void)
                telemetry.mega_data.v_batt = packet->adc.v_batt;
                telemetry.mega_data.v_pyro = packet->adc.v_pbatt;
 
-               /* XXX figure out right shift value; 4 might suffice */
+               /* ADC range is 0-4095, so shift by four to save the high 8 bits */
                for (i = 0; i < AO_ADC_NUM_SENSE; i++)
-                       telemetry.mega_data.sense[i] = packet->adc.sense[i] >> 8;
+                       telemetry.mega_data.sense[i] = packet->adc.sense[i] >> 4;
 
                telemetry.mega_data.ground_pres = ao_ground_pres;
                telemetry.mega_data.ground_accel = ao_ground_accel;
@@ -287,35 +294,61 @@ ao_telemetry(void)
                while (ao_telemetry_interval == 0)
                        ao_sleep(&telemetry);
                time = ao_rdf_time = ao_time();
+#if HAS_APRS
+               ao_aprs_time = time;
+#endif
                while (ao_telemetry_interval) {
 
-
+#if HAS_APRS
+                       if (!(ao_config.radio_enable & AO_RADIO_DISABLE_TELEMETRY))
+#endif
+                       {
 #ifdef AO_SEND_ALL_BARO
-                       ao_send_baro();
+                               ao_send_baro();
 #endif
 #ifdef AO_SEND_MEGA
-                       ao_send_mega_sensor();
-                       ao_send_mega_data();
+                               ao_send_mega_sensor();
+                               ao_send_mega_data();
 #else
-                       ao_send_sensor();
+                               ao_send_sensor();
 #endif
 
 #if HAS_COMPANION
-                       if (ao_companion_running)
-                               ao_send_companion();
+                               if (ao_companion_running)
+                                       ao_send_companion();
 #endif
-                       ao_send_configuration();
+                               ao_send_configuration();
 #if HAS_GPS
-                       ao_send_location();
-                       ao_send_satellite();
+                               ao_send_location();
+                               ao_send_satellite();
 #endif
+                       }
 #ifndef AO_SEND_ALL_BARO
                        if (ao_rdf &&
+#if HAS_APRS
+                           !(ao_config.radio_enable & AO_RADIO_DISABLE_RDF) &&
+#endif
                            (int16_t) (ao_time() - ao_rdf_time) >= 0)
                        {
+#if HAS_IGNITE_REPORT
+                               uint8_t c;
+#endif
                                ao_rdf_time = ao_time() + AO_RDF_INTERVAL_TICKS;
-                               ao_radio_rdf(AO_MS_TO_RDF_LEN(AO_RDF_LENGTH_MS));
+#if HAS_IGNITE_REPORT
+                               if (ao_flight_state == ao_flight_pad && (c = ao_report_igniter()))
+                                       ao_radio_continuity(c);
+                               else
+#endif
+                                       ao_radio_rdf();
+                       }
+#if HAS_APRS
+                       if (ao_config.aprs_interval != 0 &&
+                           (int16_t) (ao_time() - ao_aprs_time) >= 0)
+                       {
+                               ao_aprs_time = ao_time() + AO_SEC_TO_TICKS(ao_config.aprs_interval);
+                               ao_aprs_send();
                        }
+#endif
 #endif
                        time += ao_telemetry_interval;
                        delay = time - ao_time();
@@ -326,6 +359,7 @@ ao_telemetry(void)
                        }
                        else
                                time = ao_time();
+               bottom: ;
                }
        }
 }
@@ -333,7 +367,7 @@ ao_telemetry(void)
 void
 ao_telemetry_set_interval(uint16_t interval)
 {
-       uint8_t cur = 0;
+       int8_t  cur = 0;
        ao_telemetry_interval = interval;
        
 #if AO_SEND_MEGA
@@ -379,8 +413,9 @@ ao_rdf_set(uint8_t rdf)
        ao_rdf = rdf;
        if (rdf == 0)
                ao_radio_rdf_abort();
-       else
+       else {
                ao_rdf_time = ao_time() + AO_RDF_INTERVAL_TICKS;
+       }
 }
 
 __xdata struct ao_task ao_telemetry_task;