Telemetry code was mis-computing RSSI
authorKeith Packard <keithp@keithp.com>
Sat, 3 Jul 2010 21:42:36 +0000 (17:42 -0400)
committerKeith Packard <keithp@keithp.com>
Thu, 15 Jul 2010 02:10:04 +0000 (19:10 -0700)
The RSSI data from the hardware reports in 1/2 dBm increments, and so
must be divided to report plain RSSI numbers.

Signed-off-by: Keith Packard <keithp@keithp.com>
ao-tools/lib/cc-telem.c
configure.ac
src/ao.h
src/ao_monitor.c

index ccd40ac..aa52b7c 100644 (file)
@@ -101,6 +101,10 @@ cc_telem_parse(const char *input_line, struct cc_telem *telem)
                telem->flight = 0;
 
        cc_parse_int(&telem->rssi, words[5]);
+       if (version <= 2) {
+               /* Older telemetry versions mis-computed the rssi value */
+               telem->rssi = (telem->rssi + 74) / 2 - 74;
+       }
        cc_parse_string(telem->state, sizeof (telem->state), words[9]);
        cc_parse_int(&telem->tick, words[10]);
        cc_parse_int(&telem->accel, words[12]);
index d6c8682..fafc6b3 100644 (file)
@@ -77,6 +77,8 @@ PKG_CHECK_MODULES([ALSA], [alsa])
 
 PKG_CHECK_MODULES([PLPLOT], [plplotd])
 
+PKG_CHECK_MODULES([SNDFILE], [sndfile])
+
 AC_OUTPUT([
 Makefile
 ao-tools/Makefile
index a2dfadd..dfff8a8 100644 (file)
--- a/src/ao.h
+++ b/src/ao.h
@@ -804,7 +804,7 @@ ao_gps_report_init(void);
  */
 
 #define AO_MAX_CALLSIGN                8
-#define AO_TELEMETRY_VERSION   2
+#define AO_TELEMETRY_VERSION   3
 
 struct ao_telemetry {
        uint8_t                 addr;
index f2f3fc2..f019d3b 100644 (file)
@@ -26,6 +26,7 @@ ao_monitor(void)
        __xdata struct ao_radio_recv recv;
        __xdata char callsign[AO_MAX_CALLSIGN+1];
        uint8_t state;
+       int16_t rssi;
 
        for (;;) {
                __critical while (!ao_monitoring)
@@ -33,6 +34,9 @@ ao_monitor(void)
                if (!ao_radio_recv(&recv))
                        continue;
                state = recv.telemetry.flight_state;
+
+               /* Typical RSSI offset for 38.4kBaud at 433 MHz is 74 */
+               rssi = (int16_t) (recv.rssi >> 1) - 74;
                memcpy(callsign, recv.telemetry.callsign, AO_MAX_CALLSIGN);
                if (state > ao_flight_invalid)
                        state = ao_flight_invalid;
@@ -42,7 +46,7 @@ ao_monitor(void)
                               callsign,
                               recv.telemetry.addr,
                               recv.telemetry.flight,
-                              (int) recv.rssi - 74, recv.status,
+                              rssi, recv.status,
                               ao_state_names[state]);
                        printf("%5u a: %5d p: %5d t: %5d v: %5d d: %5d m: %5d "
                               "fa: %5d ga: %d fv: %7ld fp: %5d gp: %5d a+: %5d a-: %5d ",
@@ -64,9 +68,9 @@ ao_monitor(void)
                        putchar(' ');
                        ao_gps_tracking_print(&recv.telemetry.gps_tracking);
                        putchar('\n');
-                       ao_rssi_set((int) recv.rssi - 74);
+                       ao_rssi_set(rssi);
                } else {
-                       printf("CRC INVALID RSSI %3d\n", (int) recv.rssi - 74);
+                       printf("CRC INVALID RSSI %3d\n", rssi);
                }
                ao_usb_flush();
                ao_led_toggle(ao_monitor_led);