From 1217954524aa68d4850761f674f78c47f3e388c5 Mon Sep 17 00:00:00 2001 From: Derrick Brashear Date: Sun, 3 Nov 2002 06:18:43 +0000 Subject: patch from Tom Mayo, N1MU --- CHANGELOG | 2 ++ README | 3 +++ gpsd.c | 6 ++++++ nmea.h | 2 ++ nmea_parse.c | 21 +++++++++++++++++++++ 5 files changed, 34 insertions(+) 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 (WE7U) furthered the dgps support, writing the portion for other GPS receivers. +Tom Mayo 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) { -- cgit v1.2.1