summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gpsd.c91
-rw-r--r--gpsd.h-tail3
-rw-r--r--libgpsd_core.c1
-rw-r--r--net_dgpsip.c99
-rw-r--r--net_gnss_dispatch.c15
-rw-r--r--net_ntrip.c4
6 files changed, 98 insertions, 115 deletions
diff --git a/gpsd.c b/gpsd.c
index d972ed36..28b56170 100644
--- a/gpsd.c
+++ b/gpsd.c
@@ -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 {