summaryrefslogtreecommitdiff
path: root/src/drivers/ao_aprs.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2012-12-16 13:29:31 -0800
committerKeith Packard <keithp@keithp.com>2012-12-16 13:29:31 -0800
commit6b4cfd8719e3fd4a2904369e176182c870a3b43c (patch)
tree72f419f8b3be7359577aa63817f870e0e3630281 /src/drivers/ao_aprs.c
parentcf47efdc86f0b421fcf4389669fbecf6fa3f5934 (diff)
altos: Round APRS data correctly
Apply rounding once at the start of the computation, then truncate after that. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/drivers/ao_aprs.c')
-rw-r--r--src/drivers/ao_aprs.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/drivers/ao_aprs.c b/src/drivers/ao_aprs.c
index 93c4af3f..03bcab05 100644
--- a/src/drivers/ao_aprs.c
+++ b/src/drivers/ao_aprs.c
@@ -507,24 +507,32 @@ static int tncPositionPacket(void)
longitude = -longitude;
}
+ /* Round latitude and longitude by 0.005 minutes */
+ latitude = latitude + 833;
+ if (latitude > 900000000)
+ latitude = 900000000;
+ longitude = longitude + 833;
+ if (longitude > 1800000000)
+ longitude = 1800000000;
+
lat_deg = latitude / 10000000;
latitude -= lat_deg * 10000000;
latitude *= 60;
lat_min = latitude / 10000000;
latitude -= lat_min * 10000000;
- lat_frac = (latitude + 50000) / 100000;
+ lat_frac = latitude / 100000;
lon_deg = longitude / 10000000;
longitude -= lon_deg * 10000000;
longitude *= 60;
lon_min = longitude / 10000000;
longitude -= lon_min * 10000000;
- lon_frac = (longitude + 50000) / 100000;
+ lon_frac = longitude / 100000;
if (altitude < 0)
altitude = 0;
- altitude = altitude * (int32_t) 1000 / (int32_t) 3048;
+ altitude = (altitude * (int32_t) 10000 + (3048/2)) / (int32_t) 3048;
return sprintf ((char *) tncBuffer, "=%02u%02u.%02u%c\\%03u%02u.%02u%cO /A=%06u\015",
lat_deg, lat_min, lat_frac, lat_sign,