summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2014-07-05 00:09:25 -0700
committerKeith Packard <keithp@keithp.com>2014-07-05 00:38:09 -0700
commitea5887027e7a39da2b7d84a142d74950b7a24703 (patch)
tree1ec137c8f668861d1e53cbe9d5fbf18afeb9656e /src
parent214a38eb2b084baec526aa42016eddb954038639 (diff)
altos: Call ao_telemetry_reset_interval when telemetry rate changes
This lets the radio code adjust the telemetry packet sending pattern when the data rate changes. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src')
-rw-r--r--src/cc1111/ao_pins.h15
-rw-r--r--src/kernel/ao.h5
-rw-r--r--src/kernel/ao_config.c7
-rw-r--r--src/kernel/ao_telemetry.c34
-rw-r--r--src/telebt-v1.0/ao_pins.h1
-rw-r--r--src/telefire-v0.1/ao_pins.h3
-rw-r--r--src/telefire-v0.2/ao_pins.h3
-rw-r--r--src/telemini-v2.0/ao_pins.h1
-rw-r--r--src/teleshield-v0.1/ao_pins.h1
-rw-r--r--src/teleterra-v0.2/ao_pins.h2
10 files changed, 62 insertions, 10 deletions
diff --git a/src/cc1111/ao_pins.h b/src/cc1111/ao_pins.h
index 2b19f1f6..b40acbbd 100644
--- a/src/cc1111/ao_pins.h
+++ b/src/cc1111/ao_pins.h
@@ -56,6 +56,7 @@
#define HAS_ACCEL 1
#define HAS_IGNITE 1
#define HAS_MONITOR 0
+ #define HAS_TELEMETRY 1
#endif
#if defined(TELEMETRUM_V_1_1)
@@ -96,6 +97,7 @@
#define HAS_ACCEL 1
#define HAS_IGNITE 1
#define HAS_MONITOR 0
+ #define HAS_TELEMETRY 1
#endif
#if defined(TELEMETRUM_V_1_2)
@@ -136,6 +138,7 @@
#define HAS_ACCEL 1
#define HAS_IGNITE 1
#define HAS_MONITOR 0
+ #define HAS_TELEMETRY 1
#endif
#if defined(TELEDONGLE_V_0_2)
@@ -164,6 +167,7 @@
#define LEGACY_MONITOR 1
#define HAS_RSSI 1
#define HAS_AES 0
+ #define HAS_TELEMETRY 0
#endif
#if defined(TELEMINI_V_1_0)
@@ -193,6 +197,8 @@
#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)
@@ -220,6 +226,8 @@
#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)
@@ -252,6 +260,8 @@
#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
@@ -283,6 +293,7 @@
#define LEGACY_MONITOR 1
#define HAS_RSSI 1
#define HAS_AES 0
+ #define HAS_TELEMETRY 0
#endif
#if defined(TIDONGLE)
@@ -312,6 +323,7 @@
#define LEGACY_MONITOR 1
#define HAS_RSSI 1
#define HAS_AES 0
+ #define HAS_TELEMETRY 0
#endif
#if defined(TELEBT_V_0_0)
@@ -350,6 +362,7 @@
#define LEGACY_MONITOR 1
#define HAS_RSSI 0
#define HAS_AES 0
+ #define HAS_TELEMETRY 0
#endif
#if defined(TELEBT_V_0_1)
@@ -396,6 +409,7 @@
#define LEGACY_MONITOR 1
#define HAS_RSSI 0
#define HAS_AES 0
+ #define HAS_TELEMETRY 0
#endif
#if defined(TELELAUNCH_V_0_1)
@@ -428,6 +442,7 @@
#define HAS_IGNITE 1
#define HAS_MONITOR 0
#define HAS_AES 1
+ #define HAS_TELEMETRY 0
#endif
#if DBG_ON_P1
diff --git a/src/kernel/ao.h b/src/kernel/ao.h
index 6c6abd36..c11aa028 100644
--- a/src/kernel/ao.h
+++ b/src/kernel/ao.h
@@ -521,9 +521,8 @@ struct ao_telemetry_raw_recv {
#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);
diff --git a/src/kernel/ao_config.c b/src/kernel/ao_config.c
index 52c0c4f6..32a0967c 100644
--- a/src/kernel/ao_config.c
+++ b/src/kernel/ao_config.c
@@ -492,6 +492,10 @@ ao_config_radio_cal_set(void) __reentrant
#endif
#if HAS_RADIO_RATE
+#ifndef HAS_TELEMETRY
+#error Please define HAS_TELEMETRY
+#endif
+
void
ao_config_radio_rate_show(void) __reentrant
{
@@ -510,6 +514,9 @@ ao_config_radio_rate_set(void) __reentrant
}
_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
diff --git a/src/kernel/ao_telemetry.c b/src/kernel/ao_telemetry.c
index 6fb30069..f4fcf400 100644
--- a/src/kernel/ao_telemetry.c
+++ b/src/kernel/ao_telemetry.c
@@ -25,6 +25,10 @@
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;
@@ -64,7 +68,7 @@ static void
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;
@@ -106,12 +110,13 @@ ao_send_sensor(void)
#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;
@@ -240,7 +245,7 @@ static void
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;
@@ -490,12 +495,33 @@ ao_telemetry(void)
}
}
+#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 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;
-
#if AO_SEND_MEGA
if (interval > 1)
ao_telemetry_mega_data_max = 1;
diff --git a/src/telebt-v1.0/ao_pins.h b/src/telebt-v1.0/ao_pins.h
index 9e47f3b8..b5562573 100644
--- a/src/telebt-v1.0/ao_pins.h
+++ b/src/telebt-v1.0/ao_pins.h
@@ -48,6 +48,7 @@
#define BT_LINK_PIN P1_7
#define HAS_MONITOR 1
#define LEGACY_MONITOR 0
+#define HAS_TELEMETRY 0
#define HAS_ADC 1
#define AO_PAD_ADC_BATT 0
diff --git a/src/telefire-v0.1/ao_pins.h b/src/telefire-v0.1/ao_pins.h
index f7a3ff2c..47ae663f 100644
--- a/src/telefire-v0.1/ao_pins.h
+++ b/src/telefire-v0.1/ao_pins.h
@@ -18,7 +18,8 @@
#ifndef _AO_PINS_H_
#define _AO_PINS_H_
-#define HAS_RADIO 1
+#define HAS_RADIO 1
+#define HAS_TELEMETRY 0
#define HAS_FLIGHT 0
#define HAS_USB 1
diff --git a/src/telefire-v0.2/ao_pins.h b/src/telefire-v0.2/ao_pins.h
index 96e6b066..9e6631ce 100644
--- a/src/telefire-v0.2/ao_pins.h
+++ b/src/telefire-v0.2/ao_pins.h
@@ -18,7 +18,8 @@
#ifndef _AO_PINS_H_
#define _AO_PINS_H_
-#define HAS_RADIO 1
+#define HAS_RADIO 1
+#define HAS_TELEMETRY 0
#define HAS_FLIGHT 0
#define HAS_USB 1
diff --git a/src/telemini-v2.0/ao_pins.h b/src/telemini-v2.0/ao_pins.h
index f202ccd1..c9f9de62 100644
--- a/src/telemini-v2.0/ao_pins.h
+++ b/src/telemini-v2.0/ao_pins.h
@@ -39,6 +39,7 @@
#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
diff --git a/src/teleshield-v0.1/ao_pins.h b/src/teleshield-v0.1/ao_pins.h
index 30239afc..68bb44ee 100644
--- a/src/teleshield-v0.1/ao_pins.h
+++ b/src/teleshield-v0.1/ao_pins.h
@@ -62,6 +62,7 @@
#define HAS_RSSI 0
#define HAS_AES 0
#define HAS_RADIO 1
+ #define HAS_TELEMETRY 0
#endif
#if DBG_ON_P1
diff --git a/src/teleterra-v0.2/ao_pins.h b/src/teleterra-v0.2/ao_pins.h
index 1c12c437..60d627ad 100644
--- a/src/teleterra-v0.2/ao_pins.h
+++ b/src/teleterra-v0.2/ao_pins.h
@@ -71,7 +71,7 @@
#define HAS_P2_ISR 1
#define BATTERY_PIN 5
-
+ #define HAS_TELEMETRY 0
#endif
#if DBG_ON_P1