summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gps.h2
-rwxr-xr-xgps/gps.py88
-rw-r--r--libgps_core.c158
3 files changed, 21 insertions, 227 deletions
diff --git a/gps.h b/gps.h
index 391312fd..b3dbc7e0 100644
--- a/gps.h
+++ b/gps.h
@@ -949,7 +949,7 @@ struct gps_data_t {
#define VERSION_SET 0x00000800u
#define HERR_SET 0x00001000u
#define VERR_SET 0x00002000u
-#define PERR_SET 0x00004000u
+#define UNUSED1_SET 0x00004000u /* unused and reserved */
#define POLICY_SET 0x00008000u
#define SATELLITE_SET 0x00010000u
#define RAW_SET 0x00020000u
diff --git a/gps/gps.py b/gps/gps.py
index af0f7cd9..639db851 100755
--- a/gps/gps.py
+++ b/gps/gps.py
@@ -33,24 +33,25 @@ DOP_SET = 0x00000400
VERSION_SET = 0x00000800
HERR_SET = 0x00001000
VERR_SET = 0x00002000
-PERR_SET = 0x00004000
-POLICY_SET = 0x00020000
-ERR_SET = (HERR_SET|VERR_SET|PERR_SET)
-SATELLITE_SET = 0x00040000
-RAW_SET = 0x00080000
-USED_SET = 0x00100000
-SPEEDERR_SET = 0x00200000
-TRACKERR_SET = 0x00400000
-CLIMBERR_SET = 0x00800000
-DEVICE_SET = 0x01000000
-DEVICELIST_SET = 0x02000000
-DEVICEID_SET = 0x04000000
-ERROR_SET = 0x08000000
-RTCM2_SET = 0x10000000
-RTCM3_SET = 0x20000000
-AIS_SET = 0x40000000
-PACKET_SET = 0x80000000
-DATA_SET = ~(ONLINE_SET|PACKET_SET)
+UNUSED1_SET = 0x00004000
+POLICY_SET = 0x00008000
+SATELLITE_SET = 0x00010000
+RAW_SET = 0x00020000
+USED_SET = 0x00040000
+SPEEDERR_SET = 0x00080000
+TRACKERR_SET = 0x00100000
+CLIMBERR_SET = 0x00200000
+DEVICE_SET = 0x00400000
+DEVICELIST_SET = 0x00800000
+DEVICEID_SET = 0x01000000
+ERROR_SET = 0x02000000
+RTCM2_SET = 0x04000000
+RTCM3_SET = 0x08000000
+AIS_SET = 0x10000000
+PACKET_SET = 0x20000000
+ATTITUDE_SET = 0x40000000
+AUXDATA_SET = 0x80000000
+UNION_SET = (RTCM2_SET|RTCM3_SET|AIS_SET|VERSION_SET|DEVICELIST_SET|ERROR_SET)
STATUS_NO_FIX = 0
STATUS_FIX = 1
@@ -250,39 +251,10 @@ class gps(gpsdata):
data = field[2:]
if data[0] == "?":
continue
- if cmd == 'A':
- self.fix.altitude = float(data)
- self.valid |= ALTITUDE_SET
- elif cmd == 'B':
- parts = data.split()
- self.baudrate = int(parts[0])
- self.stopbits = int(parts[3])
- elif cmd == 'C':
- parts = data.split()
- if len(parts) == 2:
- (self.cycle, self.mincycle) = map(float, parts)
- else:
- self.mincycle = self.cycle = float(data)
- elif cmd == 'D':
- self.utc = data
- self.fix.time = isotime(self.utc)
- self.valid |= TIME_SET
- elif cmd == 'E':
- parts = data.split()
- (self.epe, eph, self.fix.epv) = map(float, parts)
- self.epx = self.epy = eph
- self.valid |= HERR_SET | VERR_SET | PERR_SET
- elif cmd == 'F':
+ if cmd == 'F':
self.device = data
elif cmd == 'I':
self.gps_id = data
- elif cmd == 'K':
- self.devices = data[1:].split()
- elif cmd == 'M':
- self.fix.mode = int(data)
- self.valid |= MODE_SET
- elif cmd == 'N':
- self.driver_mode = int(data)
elif cmd == 'O':
fields = data.split()
if fields[0] == '?':
@@ -328,26 +300,6 @@ class gps(gpsdata):
else:
self.fix.mode = MODE_3D
self.valid |= MODE_SET
- elif cmd == 'P':
- (self.fix.latitude, self.fix.longitude) = map(float, data.split())
- self.valid |= LATLON_SET
- elif cmd == 'Q':
- parts = data.split()
- self.satellites_used = int(parts[0])
- (self.pdop, self.hdop, self.vdop, self.tdop, self.gdop) = map(float, parts[1:])
- self.valid |= HDOP_SET | VDOP_SET | PDOP_SET | TDOP_SET | GDOP_SET
- elif cmd == 'S':
- self.status = int(data)
- self.valid |= STATUS_SET
- elif cmd == 'T':
- self.fix.track = float(data)
- self.valid |= TRACK_SET
- elif cmd == 'U':
- self.fix.climb = float(data)
- self.valid |= CLIMB_SET
- elif cmd == 'V':
- self.fix.speed = float(data)
- self.valid |= SPEED_SET
elif cmd == 'X':
self.online = float(data)
self.valid |= ONLINE_SET
diff --git a/libgps_core.c b/libgps_core.c
index e0e5cd16..c4af870c 100644
--- a/libgps_core.c
+++ b/libgps_core.c
@@ -268,7 +268,6 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
/* unpack a gpsd response into a status structure, buf must be writeable */
{
char *ns, *sp, *tp;
- int i;
libgps_debug_trace((1, "gps_unpack(%s)\n", buf));
@@ -335,58 +334,6 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
/* note, there's a bit of skip logic after the switch */
switch (*sp) {
- case 'A':
- if (sp[2] == '?') {
- gpsdata->fix.altitude = NAN;
- } else {
- (void)sscanf(sp, "A=%lf", &gpsdata->fix.altitude);
- gpsdata->set |= ALTITUDE_SET;
- }
- break;
- case 'B':
- if (sp[2] == '?') {
- gpsdata->dev.baudrate = gpsdata->dev.stopbits = 0;
- } else
- (void)sscanf(sp, "B=%u %*d %*s %u",
- &gpsdata->dev.baudrate,
- &gpsdata->dev.stopbits);
- break;
- case 'C':
- if (sp[2] == '?')
- gpsdata->dev.mincycle = gpsdata->dev.cycle = 0;
- else {
- if (sscanf(sp, "C=%lf %lf",
- &gpsdata->dev.cycle,
- &gpsdata->dev.mincycle) < 2)
- gpsdata->dev.mincycle = gpsdata->dev.cycle;
- }
- break;
- case 'D':
- if (sp[2] == '?')
- gpsdata->fix.time = NAN;
- else {
- gpsdata->fix.time = iso8601_to_unix(sp + 2);
- gpsdata->set |= TIME_SET;
- }
- break;
- case 'E':
- gpsdata->epe = gpsdata->fix.epx = gpsdata->fix.epy =
- gpsdata->fix.epv = NAN;
- /* epe should always be present if eph or epv is */
- if (sp[2] != '?') {
- char epe[20], eph[20], epv[20];
- (void)sscanf(sp, "E=%s %s %s", epe, eph, epv);
-#define DEFAULT(val) (val[0] == '?') ? NAN : atof(val)
- /*@ +floatdouble @*/
- gpsdata->epe = DEFAULT(epe);
- gpsdata->fix.epx = DEFAULT(eph) / sqrt(2);
- gpsdata->fix.epy = DEFAULT(eph) / sqrt(2);
- gpsdata->fix.epv = DEFAULT(epv);
- /*@ -floatdouble @*/
-#undef DEFAULT
- gpsdata->set |= PERR_SET | HERR_SET | VERR_SET;
- }
- break;
case 'F': /*@ -mustfreeonly */
if (sp[2] == '?')
gpsdata->dev.path[0] = '\0';
@@ -410,48 +357,6 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
}
/*@ +mustfreeonly */
break;
- case 'K':
- /* *INDENT-OFF* */
- /*@ -nullpass -mustfreeonly -dependenttrans@*/
- if (sp[2] != '?') {
- char *rc = strdup(sp);
- char *sp2 = rc;
- char *ns2 = ns;
- memset(&gpsdata->devices, '\0',
- sizeof(gpsdata->devices));
- gpsdata->devices.ndevices =
- (int)strtol(sp2 + 2, &sp2, 10);
- (void)strlcpy(gpsdata->devices.list[0].path,
- strtok_r(sp2 + 1, " \r\n", &ns2),
- sizeof(gpsdata->devices.list[0].path));
- i = 0;
- while ((sp2 =
- strtok_r(NULL, " \r\n", &ns2)) != NULL)
- if (i < MAXUSERDEVS - 1)
- (void)strlcpy(gpsdata->devices.list[++i].
- path, sp2,
- sizeof(gpsdata->devices.list[0].path));
- free(rc);
- gpsdata->set |= DEVICELIST_SET;
- gpsdata->devices.time = timestamp();
- }
- /*@ +nullpass +mustfreeonly +dependenttrans@*/
- /* *INDENT-ON* */
- break;
- case 'M':
- if (sp[2] == '?') {
- gpsdata->fix.mode = MODE_NOT_SEEN;
- } else {
- gpsdata->fix.mode = atoi(sp + 2);
- gpsdata->set |= MODE_SET;
- }
- break;
- case 'N':
- if (sp[2] == '?')
- gpsdata->dev.driver_mode = MODE_NMEA;
- else
- gpsdata->dev.driver_mode = atoi(sp + 2);
- break;
case 'O':
if (sp[2] == '?') {
gpsdata->set = MODE_SET | STATUS_SET;
@@ -519,69 +424,6 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
}
}
break;
- case 'P':
- if (sp[2] == '?') {
- gpsdata->fix.latitude = NAN;
- gpsdata->fix.longitude = NAN;
- } else {
- (void)sscanf(sp, "P=%lf %lf",
- &gpsdata->fix.latitude,
- &gpsdata->fix.longitude);
- gpsdata->set |= LATLON_SET;
- }
- break;
- case 'Q':
- if (sp[2] == '?') {
- gpsdata->satellites_used = 0;
- gpsdata->dop.pdop = 0;
- gpsdata->dop.hdop = 0;
- gpsdata->dop.vdop = 0;
- } else {
- (void)sscanf(sp, "Q=%d %lf %lf %lf %lf %lf",
- &gpsdata->satellites_used,
- &gpsdata->dop.pdop,
- &gpsdata->dop.hdop,
- &gpsdata->dop.vdop,
- &gpsdata->dop.tdop,
- &gpsdata->dop.gdop);
- gpsdata->set |= DOP_SET;
- }
- break;
- case 'S':
- if (sp[2] == '?') {
- gpsdata->status = -1;
- } else {
- gpsdata->status = atoi(sp + 2);
- gpsdata->set |= STATUS_SET;
- }
- break;
- case 'T':
- if (sp[2] == '?') {
- gpsdata->fix.track = NAN;
- } else {
- (void)sscanf(sp, "T=%lf", &gpsdata->fix.track);
- gpsdata->set |= TRACK_SET;
- }
- break;
- case 'U':
- if (sp[2] == '?') {
- gpsdata->fix.climb = NAN;
- } else {
- (void)sscanf(sp, "U=%lf", &gpsdata->fix.climb);
- gpsdata->set |= CLIMB_SET;
- }
- break;
- case 'V':
- if (sp[2] == '?') {
- gpsdata->fix.speed = NAN;
- } else {
- (void)sscanf(sp, "V=%lf", &gpsdata->fix.speed);
- /* V reply is in kt, fix.speed is in metres/sec */
- gpsdata->fix.speed =
- gpsdata->fix.speed / MPS_TO_KNOTS;
- gpsdata->set |= SPEED_SET;
- }
- break;
case 'X':
if (sp[2] == '?')
gpsdata->online = -1;