diff options
author | Eric S. Raymond <esr@thyrsus.com> | 2005-06-15 17:28:40 +0000 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 2005-06-15 17:28:40 +0000 |
commit | 14bd6c57b9e479354eb0f60bae79dc274d54f0cb (patch) | |
tree | 7397271bf5bef76b4545e574cb523eca982cf40d | |
parent | d7aa3db02d43fc7c123a2d3300116611ca835aa3 (diff) | |
download | gpsd-14bd6c57b9e479354eb0f60bae79dc274d54f0cb.tar.gz |
New packet-return API using newdata and explicit merging.
-rw-r--r-- | HACKING | 13 | ||||
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | garmin.c | 46 | ||||
-rw-r--r-- | geoid.c | 14 | ||||
-rw-r--r-- | gps.h | 19 | ||||
-rw-r--r-- | gpsd.h | 1 | ||||
-rw-r--r-- | gpsutils.c | 50 | ||||
-rw-r--r-- | gpsutils.h | 10 | ||||
-rw-r--r-- | libgps.c | 17 | ||||
-rw-r--r-- | libgpsd_core.c | 22 | ||||
-rw-r--r-- | nmea_parse.c | 68 | ||||
-rw-r--r-- | sirf.c | 82 | ||||
-rw-r--r-- | sirfmon.c | 1 | ||||
-rw-r--r-- | test/magellan315.log.chk | 2 | ||||
-rw-r--r-- | test/oncore.log.chk | 12 | ||||
-rw-r--r-- | test/tn204.log.chk | 2 | ||||
-rw-r--r-- | tsip.c | 88 | ||||
-rw-r--r-- | zodiac.c | 34 |
18 files changed, 264 insertions, 218 deletions
@@ -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 @@ -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 @@ -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 @@ -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 */ @@ -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 @@ -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); @@ -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; } @@ -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; } @@ -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 @@ -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: @@ -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); |