diff options
-rw-r--r-- | gps.h | 2 | ||||
-rwxr-xr-x | gps/gps.py | 88 | ||||
-rw-r--r-- | libgps_core.c | 158 |
3 files changed, 21 insertions, 227 deletions
@@ -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 @@ -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; |