summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel_M_Williams <dwilliams@sea-machines.com>2018-05-30 13:50:58 -0400
committerGary E. Miller <gem@rellim.com>2018-06-12 18:56:15 -0700
commit5428507f30009df571d19dd01ad1e25cff1df7dc (patch)
treeb16efa89c34b7392d40c726fbc2b44dbe6b8d40b
parent0149f55bc22cdcbe6f662fab2563479170adc653 (diff)
downloadgpsd-5428507f30009df571d19dd01ad1e25cff1df7dc.tar.gz
$GPVTG Added parsing, storage, output of magnetic course
Signed-off-by: Gary E. Miller <gem@rellim.com>
-rw-r--r--gps.h5
-rw-r--r--gpsd_json.c3
-rw-r--r--gpsutils.c5
-rw-r--r--libgps_core.c3
-rw-r--r--libgps_json.c4
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)