From 4a5b3837b460d1b6fcea99312728114c4734495a Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 6 Feb 2014 17:08:34 -0800 Subject: altos: report 0/0/0 for APRS position when GPS is not locked We were reporting whatever the GPS device sent, even if it wasn't reporting a valid status. That's not terribly useful. Signed-off-by: Keith Packard --- src/drivers/ao_aprs.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'src/drivers/ao_aprs.c') diff --git a/src/drivers/ao_aprs.c b/src/drivers/ao_aprs.c index 56d98437..25a651ca 100644 --- a/src/drivers/ao_aprs.c +++ b/src/drivers/ao_aprs.c @@ -515,13 +515,19 @@ static int tncComment(uint8_t *buf) */ static int tncPositionPacket(void) { - int32_t latitude = ao_gps_data.latitude; - int32_t longitude = ao_gps_data.longitude; - int32_t altitude = ao_gps_data.altitude; + int32_t latitude = 0; + int32_t longitude = 0; + int32_t altitude = 0; uint8_t *buf; - if (altitude < 0) - altitude = 0; + if (ao_gps_data.flags & AO_GPS_VALID) { + latitude = ao_gps_data.latitude; + longitude = ao_gps_data.longitude; + altitude = ao_gps_data.altitude; + if (altitude < 0) + altitude = 0; + } + altitude = (altitude * (int32_t) 10000 + (3048/2)) / (int32_t) 3048; buf = tncBuffer; -- cgit v1.2.3 From 6367ab2dec718c512073f70dfab86dbd1656b1fe Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 8 Feb 2014 20:02:54 -0800 Subject: altos: Report nsat in view in APRS packet This adds the number of sats in view (as opposed to the number of sats in solution) to the APRS packet. Signed-off-by: Keith Packard --- src/drivers/ao_aprs.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) (limited to 'src/drivers/ao_aprs.c') diff --git a/src/drivers/ao_aprs.c b/src/drivers/ao_aprs.c index 25a651ca..c327c897 100644 --- a/src/drivers/ao_aprs.c +++ b/src/drivers/ao_aprs.c @@ -488,9 +488,21 @@ static void tncCompressInt(uint8_t *dest, int32_t value, int len) { } } -#if HAS_ADC +static int ao_num_sats(void) +{ + int i; + int n = 0; + + for (i = 0; i < ao_gps_tracking_data.channels; i++) { + if (ao_gps_tracking_data.sats[i].svid) + n++; + } + return n; +} + static int tncComment(uint8_t *buf) { +#if HAS_ADC struct ao_data packet; ao_arch_critical(ao_data_get(&packet);); @@ -500,15 +512,19 @@ static int tncComment(uint8_t *buf) int16_t main = ao_ignite_decivolt(AO_SENSE_MAIN(&packet)); return sprintf((char *) buf, - "B:%d.%d A:%d.%d M:%d.%d", + "S: %d B:%d.%d A:%d.%d M:%d.%d", + ao_num_sats(), battery/10, battery % 10, apogee/10, apogee%10, main/10, main%10); -} +#else + return sprintf((char *) buf, + "S: %d", ao_num_sats()); #endif +} /** * Generate the plain text position packet. @@ -556,11 +572,7 @@ static int tncPositionPacket(void) *buf++ = 33 + ((1 << 5) | (2 << 3)); -#if HAS_ADC buf += tncComment(buf); -#else - *buf = '\0'; -#endif return buf - tncBuffer; } -- cgit v1.2.3 From 5001a0f882af53dde33fc531215944c9d727baf4 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 9 Feb 2014 22:53:05 -0800 Subject: altos: Re-send previous GPS position in APRS if lock is lost APRS radios often show only the last received APRS packet, which means that erasing the last known GPS position when we lose lock by sending 0/0/0 is unhelpful. Instead, just send the last known position, and make sure that we send 0/0/0 before we're locked the first time. Signed-off-by: Keith Packard --- src/drivers/ao_aprs.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'src/drivers/ao_aprs.c') diff --git a/src/drivers/ao_aprs.c b/src/drivers/ao_aprs.c index c327c897..d472af4e 100644 --- a/src/drivers/ao_aprs.c +++ b/src/drivers/ao_aprs.c @@ -531,9 +531,10 @@ static int tncComment(uint8_t *buf) */ static int tncPositionPacket(void) { - int32_t latitude = 0; - int32_t longitude = 0; - int32_t altitude = 0; + static int32_t latitude; + static int32_t longitude; + static int32_t altitude; + int32_t lat, lon, alt; uint8_t *buf; if (ao_gps_data.flags & AO_GPS_VALID) { @@ -544,30 +545,29 @@ static int tncPositionPacket(void) altitude = 0; } - altitude = (altitude * (int32_t) 10000 + (3048/2)) / (int32_t) 3048; - buf = tncBuffer; *buf++ = '!'; /* Symbol table ID */ *buf++ = '/'; - latitude = ((uint64_t) 380926 * (900000000 - latitude)) / 10000000; - longitude = ((uint64_t) 190463 * (1800000000 + longitude)) / 10000000; + lat = ((uint64_t) 380926 * (900000000 - latitude)) / 10000000; + lon = ((uint64_t) 190463 * (1800000000 + longitude)) / 10000000; #define ALTITUDE_LOG_BASE 0.001998002662673f /* log(1.002) */ - altitude = logf((float) altitude) * (1/ALTITUDE_LOG_BASE); + alt = (altitude * (int32_t) 10000 + (3048/2)) / (int32_t) 3048; + alt = logf((float) altitude) * (1/ALTITUDE_LOG_BASE); - tncCompressInt(buf, latitude, 4); + tncCompressInt(buf, lat, 4); buf += 4; - tncCompressInt(buf, longitude, 4); + tncCompressInt(buf, lon, 4); buf += 4; /* Symbol code */ *buf++ = '\''; - tncCompressInt(buf, altitude, 2); + tncCompressInt(buf, alt, 2); buf += 2; *buf++ = 33 + ((1 << 5) | (2 << 3)); -- cgit v1.2.3 From e76948d382cf6980c3a5b6c48405d71c8811780b Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 9 Feb 2014 22:54:31 -0800 Subject: altos: Put locked/unlocked GPS status in APRS comments Replace the 'S' (which marks the field showing sats in view) with either 'L' or 'U' to tell the user whether the GPS receiver is locked or unlocked. This also removes the colons in the comment field to shorten it. This makes it fit on one line of my FT1D display. Signed-off-by: Keith Packard --- src/drivers/ao_aprs.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'src/drivers/ao_aprs.c') diff --git a/src/drivers/ao_aprs.c b/src/drivers/ao_aprs.c index d472af4e..0a6c72ce 100644 --- a/src/drivers/ao_aprs.c +++ b/src/drivers/ao_aprs.c @@ -500,6 +500,14 @@ static int ao_num_sats(void) return n; } +static char ao_gps_locked(void) +{ + if (ao_gps_data.flags & AO_GPS_VALID) + return 'L'; + else + return 'U'; +} + static int tncComment(uint8_t *buf) { #if HAS_ADC @@ -512,7 +520,8 @@ static int tncComment(uint8_t *buf) int16_t main = ao_ignite_decivolt(AO_SENSE_MAIN(&packet)); return sprintf((char *) buf, - "S: %d B:%d.%d A:%d.%d M:%d.%d", + "%c%d B%d.%d A%d.%d M%d.%d", + ao_gps_locked(), ao_num_sats(), battery/10, battery % 10, @@ -522,7 +531,9 @@ static int tncComment(uint8_t *buf) main%10); #else return sprintf((char *) buf, - "S: %d", ao_num_sats()); + "%c%d", + ao_gps_locked(), + ao_num_sats()); #endif } -- cgit v1.2.3