summaryrefslogtreecommitdiff
path: root/libgps_core.c
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2010-04-14 12:39:12 -0400
committerEric S. Raymond <esr@thyrsus.com>2010-04-14 12:39:12 -0400
commit63c2738bc05e04155ebdedf946c4827199ce930b (patch)
tree783847f2ae0fd980cc5a107c7e1712522cf4c635 /libgps_core.c
parente7c662783da8028022ef2e5fd4ba6a50f693b13c (diff)
downloadgpsd-63c2738bc05e04155ebdedf946c4827199ce930b.tar.gz
Client library core reindented. cgps passes live test.
Diffstat (limited to 'libgps_core.c')
-rw-r--r--libgps_core.c398
1 files changed, 220 insertions, 178 deletions
diff --git a/libgps_core.c b/libgps_core.c
index 85f89908..d47aace5 100644
--- a/libgps_core.c
+++ b/libgps_core.c
@@ -32,7 +32,7 @@
#if defined (HAVE_SYS_SELECT_H)
#include <sys/select.h>
#endif
-#else
+#else
#include <QTcpSocket>
#endif /* USE_QT */
@@ -44,7 +44,8 @@ extern char *strtok_r(char *, const char *, char **);
#define LIBGPS_DEBUG
#endif /* defined(TESTMAIN) || defined(CLIENTDEBUG_ENABLE) */
-struct privdata_t {
+struct privdata_t
+{
bool newstyle;
ssize_t waiting;
char buffer[GPS_JSON_RESPONSE_MAX * 2];
@@ -52,21 +53,21 @@ struct privdata_t {
#define PRIVATE(gpsdata) ((struct privdata_t *)gpsdata->privdata)
#ifdef LIBGPS_DEBUG
-static int debuglevel = 0;
+static int debuglevel = 0;
static int waitcount = 0;
static FILE *debugfp;
-void gps_enable_debug(int level, FILE *fp)
+void gps_enable_debug(int level, FILE * fp)
/* control the level and destination of debug trace messages */
{
debuglevel = level;
debugfp = fp;
#ifdef CLIENTDEBUG_ENABLE
- json_enable_debug(level-2, fp);
+ json_enable_debug(level - 2, fp);
#endif
}
-static void gps_trace(int errlevel, const char *fmt, ... )
+static void gps_trace(int errlevel, const char *fmt, ...)
/* assemble command in printf(3) style */
{
if (errlevel <= debuglevel) {
@@ -74,8 +75,9 @@ static void gps_trace(int errlevel, const char *fmt, ... )
va_list ap;
(void)strlcpy(buf, "libgps: ", BUFSIZ);
- va_start(ap, fmt) ;
- (void)vsnprintf(buf + strlen(buf), sizeof(buf)-strlen(buf), fmt, ap);
+ va_start(ap, fmt);
+ (void)vsnprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), fmt,
+ ap);
va_end(ap);
(void)fputs(buf, debugfp);
@@ -89,7 +91,7 @@ static void gps_trace(int errlevel, const char *fmt, ... )
/*@-nullderef@*/
int gps_open_r(const char *host, const char *port,
- /*@out@*/struct gps_data_t *gpsdata)
+ /*@out@*/ struct gps_data_t *gpsdata)
{
/*@ -branchstate @*/
if (!gpsdata)
@@ -99,21 +101,22 @@ int gps_open_r(const char *host, const char *port,
if (!port)
port = DEFAULT_GPSD_PORT;
- libgps_debug_trace((1, "gps_open_r(%s, %s)\n", host, port));
+ libgps_debug_trace((1, "gps_open_r(%s, %s)\n", host, port));
#ifndef USE_QT
- if ((gpsdata->gps_fd = netlib_connectsock(AF_UNSPEC, host, port, "tcp")) < 0) {
+ if ((gpsdata->gps_fd =
+ netlib_connectsock(AF_UNSPEC, host, port, "tcp")) < 0) {
errno = gpsdata->gps_fd;
return -1;
}
#else
- QTcpSocket* sock = new QTcpSocket();
+ QTcpSocket *sock = new QTcpSocket();
gpsdata->gps_fd = sock;
sock->connectToHost(host, QString(port).toInt());
if (!sock->waitForConnected())
- qDebug() << "libgps::connect error: " << sock->errorString();
+ qDebug() << "libgps::connect error: " << sock->errorString();
else
- qDebug() << "libgps::connected!";
+ qDebug() << "libgps::connected!";
#endif
gpsdata->set = 0;
@@ -126,7 +129,7 @@ int gps_open_r(const char *host, const char *port,
return -1;
PRIVATE(gpsdata)->newstyle = false;
PRIVATE(gpsdata)->waiting = 0;
- /*@i2@*/PRIVATE(gpsdata)->buffer[0] = '\0';
+ /*@i2@*/ PRIVATE(gpsdata)->buffer[0] = '\0';
return 0;
/*@ +branchstate @*/
@@ -140,8 +143,9 @@ struct gps_data_t *gps_open(const char *host, const char *port)
if (gps_open_r(host, port, &gpsdata) == -1)
return NULL;
else
- return &gpsdata;
+ return &gpsdata;
}
+
/*@+compmempass +immediatetrans@*/
/*@-compdef -usereleased@*/
@@ -154,18 +158,19 @@ int gps_close(struct gps_data_t *gpsdata)
(void)close(gpsdata->gps_fd);
gpsdata->gps_fd = -1;
#else
- QTcpSocket* sock = (QTcpSocket*)gpsdata->gps_fd;
+ QTcpSocket *sock = (QTcpSocket *) gpsdata->gps_fd;
sock->disconnectFromHost();
delete sock;
gpsdata->gps_fd = NULL;
#endif
-
+
return 0;
}
+
/*@+compdef +usereleased@*/
void gps_set_raw_hook(struct gps_data_t *gpsdata,
- void (*hook)(struct gps_data_t *, char *, size_t len))
+ void (*hook) (struct gps_data_t *, char *, size_t len))
{
gpsdata->raw_hook = hook;
}
@@ -173,12 +178,12 @@ void gps_set_raw_hook(struct gps_data_t *gpsdata,
#ifdef LIBGPS_DEBUG
static void libgps_dump_state(struct gps_data_t *collect, time_t now)
{
- char *status_values[] = {"NO_FIX", "FIX", "DGPS_FIX"};
- char *mode_values[] = {"", "NO_FIX", "MODE_2D", "MODE_3D"};
+ char *status_values[] = { "NO_FIX", "FIX", "DGPS_FIX" };
+ char *mode_values[] = { "", "NO_FIX", "MODE_2D", "MODE_3D" };
/* FIXME: We don't dump the entire state here yet */
#ifndef USE_QT
- (void)fprintf(debugfp, "flags: (0x%04x) %s\n",
+ (void)fprintf(debugfp, "flags: (0x%04x) %s\n",
collect->set, gps_maskdump(collect->set));
#endif
if (collect->set & ONLINE_SET)
@@ -186,11 +191,11 @@ static void libgps_dump_state(struct gps_data_t *collect, time_t now)
if (collect->set & TIME_SET)
(void)fprintf(debugfp, "TIME: %lf\n", collect->fix.time);
if (collect->set & LATLON_SET)
- (void)fprintf(debugfp, "LATLON: lat/lon: %lf %lf\n",
+ (void)fprintf(debugfp, "LATLON: lat/lon: %lf %lf\n",
collect->fix.latitude, collect->fix.longitude);
if (collect->set & ALTITUDE_SET)
(void)fprintf(debugfp, "ALTITUDE: altitude: %lf U: climb: %lf\n",
- collect->fix.altitude, collect->fix.climb);
+ collect->fix.altitude, collect->fix.climb);
if (collect->set & SPEED_SET)
(void)fprintf(debugfp, "SPEED: %lf\n", collect->fix.speed);
if (collect->set & TRACK_SET)
@@ -199,38 +204,44 @@ static void libgps_dump_state(struct gps_data_t *collect, time_t now)
(void)fprintf(debugfp, "CLIMB: climb: %lf\n", collect->fix.climb);
if (collect->set & STATUS_SET)
(void)fprintf(debugfp, "STATUS: status: %d (%s)\n",
- collect->status, status_values[collect->status]);
+ collect->status, status_values[collect->status]);
if (collect->set & MODE_SET)
(void)fprintf(debugfp, "MODE: mode: %d (%s)\n",
- collect->fix.mode, mode_values[collect->fix.mode]);
+ collect->fix.mode, mode_values[collect->fix.mode]);
if (collect->set & DOP_SET)
- (void)fprintf(debugfp, "DOP: satellites %d, pdop=%lf, hdop=%lf, vdop=%lf\n",
- collect->satellites_used,
- collect->dop.pdop, collect->dop.hdop, collect->dop.vdop);
+ (void)fprintf(debugfp,
+ "DOP: satellites %d, pdop=%lf, hdop=%lf, vdop=%lf\n",
+ collect->satellites_used, collect->dop.pdop,
+ collect->dop.hdop, collect->dop.vdop);
if (collect->set & VERSION_SET)
(void)fprintf(debugfp, "VERSION: release=%s rev=%s proto=%d.%d\n",
- collect->version.release,
+ collect->version.release,
collect->version.rev,
- collect->version.proto_major,
+ collect->version.proto_major,
collect->version.proto_minor);
if (collect->set & POLICY_SET)
- (void)fprintf(debugfp, "POLICY: watcher=%s nmea=%s raw=%d scaled=%s timing=%s, devpath=%s\n",
- collect->policy.watcher ? "true" : "false",
+ (void)fprintf(debugfp,
+ "POLICY: watcher=%s nmea=%s raw=%d scaled=%s timing=%s, devpath=%s\n",
+ collect->policy.watcher ? "true" : "false",
collect->policy.nmea ? "true" : "false",
- collect->policy.raw,
- collect->policy.scaled ? "true" : "false",
- collect->policy.timing ? "true" : "false",
+ collect->policy.raw,
+ collect->policy.scaled ? "true" : "false",
+ collect->policy.timing ? "true" : "false",
collect->policy.devpath);
if (collect->set & SATELLITE_SET) {
int i;
- (void)fprintf(debugfp, "SKY: satellites in view: %d\n", collect->satellites_visible);
+ (void)fprintf(debugfp, "SKY: satellites in view: %d\n",
+ collect->satellites_visible);
for (i = 0; i < collect->satellites_visible; i++) {
- (void)fprintf(debugfp, " %2.2d: %2.2d %3.3d %3.0f %c\n", collect->PRN[i], collect->elevation[i], collect->azimuth[i], collect->ss[i], collect->used[i]? 'Y' : 'N');
+ (void)fprintf(debugfp, " %2.2d: %2.2d %3.3d %3.0f %c\n",
+ collect->PRN[i], collect->elevation[i],
+ collect->azimuth[i], collect->ss[i],
+ collect->used[i] ? 'Y' : 'N');
}
}
if (collect->set & DEVICE_SET)
- (void)fprintf(debugfp, "DEVICE: Device is '%s', driver is '%s'\n",
+ (void)fprintf(debugfp, "DEVICE: Device is '%s', driver is '%s'\n",
collect->dev.path, collect->dev.driver);
#ifdef OLDSTYLE_ENABLE
if (collect->set & DEVICEID_SET)
@@ -238,10 +249,11 @@ static void libgps_dump_state(struct gps_data_t *collect, time_t now)
#endif /* OLDSTYLE_ENABLE */
if (collect->set & DEVICELIST_SET) {
int i;
- (void)fprintf(debugfp, "DEVICELIST:%d devices:\n", collect->devices.ndevices);
+ (void)fprintf(debugfp, "DEVICELIST:%d devices:\n",
+ collect->devices.ndevices);
for (i = 0; i < collect->devices.ndevices; i++) {
- (void)fprintf(debugfp, "%d: path='%s' driver='%s'\n",
- collect->devices.ndevices,
+ (void)fprintf(debugfp, "%d: path='%s' driver='%s'\n",
+ collect->devices.ndevices,
collect->devices.list[i].path,
collect->devices.list[i].driver);
}
@@ -264,9 +276,8 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
if (buf[0] == '{') {
const char *jp = buf, **next = &jp;
while (next != NULL && *next != NULL && next[0][0] != '\0') {
- libgps_debug_trace((1,
- "gps_unpack() segment parse '%s'\n",
- *next));
+ libgps_debug_trace((1,
+ "gps_unpack() segment parse '%s'\n", *next));
if (libgps_json_unpack(*next, gpsdata, next) == -1)
break;
#ifdef LIBGPS_DEBUG
@@ -281,8 +292,7 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
#endif /* OLDSTYLE_ENABLE */
}
#ifdef OLDSTYLE_ENABLE
- else
- {
+ else {
/*
* Get the decimal separator for the current application locale.
* This looks thread-unsafe, but it's not. The key is that
@@ -295,11 +305,11 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
decimal_point = locale_data->decimal_point[0];
}
- for (ns = buf; ns; ns = strstr(ns+1, "GPSD")) {
- if (/*@i1@*/strncmp(ns, "GPSD", 4) == 0) {
+ for (ns = buf; ns; ns = strstr(ns + 1, "GPSD")) {
+ if ( /*@i1@*/ strncmp(ns, "GPSD", 4) == 0) {
bool eol = false;
/* the following should execute each time we have a good next sp */
- for (sp = ns + 5; *sp != '\0'; sp = tp+1) {
+ for (sp = ns + 5; *sp != '\0'; sp = tp + 1) {
tp = sp + strcspn(sp, ",\r\n");
eol = *tp == '\r' || *tp == '\n';
if (*tp == '\0')
@@ -327,7 +337,7 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
switch (*sp) {
case 'A':
if (sp[2] == '?') {
- gpsdata->fix.altitude = NAN;
+ gpsdata->fix.altitude = NAN;
} else {
(void)sscanf(sp, "A=%lf", &gpsdata->fix.altitude);
gpsdata->set |= ALTITUDE_SET;
@@ -338,14 +348,15 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
gpsdata->dev.baudrate = gpsdata->dev.stopbits = 0;
} else
(void)sscanf(sp, "B=%u %*d %*s %u",
- &gpsdata->dev.baudrate, &gpsdata->dev.stopbits);
+ &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.cycle,
&gpsdata->dev.mincycle) < 2)
gpsdata->dev.mincycle = gpsdata->dev.cycle;
}
@@ -354,33 +365,35 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
if (sp[2] == '?')
gpsdata->fix.time = NAN;
else {
- gpsdata->fix.time = iso8601_to_unix(sp+2);
+ 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;
+ 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 @*/
+ /*@ +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;
+ gpsdata->set |= PERR_SET | HERR_SET | VERR_SET;
}
break;
- case 'F': /*@ -mustfreeonly */
+ case 'F': /*@ -mustfreeonly */
if (sp[2] == '?')
gpsdata->dev.path[0] = '\0';
else {
/*@ -mayaliasunique @*/
- strncpy(gpsdata->dev.path, sp+2, sizeof(gpsdata->dev.path));
+ strncpy(gpsdata->dev.path, sp + 2,
+ sizeof(gpsdata->dev.path));
/*@ +mayaliasunique @*/
gpsdata->set |= DEVICE_SET;
}
@@ -391,7 +404,8 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
if (sp[2] == '?')
gpsdata->dev.subtype[0] = '\0';
else {
- (void)strlcpy(gpsdata->dev.subtype, sp+2, sizeof(gpsdata->dev.subtype));
+ (void)strlcpy(gpsdata->dev.subtype, sp + 2,
+ sizeof(gpsdata->dev.subtype));
gpsdata->set |= DEVICEID_SET;
}
/*@ +mustfreeonly */
@@ -402,17 +416,22 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
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);
+ 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));
+ 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));
+ 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();
@@ -423,7 +442,7 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
if (sp[2] == '?') {
gpsdata->fix.mode = MODE_NOT_SEEN;
} else {
- gpsdata->fix.mode = atoi(sp+2);
+ gpsdata->fix.mode = atoi(sp + 2);
gpsdata->set |= MODE_SET;
}
break;
@@ -431,7 +450,7 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
if (sp[2] == '?')
gpsdata->dev.driver_mode = MODE_NMEA;
else
- gpsdata->dev.driver_mode = atoi(sp+2);
+ gpsdata->dev.driver_mode = atoi(sp + 2);
break;
case 'O':
if (sp[2] == '?') {
@@ -440,17 +459,19 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
gps_clear_fix(&gpsdata->fix);
} else {
struct gps_fix_t nf;
- char tag[MAXTAGLEN+1], alt[20];
- char eph[20], epv[20], track[20],speed[20], climb[20];
+ char tag[MAXTAGLEN + 1], alt[20];
+ char eph[20], epv[20], track[20], speed[20],
+ climb[20];
char epd[20], eps[20], epc[20], mode[2];
char timestr[20], ept[20], lat[20], lon[20];
- int st = sscanf(sp+2,
- "%8s %19s %19s %19s %19s %19s %19s %19s %19s %19s %19s %19s %19s %19s %1s",
- tag, timestr, ept, lat, lon,
- alt, eph, epv, track, speed, climb,
- epd, eps, epc, mode);
+ int st = sscanf(sp + 2,
+ "%8s %19s %19s %19s %19s %19s %19s %19s %19s %19s %19s %19s %19s %19s %1s",
+ tag, timestr, ept, lat, lon,
+ alt, eph, epv, track, speed,
+ climb,
+ epd, eps, epc, mode);
if (st >= 14) {
- #define DEFAULT(val) (val[0] == '?') ? NAN : atof(val)
+#define DEFAULT(val) (val[0] == '?') ? NAN : atof(val)
/*@ +floatdouble @*/
nf.time = DEFAULT(timestr);
nf.latitude = DEFAULT(lat);
@@ -458,7 +479,7 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
nf.ept = DEFAULT(ept);
nf.altitude = DEFAULT(alt);
/* designed before we split eph into epx+epy */
- nf.epx = nf.epy = DEFAULT(eph)/sqrt(2);
+ nf.epx = nf.epy = DEFAULT(eph) / sqrt(2);
nf.epv = DEFAULT(epv);
nf.track = DEFAULT(track);
nf.speed = DEFAULT(speed);
@@ -467,26 +488,32 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
nf.eps = DEFAULT(eps);
nf.epc = DEFAULT(epc);
/*@ -floatdouble @*/
- #undef DEFAULT
+#undef DEFAULT
if (st >= 15)
- nf.mode = (mode[0] == '?') ? MODE_NOT_SEEN : atoi(mode);
+ nf.mode =
+ (mode[0] ==
+ '?') ? MODE_NOT_SEEN : atoi(mode);
else
- nf.mode = (alt[0] == '?') ? MODE_2D : MODE_3D;
+ nf.mode =
+ (alt[0] == '?') ? MODE_2D : MODE_3D;
if (alt[0] != '?')
gpsdata->set |= ALTITUDE_SET | CLIMB_SET;
- if (isnan(nf.epx)==0 && isnan(nf.epy)==0)
+ if (isnan(nf.epx) == 0 && isnan(nf.epy) == 0)
gpsdata->set |= HERR_SET;
- if (isnan(nf.epv)==0)
+ if (isnan(nf.epv) == 0)
gpsdata->set |= VERR_SET;
- if (isnan(nf.track)==0)
+ if (isnan(nf.track) == 0)
gpsdata->set |= TRACK_SET | SPEED_SET;
- if (isnan(nf.eps)==0)
+ if (isnan(nf.eps) == 0)
gpsdata->set |= SPEEDERR_SET;
- if (isnan(nf.epc)==0)
+ if (isnan(nf.epc) == 0)
gpsdata->set |= CLIMBERR_SET;
gpsdata->fix = nf;
- (void)strlcpy(gpsdata->tag, tag, MAXTAGLEN+1);
- gpsdata->set |= TIME_SET|TIMERR_SET|LATLON_SET|MODE_SET;
+ (void)strlcpy(gpsdata->tag, tag,
+ MAXTAGLEN + 1);
+ gpsdata->set |=
+ TIME_SET | TIMERR_SET | LATLON_SET |
+ MODE_SET;
gpsdata->status = STATUS_FIX;
gpsdata->set |= STATUS_SET;
}
@@ -494,28 +521,29 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
break;
case 'P':
if (sp[2] == '?') {
- gpsdata->fix.latitude = NAN;
- gpsdata->fix.longitude = NAN;
+ gpsdata->fix.latitude = NAN;
+ gpsdata->fix.longitude = NAN;
} else {
(void)sscanf(sp, "P=%lf %lf",
- &gpsdata->fix.latitude, &gpsdata->fix.longitude);
+ &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;
+ 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->satellites_used,
+ &gpsdata->dop.pdop,
+ &gpsdata->dop.hdop,
+ &gpsdata->dop.vdop,
+ &gpsdata->dop.tdop,
+ &gpsdata->dop.gdop);
gpsdata->set |= DOP_SET;
}
break;
@@ -523,7 +551,7 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
if (sp[2] == '?') {
gpsdata->status = -1;
} else {
- gpsdata->status = atoi(sp+2);
+ gpsdata->status = atoi(sp + 2);
gpsdata->set |= STATUS_SET;
}
break;
@@ -549,7 +577,8 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
} 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->fix.speed =
+ gpsdata->fix.speed / MPS_TO_KNOTS;
gpsdata->set |= SPEED_SET;
}
break;
@@ -570,33 +599,42 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
int elevation[MAXCHANNELS], azimuth[MAXCHANNELS];
int used[MAXCHANNELS];
double ss[MAXCHANNELS], f4;
- char tag[MAXTAGLEN+1], timestamp[21];
+ char tag[MAXTAGLEN + 1], timestamp[21];
(void)sscanf(sp, "Y=%8s %20s %d ",
- tag, timestamp, &gpsdata->satellites_visible);
+ tag, timestamp,
+ &gpsdata->satellites_visible);
(void)strncpy(gpsdata->tag, tag, MAXTAGLEN);
if (timestamp[0] != '?') {
gpsdata->set |= TIME_SET;
}
for (j = 0; j < gpsdata->satellites_visible; j++) {
- PRN[j]=elevation[j]=azimuth[j]=used[j]=0;
- ss[j]=0.0;
+ PRN[j] = elevation[j] = azimuth[j] = used[j] =
+ 0;
+ ss[j] = 0.0;
}
- for (j = 0, gpsdata->satellites_used = 0; j < gpsdata->satellites_visible; j++) {
- if ((sp != NULL) && ((sp = strchr(sp, ':')) != NULL)) {
+ for (j = 0, gpsdata->satellites_used = 0;
+ j < gpsdata->satellites_visible; j++) {
+ if ((sp != NULL)
+ && ((sp = strchr(sp, ':')) != NULL)) {
sp++;
- (void)sscanf(sp, "%d %d %d %lf %d", &i1, &i2, &i3, &f4, &i5);
+ (void)sscanf(sp, "%d %d %d %lf %d", &i1,
+ &i2, &i3, &f4, &i5);
PRN[j] = i1;
- elevation[j] = i2; azimuth[j] = i3;
- ss[j] = f4; used[j] = i5;
+ elevation[j] = i2;
+ azimuth[j] = i3;
+ ss[j] = f4;
+ used[j] = i5;
if (i5 == 1)
gpsdata->satellites_used++;
}
}
/*@ -compdef @*/
memcpy(gpsdata->PRN, PRN, sizeof(PRN));
- memcpy(gpsdata->elevation, elevation, sizeof(elevation));
- memcpy(gpsdata->azimuth, azimuth,sizeof(azimuth));
+ memcpy(gpsdata->elevation, elevation,
+ sizeof(elevation));
+ memcpy(gpsdata->azimuth, azimuth,
+ sizeof(azimuth));
memcpy(gpsdata->ss, ss, sizeof(ss));
memcpy(gpsdata->used, used, sizeof(used));
/*@ +compdef @*/
@@ -629,14 +667,16 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
gpsdata->raw_hook(gpsdata, buf, strlen(buf));
}
#ifndef USE_QT
- libgps_debug_trace((1, "final flags: (0x%04x) %s\n", gpsdata->set, gpsd_maskdump(gpsdata->set)));
+ libgps_debug_trace((1, "final flags: (0x%04x) %s\n", gpsdata->set,
+ gpsd_maskdump(gpsdata->set)));
#endif
return 0;
}
+
/*@ +compdef @*/
/*@ -branchstate +usereleased +mustfreefresh +nullstate +usedef @*/
-bool gps_waiting(struct gps_data_t *gpsdata)
+bool gps_waiting(struct gps_data_t * gpsdata)
/* is there input waiting from the GPS? */
{
#ifndef USE_QT
@@ -649,11 +689,12 @@ bool gps_waiting(struct gps_data_t *gpsdata)
FD_ZERO(&rfds);
FD_SET(gpsdata->gps_fd, &rfds);
- tv.tv_sec = 0; tv.tv_usec = 1;
+ tv.tv_sec = 0;
+ tv.tv_usec = 1;
/* all error conditions return "not waiting" -- crude but effective */
- return (select(gpsdata->gps_fd+1, &rfds, NULL, NULL, &tv) == 1);
+ return (select(gpsdata->gps_fd + 1, &rfds, NULL, NULL, &tv) == 1);
#else
- return ((QTcpSocket*)(gpsdata->gps_fd))->waitForReadyRead(250);
+ return ((QTcpSocket *) (gpsdata->gps_fd))->waitForReadyRead(250);
#endif
}
@@ -666,24 +707,28 @@ int gps_poll(struct gps_data_t *gpsdata)
int status = -1;
struct privdata_t *priv = PRIVATE(gpsdata);
- gpsdata->set &=~ PACKET_SET;
- for (eol = priv->buffer; *eol != '\n' && eol < priv->buffer+priv->waiting; eol++)
+ gpsdata->set &= ~PACKET_SET;
+ for (eol = priv->buffer;
+ *eol != '\n' && eol < priv->buffer + priv->waiting; eol++)
continue;
if (*eol != '\n')
- eol = NULL;
+ eol = NULL;
if (eol == NULL) {
#ifndef USE_QT
/* read data: return -1 if no data waiting or buffered, 0 otherwise */
status = (int)recv(gpsdata->gps_fd,
priv->buffer + priv->waiting,
- sizeof(priv->buffer)-priv->waiting,
- 0);
+ sizeof(priv->buffer) - priv->waiting, 0);
#else
- status = ((QTcpSocket*)(gpsdata->gps_fd))->read(priv->buffer + priv->waiting, sizeof(priv->buffer)-priv->waiting);
+ status =
+ ((QTcpSocket *) (gpsdata->gps_fd))->read(priv->buffer +
+ priv->waiting,
+ sizeof(priv->buffer) -
+ priv->waiting);
#endif
- /* if we just received data from the socket, it's in the buffer */
+ /* if we just received data from the socket, it's in the buffer */
if (status > -1)
priv->waiting += status;
/* buffer is empty - implies no data was read */
@@ -696,15 +741,17 @@ int gps_poll(struct gps_data_t *gpsdata)
return -1;
#ifndef USE_QT
/* count transient errors as success, we'll retry later */
- else if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)
+ else if (errno == EINTR || errno == EAGAIN
+ || errno == EWOULDBLOCK)
return 0;
#endif
/* hard error return of -1, pass it along */
else
return -1;
}
- /* there's buffered data waiting to be returned */
- for (eol = priv->buffer; *eol != '\n' && eol < priv->buffer+priv->waiting; eol++)
+ /* there's buffered data waiting to be returned */
+ for (eol = priv->buffer;
+ *eol != '\n' && eol < priv->buffer + priv->waiting; eol++)
continue;
if (*eol != '\n')
eol = NULL;
@@ -719,9 +766,8 @@ int gps_poll(struct gps_data_t *gpsdata)
received = gpsdata->online = timestamp();
status = gps_unpack(priv->buffer, gpsdata);
/*@+matchanyintegral@*/
- memmove(priv->buffer,
- priv->buffer + response_length,
- priv->waiting - response_length);
+ memmove(priv->buffer,
+ priv->buffer + response_length, priv->waiting - response_length);
/*@-matchanyintegral@*/
priv->waiting -= response_length;
gpsdata->set |= PACKET_SET;
@@ -729,53 +775,51 @@ int gps_poll(struct gps_data_t *gpsdata)
return 0;
}
-int gps_send(struct gps_data_t *gpsdata, const char *fmt, ... )
+int gps_send(struct gps_data_t *gpsdata, const char *fmt, ...)
/* send a command to the gpsd instance */
{
char buf[BUFSIZ];
va_list ap;
va_start(ap, fmt);
- (void)vsnprintf(buf, sizeof(buf)-2, fmt, ap);
+ (void)vsnprintf(buf, sizeof(buf) - 2, fmt, ap);
va_end(ap);
- if (buf[strlen(buf)-1] != '\n')
+ if (buf[strlen(buf) - 1] != '\n')
(void)strlcat(buf, "\n", BUFSIZ);
#ifndef USE_QT
- if (write(gpsdata->gps_fd, buf, strlen(buf)) == (ssize_t)strlen(buf))
+ if (write(gpsdata->gps_fd, buf, strlen(buf)) == (ssize_t) strlen(buf))
return 0;
else
return -1;
#else
- QTcpSocket* sock = (QTcpSocket*)gpsdata->gps_fd;
+ QTcpSocket *sock = (QTcpSocket *) gpsdata->gps_fd;
sock->write(buf, strlen(buf));
if (sock->waitForBytesWritten())
- return 0;
+ return 0;
else {
- qDebug() << "libgps::send error: " << sock->errorString();
- return -1;
+ qDebug() << "libgps::send error: " << sock->errorString();
+ return -1;
}
#endif
}
-int gps_stream(struct gps_data_t *gpsdata,
- unsigned int flags,
- /*@null@*/void *d)
+int gps_stream(struct gps_data_t *gpsdata, unsigned int flags,
+ /*@null@*/ void *d)
/* ask gpsd to stream reports at you, hiding the command details */
{
char buf[GPS_JSON_COMMAND_MAX];
- if ((flags & (WATCH_JSON|WATCH_OLDSTYLE|WATCH_NMEA|WATCH_RAW))== 0) {
+ if ((flags & (WATCH_JSON | WATCH_OLDSTYLE | WATCH_NMEA | WATCH_RAW)) == 0) {
flags |= WATCH_JSON;
}
-
#ifndef USE_QT
if (flags & POLL_NONBLOCK)
- (void)fcntl(gpsdata->gps_fd, F_SETFL, O_NONBLOCK);
+ (void)fcntl(gpsdata->gps_fd, F_SETFL, O_NONBLOCK);
#endif
if ((flags & WATCH_DISABLE) != 0) {
if ((flags & WATCH_OLDSTYLE) != 0) {
(void)strlcpy(buf, "w-", sizeof(buf));
- if (gpsdata->raw_hook != NULL || (flags & WATCH_NMEA)!=0)
+ if (gpsdata->raw_hook != NULL || (flags & WATCH_NMEA) != 0)
(void)strlcat(buf, "r-", sizeof(buf));
} else {
(void)strlcpy(buf, "?WATCH={\"enable\":false,", sizeof(buf));
@@ -789,16 +833,17 @@ int gps_stream(struct gps_data_t *gpsdata,
(void)strlcat(buf, "\"raw\":0,", sizeof(buf));
if (flags & WATCH_SCALED)
(void)strlcat(buf, "\"scaled\":false,", sizeof(buf));
- if (buf[strlen(buf)-1] == ',')
- buf[strlen(buf)-1] = '\0';
+ if (buf[strlen(buf) - 1] == ',')
+ buf[strlen(buf) - 1] = '\0';
(void)strlcat(buf, "};", sizeof(buf));
}
libgps_debug_trace((1, "gps_stream() disable command: %s\n", buf));
return gps_send(gpsdata, buf);
- } else /* if ((flags & WATCH_ENABLE) != 0) */{
+ } else { /* if ((flags & WATCH_ENABLE) != 0) */
+
if ((flags & WATCH_OLDSTYLE) != 0) {
(void)strlcpy(buf, "w+x", sizeof(buf));
- if (gpsdata->raw_hook != NULL || (flags & WATCH_NMEA)!=0)
+ if (gpsdata->raw_hook != NULL || (flags & WATCH_NMEA) != 0)
(void)strlcat(buf, "r+", sizeof(buf));
} else {
(void)strlcpy(buf, "?WATCH={\"enable\":true,", sizeof(buf));
@@ -814,11 +859,11 @@ int gps_stream(struct gps_data_t *gpsdata,
(void)strlcat(buf, "\"scaled\":true,", sizeof(buf));
/*@-nullpass@*//* shouldn't be needed, splint has a bug */
if (flags & WATCH_DEVICE)
- (void)snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf),
- "\"device\":%s,", (char*)d);
+ (void)snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
+ "\"device\":%s,", (char *)d);
/*@+nullpass@*/
- if (buf[strlen(buf)-1] == ',')
- buf[strlen(buf)-1] = '\0';
+ if (buf[strlen(buf) - 1] == ',')
+ buf[strlen(buf) - 1] = '\0';
(void)strlcat(buf, "};", sizeof(buf));
}
libgps_debug_trace((1, "gps_stream() enable command: %s\n", buf));
@@ -833,7 +878,7 @@ extern char /*@observer@*/ *gps_errstr(const int err)
* protocol compatibility checks
*/
#ifndef USE_QT
- return netlib_errstr(err);
+ return netlib_errstr(err);
#else
return "";
#endif
@@ -845,7 +890,7 @@ extern char /*@observer@*/ *gps_errstr(const int err)
* Not really useful for anything but debugging.
*/
-static void dumpline(struct gps_data_t *ud UNUSED,
+static void dumpline(struct gps_data_t *ud UNUSED,
char *buf, size_t ulen UNUSED)
{
puts(buf);
@@ -883,16 +928,14 @@ int main(int argc, char *argv[])
batchmode = true;
break;
case 's':
- (void)printf("Sizes: gpsdata=%zd rtcm2=%zd rtcm3=%zd ais=%zd compass=%zd raw=%zd devices=%zd policy=%zd version=%zd\n",
- sizeof(struct gps_data_t),
- sizeof(struct rtcm2_t),
- sizeof(struct rtcm3_t),
- sizeof(struct ais_t),
- sizeof(struct attitude_t),
- sizeof(struct rawdata_t),
- sizeof(collect->devices),
- sizeof(struct policy_t),
- sizeof(struct version_t));
+ (void)
+ printf
+ ("Sizes: gpsdata=%zd rtcm2=%zd rtcm3=%zd ais=%zd compass=%zd raw=%zd devices=%zd policy=%zd version=%zd\n",
+ sizeof(struct gps_data_t), sizeof(struct rtcm2_t),
+ sizeof(struct rtcm3_t), sizeof(struct ais_t),
+ sizeof(struct attitude_t), sizeof(struct rawdata_t),
+ sizeof(collect->devices), sizeof(struct policy_t),
+ sizeof(struct version_t));
exit(0);
case 'D':
debug = atoi(optarg);
@@ -919,13 +962,13 @@ int main(int argc, char *argv[])
} else if (optind < argc) {
gps_set_raw_hook(collect, dumpline);
strlcpy(buf, argv[optind], BUFSIZ);
- strlcat(buf,"\n", BUFSIZ);
+ strlcat(buf, "\n", BUFSIZ);
gps_send(collect, buf);
gps_poll(collect);
libgps_dump_state(collect, time(NULL));
(void)gps_close(collect);
} else {
- int tty = isatty(0);
+ int tty = isatty(0);
gps_set_raw_hook(collect, dumpline);
if (tty)
@@ -948,8 +991,7 @@ int main(int argc, char *argv[])
return 0;
}
+
/*@-nullderef@*/
#endif /* TESTMAIN */
-
-