diff options
| author | Keith Packard <keithp@keithp.com> | 2015-03-02 21:02:31 -0800 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2015-03-02 21:02:31 -0800 | 
| commit | 2614d20b324ab215ef22f178e3635d48e757fa9b (patch) | |
| tree | b86b5592db95042b095b0991005785ae1064b7e6 /src/drivers/ao_aprs.c | |
| parent | 0724cc334a3bd8d81bbd4641d90a7e4040330efe (diff) | |
altos: Make APRS format (compressed/uncompressed) configurable
This provides a choice of compressed vs uncompressed when sending APRS
packets to deal with receivers that still do not have support for the
more useful compressed format.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/drivers/ao_aprs.c')
| -rw-r--r-- | src/drivers/ao_aprs.c | 98 | 
1 files changed, 81 insertions, 17 deletions
| diff --git a/src/drivers/ao_aprs.c b/src/drivers/ao_aprs.c index 19beb78f..2e977612 100644 --- a/src/drivers/ao_aprs.c +++ b/src/drivers/ao_aprs.c @@ -707,8 +707,7 @@ static int tncPositionPacket(void)      static int32_t	latitude;      static int32_t	longitude;      static int32_t	altitude; -    int32_t		lat, lon, alt; -    uint8_t	*buf; +    uint8_t		*buf;      if (ao_gps_data.flags & AO_GPS_VALID) {  	latitude = ao_gps_data.latitude; @@ -719,28 +718,93 @@ static int tncPositionPacket(void)      }      buf = tncBuffer; -    *buf++ = '!'; -    /* Symbol table ID */ -    *buf++ = '/'; +    switch (ao_config.aprs_format) { +    case AO_APRS_FORMAT_COMPRESSED: +    default: +    { +	    int32_t		lat, lon, alt; + +	    *buf++ = '!'; + +	    /* Symbol table ID */ +	    *buf++ = '/'; + +	    lat = ((uint64_t) 380926 * (900000000 - latitude)) / 10000000; +	    lon = ((uint64_t) 190463 * (1800000000 + longitude)) / 10000000; + +	    alt = ao_aprs_encode_altitude(altitude); + +	    tncCompressInt(buf, lat, 4); +	    buf += 4; +	    tncCompressInt(buf, lon, 4); +	    buf += 4; -    lat = ((uint64_t) 380926 * (900000000 - latitude)) / 10000000; -    lon = ((uint64_t) 190463 * (1800000000 + longitude)) / 10000000; +	    /* Symbol code */ +	    *buf++ = '\''; -    alt = ao_aprs_encode_altitude(altitude); +	    tncCompressInt(buf, alt, 2); +	    buf += 2; -    tncCompressInt(buf, lat, 4); -    buf += 4; -    tncCompressInt(buf, lon, 4); -    buf += 4; +	    *buf++ = 33 + ((1 << 5) | (2 << 3)); -    /* Symbol code */ -    *buf++ = '\''; +	    break; +    } +    case AO_APRS_FORMAT_UNCOMPRESSED: +    { +	    char	lat_sign = 'N', lon_sign = 'E'; +	    int32_t	lat = latitude; +	    int32_t	lon = longitude; +	    int32_t	alt = altitude; +	    uint16_t	lat_deg; +	    uint16_t	lon_deg; +	    uint16_t	lat_min; +	    uint16_t	lat_frac; +	    uint16_t	lon_min; +	    uint16_t	lon_frac; + +	    if (lat < 0) { +		    lat_sign = 'S'; +		    lat = -lat; +	    } -    tncCompressInt(buf, alt, 2); -    buf += 2; +	    if (lon < 0) { +		    lon_sign = 'W'; +		    lon = -lon; +	    } -    *buf++ = 33 + ((1 << 5) | (2 << 3)); +	    /* Round latitude and longitude by 0.005 minutes */ +	    lat = lat + 833; +	    if (lat > 900000000) +		    lat = 900000000; +	    lon = lon + 833; +	    if (lon > 1800000000) +		    lon = 1800000000; + +	    lat_deg = lat / 10000000; +	    lat -= lat_deg * 10000000; +	    lat *= 60; +	    lat_min = lat / 10000000; +	    lat -= lat_min * 10000000; +	    lat_frac = lat / 100000; + +	    lon_deg = lon / 10000000; +	    lon -= lon_deg * 10000000; +	    lon *= 60; +	    lon_min = lon / 10000000; +	    lon -= lon_min * 10000000; +	    lon_frac = lon / 100000; + +	    /* Convert from meters to feet */ +	    alt = (alt * 328 + 50) / 100; + +	    buf += sprintf((char *) tncBuffer, "!%02u%02u.%02u%c/%03u%02u.%02u%c'/A=%06u ", +			   lat_deg, lat_min, lat_frac, lat_sign, +			   lon_deg, lon_min, lon_frac, lon_sign, +			   alt); +	    break; +    } +    }      buf += tncComment(buf); | 
