diff options
-rw-r--r-- | gpsd.c | 91 | ||||
-rw-r--r-- | gpsd.h-tail | 3 | ||||
-rw-r--r-- | libgpsd_core.c | 1 | ||||
-rw-r--r-- | net_dgpsip.c | 99 | ||||
-rw-r--r-- | net_gnss_dispatch.c | 15 | ||||
-rw-r--r-- | net_ntrip.c | 4 |
6 files changed, 98 insertions, 115 deletions
@@ -588,9 +588,6 @@ static void deactivate_device(struct gps_device_t *device) if (device->gpsdata.gps_fd != -1) { FD_CLR(device->gpsdata.gps_fd, &all_fds); adjust_max_fd(device->gpsdata.gps_fd, false); - if (context.dsock == device->gpsdata.gps_fd) { - context.dsock = -1; - } gpsd_deactivate(device); } } @@ -1294,9 +1291,6 @@ static void consume_packets(struct gps_device_t *device) device->driver.ntrip.conn_state = ntrip_conn_init; deactivate_device(device); } else { - if (device->driver.ntrip.conn_state == ntrip_conn_established) { - device->context->dsock = device->gpsdata.gps_fd; - } FD_SET(device->gpsdata.gps_fd, &all_fds); } return; @@ -1504,6 +1498,84 @@ static int handle_gpsd_request(struct subscriber_t *sub, const char *buf) return (int)throttled_write(sub, reply, strlen(reply)); } +#ifdef AUTOCONNECT_UNUSED +#define DGPS_THRESHOLD 1600000 /* max. useful dist. from DGPS server (m) */ +#define SERVER_SAMPLE 12 /* # of servers within threshold to check */ + +struct dgps_server_t +{ + double lat, lon; + char server[257]; + double dist; +}; + +static int srvcmp(const void *s, const void *t) +{ + return (int)(((const struct dgps_server_t *)s)->dist - ((const struct dgps_server_t *)t)->dist); /* fixes: warning: cast discards qualifiers from pointer target type */ +} + +static void netgnss_autoconnect(struct gps_context_t *context, + double lat, double lon, const char *serverlist) +/* tell the library to talk to the nearest DGPSIP server */ +{ + struct dgps_server_t keep[SERVER_SAMPLE], hold, *sp, *tp; + char buf[BUFSIZ]; + FILE *sfp = fopen(serverlist, "r"); + + if (sfp == NULL) { + gpsd_report(LOG_ERROR, "no DGPS server list found.\n"); + return; + } + + for (sp = keep; sp < keep + SERVER_SAMPLE; sp++) { + sp->dist = DGPS_THRESHOLD; + sp->server[0] = '\0'; + } + /*@ -usedef @*/ + while (fgets(buf, (int)sizeof(buf), sfp)) { + char *cp = strchr(buf, '#'); + if (cp != NULL) + *cp = '\0'; + if (sscanf(buf, "%lf %lf %256s", &hold.lat, &hold.lon, hold.server) == + 3) { + hold.dist = earth_distance(lat, lon, hold.lat, hold.lon); + tp = NULL; + /* + * The idea here is to look for a server in the sample array + * that is (a) closer than the one we're checking, and (b) + * furtherest away of all those that are closer. Replace it. + * In this way we end up with the closest possible set. + */ + for (sp = keep; sp < keep + SERVER_SAMPLE; sp++) + if (hold.dist < sp->dist + && (tp == NULL || hold.dist > tp->dist)) + tp = sp; + if (tp != NULL) + memcpy(tp, &hold, sizeof(struct dgps_server_t)); + } + } + (void)fclose(sfp); + + if (keep[0].server[0] == '\0') { + gpsd_report(LOG_ERROR, "no DGPS servers within %dm.\n", + (int)(DGPS_THRESHOLD / 1000)); + return; + } + /*@ +usedef @*/ + + /* sort them and try the closest first */ + qsort((void *)keep, SERVER_SAMPLE, sizeof(struct dgps_server_t), srvcmp); + for (sp = keep; sp < keep + SERVER_SAMPLE; sp++) { + if (sp->server[0] != '\0') { + gpsd_report(LOG_INF, "%s is %dkm away.\n", sp->server, + (int)(sp->dist / 1000)); + if (dgpsip_open(context, sp->server) >= 0) + break; + } + } +} +#endif /* AUTOCONNECT_UNUSED */ + /*@ -mustfreefresh @*/ int main(int argc, char *argv[]) { @@ -1911,18 +1983,19 @@ int main(int argc, char *argv[]) } } /* devices */ -#ifdef NOT_FIXED - if (context.fixcnt > 0 && context.dsock == -1) { +#ifdef AUTOCONNECT_UNUSED + if (context.fixcnt > 0 && !context.autconnect) { for (device = devices; device < devices + MAXDEVICES; device++) { if (device->gpsdata.fix.mode > MODE_NO_FIX) { netgnss_autoconnect(&context, device->gpsdata.fix.latitude, device->gpsdata.fix.longitude); + context.autconnect = True; break; } } } -#endif +#endif /* AUTOCONNECT_UNUSED */ /* accept and execute commands for all clients */ for (sub = subscribers; sub < subscribers + MAXSUBSCRIBERS; sub++) { diff --git a/gpsd.h-tail b/gpsd.h-tail index 14dedf9c..91114e1e 100644 --- a/gpsd.h-tail +++ b/gpsd.h-tail @@ -184,7 +184,6 @@ struct gps_context_t { bool sentdgps; /* have we sent a DGPS report? */ enum { netgnss_none, netgnss_dgpsip, netgnss_ntrip} netgnss_service; /* type of GNSS service */ int fixcnt; /* count of good fixes seen */ - socket_t dsock; /* socket to DGPSIP server/Ntrip caster */ size_t rtcmbytes; /* byte count of last RTCM104 report */ char rtcmbuf[RTCM_MAX]; /* last RTCM104 report */ double rtcmtime; /* timestamp of last RTCM104 report */ @@ -589,7 +588,7 @@ extern void netgnss_autoconnect(struct gps_context_t *, double, double); extern void rtcm_relay(struct gps_device_t *); extern void rtcm2_output_mag(isgps30bits_t *, FILE *); -extern int dgpsip_open(struct gps_context_t *, const char *); +extern int dgpsip_open(struct gps_device_t *, const char *); extern void dgpsip_report(struct gps_device_t *); extern void dgpsip_autoconnect(struct gps_context_t *, double, double, const char *); diff --git a/libgpsd_core.c b/libgpsd_core.c index 16008b80..1c1bd897 100644 --- a/libgpsd_core.c +++ b/libgpsd_core.c @@ -162,7 +162,6 @@ void gps_context_init(struct gps_context_t *context) .sentdgps = false, .netgnss_service = netgnss_none, .fixcnt = 0, - .dsock = -1, .rtcmbytes = 0, .rtcmbuf = {'\0'}, .rtcmtime = 0, diff --git a/net_dgpsip.c b/net_dgpsip.c index 822bb18a..edcdb80b 100644 --- a/net_dgpsip.c +++ b/net_dgpsip.c @@ -18,7 +18,7 @@ #include "gpsd.h" /*@ -branchstate */ -int dgpsip_open(struct gps_context_t *context, const char *dgpsserver) +int dgpsip_open(struct gps_device_t *device, const char *dgpsserver) /* open a connection to a DGPSIP server */ { char hn[256], buf[BUFSIZ]; @@ -32,29 +32,29 @@ int dgpsip_open(struct gps_context_t *context, const char *dgpsserver) if (!getservbyname(dgpsport, "tcp")) dgpsport = DEFAULT_RTCM_PORT; - context->dsock = + device->gpsdata.gps_fd = netlib_connectsock(AF_UNSPEC, dgpsserver, dgpsport, "tcp"); - if (context->dsock >= 0) { + if (device->gpsdata.gps_fd >= 0) { gpsd_report(LOG_PROG, "connection to DGPS server %s established.\n", dgpsserver); (void)gethostname(hn, sizeof(hn)); /* greeting required by some RTCM104 servers; others will ignore it */ (void)snprintf(buf, sizeof(buf), "HELO %s gpsd %s\r\nR\r\n", hn, VERSION); - if (write(context->dsock, buf, strlen(buf)) == (ssize_t) strlen(buf)) - context->netgnss_service = netgnss_dgpsip; + if (write(device->gpsdata.gps_fd, buf, strlen(buf)) == (ssize_t) strlen(buf)) + device->context->netgnss_service = netgnss_dgpsip; else gpsd_report(LOG_ERROR, "hello to DGPS server %s failed\n", dgpsserver); } else gpsd_report(LOG_ERROR, "can't connect to DGPS server %s, netlib error %d.\n", - dgpsserver, context->dsock); - opts = fcntl(context->dsock, F_GETFL); + dgpsserver, device->gpsdata.gps_fd); + opts = fcntl(device->gpsdata.gps_fd, F_GETFL); if (opts >= 0) - (void)fcntl(context->dsock, F_SETFL, opts | O_NONBLOCK); - return context->dsock; + (void)fcntl(device->gpsdata.gps_fd, F_SETFL, opts | O_NONBLOCK); + return device->gpsdata.gps_fd; } /*@ +branchstate */ @@ -68,13 +68,13 @@ void dgpsip_report(struct gps_device_t *session) */ if (session->context->fixcnt > 10 && !session->context->sentdgps) { session->context->sentdgps = true; - if (session->context->dsock > -1) { + if (session->gpsdata.gps_fd > -1) { char buf[BUFSIZ]; (void)snprintf(buf, sizeof(buf), "R %0.8f %0.8f %0.2f\r\n", session->gpsdata.fix.latitude, session->gpsdata.fix.longitude, session->gpsdata.fix.altitude); - if (write(session->context->dsock, buf, strlen(buf)) == + if (write(session->gpsdata.gps_fd, buf, strlen(buf)) == (ssize_t) strlen(buf)) gpsd_report(LOG_IO, "=> dgps %s\n", buf); else @@ -83,80 +83,3 @@ void dgpsip_report(struct gps_device_t *session) } } -#define DGPS_THRESHOLD 1600000 /* max. useful dist. from DGPS server (m) */ -#define SERVER_SAMPLE 12 /* # of servers within threshold to check */ - -struct dgps_server_t -{ - double lat, lon; - char server[257]; - double dist; -}; - -static int srvcmp(const void *s, const void *t) -{ - return (int)(((const struct dgps_server_t *)s)->dist - ((const struct dgps_server_t *)t)->dist); /* fixes: warning: cast discards qualifiers from pointer target type */ -} - -void dgpsip_autoconnect(struct gps_context_t *context, - double lat, double lon, const char *serverlist) -/* tell the library to talk to the nearest DGPSIP server */ -{ - struct dgps_server_t keep[SERVER_SAMPLE], hold, *sp, *tp; - char buf[BUFSIZ]; - FILE *sfp = fopen(serverlist, "r"); - - if (sfp == NULL) { - gpsd_report(LOG_ERROR, "no DGPS server list found.\n"); - context->dsock = -2; /* don't try this again */ - return; - } - - for (sp = keep; sp < keep + SERVER_SAMPLE; sp++) { - sp->dist = DGPS_THRESHOLD; - sp->server[0] = '\0'; - } - /*@ -usedef @*/ - while (fgets(buf, (int)sizeof(buf), sfp)) { - char *cp = strchr(buf, '#'); - if (cp != NULL) - *cp = '\0'; - if (sscanf(buf, "%lf %lf %256s", &hold.lat, &hold.lon, hold.server) == - 3) { - hold.dist = earth_distance(lat, lon, hold.lat, hold.lon); - tp = NULL; - /* - * The idea here is to look for a server in the sample array - * that is (a) closer than the one we're checking, and (b) - * furtherest away of all those that are closer. Replace it. - * In this way we end up with the closest possible set. - */ - for (sp = keep; sp < keep + SERVER_SAMPLE; sp++) - if (hold.dist < sp->dist - && (tp == NULL || hold.dist > tp->dist)) - tp = sp; - if (tp != NULL) - memcpy(tp, &hold, sizeof(struct dgps_server_t)); - } - } - (void)fclose(sfp); - - if (keep[0].server[0] == '\0') { - gpsd_report(LOG_ERROR, "no DGPS servers within %dm.\n", - (int)(DGPS_THRESHOLD / 1000)); - context->dsock = -2; /* don't try this again */ - return; - } - /*@ +usedef @*/ - - /* sort them and try the closest first */ - qsort((void *)keep, SERVER_SAMPLE, sizeof(struct dgps_server_t), srvcmp); - for (sp = keep; sp < keep + SERVER_SAMPLE; sp++) { - if (sp->server[0] != '\0') { - gpsd_report(LOG_INF, "%s is %dkm away.\n", sp->server, - (int)(sp->dist / 1000)); - if (dgpsip_open(context, sp->server) >= 0) - break; - } - } -} diff --git a/net_gnss_dispatch.c b/net_gnss_dispatch.c index 064b0f7f..cc54d1dd 100644 --- a/net_gnss_dispatch.c +++ b/net_gnss_dispatch.c @@ -18,9 +18,6 @@ #define NETGNSS_DGPSIP "dgpsip://" #define NETGNSS_NTRIP "ntrip://" -/* Where to find the list of DGPSIP correction servers, if there is one */ -#define DGPSIP_SERVER_LIST "/usr/share/gpsd/dgpsip-servers" - bool netgnss_uri_check(char *name) /* is given string a valid URI for GNSS/DGPS service? */ { @@ -40,10 +37,10 @@ int netgnss_uri_open(struct gps_device_t *dev, char *netgnss_service) #endif if (strncmp(netgnss_service, NETGNSS_DGPSIP, strlen(NETGNSS_DGPSIP)) == 0) - return dgpsip_open(dev->context, netgnss_service + strlen(NETGNSS_DGPSIP)); + return dgpsip_open(dev, netgnss_service + strlen(NETGNSS_DGPSIP)); #ifndef REQUIRE_DGNSS_PROTO - return dgpsip_open(dev->context, netgnss_service); + return dgpsip_open(dev, netgnss_service); #else gpsd_report(LOG_ERROR, "Unknown or unspecified DGNSS protocol for service %s\n", @@ -65,14 +62,6 @@ void netgnss_report(struct gps_device_t *session) #endif } -void netgnss_autoconnect(struct gps_context_t *context, double lat, - double lon) -{ - if (context->netgnss_service == netgnss_dgpsip) { - dgpsip_autoconnect(context, lat, lon, DGPSIP_SERVER_LIST); - } -} - /* *INDENT-OFF* */ void rtcm_relay(struct gps_device_t *session) /* pass a DGNSS connection report to a session */ diff --git a/net_ntrip.c b/net_ntrip.c index 27451406..b12e8e32 100644 --- a/net_ntrip.c +++ b/net_ntrip.c @@ -582,10 +582,10 @@ void ntrip_report(struct gps_device_t *session) count ++; if (ntrip_stream.nmea != 0 && session->context->fixcnt > 10 && (count % 5)==0) { - if (session->context->dsock > -1) { + if (session->gpsdata.gps_fd > -1) { char buf[BUFSIZ]; gpsd_position_fix_dump(session, buf, sizeof(buf)); - if (write(session->context->dsock, buf, strlen(buf)) == + if (write(session->gpsdata.gps_fd, buf, strlen(buf)) == (ssize_t) strlen(buf)) { gpsd_report(LOG_IO, "=> dgps %s\n", buf); } else { |