altos: Call ao_telemetry_reset_interval when telemetry rate changes
authorKeith Packard <keithp@keithp.com>
Sat, 5 Jul 2014 07:09:25 +0000 (00:09 -0700)
committerKeith Packard <keithp@keithp.com>
Sat, 5 Jul 2014 07:38:09 +0000 (00:38 -0700)
This lets the radio code adjust the telemetry packet sending pattern
when the data rate changes.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/cc1111/ao_pins.h
src/kernel/ao.h
src/kernel/ao_config.c
src/kernel/ao_telemetry.c
src/telebt-v1.0/ao_pins.h
src/telefire-v0.1/ao_pins.h
src/telefire-v0.2/ao_pins.h
src/telemini-v2.0/ao_pins.h
src/teleshield-v0.1/ao_pins.h
src/teleterra-v0.2/ao_pins.h

index 2b19f1f6b4bc20f986443c904e400f6f171f871a..b40acbbd5495f105ffca582ddbf0738ee1a78f33 100644 (file)
@@ -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)
        #define HAS_ACCEL               1
        #define HAS_IGNITE              1
        #define HAS_MONITOR             0
+       #define HAS_TELEMETRY           1
 #endif
 
 #if defined(TELEDONGLE_V_0_2)
        #define LEGACY_MONITOR          1
        #define HAS_RSSI                1
        #define HAS_AES                 0
+       #define HAS_TELEMETRY           0
 #endif
 
 #if defined(TELEMINI_V_1_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)
        #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)
        #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 LEGACY_MONITOR          1
        #define HAS_RSSI                1
        #define HAS_AES                 0
+       #define HAS_TELEMETRY           0
 #endif
 
 #if defined(TIDONGLE)
        #define LEGACY_MONITOR          1
        #define HAS_RSSI                1
        #define HAS_AES                 0
+       #define HAS_TELEMETRY           0
 #endif
 
 #if defined(TELEBT_V_0_0)
        #define LEGACY_MONITOR          1
        #define HAS_RSSI                0
        #define HAS_AES                 0
+       #define HAS_TELEMETRY           0
 #endif
 
 #if defined(TELEBT_V_0_1)
        #define LEGACY_MONITOR          1
        #define HAS_RSSI                0
        #define HAS_AES                 0
+       #define HAS_TELEMETRY           0
 #endif
 
 #if defined(TELELAUNCH_V_0_1)
        #define HAS_IGNITE              1
        #define HAS_MONITOR             0
        #define HAS_AES                 1
+       #define HAS_TELEMETRY           0
 #endif
 
 #if DBG_ON_P1
index 6c6abd36271463a33b44594c0c457e8a197ae740..c11aa028a4e2896231ac5037b1d5a2ca6f70d665 100644 (file)
@@ -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);
index 52c0c4f6f02e20a42fc99f4da5fb4788bb32b60c..32a0967c9808c7dcd4087b76c58178630baa30c2 100644 (file)
@@ -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
index 6fb30069ee5be977a6112b2058cf3753c5111f7a..f4fcf40074684b58956ffcec7984cef3a350c0d6 100644 (file)
 
 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;
index 9e47f3b839d497c65129e7d4490fef352642d0e4..b5562573b67723ca7017afe156cec2626bfcde8c 100644 (file)
@@ -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
index f7a3ff2cea2dc40b7e31866da843d139aac494f7..47ae663f1811af6be510d52913c9fd01e30125fd 100644 (file)
@@ -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
index 96e6b066081e47801310c428f644efe86ad700da..9e6631ce246131d767c88c63059d17385773bd10 100644 (file)
@@ -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
index f202ccd1c31488608a412dd95aa08a8ed9b138ff..c9f9de62743f0f8e20bc7fcd3e85ef7e419af021 100644 (file)
@@ -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
index 30239afccf57bc71377860a837be3e7ddac8a9d8..68bb44eee20fbeacc0c7ee5a1dd5815481d82425 100644 (file)
@@ -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
index 1c12c437b8651900b5741aed428bd5ae52f37802..60d627ad21e628947d69f82aa7f5549cecbe1d68 100644 (file)
@@ -71,7 +71,7 @@
        #define HAS_P2_ISR              1
 
        #define BATTERY_PIN             5
-       
+       #define HAS_TELEMETRY           0
 #endif
 
 #if DBG_ON_P1