summaryrefslogtreecommitdiff
path: root/driver_nmea2000.c
diff options
context:
space:
mode:
authorReinhard Arlt <reinhard.arlt@t-online.de>2015-01-31 08:36:04 +0100
committerReinhard Arlt <reinhard.arlt@t-online.de>2015-01-31 08:36:04 +0100
commite5a936f388d3275c674235649a34ea88b48a9d72 (patch)
tree6344ac74996146b90fa9428f59e9f1ab99e78a74 /driver_nmea2000.c
parentb4a25464ed5b5d87b4c6ee263e6c2b9be559987c (diff)
downloadgpsd-e5a936f388d3275c674235649a34ea88b48a9d72.tar.gz
Add new scale routine.
Diffstat (limited to 'driver_nmea2000.c')
-rw-r--r--driver_nmea2000.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/driver_nmea2000.c b/driver_nmea2000.c
index fba3f967..4059dbee 100644
--- a/driver_nmea2000.c
+++ b/driver_nmea2000.c
@@ -59,6 +59,19 @@ FILE *logFile = NULL;
extern bool __attribute__ ((weak)) gpsd_add_device(const char *device_name, bool flag_nowait);
+#define SHIFT32 0x100000000l
+
+static int scale_int(int32_t var, const int64_t factor)
+{
+ int64_t ret;
+
+ ret = var;
+ ret *= factor;
+ ret >>= 32;
+
+ return((int)ret);
+}
+
static void print_data(struct gps_context_t *context,
unsigned char *buffer, int len, PGN *pgn)
{
@@ -485,8 +498,8 @@ static gps_mask_t hnd_129038(unsigned char *bu, int len, PGN *pgn, struct gps_de
"pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit);
if (decode_ais_header(session->context, bu, len, ais, 0xffffffffU) != 0) {
- ais->type1.lon = (int) (getles32(bu, 5) * 0.06);
- ais->type1.lat = (int) (getles32(bu, 9) * 0.06);
+ ais->type1.lon = (int) scale_int(getles32(bu, 5), (int64_t)(SHIFT32 *.06L));
+ ais->type1.lat = (int) scale_int(getles32(bu, 9), (int64_t)(SHIFT32 *.06L));
ais->type1.accuracy = (bool) ((bu[13] >> 0) & 0x01);
ais->type1.raim = (bool) ((bu[13] >> 1) & 0x01);
ais->type1.second = (unsigned int) ((bu[13] >> 2) & 0x3f);