summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerrick Brashear <shadow@gmail.com>2002-11-03 06:18:43 +0000
committerDerrick Brashear <shadow@gmail.com>2002-11-03 06:18:43 +0000
commit1217954524aa68d4850761f674f78c47f3e388c5 (patch)
tree8cc66dd8b3c96800fb5b29701a8a782e6e44d89d
parent3641b8ccc78d09f9ac0a52dd98d4241a757738ac (diff)
downloadgpsd-1217954524aa68d4850761f674f78c47f3e388c5.tar.gz
patch from Tom Mayo, N1MU
-rw-r--r--CHANGELOG2
-rw-r--r--README3
-rw-r--r--gpsd.c6
-rw-r--r--nmea.h2
-rw-r--r--nmea_parse.c21
5 files changed, 34 insertions, 0 deletions
diff --git a/CHANGELOG b/CHANGELOG
index f62c4892..5190529b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -36,3 +36,5 @@
where they were not needed.
20021003 (1.08)
Added sockopt SO_REUSEADDR to netlib.c passive_sock.
+20021103 (1.09)
+ G or g command returns six-digit Maidenhead grid square (like FN12fx)
diff --git a/README b/README
index e08f202c..354ce674 100644
--- a/README
+++ b/README
@@ -63,6 +63,9 @@ for the Earthmate.
Curt Mills <BowHunter@mail.com> (WE7U) furthered the dgps support,
writing the portion for other GPS receivers.
+Tom Mayo <tmayo1@rochester.rr.com> N1MU contributed the G/g command,
+which returns a 6 digit Maidenhead grid square.
+
Be advised: any bugs in this code are mine, and mine only ;-)
Thanks for Russ Nelson for providing a home for gpsd!
diff --git a/gpsd.c b/gpsd.c
index 3fecd2ab..88008e3a 100644
--- a/gpsd.c
+++ b/gpsd.c
@@ -505,6 +505,12 @@ static int handle_request(int fd, fd_set * fds)
",V=%f",
gNMEAdata.speed);
break;
+ case 'G':
+ case 'g':
+ sprintf(reply + strlen(reply),
+ ",G=%6.6s",
+ gNMEAdata.grid);
+ break;
case 'R':
case 'r':
if (FD_ISSET(fd, fds)) {
diff --git a/nmea.h b/nmea.h
index bc1065fe..b893daaa 100644
--- a/nmea.h
+++ b/nmea.h
@@ -17,6 +17,8 @@ struct OUTDATA {
double longitude;
+ char grid[7];
+
double altitude; /* Altitude in meters */
double speed; /* Speed over ground, knots */
diff --git a/nmea_parse.c b/nmea_parse.c
index 4ed82911..0c5c77e5 100644
--- a/nmea_parse.c
+++ b/nmea_parse.c
@@ -6,6 +6,7 @@
extern struct OUTDATA gNMEAdata;
static void do_lat_lon(char *sentence, int begin);
+static void do_grid(void);
static char *field(char *sentence, short n);
static void update_field_i(char *sentence, int fld, int *dest, int mask);
@@ -72,6 +73,7 @@ void processGPRMC(char *sentence)
sscanf(field(sentence, 8), "%lf", &gNMEAdata.track);
do_lat_lon(sentence, 3);
+ do_grid();
}
@@ -88,6 +90,7 @@ void processGPVTG(char *sentence)
void processGPGGA(char *sentence)
{
do_lat_lon(sentence, 2);
+ do_grid();
/* 0 = none, 1 = normal, 2 = diff */
sscanf(field(sentence, 6), "%d", &gNMEAdata.status);
if ((gNMEAdata.status > 0) && (gNMEAdata.mode < 2))
@@ -188,6 +191,24 @@ static void do_lat_lon(char *sentence, int begin)
}
}
+/* ----------------------------------------------------------------------- */
+
+static void do_grid() {
+ double lat, lon;
+
+ lat = gNMEAdata.latitude;
+ lon = gNMEAdata.longitude;
+
+ gNMEAdata.grid[0] = 65 + (int)((180.0 + lon) / 20.0);
+ gNMEAdata.grid[1] = 65 + (int)((90.0 + lat) / 10.0);
+ gNMEAdata.grid[2] = 48 + (int)((180.0 + lon) / 2) % 10;
+ gNMEAdata.grid[3] = 48 + (int)(90.0 + lat) % 10;
+ gNMEAdata.grid[4] = 97 + ((int)(180.0 + lon) % 2) * 12 + (int)(((180.0 + lon) - (int)(180.0 + lon)) * 12);
+ gNMEAdata.grid[5] = 97 + (int)(((90.0 + lat) - (int)(90.0 + lat)) * 24);
+ gNMEAdata.grid[6] = '\0';
+}
+
+/* ----------------------------------------------------------------------- */
static void update_field_i(char *sentence, int fld, int *dest, int mask)
{