/*
- * Copyright © 2011 Keith Packard <keithp@keithp.com>
+ * Copyright © 2011 Keth Packard <keithp@keithp.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
static __pdata uint16_t ao_telemetry_interval;
+#if HAS_RADIO_RATE
+static __xdata uint16_t ao_telemetry_desired_interval;
+#endif
+
#if HAS_RDF
static __pdata uint8_t ao_rdf = 0;
static __pdata uint16_t ao_rdf_time;
ao_send_sensor(void)
{
__xdata struct ao_data *packet = (__xdata struct ao_data *) &ao_data_ring[ao_data_ring_prev(ao_sample_data)];
-
+
telemetry.generic.tick = packet->tick;
telemetry.generic.type = AO_TELEMETRY_SENSOR;
#ifdef AO_SEND_MEGA
+
/* Send mega sensor packet */
static void
ao_send_mega_sensor(void)
{
__xdata struct ao_data *packet = (__xdata 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;
ao_send_mini(void)
{
__xdata struct ao_data *packet = (__xdata struct ao_data *) &ao_data_ring[ao_data_ring_prev(ao_sample_data)];
-
+
telemetry.generic.tick = packet->tick;
telemetry.generic.type = AO_TELEMETRY_MINI;
#endif /* AO_SEND_MINI */
-#ifdef AO_SEND_ALL_BARO
-static uint8_t ao_baro_sample;
-
-static void
-ao_send_baro(void)
-{
- uint8_t sample = ao_sample_data;
- uint8_t samples = (sample - ao_baro_sample) & (AO_DATA_RING - 1);
-
- if (samples > 12) {
- ao_baro_sample = (ao_baro_sample + (samples - 12)) & (AO_DATA_RING - 1);
- samples = 12;
- }
- telemetry.generic.tick = ao_data_ring[sample].tick;
- telemetry.generic.type = AO_TELEMETRY_BARO;
- telemetry.baro.samples = samples;
- for (sample = 0; sample < samples; sample++) {
- telemetry.baro.baro[sample] = ao_data_ring[ao_baro_sample].adc.pres;
- ao_baro_sample = ao_data_ring_next(ao_baro_sample);
- }
- ao_radio_send(&telemetry, sizeof (telemetry));
-}
-#endif
-
static __pdata int8_t ao_telemetry_config_max;
static __pdata int8_t ao_telemetry_config_cur;
#endif
telemetry.configuration.config_major = AO_CONFIG_MAJOR;
telemetry.configuration.config_minor = AO_CONFIG_MINOR;
+#if AO_idProduct_NUMBER == 0x25 && HAS_ADC
+ /* TeleGPS gets battery voltage instead of apogee delay */
+ telemetry.configuration.apogee_delay = ao_data_ring[ao_data_ring_prev(ao_data_head)].adc.v_batt;
+#else
telemetry.configuration.apogee_delay = ao_config.apogee_delay;
telemetry.configuration.main_deploy = ao_config.main_deploy;
+#endif
+
telemetry.configuration.flight_log_max = ao_config.flight_log_max >> 10;
ao_xmemcpy (telemetry.configuration.callsign,
ao_config.callsign,
ao_mutex_get(&ao_gps_mutex);
ao_xmemcpy(&telemetry.location.flags,
&ao_gps_data.flags,
- 26);
- telemetry.location.state = ao_flight_state;
+ 27);
telemetry.location.tick = ao_gps_tick;
ao_mutex_put(&ao_gps_mutex);
ao_radio_send(&telemetry, sizeof (telemetry));
if (!(ao_config.radio_enable & AO_RADIO_DISABLE_TELEMETRY))
#endif
{
-#ifdef AO_SEND_ALL_BARO
- ao_send_baro();
-#endif
-
#if HAS_FLIGHT
# ifdef AO_SEND_MEGA
ao_send_mega_sensor();
ao_send_satellite();
#endif
}
-#ifndef AO_SEND_ALL_BARO
#if HAS_RDF
if (ao_rdf &&
#if HAS_APRS
ao_aprs_send();
}
#endif /* HAS_APRS */
-#endif /* !AO_SEND_ALL_BARO */
time += ao_telemetry_interval;
delay = time - ao_time();
if (delay > 0) {
}
}
+#if HAS_RADIO_RATE
+void
+ao_telemetry_reset_interval(void)
+{
+ ao_telemetry_set_interval(ao_telemetry_desired_interval);
+}
+#endif
+
void
ao_telemetry_set_interval(uint16_t interval)
{
int8_t cur = 0;
+
+#if HAS_RADIO_RATE
+ /* Limit max telemetry rate based on available radio bandwidth.
+ */
+ static __xdata const uint16_t min_interval[] = {
+ /* [AO_RADIO_RATE_38400] = */ AO_MS_TO_TICKS(100),
+ /* [AO_RADIO_RATE_9600] = */ AO_MS_TO_TICKS(500),
+ /* [AO_RADIO_RATE_2400] = */ AO_MS_TO_TICKS(1000)
+ };
+
+ ao_telemetry_desired_interval = interval;
+ if (interval && interval < min_interval[ao_config.radio_rate])
+ interval = min_interval[ao_config.radio_rate];
+#endif
ao_telemetry_interval = interval;
-
#if AO_SEND_MEGA
if (interval > 1)
ao_telemetry_mega_data_max = 1;
ao_telemetry_companion_cur = cur;
#endif
- ao_telemetry_config_max = AO_SEC_TO_TICKS(1) / interval;
+ ao_telemetry_config_max = AO_SEC_TO_TICKS(5) / interval;
#if HAS_COMPANION
if (ao_telemetry_config_max > cur)
cur++;