From 5428507f30009df571d19dd01ad1e25cff1df7dc Mon Sep 17 00:00:00 2001 From: Daniel_M_Williams Date: Wed, 30 May 2018 13:50:58 -0400 Subject: $GPVTG Added parsing, storage, output of magnetic course Signed-off-by: Gary E. Miller --- gps.h | 5 ++++- gpsd_json.c | 3 +++ gpsutils.c | 5 ++++- libgps_core.c | 3 +++ libgps_json.c | 4 ++++ 5 files changed, 18 insertions(+), 2 deletions(-) diff --git a/gps.h b/gps.h index 8784a97b..f320e9ee 100644 --- a/gps.h +++ b/gps.h @@ -98,6 +98,8 @@ struct gps_fix_t { double climb; /* Vertical speed, meters/sec */ double epc; /* Vertical speed uncertainty */ + double magnetic_track; /* Course (relative to Magnetic North) */ + /* ECEF data, all data in meters, and meters/second, or NaN */ struct { double x, y, z; /* ECEF x, y, z */ @@ -2008,7 +2010,8 @@ struct gps_data_t { #define OSCILLATOR_SET (1llu<<35) #define ECEF_SET (1llu<<36) #define VECEF_SET (1llu<<37) -#define SET_HIGH_BIT 38 +#define MAGNETIC_TRACK_SET (1llu<<38) +#define SET_HIGH_BIT 39 timestamp_t online; /* NZ if GPS is on line, 0 if not. * * Note: gpsd clears this time when sentences diff --git a/gpsd_json.c b/gpsd_json.c index 9c04e9c8..7d45295e 100644 --- a/gpsd_json.c +++ b/gpsd_json.c @@ -183,6 +183,9 @@ void json_tpv_dump(const struct gps_device_t *session, str_appendf(reply, replylen, "\"epv\":%.3f,", gpsdata->fix.epv); if (isnan(gpsdata->fix.track) == 0) str_appendf(reply, replylen, "\"track\":%.4f,", gpsdata->fix.track); + if (isnan(gpsdata->fix.magnetic_track) == 0) + str_appendf(reply, replylen, "\"magtrack\":%.4f,", + gpsdata->fix.magnetic_track); if (isnan(gpsdata->fix.speed) == 0) str_appendf(reply, replylen, "\"speed\":%.3f,", gpsdata->fix.speed); if ((gpsdata->fix.mode >= MODE_3D) && isnan(gpsdata->fix.climb) == 0) diff --git a/gpsutils.c b/gpsutils.c index c01b7bd3..bb4d5f10 100644 --- a/gpsutils.c +++ b/gpsutils.c @@ -242,6 +242,7 @@ void gps_clear_fix(struct gps_fix_t *fixp) fixp->mode = MODE_NOT_SEEN; fixp->latitude = fixp->longitude = NAN; fixp->track = NAN; + fixp->magnetic_track = NAN; fixp->speed = NAN; fixp->climb = NAN; fixp->altitude = NAN; @@ -287,7 +288,9 @@ void gps_merge_fix(struct gps_fix_t *to, if ((transfer & ALTITUDE_SET) != 0) to->altitude = from->altitude; if ((transfer & TRACK_SET) != 0) - to->track = from->track; + to->track = from->track; + if ((transfer & MAGNETIC_TRACK_SET) != 0) + to->magnetic_track = from->magnetic_track; if ((transfer & SPEED_SET) != 0) to->speed = from->speed; if ((transfer & CLIMB_SET) != 0) diff --git a/libgps_core.c b/libgps_core.c index 40b7425a..29ac6da1 100644 --- a/libgps_core.c +++ b/libgps_core.c @@ -313,6 +313,9 @@ void libgps_dump_state(struct gps_data_t *collect) (void)fprintf(debugfp, "SPEED: %lf\n", collect->fix.speed); if (collect->set & TRACK_SET) (void)fprintf(debugfp, "TRACK: track: %lf\n", collect->fix.track); + if (collect->set & MAGNETIC_TRACK_SET) + (void)fprintf(debugfp, "MAGNETIC_TRACK: magtrack: %lf\n", + collect->fix.magnetic_track); if (collect->set & CLIMB_SET) (void)fprintf(debugfp, "CLIMB: climb: %lf\n", collect->fix.climb); if (collect->set & STATUS_SET) { diff --git a/libgps_json.c b/libgps_json.c index 795e5d76..8afd789d 100644 --- a/libgps_json.c +++ b/libgps_json.c @@ -52,6 +52,8 @@ static int json_tpv_read(const char *buf, struct gps_data_t *gpsdata, .dflt.real = NAN}, {"track", t_real, .addr.real = &gpsdata->fix.track, .dflt.real = NAN}, + {"magtrack", t_real, .addr.real = &gpsdata->fix.magnetic_track, + .dflt.real = NAN}, {"speed", t_real, .addr.real = &gpsdata->fix.speed, .dflt.real = NAN}, {"climb", t_real, .addr.real = &gpsdata->fix.climb, @@ -473,6 +475,8 @@ int libgps_json_unpack(const char *buf, gpsdata->set |= VERR_SET; if (isnan(gpsdata->fix.track) == 0) gpsdata->set |= TRACK_SET; + if (isnan(gpsdata->fix.magnetic_track) == 0) + gpsdata->set |= MAGNETIC_TRACK_SET; if (isnan(gpsdata->fix.speed) == 0) gpsdata->set |= SPEED_SET; if (isnan(gpsdata->fix.climb) == 0) -- cgit v1.2.1