diff options
author | Derrick Brashear <shadow@gmail.com> | 2002-11-03 06:18:43 +0000 |
---|---|---|
committer | Derrick Brashear <shadow@gmail.com> | 2002-11-03 06:18:43 +0000 |
commit | 1217954524aa68d4850761f674f78c47f3e388c5 (patch) | |
tree | 8cc66dd8b3c96800fb5b29701a8a782e6e44d89d | |
parent | 3641b8ccc78d09f9ac0a52dd98d4241a757738ac (diff) | |
download | gpsd-1217954524aa68d4850761f674f78c47f3e388c5.tar.gz |
patch from Tom Mayo, N1MU
-rw-r--r-- | CHANGELOG | 2 | ||||
-rw-r--r-- | README | 3 | ||||
-rw-r--r-- | gpsd.c | 6 | ||||
-rw-r--r-- | nmea.h | 2 | ||||
-rw-r--r-- | nmea_parse.c | 21 |
5 files changed, 34 insertions, 0 deletions
@@ -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) @@ -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! @@ -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)) { @@ -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) { |