summaryrefslogtreecommitdiff
path: root/dgpsip.c
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2005-06-29 20:38:44 +0000
committerEric S. Raymond <esr@thyrsus.com>2005-06-29 20:38:44 +0000
commit7034fb6917d6afc9851dc79518fa1ce83a767e67 (patch)
treea4b8e41bbc8edd029c93b45210d9e71154fb3eac /dgpsip.c
parentcba6b916920d78ef3e002061f1229d6c4debecac (diff)
downloadgpsd-7034fb6917d6afc9851dc79518fa1ce83a767e67.tar.gz
Experimental code to hunt for a DGPSIP server.
Diffstat (limited to 'dgpsip.c')
-rw-r--r--dgpsip.c47
1 files changed, 46 insertions, 1 deletions
diff --git a/dgpsip.c b/dgpsip.c
index 96b7771d..77615b4d 100644
--- a/dgpsip.c
+++ b/dgpsip.c
@@ -31,7 +31,8 @@ int dgpsip_open(struct gps_context_t *context, const char *dgpsserver)
(void)gethostname(hn, sizeof(hn));
(void)snprintf(buf,sizeof(buf), "HELO %s gpsd %s\r\nR\r\n",hn,VERSION);
(void)write(context->dsock, buf, strlen(buf));
- }
+ } else
+ gpsd_report(1, "Can't connect to DGPS server, netlib error %d\n", context->dsock);
opts = fcntl(context->dsock, F_GETFL);
if (opts >= 0)
@@ -89,3 +90,47 @@ void dgpsip_report(struct gps_device_t *session)
}
}
+/* maximum distance from DGPS server for it to be useful (meters) */
+#define DGPS_THRESHOLD 1600000
+
+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 */
+{
+ char buf[BUFSIZ];
+ struct dgps_server_t {
+ double lat, lon;
+ char server[255];
+ double dist;
+ } keep, hold;
+ FILE *sfp = fopen(serverlist, "r");
+
+ if (sfp == NULL) {
+ gpsd_report(1, "no DGPS server list found.\n");
+ context->dsock = -2; /* don't try this again */
+ return;
+ }
+
+ keep.dist = DGPS_THRESHOLD;
+ keep.server[0] = '\0';
+ while (fgets(buf, (int)sizeof(buf), sfp)) {
+ char *cp = strchr(buf, '#');
+ if (cp)
+ *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);
+ if (hold.dist < keep.dist)
+ memcpy(&keep, &hold, sizeof(struct dgps_server_t));
+ }
+ }
+ (void)fclose(sfp);
+
+ if (keep.server[0] == '\0') {
+ gpsd_report(1, "no DGPS server within %d m\n", DGPS_THRESHOLD);
+ context->dsock = -2; /* don't try this again */
+ return;
+ }
+
+ (void)dgpsip_open(context, keep.server);
+}