This lets the radio code adjust the telemetry packet sending pattern
when the data rate changes.
Signed-off-by: Keith Packard <keithp@keithp.com>
#define HAS_ACCEL 1
#define HAS_IGNITE 1
#define HAS_MONITOR 0
#define HAS_ACCEL 1
#define HAS_IGNITE 1
#define HAS_MONITOR 0
+ #define HAS_TELEMETRY 1
#endif
#if defined(TELEMETRUM_V_1_1)
#endif
#if defined(TELEMETRUM_V_1_1)
#define HAS_ACCEL 1
#define HAS_IGNITE 1
#define HAS_MONITOR 0
#define HAS_ACCEL 1
#define HAS_IGNITE 1
#define HAS_MONITOR 0
+ #define HAS_TELEMETRY 1
#endif
#if defined(TELEMETRUM_V_1_2)
#endif
#if defined(TELEMETRUM_V_1_2)
#define HAS_ACCEL 1
#define HAS_IGNITE 1
#define HAS_MONITOR 0
#define HAS_ACCEL 1
#define HAS_IGNITE 1
#define HAS_MONITOR 0
+ #define HAS_TELEMETRY 1
#endif
#if defined(TELEDONGLE_V_0_2)
#endif
#if defined(TELEDONGLE_V_0_2)
#define LEGACY_MONITOR 1
#define HAS_RSSI 1
#define HAS_AES 0
#define LEGACY_MONITOR 1
#define HAS_RSSI 1
#define HAS_AES 0
+ #define HAS_TELEMETRY 0
#endif
#if defined(TELEMINI_V_1_0)
#endif
#if defined(TELEMINI_V_1_0)
#define HAS_ACCEL 0
#define HAS_IGNITE 1
#define HAS_MONITOR 0
#define HAS_ACCEL 0
#define HAS_IGNITE 1
#define HAS_MONITOR 0
+ #define HAS_TELEMETRY 1
+ #define HAS_RADIO_RATE 0 /* not enough space for this */
#endif
#if defined(TELENANO_V_0_1)
#endif
#if defined(TELENANO_V_0_1)
#define HAS_ACCEL 0
#define HAS_IGNITE 0
#define HAS_MONITOR 0
#define HAS_ACCEL 0
#define HAS_IGNITE 0
#define HAS_MONITOR 0
+ #define HAS_TELEMETRY 1
+ #define HAS_RADIO_RATE 0 /* not enough space for this */
#endif
#if defined(TELEMETRUM_V_0_1)
#endif
#if defined(TELEMETRUM_V_0_1)
#define HAS_ACCEL 1
#define HAS_IGNITE 1
#define HAS_MONITOR 0
#define HAS_ACCEL 1
#define HAS_IGNITE 1
#define HAS_MONITOR 0
+ #define HAS_TELEMETRY 1
+ #define HAS_RADIO_RATE 0 /* not enough space for this */
#define AO_CONFIG_DEFAULT_FLIGHT_LOG_MAX ((uint32_t) 127 * (uint32_t) 1024)
#endif
#define AO_CONFIG_DEFAULT_FLIGHT_LOG_MAX ((uint32_t) 127 * (uint32_t) 1024)
#endif
#define LEGACY_MONITOR 1
#define HAS_RSSI 1
#define HAS_AES 0
#define LEGACY_MONITOR 1
#define HAS_RSSI 1
#define HAS_AES 0
+ #define HAS_TELEMETRY 0
#endif
#if defined(TIDONGLE)
#endif
#if defined(TIDONGLE)
#define LEGACY_MONITOR 1
#define HAS_RSSI 1
#define HAS_AES 0
#define LEGACY_MONITOR 1
#define HAS_RSSI 1
#define HAS_AES 0
+ #define HAS_TELEMETRY 0
#endif
#if defined(TELEBT_V_0_0)
#endif
#if defined(TELEBT_V_0_0)
#define LEGACY_MONITOR 1
#define HAS_RSSI 0
#define HAS_AES 0
#define LEGACY_MONITOR 1
#define HAS_RSSI 0
#define HAS_AES 0
+ #define HAS_TELEMETRY 0
#endif
#if defined(TELEBT_V_0_1)
#endif
#if defined(TELEBT_V_0_1)
#define LEGACY_MONITOR 1
#define HAS_RSSI 0
#define HAS_AES 0
#define LEGACY_MONITOR 1
#define HAS_RSSI 0
#define HAS_AES 0
+ #define HAS_TELEMETRY 0
#endif
#if defined(TELELAUNCH_V_0_1)
#endif
#if defined(TELELAUNCH_V_0_1)
#define HAS_IGNITE 1
#define HAS_MONITOR 0
#define HAS_AES 1
#define HAS_IGNITE 1
#define HAS_MONITOR 0
#define HAS_AES 1
+ #define HAS_TELEMETRY 0
#define AO_TELEMETRY_INTERVAL_RECOVER AO_MS_TO_TICKS(1000)
#endif
#define AO_TELEMETRY_INTERVAL_RECOVER AO_MS_TO_TICKS(1000)
#endif
-#define AO_RADIO_RATE_38400 0
-#define AO_RADIO_RATE_9600 1
-#define AO_RADIO_RATE_2400 2
+void
+ao_telemetry_reset_interval(void);
void
ao_telemetry_set_interval(uint16_t interval);
void
ao_telemetry_set_interval(uint16_t interval);
#endif
#if HAS_RADIO_RATE
#endif
#if HAS_RADIO_RATE
+#ifndef HAS_TELEMETRY
+#error Please define HAS_TELEMETRY
+#endif
+
void
ao_config_radio_rate_show(void) __reentrant
{
void
ao_config_radio_rate_show(void) __reentrant
{
}
_ao_config_edit_start();
ao_config.radio_rate = ao_cmd_lex_i;
}
_ao_config_edit_start();
ao_config.radio_rate = ao_cmd_lex_i;
+#if HAS_TELEMETRY
+ ao_telemetry_reset_interval();
+#endif
_ao_config_edit_finish();
}
#endif
_ao_config_edit_finish();
}
#endif
static __pdata uint16_t ao_telemetry_interval;
static __pdata uint16_t ao_telemetry_interval;
+#if HAS_RADIO_RATE
+static __pdata uint16_t ao_telemetry_desired_interval;
+#endif
+
#if HAS_RDF
static __pdata uint8_t ao_rdf = 0;
static __pdata uint16_t ao_rdf_time;
#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)];
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;
telemetry.generic.tick = packet->tick;
telemetry.generic.type = AO_TELEMETRY_SENSOR;
/* 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)];
/* 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;
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)];
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;
telemetry.generic.tick = packet->tick;
telemetry.generic.type = AO_TELEMETRY_MINI;
+#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;
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 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 < min_interval[ao_config.radio_rate])
+ interval = min_interval[ao_config.radio_rate];
+#endif
ao_telemetry_interval = interval;
ao_telemetry_interval = interval;
#if AO_SEND_MEGA
if (interval > 1)
ao_telemetry_mega_data_max = 1;
#if AO_SEND_MEGA
if (interval > 1)
ao_telemetry_mega_data_max = 1;
#define BT_LINK_PIN P1_7
#define HAS_MONITOR 1
#define LEGACY_MONITOR 0
#define BT_LINK_PIN P1_7
#define HAS_MONITOR 1
#define LEGACY_MONITOR 0
#define HAS_ADC 1
#define AO_PAD_ADC_BATT 0
#define HAS_ADC 1
#define AO_PAD_ADC_BATT 0
#ifndef _AO_PINS_H_
#define _AO_PINS_H_
#ifndef _AO_PINS_H_
#define _AO_PINS_H_
+#define HAS_RADIO 1
+#define HAS_TELEMETRY 0
#define HAS_FLIGHT 0
#define HAS_USB 1
#define HAS_FLIGHT 0
#define HAS_USB 1
#ifndef _AO_PINS_H_
#define _AO_PINS_H_
#ifndef _AO_PINS_H_
#define _AO_PINS_H_
+#define HAS_RADIO 1
+#define HAS_TELEMETRY 0
#define HAS_FLIGHT 0
#define HAS_USB 1
#define HAS_FLIGHT 0
#define HAS_USB 1
#define USE_INTERNAL_FLASH 0
#define HAS_DBG 0
#define PACKET_HAS_SLAVE 1
#define USE_INTERNAL_FLASH 0
#define HAS_DBG 0
#define PACKET_HAS_SLAVE 1
+#define HAS_RADIO_RATE 0 /* not enough space for this */
#define AO_LED_RED 2
#define LEDS_AVAILABLE AO_LED_RED
#define AO_LED_RED 2
#define LEDS_AVAILABLE AO_LED_RED
#define HAS_RSSI 0
#define HAS_AES 0
#define HAS_RADIO 1
#define HAS_RSSI 0
#define HAS_AES 0
#define HAS_RADIO 1
+ #define HAS_TELEMETRY 0
#define HAS_P2_ISR 1
#define BATTERY_PIN 5
#define HAS_P2_ISR 1
#define BATTERY_PIN 5
+ #define HAS_TELEMETRY 0