summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2005-06-15 17:28:40 +0000
committerEric S. Raymond <esr@thyrsus.com>2005-06-15 17:28:40 +0000
commit14bd6c57b9e479354eb0f60bae79dc274d54f0cb (patch)
tree7397271bf5bef76b4545e574cb523eca982cf40d
parentd7aa3db02d43fc7c123a2d3300116611ca835aa3 (diff)
downloadgpsd-14bd6c57b9e479354eb0f60bae79dc274d54f0cb.tar.gz
New packet-return API using newdata and explicit merging.
-rw-r--r--HACKING13
-rw-r--r--Makefile.am1
-rw-r--r--garmin.c46
-rw-r--r--geoid.c14
-rw-r--r--gps.h19
-rw-r--r--gpsd.h1
-rw-r--r--gpsutils.c50
-rw-r--r--gpsutils.h10
-rw-r--r--libgps.c17
-rw-r--r--libgpsd_core.c22
-rw-r--r--nmea_parse.c68
-rw-r--r--sirf.c82
-rw-r--r--sirfmon.c1
-rw-r--r--test/magellan315.log.chk2
-rw-r--r--test/oncore.log.chk12
-rw-r--r--test/tn204.log.chk2
-rw-r--r--tsip.c88
-rw-r--r--zodiac.c34
18 files changed, 264 insertions, 218 deletions
diff --git a/HACKING b/HACKING
index 9d6f090f..162c4252 100644
--- a/HACKING
+++ b/HACKING
@@ -387,6 +387,15 @@ methods except when to call them. At any given time one driver is
active; by default it's the NMEA one. To add a new device, populate
another driver structure and add it to the list.
+Your driver should put new data from each incoming packet or sentence
+in the 'newdata' member of the GPS, and return a validity flag mask
+telling what members were updated. There is driver-independent code
+that will be responsible for merging that new data into the existing
+fix. To assist this, the CYCLE_START_SET flag is special. Set this
+when the driver returns the first timestamped message containing fix
+data in in an update cycle. (This excludes satellite-picture messages
+and GPS status indications.)
+
Each driver may have a trigger string that the NMEA interpreter
watches for. When that string is recognized at the start of a
line, the interpreter switches to its driver. The new driver
@@ -415,10 +424,6 @@ publish. Also, you must ensure that gpsdata.fix.mode is set properly to
indicate fix validity after each message; the framework code relies on
this.
-The CYCLE_START_SET flag is special. Set this when the driver returns
-the first timestamped message containing fix data in in an update cycle.
-(This excludes satellite-picture messages and GPS status indications.)
-
Your packet parser is also responsible for setting the tag field
in the gps_data_t structure. This is the string that will be emitted
as the first field of each $ record for profiling. The packet getter
diff --git a/Makefile.am b/Makefile.am
index 484024fb..7dd4bb0c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -82,7 +82,6 @@ libgps_c_sources = \
geoid.c \
sirf.c \
report.c \
- gpsutils.h \
bits.h \
timebase.h
diff --git a/garmin.c b/garmin.c
index 1ea5174e..369ce5d6 100644
--- a/garmin.c
+++ b/garmin.c
@@ -114,7 +114,7 @@ typedef struct {
/* Garmin D800_Pvt_Date_Type */
// This is the data format of the position data from the garmin USB
typedef struct {
- float alt; /* ->fix.altitude above WGS 84 (meters) */
+ float alt; /* altitude above WGS 84 (meters) */
float epe; /* estimated position error, 2 sigma (meters) */
float eph; /* epe, but horizontal only (meters) */
float epv; /* epe but vertical only (meters ) */
@@ -272,16 +272,16 @@ static gps_mask_t PrintPacket(struct gps_device_t *session, Packet_t *pkt)
session->context->valid = LEAP_SECOND_VALID;
// gps_tow is always like x.999 or x.998 so just round it
time_l += (time_t) round(pvt->gps_tow);
- session->gpsdata.fix.time
+ session->gpsdata.newdata.time
= session->gpsdata.sentence_time
= (double)time_l;
gpsd_report(5, "time_l: %ld\n", (long int)time_l);
- session->gpsdata.fix.latitude = radtodeg(pvt->lat);
- session->gpsdata.fix.longitude = radtodeg(pvt->lon);
+ session->gpsdata.newdata.latitude = radtodeg(pvt->lat);
+ session->gpsdata.newdata.longitude = radtodeg(pvt->lon);
// altitude over WGS84 converted to MSL
- session->gpsdata.fix.altitude = pvt->alt + pvt->msl_hght;
+ session->gpsdata.newdata.altitude = pvt->alt + pvt->msl_hght;
// geoid separation from WGS 84
// gpsd sign is opposite of garmin sign
@@ -289,21 +289,21 @@ static gps_mask_t PrintPacket(struct gps_device_t *session, Packet_t *pkt)
// estimated position error in meters
session->gpsdata.epe = pvt->epe;
- session->gpsdata.fix.eph = pvt->eph;
- session->gpsdata.fix.epv = pvt->epv;
+ session->gpsdata.newdata.eph = pvt->eph;
+ session->gpsdata.newdata.epv = pvt->epv;
// convert lat/lon to knots
- session->gpsdata.fix.speed
+ session->gpsdata.newdata.speed
= hypot(pvt->lon_vel, pvt->lat_vel) * 1.9438445;
// keep climb in meters/sec
- session->gpsdata.fix.climb = pvt->alt_vel;
+ session->gpsdata.newdata.climb = pvt->alt_vel;
track = atan2(pvt->lon_vel, pvt->lat_vel);
if (track < 0) {
track += 2 * PI;
}
- session->gpsdata.fix.track = radtodeg(track);
+ session->gpsdata.newdata.track = radtodeg(track);
switch ( pvt->fix) {
case 0:
@@ -311,43 +311,43 @@ static gps_mask_t PrintPacket(struct gps_device_t *session, Packet_t *pkt)
default:
// no fix
session->gpsdata.status = STATUS_NO_FIX;
- session->gpsdata.fix.mode = MODE_NO_FIX;
+ session->gpsdata.newdata.mode = MODE_NO_FIX;
break;
case 2:
// 2D fix
session->gpsdata.status = STATUS_FIX;
- session->gpsdata.fix.mode = MODE_2D;
+ session->gpsdata.newdata.mode = MODE_2D;
break;
case 3:
// 3D fix
session->gpsdata.status = STATUS_FIX;
- session->gpsdata.fix.mode = MODE_3D;
+ session->gpsdata.newdata.mode = MODE_3D;
break;
case 4:
// 2D Differential fix
session->gpsdata.status = STATUS_DGPS_FIX;
- session->gpsdata.fix.mode = MODE_2D;
+ session->gpsdata.newdata.mode = MODE_2D;
break;
case 5:
// 3D differential fix
session->gpsdata.status = STATUS_DGPS_FIX;
- session->gpsdata.fix.mode = MODE_3D;
+ session->gpsdata.newdata.mode = MODE_3D;
break;
}
#ifdef NTPSHM_ENABLE
- if (session->gpsdata.fix.mode > MODE_NO_FIX)
- (void) ntpshm_put(session, session->gpsdata.fix.time);
+ if (session->gpsdata.newdata.mode > MODE_NO_FIX)
+ (void) ntpshm_put(session, session->gpsdata.newdata.time);
#endif /* NTPSHM_ENABLE */
gpsd_report(4, "Appl, mode %d, status %d\n"
- , session->gpsdata.fix.mode
+ , session->gpsdata.newdata.mode
, session->gpsdata.status);
- gpsd_report(3, "UTC Time: %lf\n", session->gpsdata.fix.time);
+ gpsd_report(3, "UTC Time: %lf\n", session->gpsdata.newdata.time);
gpsd_report(3, "Geoid Separation (MSL - WGS84): from garmin %lf, calculated %lf\n"
, -pvt->msl_hght
- , wgs84_separation(session->gpsdata.fix.latitude
- , session->gpsdata.fix.longitude));
+ , wgs84_separation(session->gpsdata.newdata.latitude
+ , session->gpsdata.newdata.longitude));
gpsd_report(3, "Alt: %.3f, Epe: %.3f, Eph: %.3f, Epv: %.3f, Fix: %d, Gps_tow: %f, Lat: %.3f, Lon: %.3f, LonVel: %.3f, LatVel: %.3f, AltVel: %.3f, MslHgt: %.3f, Leap: %d, GarminDays: %ld\n"
, pvt->alt
, pvt->epe
@@ -355,8 +355,8 @@ static gps_mask_t PrintPacket(struct gps_device_t *session, Packet_t *pkt)
, pvt->epv
, pvt->fix
, pvt->gps_tow
- , session->gpsdata.fix.latitude
- , session->gpsdata.fix.longitude
+ , session->gpsdata.newdata.latitude
+ , session->gpsdata.newdata.longitude
, pvt->lon_vel
, pvt->lat_vel
, pvt->alt_vel
diff --git a/geoid.c b/geoid.c
index 8e575361..c04bea95 100644
--- a/geoid.c
+++ b/geoid.c
@@ -92,20 +92,20 @@ void ecef_to_wgs84fix(struct gps_data_t *gpsdata,
phi = atan2(z + e_2*b*pow(sin(theta),3),p - e2*a*pow(cos(theta),3));
n = a / sqrt(1.0 - e2*pow(sin(phi),2));
h = p / cos(phi) - n;
- gpsdata->fix.latitude = phi * RAD_2_DEG;
- gpsdata->fix.longitude = lambda * RAD_2_DEG;
- gpsdata->separation = wgs84_separation(gpsdata->fix.latitude, gpsdata->fix.longitude);
- gpsdata->fix.altitude = h - gpsdata->separation;
+ gpsdata->newdata.latitude = phi * RAD_2_DEG;
+ gpsdata->newdata.longitude = lambda * RAD_2_DEG;
+ gpsdata->separation = wgs84_separation(gpsdata->newdata.latitude, gpsdata->newdata.longitude);
+ gpsdata->newdata.altitude = h - gpsdata->separation;
/* velocity computation */
vnorth = -vx*sin(phi)*cos(lambda)-vy*sin(phi)*sin(lambda)+vz*cos(phi);
veast = -vx*sin(lambda)+vy*cos(lambda);
- gpsdata->fix.climb = vx*cos(phi)*cos(lambda)+vy*cos(phi)*sin(lambda)+vz*sin(phi);
- gpsdata->fix.speed = sqrt(pow(vnorth,2) + pow(veast,2));
+ gpsdata->newdata.climb = vx*cos(phi)*cos(lambda)+vy*cos(phi)*sin(lambda)+vz*sin(phi);
+ gpsdata->newdata.speed = sqrt(pow(vnorth,2) + pow(veast,2));
heading = atan2(veast,vnorth);
/*@ +evalorder @*/
if (heading < 0)
heading += 2 * PI;
- gpsdata->fix.track = heading * RAD_2_DEG;
+ gpsdata->newdata.track = heading * RAD_2_DEG;
}
#ifdef TESTMAIN
diff --git a/gps.h b/gps.h
index 1fd2affd..38b81af7 100644
--- a/gps.h
+++ b/gps.h
@@ -11,7 +11,6 @@ extern "C" {
#include <sys/types.h>
#include <sys/time.h>
#include <time.h>
-#include "gpsutils.h"
#define MAXCHANNELS 12 /* maximum GPS channels (*not* satellites!) */
#define MAXTAGLEN 6 /* maximum length of sentence tag name */
@@ -103,7 +102,8 @@ struct gps_data_t {
* prone to false negatives.
*/
- struct gps_fix_t fix; /* PVT data */
+ struct gps_fix_t fix; /* accumulated PVT data */
+ struct gps_fix_t newdata; /* PVT data from last packet */
double separation; /* Geoidal separation, MSL - WGS84 (Meters) */
@@ -170,7 +170,6 @@ struct gps_data_t {
double subseconds;
};
-extern void gps_clear_fix(struct gps_fix_t *fixp);
extern struct gps_data_t *gps_open(const char *host, const char *port);
int gps_close(struct gps_data_t *);
int gps_query(struct gps_data_t *gpsdata, const char *requests);
@@ -179,6 +178,20 @@ void gps_set_raw_hook(struct gps_data_t *gpsdata, void (*hook)(struct gps_data_t
int gps_set_callback(struct gps_data_t *gpsdata, void (*callback)(struct gps_data_t *sentence, char *buf, size_t len, int level), pthread_t *handler);
int gps_del_callback(struct gps_data_t *gpsdata, pthread_t *handler);
+extern void gps_clear_fix(/*@ out @*/struct gps_fix_t *);
+extern void gps_merge_fix(/*@ out @*/struct gps_fix_t *,
+ gps_mask_t,
+ /*@ in @*/struct gps_fix_t *);
+
+extern time_t mkgmtime(register struct tm *);
+extern double timestamp(void);
+extern double iso8601_to_unix(char *);
+extern /*@observer@*/char *unix_to_iso8601(double t, /*@ out @*/char[], int len);
+extern double gpstime_to_unix(int, double);
+/* extern double earth_distance(double, double, double, double); */
+extern double wgs84_separation(double lat, double lon);
+extern int gpsd_units(void);
+
/* some multipliers for interpreting GPS output */
#define METERS_TO_FEET 3.2808399 /* Meters to U.S./British feet */
#define METERS_TO_MILES 0.00062137119 /* Meters to miles */
diff --git a/gpsd.h b/gpsd.h
index bb2924c3..c52ab490 100644
--- a/gpsd.h
+++ b/gpsd.h
@@ -7,7 +7,6 @@
#include <termios.h>
#include "config.h"
#include "gps.h"
-#include "gpsutils.h"
/* Some internal capabilities depend on which drivers we're compiling. */
#ifdef EARTHMATE_ENABLE
diff --git a/gpsutils.c b/gpsutils.c
index b03c6387..b443388c 100644
--- a/gpsutils.c
+++ b/gpsutils.c
@@ -9,6 +9,56 @@
#include "gpsd.h"
+void gps_clear_fix(/*@ out @*/struct gps_fix_t *fixp)
+/* stuff a fix structure with recognizable out-of-band values */
+{
+ fixp->time = NAN;
+ fixp->mode = MODE_NOT_SEEN;
+ fixp->track = NAN;
+ fixp->speed = NAN;
+ fixp->climb = NAN;
+ fixp->altitude = NAN;
+ fixp->ept = NAN;
+ fixp->eph = NAN;
+ fixp->epv = NAN;
+ fixp->epd = NAN;
+ fixp->eps = NAN;
+ fixp->epc = NAN;
+}
+
+void gps_merge_fix(/*@ out @*/struct gps_fix_t *to,
+ gps_mask_t transfer,
+ /*@ in @*/struct gps_fix_t *from)
+/* merge new data into an old fix */
+{
+ if ((transfer & TIME_SET)!=0)
+ to->time = from->time;
+ if ((transfer & LATLON_SET)!=0) {
+ to->latitude = from->latitude;
+ to->longitude = from->longitude;
+ }
+ if ((transfer & MODE_SET)!=0)
+ to->mode = from->mode;
+ if ((transfer & ALTITUDE_SET)!=0)
+ to->altitude = from->altitude;
+ if ((transfer & TRACK_SET)!=0)
+ to->track = from->track;
+ if ((transfer & SPEED_SET)!=0)
+ to->speed = from->speed;
+ if ((transfer & CLIMB_SET)!=0)
+ to->climb = from->climb;
+ if ((transfer & TIMERR_SET)!=0)
+ to->ept = from->ept;
+ if ((transfer & HERR_SET)!=0)
+ to->eph = from->eph;
+ if ((transfer & VERR_SET)!=0)
+ to->epv = from->epv;
+ if ((transfer & SPEEDERR_SET)!=0)
+ to->eps = from->eps;
+ if ((transfer & CLIMBERR_SET)!=0)
+ to->epc = from->epc;
+}
+
double timestamp(void)
{
struct timeval tv;
diff --git a/gpsutils.h b/gpsutils.h
deleted file mode 100644
index 0b462a35..00000000
--- a/gpsutils.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/* gpsutils.h -- geodesy and time conversions */
-
-extern time_t mkgmtime(register struct tm *);
-extern double timestamp(void);
-extern double iso8601_to_unix(char *);
-extern /*@observer@*/char *unix_to_iso8601(double t, /*@ out @*/char[], int len);
-extern double gpstime_to_unix(int, double);
-/* extern double earth_distance(double, double, double, double); */
-extern double wgs84_separation(double lat, double lon);
-extern int gpsd_units(void);
diff --git a/libgps.c b/libgps.c
index 9e697224..455d3a7c 100644
--- a/libgps.c
+++ b/libgps.c
@@ -74,23 +74,6 @@ int gpsd_units(void)
}
#endif /* __UNUSED__ */
-void gps_clear_fix(struct gps_fix_t *fixp)
-/* stuff a fix structure with recognizable out-of-band values */
-{
- fixp->time = NAN;
- fixp->mode = MODE_NOT_SEEN;
- fixp->track = NAN;
- fixp->speed = NAN;
- fixp->climb = NAN;
- fixp->altitude = NAN;
- fixp->ept = NAN;
- fixp->eph = NAN;
- fixp->epv = NAN;
- fixp->epd = NAN;
- fixp->eps = NAN;
- fixp->epc = NAN;
-}
-
struct gps_data_t *gps_open(const char *host, const char *port)
/* open a connection to a gpsd daemon */
{
diff --git a/libgpsd_core.c b/libgpsd_core.c
index 7335ac3b..e7081205 100644
--- a/libgpsd_core.c
+++ b/libgpsd_core.c
@@ -347,14 +347,15 @@ static void gpsd_binary_quality_dump(struct gps_device_t *session,
(void)strcpy(bufp, ",");
}
bufp += strlen(bufp);
+#define ZEROIZE(x) (isnan(x)!=0 ? 0.0 : x)
if (session->gpsdata.fix.mode == MODE_NO_FIX)
(void)strcat(bufp, ",,,");
else
(void)snprintf(bufp, len-strlen(bufp),
"%.1f,%.1f,%.1f*",
- session->gpsdata.pdop,
- session->gpsdata.hdop,
- session->gpsdata.vdop);
+ ZEROIZE(session->gpsdata.pdop),
+ ZEROIZE(session->gpsdata.hdop),
+ ZEROIZE(session->gpsdata.vdop));
nmea_add_checksum(bufp2);
bufp += strlen(bufp);
if (finite(session->gpsdata.fix.eph)
@@ -364,12 +365,13 @@ static void gpsd_binary_quality_dump(struct gps_device_t *session,
// only if realistic
(void)snprintf(bufp, len-strlen(bufp),
"$PGRME,%.2f,%.2f,%.2f",
- session->gpsdata.fix.eph,
- session->gpsdata.fix.epv,
- session->gpsdata.epe);
+ ZEROIZE(session->gpsdata.fix.eph),
+ ZEROIZE(session->gpsdata.fix.epv),
+ ZEROIZE(session->gpsdata.epe));
nmea_add_checksum(bufp);
session->gpsdata.seen_sentences |= PGRME;
}
+#undef ZEROIZE
}
#endif /* BINARY_ENABLE */
@@ -384,18 +386,24 @@ static int is_input_waiting(int fd)
static gps_mask_t handle_packet(struct gps_device_t *session)
{
+ gps_mask_t received;
+
session->packet_full = 0;
session->gpsdata.sentence_time = 0;
session->gpsdata.sentence_length = session->outbuflen;
session->gpsdata.d_recv_time = timestamp();
- session->gpsdata.set = ONLINE_SET | session->device_type->parse_packet(session);
+ received = session->device_type->parse_packet(session);
+
+ gps_merge_fix(&session->gpsdata.fix, received, &session->gpsdata.newdata);
+ session->gpsdata.set = ONLINE_SET | received;
/* count all packets and good fixes */
session->counter++;
if (session->gpsdata.status > STATUS_NO_FIX)
session->fixcnt++;
+
if ((session->gpsdata.set & TIME_SET)==0)
session->gpsdata.sentence_time = NAN;
/*
diff --git a/nmea_parse.c b/nmea_parse.c
index 411c9aef..8d41e15b 100644
--- a/nmea_parse.c
+++ b/nmea_parse.c
@@ -31,8 +31,8 @@ static void do_lat_lon(char *field[], struct gps_data_t *out)
p = field[1];
if (*p == 'S')
lat = -lat;
- if (out->fix.latitude != lat)
- out->fix.latitude = lat;
+ if (out->newdata.latitude != lat)
+ out->newdata.latitude = lat;
updated++;
}
if (*(p = field[2]) != '\0') {
@@ -44,8 +44,8 @@ static void do_lat_lon(char *field[], struct gps_data_t *out)
p = field[3];
if (*p == 'W')
lon = -lon;
- if (out->fix.longitude != lon)
- out->fix.longitude = lon;
+ if (out->newdata.longitude != lon)
+ out->newdata.longitude = lon;
updated++;
}
}
@@ -125,8 +125,8 @@ static gps_mask_t processGPRMC(int count, char *field[], struct gps_data_t *out)
out->status = STATUS_NO_FIX;
mask |= STATUS_SET;
}
- if (out->fix.mode >= MODE_2D) {
- out->fix.mode = MODE_NO_FIX;
+ if (out->newdata.mode >= MODE_2D) {
+ out->newdata.mode = MODE_NO_FIX;
mask |= MODE_SET;
}
} else if (strcmp(field[2], "A")==0) {
@@ -134,28 +134,28 @@ static gps_mask_t processGPRMC(int count, char *field[], struct gps_data_t *out)
merge_ddmmyy(field[9], out);
merge_hhmmss(field[1], out);
mask |= TIME_SET;
- out->fix.time = (double)mkgmtime(&out->nmea_date)+out->subseconds;
- if (out->sentence_time != out->fix.time)
+ out->newdata.time = (double)mkgmtime(&out->nmea_date)+out->subseconds;
+ if (out->sentence_time != out->newdata.time)
mask |= CYCLE_START_SET;
- out->sentence_time = out->fix.time;
+ out->sentence_time = out->newdata.time;
}
do_lat_lon(&field[3], out);
mask |= LATLON_SET;
- out->fix.speed = atof(field[7]) * KNOTS_TO_MPS;
- out->fix.track = atof(field[8]);
+ out->newdata.speed = atof(field[7]) * KNOTS_TO_MPS;
+ out->newdata.track = atof(field[8]);
mask |= (TRACK_SET | SPEED_SET);
/*
* This copes with GPSes like the Magellan EC-10X that *only* emit
* GPRMC. In this case we set mode and status here so the client
* code that relies on them won't mistakenly believe it has never
- * received a fix.
+ * received a newdata.
*/
if (out->status == STATUS_NO_FIX) {
out->status = STATUS_FIX; /* could be DGPS_FIX, we can't tell */
mask |= STATUS_SET;
}
- if (out->fix.mode < MODE_2D) {
- out->fix.mode = MODE_2D;
+ if (out->newdata.mode < MODE_2D) {
+ out->newdata.mode = MODE_2D;
mask |= MODE_SET;
}
}
@@ -199,10 +199,10 @@ static gps_mask_t processGPGLL(int count, char *field[], struct gps_data_t *out)
merge_hhmmss(field[5], out);
if (out->nmea_date.tm_year != 0) {
mask = TIME_SET;
- out->fix.time = (double)mkgmtime(&out->nmea_date)+out->subseconds;
- if (out->sentence_time != out->fix.time)
+ out->newdata.time = (double)mkgmtime(&out->nmea_date)+out->subseconds;
+ if (out->sentence_time != out->newdata.time)
mask |= CYCLE_START_SET;
- out->sentence_time = out->fix.time;
+ out->sentence_time = out->newdata.time;
}
do_lat_lon(&field[1], out);
mask |= LATLON_SET;
@@ -242,12 +242,12 @@ static gps_mask_t processGPGGA(int c UNUSED, char *field[], struct gps_data_t *o
mask = STATUS_SET;
if (out->status > STATUS_NO_FIX) {
char *altitude;
- double oldfixtime = out->fix.time;
+ double oldfixtime = out->newdata.time;
merge_hhmmss(field[1], out);
if (out->nmea_date.tm_year != 0) {
mask |= TIME_SET;
- out->fix.time = (double)mkgmtime(&out->nmea_date)+out->subseconds;
+ out->newdata.time = (double)mkgmtime(&out->nmea_date)+out->subseconds;
}
do_lat_lon(&field[2], out);
mask |= LATLON_SET;
@@ -259,14 +259,14 @@ static gps_mask_t processGPGGA(int c UNUSED, char *field[], struct gps_data_t *o
* If we see this, force mode to 2D at most.
*/
if (altitude[0] == '\0') {
- if (out->fix.mode == MODE_3D) {
- out->fix.mode = out->status ? MODE_2D : MODE_NO_FIX;
+ if (out->newdata.mode == MODE_3D) {
+ out->newdata.mode = out->status ? MODE_2D : MODE_NO_FIX;
mask |= MODE_SET;
}
} else {
- double oldaltitude = out->fix.altitude;
+ double oldaltitude = out->newdata.altitude;
- out->fix.altitude = atof(altitude);
+ out->newdata.altitude = atof(altitude);
mask |= ALTITUDE_SET;
@@ -276,17 +276,17 @@ static gps_mask_t processGPGGA(int c UNUSED, char *field[], struct gps_data_t *o
* SiRF and Garmin chips, which might have some smoothing
* going on.
*/
- if (isnan(oldaltitude)==0 || out->fix.time==oldfixtime)
- out->fix.climb = 0;
+ if (isnan(oldaltitude)==0 || out->newdata.time==oldfixtime)
+ out->newdata.climb = 0;
else {
- out->fix.climb = (out->fix.altitude-oldaltitude)/(out->fix.time-oldfixtime);
+ out->newdata.climb = (out->newdata.altitude-oldaltitude)/(out->newdata.time-oldfixtime);
}
mask |= CLIMB_SET;
}
if (strlen(field[11]) > 0) {
out->separation = atof(field[11]);
} else {
- out->separation = wgs84_separation(out->fix.latitude,out->fix.longitude);
+ out->separation = wgs84_separation(out->newdata.latitude,out->newdata.longitude);
}
}
return mask;
@@ -310,9 +310,9 @@ static gps_mask_t processGPGSA(int c UNUSED, char *field[], struct gps_data_t *o
gps_mask_t mask;
int i;
- out->fix.mode = atoi(field[2]);
+ out->newdata.mode = atoi(field[2]);
mask = MODE_SET;
- gpsd_report(3, "GPGSA sets mode %d\n", out->fix.mode);
+ gpsd_report(3, "GPGSA sets mode %d\n", out->newdata.mode);
out->pdop = atof(field[15]);
out->hdop = atof(field[16]);
out->vdop = atof(field[17]);
@@ -417,8 +417,8 @@ static gps_mask_t processPGRME(int c UNUSED, char *field[], struct gps_data_t *o
* Garmin won't say, but the general belief is that these are 1-sigma.
* See <http://gpsinformation.net/main/epenew.txt>.
*/
- out->fix.eph = atof(field[1]);
- out->fix.epv = atof(field[3]);
+ out->newdata.eph = atof(field[1]);
+ out->newdata.epv = atof(field[3]);
out->epe = atof(field[5]);
return HERR_SET | VERR_SET | PERR_SET;
}
@@ -441,10 +441,10 @@ static gps_mask_t processGPZDA(int c UNUSED, char *field[], struct gps_data_t *o
out->nmea_date.tm_year = atoi(field[4]) - 1900;
out->nmea_date.tm_mon = atoi(field[3]);
out->nmea_date.tm_mday = atoi(field[2]);
- out->fix.time = (double)mkgmtime(&out->nmea_date)+out->subseconds;
- if (out->sentence_time != out->fix.time)
+ out->newdata.time = (double)mkgmtime(&out->nmea_date)+out->subseconds;
+ if (out->sentence_time != out->newdata.time)
mask |= CYCLE_START_SET;
- out->sentence_time = out->fix.time;
+ out->sentence_time = out->newdata.time;
return mask;
}
diff --git a/sirf.c b/sirf.c
index 680eb515..37470db0 100644
--- a/sirf.c
+++ b/sirf.c
@@ -176,42 +176,42 @@ gps_mask_t sirf_parse(struct gps_device_t *session, unsigned char *buf, size_t l
/* fix status is byte 19 */
navtype = (unsigned short)getub(buf, 19);
session->gpsdata.status = STATUS_NO_FIX;
- session->gpsdata.fix.mode = MODE_NO_FIX;
+ session->gpsdata.newdata.mode = MODE_NO_FIX;
if ((navtype & 0x80) != 0)
session->gpsdata.status = STATUS_DGPS_FIX;
else if ((navtype & 0x07) > 0 && (navtype & 0x07) < 7)
session->gpsdata.status = STATUS_FIX;
if ((navtype & 0x07) == 4 || (navtype & 0x07) == 6)
- session->gpsdata.fix.mode = MODE_3D;
+ session->gpsdata.newdata.mode = MODE_3D;
else if (session->gpsdata.status != 0)
- session->gpsdata.fix.mode = MODE_2D;
- if (session->gpsdata.fix.mode == MODE_3D)
+ session->gpsdata.newdata.mode = MODE_2D;
+ if (session->gpsdata.newdata.mode == MODE_3D)
mask |= ALTITUDE_SET;
gpsd_report(4, "MND 0x02: Navtype = 0x%0x, Status = %d, mode = %d\n",
- navtype,session->gpsdata.status,session->gpsdata.fix.mode);
+ navtype,session->gpsdata.status,session->gpsdata.newdata.mode);
/* byte 20 is HDOP, see below */
/* byte 21 is "mode 2", not clear how to interpret that */
- session->gpsdata.fix.time = session->gpsdata.sentence_time
+ session->gpsdata.newdata.time = session->gpsdata.sentence_time
= gpstime_to_unix(getsw(buf, 22), getul(buf, 24)*1e-2) - session->context->leap_seconds;
#ifdef NTPSHM_ENABLE
- if (session->gpsdata.fix.mode > MODE_NO_FIX) {
+ if (session->gpsdata.newdata.mode > MODE_NO_FIX) {
if ((session->time_seen & TIME_SEEN_GPS_2) == 0)
gpsd_report(4, "valid time in message 0x02, seen=0x%02x\n",
session->time_seen);
session->time_seen |= TIME_SEEN_GPS_2;
if (IS_HIGHEST_BIT(session->time_seen,TIME_SEEN_GPS_2))
- (void)ntpshm_put(session, session->gpsdata.fix.time + 0.8);
+ (void)ntpshm_put(session, session->gpsdata.newdata.time + 0.8);
}
#endif /* NTPSHM_ENABLE */
/* fix quality data */
session->gpsdata.hdop = (double)getub(buf, 20)/5.0;
- session->gpsdata.pdop = session->gpsdata.vdop = 0.0;
+ session->gpsdata.pdop = session->gpsdata.vdop = NAN;
if (session->gpsdata.satellites > 0)
dop(session->gpsdata.satellites_used, &session->gpsdata);
- mask |= TIME_SET | LATLON_SET | TRACK_SET | SPEED_SET | STATUS_SET | MODE_SET | HDOP_SET | CYCLE_START_SET;
+ mask |= TIME_SET | LATLON_SET | TRACK_SET | SPEED_SET | STATUS_SET | MODE_SET | HDOP_SET;
}
- return mask;
+ return mask | CYCLE_START_SET;
case 0x04: /* Measured tracker data out */
gpsd_zero_satellites(&session->gpsdata);
@@ -480,18 +480,18 @@ gps_mask_t sirf_parse(struct gps_device_t *session, unsigned char *buf, size_t l
*/
navtype = (unsigned short)getuw(buf, 3);
session->gpsdata.status = STATUS_NO_FIX;
- session->gpsdata.fix.mode = MODE_NO_FIX;
+ session->gpsdata.newdata.mode = MODE_NO_FIX;
if (navtype & 0x80)
session->gpsdata.status = STATUS_DGPS_FIX;
else if ((navtype & 0x07) > 0 && (navtype & 0x07) < 7)
session->gpsdata.status = STATUS_FIX;
- session->gpsdata.fix.mode = MODE_NO_FIX;
+ session->gpsdata.newdata.mode = MODE_NO_FIX;
if ((navtype & 0x07) == 4 || (navtype & 0x07) == 6)
- session->gpsdata.fix.mode = MODE_3D;
+ session->gpsdata.newdata.mode = MODE_3D;
else if (session->gpsdata.status)
- session->gpsdata.fix.mode = MODE_2D;
+ session->gpsdata.newdata.mode = MODE_2D;
gpsd_report(4, "GNI 0x29: Navtype = 0x%0x, Status = %d, mode = %d\n",
- navtype, session->gpsdata.status, session->gpsdata.fix.mode);
+ navtype, session->gpsdata.status, session->gpsdata.newdata.mode);
/*
* UTC is left all zeros in 231 and older firmware versions,
* and misdocumented in the Protocol Reference (version 1.4).
@@ -511,36 +511,36 @@ gps_mask_t sirf_parse(struct gps_device_t *session, unsigned char *buf, size_t l
session->gpsdata.nmea_date.tm_min = (int)getub(buf, 16);
session->gpsdata.nmea_date.tm_sec = 0;
session->gpsdata.subseconds = getuw(buf, 17)*1e-3;
- session->gpsdata.fix.time = session->gpsdata.sentence_time
+ session->gpsdata.newdata.time = session->gpsdata.sentence_time
= (double)mktime(&session->gpsdata.nmea_date)+session->gpsdata.subseconds;
- gpsd_report(5, "MID 41 UTC: %lf\n", session->gpsdata.fix.time);
+ gpsd_report(5, "MID 41 UTC: %lf\n", session->gpsdata.newdata.time);
#ifdef NTPSHM_ENABLE
- if (session->gpsdata.fix.mode > MODE_NO_FIX && session->gpsdata.nmea_date.tm_year != 0) {
+ if (session->gpsdata.newdata.mode > MODE_NO_FIX && session->gpsdata.nmea_date.tm_year != 0) {
if ((session->time_seen & TIME_SEEN_UTC_1) == 0)
gpsd_report(4, "valid time in message 0x29, seen=0x%02x\n",
session->time_seen);
session->time_seen |= TIME_SEEN_UTC_1;
if (IS_HIGHEST_BIT(session->time_seen,TIME_SEEN_UTC_1))
- (void)ntpshm_put(session, session->gpsdata.fix.time + 0.8);
+ (void)ntpshm_put(session, session->gpsdata.newdata.time + 0.8);
}
#endif /* NTPSHM_ENABLE */
/* skip 4 bytes of satellite map */
- session->gpsdata.fix.latitude = getsl(buf, 23)*1e-7;
- session->gpsdata.fix.longitude = getsl(buf, 27)*1e-7;
+ session->gpsdata.newdata.latitude = getsl(buf, 23)*1e-7;
+ session->gpsdata.newdata.longitude = getsl(buf, 27)*1e-7;
/* skip 4 bytes of altitude from ellipsoid */
mask = TIME_SET | LATLON_SET | STATUS_SET | MODE_SET;
- session->gpsdata.fix.altitude = getsl(buf, 31)*1e-2;
+ session->gpsdata.newdata.altitude = getsl(buf, 31)*1e-2;
/* skip 1 byte of map datum */
- session->gpsdata.fix.speed = getsw(buf, 36)*1e-2;
- session->gpsdata.fix.track = getsw(buf, 38)*1e-2;
+ session->gpsdata.newdata.speed = getsw(buf, 36)*1e-2;
+ session->gpsdata.newdata.track = getsw(buf, 38)*1e-2;
/* skip 2 bytes of magnetic variation */
- session->gpsdata.fix.climb = getsw(buf, 42)*1e-2;
+ session->gpsdata.newdata.climb = getsw(buf, 42)*1e-2;
/* HDOP should be available at byte 89, but in 231 it's zero. */
mask |= SPEED_SET | TRACK_SET | CLIMB_SET;
session->gpsdata.sentence_length = 91;
strcpy(session->gpsdata.tag, "GND");
}
- return mask;
+ return mask | CYCLE_START_SET;
case 0x32: /* SBAS corrections */
return 0;
@@ -584,7 +584,7 @@ gps_mask_t sirf_parse(struct gps_device_t *session, unsigned char *buf, size_t l
session->time_seen);
session->time_seen |= TIME_SEEN_UTC_2;
if (IS_HIGHEST_BIT(session->time_seen,TIME_SEEN_UTC_2))
- (void)ntpshm_put(session, session->gpsdata.fix.time + 0.3);
+ (void)ntpshm_put(session, session->gpsdata.newdata.time + 0.3);
#endif /* NTPSHM_ENABLE */
mask |= TIME_SET;
}
@@ -594,27 +594,27 @@ gps_mask_t sirf_parse(struct gps_device_t *session, unsigned char *buf, size_t l
/* this packet is only sent by uBlox firmware from version 1.32 */
mask = LATLON_SET | ALTITUDE_SET | SPEED_SET | TRACK_SET | CLIMB_SET |
STATUS_SET | MODE_SET | HDOP_SET | VDOP_SET | PDOP_SET;
- session->gpsdata.fix.latitude = getsl(buf, 1) * RAD_2_DEG * 1e-8;
- session->gpsdata.fix.longitude = getsl(buf, 5) * RAD_2_DEG * 1e-8;
- session->gpsdata.separation = wgs84_separation(session->gpsdata.fix.latitude, session->gpsdata.fix.longitude);
- session->gpsdata.fix.altitude = getsl(buf, 9) * 1e-3 - session->gpsdata.separation;
- session->gpsdata.fix.speed = getsl(buf, 13) * 1e-3;
- session->gpsdata.fix.climb = getsl(buf, 17) * 1e-3;
- session->gpsdata.fix.track = getsl(buf, 21) * RAD_2_DEG * 1e-8;
+ session->gpsdata.newdata.latitude = getsl(buf, 1) * RAD_2_DEG * 1e-8;
+ session->gpsdata.newdata.longitude = getsl(buf, 5) * RAD_2_DEG * 1e-8;
+ session->gpsdata.separation = wgs84_separation(session->gpsdata.newdata.latitude, session->gpsdata.newdata.longitude);
+ session->gpsdata.newdata.altitude = getsl(buf, 9) * 1e-3 - session->gpsdata.separation;
+ session->gpsdata.newdata.speed = getsl(buf, 13) * 1e-3;
+ session->gpsdata.newdata.climb = getsl(buf, 17) * 1e-3;
+ session->gpsdata.newdata.track = getsl(buf, 21) * RAD_2_DEG * 1e-8;
navtype = (unsigned short)getub(buf, 25);
session->gpsdata.status = STATUS_NO_FIX;
- session->gpsdata.fix.mode = MODE_NO_FIX;
+ session->gpsdata.newdata.mode = MODE_NO_FIX;
if (navtype & 0x80)
session->gpsdata.status = STATUS_DGPS_FIX;
else if ((navtype & 0x07) > 0 && (navtype & 0x07) < 7)
session->gpsdata.status = STATUS_FIX;
if ((navtype & 0x07) == 4 || (navtype & 0x07) == 6)
- session->gpsdata.fix.mode = MODE_3D;
+ session->gpsdata.newdata.mode = MODE_3D;
else if (session->gpsdata.status)
- session->gpsdata.fix.mode = MODE_2D;
+ session->gpsdata.newdata.mode = MODE_2D;
gpsd_report(4, "EMND 0x62: Navtype = 0x%0x, Status = %d, mode = %d\n",
- navtype, session->gpsdata.status, session->gpsdata.fix.mode);
+ navtype, session->gpsdata.status, session->gpsdata.newdata.mode);
if (navtype & 0x40) { /* UTC corrected timestamp? */
mask |= TIME_SET;
@@ -625,7 +625,7 @@ gps_mask_t sirf_parse(struct gps_device_t *session, unsigned char *buf, size_t l
session->gpsdata.nmea_date.tm_min = (int)getub(buf, 31);
session->gpsdata.nmea_date.tm_sec = 0;
session->gpsdata.subseconds = ((unsigned short)getuw(buf, 32))*1e-3;
- session->gpsdata.fix.time = session->gpsdata.sentence_time
+ session->gpsdata.newdata.time = session->gpsdata.sentence_time
= (double)mkgmtime(&session->gpsdata.nmea_date)+session->gpsdata.subseconds;
#ifdef NTPSHM_ENABLE
if ((session->time_seen & TIME_SEEN_UTC_2) == 0)
@@ -633,7 +633,7 @@ gps_mask_t sirf_parse(struct gps_device_t *session, unsigned char *buf, size_t l
session->time_seen);
session->time_seen |= TIME_SEEN_UTC_2;
if (IS_HIGHEST_BIT(session->time_seen,TIME_SEEN_UTC_2))
- (void)ntpshm_put(session, session->gpsdata.fix.time + 0.8);
+ (void)ntpshm_put(session, session->gpsdata.newdata.time + 0.8);
#endif /* NTPSHM_ENABLE */
session->context->valid |= LEAP_SECOND_VALID;
}
diff --git a/sirfmon.c b/sirfmon.c
index 448f048b..0c7e9558 100644
--- a/sirfmon.c
+++ b/sirfmon.c
@@ -36,7 +36,6 @@
#include <stdbool.h>
#include "config.h"
-#include "gpsutils.h"
#include "gps.h" /* for DEFAULT_GPSD_PORT; brings in PI as well */
#define PUT_ORIGIN 4
diff --git a/test/magellan315.log.chk b/test/magellan315.log.chk
index 65e6a69a..d4b2883e 100644
--- a/test/magellan315.log.chk
+++ b/test/magellan315.log.chk
@@ -14,7 +14,7 @@ GPSD,Y=GSV ? 12:19 77 349 45 1:3 68 117 41 1:22 39 52 52 1:11 35 274 56 1:15 22
$GPGLL,3908.8200,N,00023.0832,W,120827.523,A*2C
GPSD,O=GLL 1110715707.52 0.005 39.147000 -0.384720 ? 16.80 21.60 ? ? ? ? 12.16 ?
$GPGGA,120827.52,3908.8200,N,00023.0832,W,1,06,2.1,00176,M,,,,*3F
-GPSD,O=GGA 1110715707.52 0.005 39.147000 -0.384720 176.00 16.80 21.60 ? ? ? ? 12.16 ?
+GPSD,O=GGA 1110715707.52 0.005 39.147000 -0.384720 176.00 16.80 21.60 ? ? 0.000 ? 12.16 ?
$GPRMC,120827.52,A,3908.8200,N,00023.0832,W,00.0,000.0,130305,01.,W*64
GPSD,O=RMC 1110715707.52 0.005 39.147000 -0.384720 176.00 16.80 21.60 0.0000 0.000 ? ? 12.16 ?
$GPGSA,A,3,19,15,03,18,22,11,,,,,,,3.5,2.1,2.7*34
diff --git a/test/oncore.log.chk b/test/oncore.log.chk
index dd8d2340..945c04bb 100644
--- a/test/oncore.log.chk
+++ b/test/oncore.log.chk
@@ -6,7 +6,7 @@ GPSD,Y=GSV ? 9:2 33 299 27 0:4 43 242 26 0:8 12 202 0 0:13 85 356 0 0:16 22 59 0
$GPRMC,171244.00,A,5209.7838,N,02048.4818,E,0.6,71.0,080405,3.5,E*63
GPSD,O=RMC 1112980364.00 0.005 52.163063 20.808030 ? 0.00 0.00 71.0000 0.309 ? ? ? ?
$GPGGA,171245.00,5209.7838,N,02048.4819,E,1,03,5.3,76.6,M,36.5,M,,*5A
-GPSD,O=GGA 1112980365.00 0.005 52.163063 20.808032 76.60 0.00 0.00 ? ? ? ? 0.00 ?
+GPSD,O=GGA 1112980365.00 0.005 52.163063 20.808032 76.60 0.00 0.00 ? ? 0.000 ? 0.00 ?
$GPGLL,5209.7838,N,02048.4819,E,171245.00,A*00
GPSD,O=GLL 1112980365.00 0.005 52.163063 20.808032 76.60 0.00 0.00 ? ? ? ? 0.00 ?
$GPGSA,A,2,02,04,27,,,,,,,,,,,5.3,*36
@@ -18,7 +18,7 @@ GPSD,Y=GSV ? 9:2 33 299 27 1:4 43 242 26 1:8 12 202 0 0:13 85 356 0 0:16 22 59 0
$GPRMC,171245.00,A,5209.7838,N,02048.4819,E,0.3,41.9,080405,3.5,E*6C
GPSD,O=RMC 1112980365.00 0.005 52.163063 20.808032 ? 42.40 0.00 41.9000 0.154 ? ? 0.00 ?
$GPGGA,171246.00,5209.7839,N,02048.4824,E,1,03,5.3,76.6,M,36.5,M,,*56
-GPSD,O=GGA 1112980366.00 0.005 52.163065 20.808040 76.60 42.40 0.00 ? ? ? ? 84.80 ?
+GPSD,O=GGA 1112980366.00 0.005 52.163065 20.808040 76.60 42.40 0.00 ? ? 0.000 ? 84.80 ?
$GPGLL,5209.7839,N,02048.4824,E,171246.00,A*0C
GPSD,O=GLL 1112980366.00 0.005 52.163065 20.808040 76.60 42.40 0.00 ? ? ? ? 84.80 ?
$GPGSA,A,2,02,04,27,,,,,,,,,,,5.3,*36
@@ -30,7 +30,7 @@ GPSD,Y=GSV ? 9:2 33 299 27 1:4 43 242 26 1:8 12 202 0 0:13 85 356 0 0:16 22 59 0
$GPRMC,171246.00,A,5209.7839,N,02048.4824,E,0.5,75.4,080405,3.5,E*6C
GPSD,O=RMC 1112980366.00 0.005 52.163065 20.808040 ? 42.40 0.00 75.4000 0.257 ? ? 84.80 ?
$GPGGA,171247.00,5209.7838,N,02048.4821,E,1,03,5.3,76.6,M,36.5,M,,*53
-GPSD,O=GGA 1112980367.00 0.005 52.163063 20.808035 76.60 42.40 0.00 ? ? ? ? 84.80 ?
+GPSD,O=GGA 1112980367.00 0.005 52.163063 20.808035 76.60 42.40 0.00 ? ? 0.000 ? 84.80 ?
$GPGLL,5209.7838,N,02048.4821,E,171247.00,A*09
GPSD,O=GLL 1112980367.00 0.005 52.163063 20.808035 76.60 42.40 0.00 ? ? ? ? 84.80 ?
$GPGSA,A,2,02,04,27,,,,,,,,,,,5.3,*36
@@ -42,7 +42,7 @@ GPSD,Y=GSV ? 9:2 33 299 28 1:4 43 242 26 1:8 12 202 0 0:13 85 357 0 0:16 22 59 0
$GPRMC,171247.00,A,5209.7838,N,02048.4821,E,0.5,269.3,080405,3.5,E*51
GPSD,O=RMC 1112980367.00 0.005 52.163063 20.808035 ? 42.40 0.00 269.3000 0.257 ? ? 84.80 ?
$GPGGA,171248.00,5209.7839,N,02048.4824,E,1,03,5.3,76.6,M,36.5,M,,*58
-GPSD,O=GGA 1112980368.00 0.005 52.163065 20.808040 76.60 42.40 0.00 ? ? ? ? 84.80 ?
+GPSD,O=GGA 1112980368.00 0.005 52.163065 20.808040 76.60 42.40 0.00 ? ? 0.000 ? 84.80 ?
$GPGLL,5209.7839,N,02048.4824,E,171248.00,A*02
GPSD,O=GLL 1112980368.00 0.005 52.163065 20.808040 76.60 42.40 0.00 ? ? ? ? 84.80 ?
$GPGSA,A,2,02,04,27,,,,,,,,,,,5.3,*36
@@ -54,7 +54,7 @@ GPSD,Y=GSV ? 9:2 33 299 28 1:4 43 242 25 1:8 12 202 0 0:13 85 357 0 0:16 22 59 0
$GPRMC,171248.00,A,5209.7839,N,02048.4824,E,0.2,0.0,080405,3.5,E*53
GPSD,O=RMC 1112980368.00 0.005 52.163065 20.808040 ? 42.40 0.00 0.0000 0.103 ? ? 84.80 ?
$GPGGA,171249.00,5209.7839,N,02048.4827,E,1,03,5.3,76.6,M,36.5,M,,*5A
-GPSD,O=GGA 1112980369.00 0.005 52.163065 20.808045 76.60 42.40 0.00 ? ? ? ? 84.80 ?
+GPSD,O=GGA 1112980369.00 0.005 52.163065 20.808045 76.60 42.40 0.00 ? ? 0.000 ? 84.80 ?
$GPGLL,5209.7839,N,02048.4827,E,171249.00,A*00
GPSD,O=GLL 1112980369.00 0.005 52.163065 20.808045 76.60 42.40 0.00 ? ? ? ? 84.80 ?
$GPGSA,A,2,02,04,27,,,,,,,,,,,5.3,*36
@@ -66,7 +66,7 @@ GPSD,Y=GSV ? 9:2 33 299 27 1:4 43 242 26 1:8 12 202 0 0:13 85 357 0 0:16 22 59 0
$GPRMC,171249.00,A,5209.7839,N,02048.4827,E,0.3,80.9,080405,3.5,E*61
GPSD,O=RMC 1112980369.00 0.005 52.163065 20.808045 ? 42.40 0.00 80.9000 0.154 ? ? 84.80 ?
$GPGGA,171250.00,5209.7839,N,02048.4829,E,1,03,5.3,76.6,M,36.5,M,,*5C
-GPSD,O=GGA 1112980370.00 0.005 52.163065 20.808048 76.60 42.40 0.00 ? ? ? ? 84.80 ?
+GPSD,O=GGA 1112980370.00 0.005 52.163065 20.808048 76.60 42.40 0.00 ? ? 0.000 ? 84.80 ?
$GPGLL,5209.7839,N,02048.4829,E,171250.00,A*06
GPSD,O=GLL 1112980370.00 0.005 52.163065 20.808048 76.60 42.40 0.00 ? ? ? ? 84.80 ?
$GPGSA,A,2,02,04,27,,,,,,,,,,,5.3,*36
diff --git a/test/tn204.log.chk b/test/tn204.log.chk
index 99f5d819..d2f0ee1e 100644
--- a/test/tn204.log.chk
+++ b/test/tn204.log.chk
@@ -3,7 +3,7 @@ $GPRMC,230148,A,3348.605,N,11821.126,W,000.0,209.4,261002,013.8,E*6B
GPSD,O=RMC 1035673308.00 0.005 33.810083 -118.352100 ? 0.00 0.00 209.4000 0.000 ? ? ? ?
$GPRMB,A,,,,,,,,,,,,V*71
$GPGGA,230149,3348.605,N,11821.126,W,1,05,1.7,49.4,M,-32.4,M,,*4E
-GPSD,O=GGA 1035673309.00 0.005 33.810083 -118.352100 49.40 0.00 0.00 ? ? ? ? 0.00 ?
+GPSD,O=GGA 1035673309.00 0.005 33.810083 -118.352100 49.40 0.00 0.00 ? ? 0.000 ? 0.00 ?
$GPGSA,A,3,07,08,,,27,28,29,,,,,,4.2,1.7,3.8*32
GPSD,O=GSA 1035673309.00 0.005 33.810083 -118.352100 49.40 13.60 30.40 ? ? ? ? 0.00 ?
$GPGSV,2,1,08,07,43,197,44,08,68,062,43,11,18,089,00,26,24,314,43*73
diff --git a/tsip.c b/tsip.c
index 04c5e19d..640bfea2 100644
--- a/tsip.c
+++ b/tsip.c
@@ -240,15 +240,15 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
case 0x4a: /* Single-Precision Position LLA */
if (len != 20)
break;
- session->gpsdata.fix.latitude = getf(buf,0) * RAD_2_DEG;
- session->gpsdata.fix.longitude = getf(buf,4) * RAD_2_DEG;
- session->gpsdata.fix.altitude = getf(buf,8);
+ session->gpsdata.newdata.latitude = getf(buf,0) * RAD_2_DEG;
+ session->gpsdata.newdata.longitude = getf(buf,4) * RAD_2_DEG;
+ session->gpsdata.newdata.altitude = getf(buf,8);
f1 = getf(buf,12); /* clock bias */
f2 = getf(buf,16); /* time-of-fix */
if (session->gps_week)
- session->gpsdata.fix.time = session->gpsdata.sentence_time =
+ session->gpsdata.newdata.time = session->gpsdata.sentence_time =
gpstime_to_unix((int)session->gps_week, f2) - session->context->leap_seconds;
- gpsd_report(4, "GPS LLA %f %f %f\n",session->gpsdata.fix.latitude,session->gpsdata.fix.longitude,session->gpsdata.fix.altitude);
+ gpsd_report(4, "GPS LLA %f %f %f\n",session->gpsdata.newdata.latitude,session->gpsdata.newdata.longitude,session->gpsdata.newdata.altitude);
mask |= LATLON_SET | ALTITUDE_SET;
break;
case 0x4b: /* Machine/Code ID and Additional Status */
@@ -302,12 +302,12 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
f3 = getf(buf,8); /* Up velocity */
f4 = getf(buf,12); /* clock bias rate */
f5 = getf(buf,16); /* time-of-fix */
- session->gpsdata.fix.climb = f3;
+ session->gpsdata.newdata.climb = f3;
/*@ -evalorder @*/
- session->gpsdata.fix.speed = sqrt(pow(f2,2) + pow(f1,2));
+ session->gpsdata.newdata.speed = sqrt(pow(f2,2) + pow(f1,2));
/*@ +evalorder @*/
- if ((session->gpsdata.fix.track = atan2(f1,f2) * RAD_2_DEG) < 0)
- session->gpsdata.fix.track += 360.0;
+ if ((session->gpsdata.newdata.track = atan2(f1,f2) * RAD_2_DEG) < 0)
+ session->gpsdata.newdata.track += 360.0;
gpsd_report(4, "GPS Velocity ENU %f %f %f %f %f\n",f1,f2,f3,f4,f5);
mask |= SPEED_SET | TRACK_SET | CLIMB_SET;
break;
@@ -370,15 +370,15 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
{
case 3:
session->gpsdata.status = STATUS_FIX;
- session->gpsdata.fix.mode = MODE_2D;
+ session->gpsdata.newdata.mode = MODE_2D;
break;
case 4:
session->gpsdata.status = STATUS_FIX;
- session->gpsdata.fix.mode = MODE_3D;
+ session->gpsdata.newdata.mode = MODE_3D;
break;
default:
session->gpsdata.status = STATUS_NO_FIX;
- session->gpsdata.fix.mode = MODE_NO_FIX;
+ session->gpsdata.newdata.mode = MODE_NO_FIX;
break;
}
session->gpsdata.satellites_used = count;
@@ -399,7 +399,7 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
/*@ -charint @*/
gpsd_report(4, "Sat info: %d %f %f %f %f %f %d:%s\n",
- session->gpsdata.fix.mode, session->gpsdata.pdop,
+ session->gpsdata.newdata.mode, session->gpsdata.pdop,
session->gpsdata.hdop, session->gpsdata.vdop,
session->gpsdata.tdop, session->gpsdata.gdop,
session->gpsdata.satellites_used,buf2);
@@ -441,15 +441,15 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
case 0x84: /* Double-Precision LLA Position Fix and Bias Information */
if (len != 36)
break;
- session->gpsdata.fix.latitude = getd(buf,0) * RAD_2_DEG;
- session->gpsdata.fix.longitude = getd(buf,8) * RAD_2_DEG;
- session->gpsdata.fix.altitude = getd(buf,16);
+ session->gpsdata.newdata.latitude = getd(buf,0) * RAD_2_DEG;
+ session->gpsdata.newdata.longitude = getd(buf,8) * RAD_2_DEG;
+ session->gpsdata.newdata.altitude = getd(buf,16);
d1 = getd(buf,24); /* clock bias */
f1 = getf(buf,32); /* time-of-fix */
if (session->gps_week)
- session->gpsdata.fix.time = session->gpsdata.sentence_time =
+ session->gpsdata.newdata.time = session->gpsdata.sentence_time =
gpstime_to_unix((int)session->gps_week, f1) - session->context->leap_seconds;
- gpsd_report(4, "GPS DP LLA %f %f %f\n",session->gpsdata.fix.latitude,session->gpsdata.fix.longitude,session->gpsdata.fix.altitude);
+ gpsd_report(4, "GPS DP LLA %f %f %f\n",session->gpsdata.newdata.latitude,session->gpsdata.newdata.longitude,session->gpsdata.newdata.altitude);
mask |= LATLON_SET | ALTITUDE_SET;
break;
case 0x8f: /* Super Packet. Well... */
@@ -496,27 +496,27 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
d5 = 0.005;
d1 = s1 * d5; /* east velocity m/s */
d2 = s2 * d5; /* north velocity m/s */
- session->gpsdata.fix.climb = s3 * d5; /* up velocity m/s */
+ session->gpsdata.newdata.climb = s3 * d5; /* up velocity m/s */
/*@ -evalorder @*/
- session->gpsdata.fix.speed = sqrt(pow(d2,2) + pow(d1,2));
+ session->gpsdata.newdata.speed = sqrt(pow(d2,2) + pow(d1,2));
/*@ +evalorder @*/
- if ((session->gpsdata.fix.track = atan2(d1,d2) * RAD_2_DEG) < 0)
- session->gpsdata.fix.track += 360.0;
- session->gpsdata.fix.latitude = sl1 * SEMI_2_DEG;
- if ((session->gpsdata.fix.longitude = ul2 * SEMI_2_DEG) > 180.0)
- session->gpsdata.fix.longitude -= 360.0;
- session->gpsdata.separation = wgs84_separation(session->gpsdata.fix.latitude, session->gpsdata.fix.longitude);
- session->gpsdata.fix.altitude = sl2 * 1e-3 - session->gpsdata.separation;;
+ if ((session->gpsdata.newdata.track = atan2(d1,d2) * RAD_2_DEG) < 0)
+ session->gpsdata.newdata.track += 360.0;
+ session->gpsdata.newdata.latitude = sl1 * SEMI_2_DEG;
+ if ((session->gpsdata.newdata.longitude = ul2 * SEMI_2_DEG) > 180.0)
+ session->gpsdata.newdata.longitude -= 360.0;
+ session->gpsdata.separation = wgs84_separation(session->gpsdata.newdata.latitude, session->gpsdata.newdata.longitude);
+ session->gpsdata.newdata.altitude = sl2 * 1e-3 - session->gpsdata.separation;;
session->gpsdata.status = STATUS_NO_FIX;
- session->gpsdata.fix.mode = MODE_NO_FIX;
+ session->gpsdata.newdata.mode = MODE_NO_FIX;
if ((u2 & 0x01) == (u_int8_t)0) { /* Fix Available */
session->gpsdata.status = STATUS_FIX;
if ((u2 & 0x02) != (u_int8_t)0) /* DGPS Corrected */
session->gpsdata.status = STATUS_DGPS_FIX;
if ((u2 & 0x04) != (u_int8_t)0) /* Fix Dimension */
- session->gpsdata.fix.mode = MODE_2D;
+ session->gpsdata.newdata.mode = MODE_2D;
else
- session->gpsdata.fix.mode = MODE_3D;
+ session->gpsdata.newdata.mode = MODE_3D;
}
session->gpsdata.satellites_used = (int)u3;
if ((int)u4 > 10) {
@@ -524,7 +524,7 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
session->context->valid |= LEAP_SECOND_VALID;
}
session->gps_week = s4;
- session->gpsdata.fix.time = session->gpsdata.sentence_time =
+ session->gpsdata.newdata.time = session->gpsdata.sentence_time =
gpstime_to_unix((int)s4, ul1 * 1e-3) - session->context->leap_seconds;
mask |= TIME_SET | LATLON_SET | ALTITUDE_SET | SPEED_SET | TRACK_SET | CLIMB_SET | MODE_SET;
break;
@@ -547,36 +547,36 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
session->context->leap_seconds = (int)u1;
session->context->valid |= LEAP_SECOND_VALID;
}
- session->gpsdata.fix.time = session->gpsdata.sentence_time =
+ session->gpsdata.newdata.time = session->gpsdata.sentence_time =
gpstime_to_unix((int)s1, ul1 * 1e-3) - session->context->leap_seconds;
session->gpsdata.status = STATUS_NO_FIX;
- session->gpsdata.fix.mode = MODE_NO_FIX;
+ session->gpsdata.newdata.mode = MODE_NO_FIX;
if ((u2 & 0x01) == (u_int8_t)0) { /* Fix Available */
session->gpsdata.status = STATUS_FIX;
if ((u2 & 0x02) != (u_int8_t)0) /* DGPS Corrected */
session->gpsdata.status = STATUS_DGPS_FIX;
if ((u2 & 0x04) != (u_int8_t)0) /* Fix Dimension */
- session->gpsdata.fix.mode = MODE_2D;
+ session->gpsdata.newdata.mode = MODE_2D;
else
- session->gpsdata.fix.mode = MODE_3D;
+ session->gpsdata.newdata.mode = MODE_3D;
}
- session->gpsdata.fix.latitude = sl1 * SEMI_2_DEG;
- if ((session->gpsdata.fix.longitude = ul2 * SEMI_2_DEG) > 180.0)
- session->gpsdata.fix.longitude -= 360.0;
- session->gpsdata.separation = wgs84_separation(session->gpsdata.fix.latitude, session->gpsdata.fix.longitude);
- session->gpsdata.fix.altitude = sl3 * 1e-3 - session->gpsdata.separation;;
+ session->gpsdata.newdata.latitude = sl1 * SEMI_2_DEG;
+ if ((session->gpsdata.newdata.longitude = ul2 * SEMI_2_DEG) > 180.0)
+ session->gpsdata.newdata.longitude -= 360.0;
+ session->gpsdata.separation = wgs84_separation(session->gpsdata.newdata.latitude, session->gpsdata.newdata.longitude);
+ session->gpsdata.newdata.altitude = sl3 * 1e-3 - session->gpsdata.separation;;
if ((u2 & 0x20) != (u_int8_t)0) /* check velocity scaling */
d5 = 0.02;
else
d5 = 0.005;
d1 = s2 * d5; /* east velocity m/s */
d2 = s3 * d5; /* north velocity m/s */
- session->gpsdata.fix.climb = s4 * d5; /* up velocity m/s */
+ session->gpsdata.newdata.climb = s4 * d5; /* up velocity m/s */
/*@ -evalorder @*/
- session->gpsdata.fix.speed = sqrt(pow(d2,2) + pow(d1,2));
+ session->gpsdata.newdata.speed = sqrt(pow(d2,2) + pow(d1,2));
/*@ +evalorder @*/
- if ((session->gpsdata.fix.track = atan2(d1,d2) * RAD_2_DEG) < 0)
- session->gpsdata.fix.track += 360.0;
+ if ((session->gpsdata.newdata.track = atan2(d1,d2) * RAD_2_DEG) < 0)
+ session->gpsdata.newdata.track += 360.0;
mask |= TIME_SET | LATLON_SET | ALTITUDE_SET | SPEED_SET | TRACK_SET | CLIMB_SET | MODE_SET;
break;
default:
diff --git a/zodiac.c b/zodiac.c
index 19c66ed1..92a48a0b 100644
--- a/zodiac.c
+++ b/zodiac.c
@@ -139,9 +139,9 @@ static gps_mask_t handle1000(struct gps_device_t *session)
/*@ -boolops -predboolothers @*/
session->gpsdata.status = (getword(10) & 0x1c) ? 0 : 1;
if (session->gpsdata.status != 0)
- session->gpsdata.fix.mode = (getword(10) & 1) ? MODE_2D : MODE_3D;
+ session->gpsdata.newdata.mode = (getword(10) & 1) ? MODE_2D : MODE_3D;
else
- session->gpsdata.fix.mode = MODE_NO_FIX;
+ session->gpsdata.newdata.mode = MODE_NO_FIX;
/*@ +boolops -predboolothers @*/
/* solution_type = getword(11); */
@@ -157,40 +157,40 @@ static gps_mask_t handle1000(struct gps_device_t *session)
session->gpsdata.nmea_date.tm_min = (int)getword(23);
session->gpsdata.nmea_date.tm_sec = (int)getword(24);
session->gpsdata.subseconds = (int)getlong(25) / 1e9;
- session->gpsdata.fix.time = session->gpsdata.sentence_time =
+ session->gpsdata.newdata.time = session->gpsdata.sentence_time =
(double)mkgmtime(&session->gpsdata.nmea_date) + session->gpsdata.subseconds;
#ifdef NTPSHM_ENABLE
- if (session->gpsdata.fix.mode > MODE_NO_FIX)
- (void)ntpshm_put(session, session->gpsdata.fix.time + 1.1);
+ if (session->gpsdata.newdata.mode > MODE_NO_FIX)
+ (void)ntpshm_put(session, session->gpsdata.newdata.time + 1.1);
#endif
/*@ -type @*/
- session->gpsdata.fix.latitude = ((long)getlong(27)) * RAD_2_DEG * 1e-8;
- session->gpsdata.fix.longitude = ((long)getlong(29)) * RAD_2_DEG * 1e-8;
+ session->gpsdata.newdata.latitude = ((long)getlong(27)) * RAD_2_DEG * 1e-8;
+ session->gpsdata.newdata.longitude = ((long)getlong(29)) * RAD_2_DEG * 1e-8;
/*
* The Rockwell Jupiter TU30-D140 reports altitude as uncorrected height
* above WGS84 geoid. The Zodiac binary protocol manual does not
* specify whether word 31 is geodetic or WGS 84.
*/
- session->gpsdata.fix.altitude = ((long)getlong(31)) * 1e-2;
+ session->gpsdata.newdata.altitude = ((long)getlong(31)) * 1e-2;
/*@ +type @*/
session->gpsdata.separation = ((short)getword(33)) * 1e-2;
- session->gpsdata.fix.altitude -= session->gpsdata.separation;
- session->gpsdata.fix.speed = (int)getlong(34) * 1e-2;
- session->gpsdata.fix.track = (int)getword(36) * RAD_2_DEG * 1e-3;
+ session->gpsdata.newdata.altitude -= session->gpsdata.separation;
+ session->gpsdata.newdata.speed = (int)getlong(34) * 1e-2;
+ session->gpsdata.newdata.track = (int)getword(36) * RAD_2_DEG * 1e-3;
session->mag_var = ((short)getword(37)) * RAD_2_DEG * 1e-4;
- session->gpsdata.fix.climb = ((short)getword(38)) * 1e-2;
+ session->gpsdata.newdata.climb = ((short)getword(38)) * 1e-2;
/* map_datum = getword(39); */
- session->gpsdata.fix.eph = (int)getlong(40) * 1e-2;
- session->gpsdata.fix.epv = (int)getlong(42) * 1e-2;
- session->gpsdata.fix.ept = (int)getlong(44) * 1e-2;
- session->gpsdata.fix.eps = (int)getword(46) * 1e-2;
+ session->gpsdata.newdata.eph = (int)getlong(40) * 1e-2;
+ session->gpsdata.newdata.epv = (int)getlong(42) * 1e-2;
+ session->gpsdata.newdata.ept = (int)getlong(44) * 1e-2;
+ session->gpsdata.newdata.eps = (int)getword(46) * 1e-2;
/* clock_bias = (int)getlong(47) * 1e-2; */
/* clock_bias_sd = (int)getlong(49) * 1e-2; */
/* clock_drift = (int)getlong(51) * 1e-2; */
/* clock_drift_sd = (int)getlong(53) * 1e-2; */
#if 0
- gpsd_report(1, "date: %lf\n", session->gpsdata.fix.time);
+ gpsd_report(1, "date: %lf\n", session->gpsdata.newdata.time);
gpsd_report(1, " solution invalid:\n");
gpsd_report(1, " altitude: %d\n", (getword(10) & 1) ? 1 : 0);
gpsd_report(1, " no diff gps: %d\n", (getword(10) & 2) ? 1 : 0);