Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of GroveGPS by
Revision 4:4615d6e99bb4, committed 2018-05-31
- Comitter:
- JimCarver
- Date:
- Thu May 31 17:21:40 2018 +0000
- Parent:
- 3:cc5c9faa1cc6
- Commit message:
- Thread based example
Changed in this revision
GroveGPS.cpp | Show annotated file Show diff for this revision Revisions of this file |
GroveGPS.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r cc5c9faa1cc6 -r 4615d6e99bb4 GroveGPS.cpp --- a/GroveGPS.cpp Sun Apr 22 00:06:53 2018 +0000 +++ b/GroveGPS.cpp Thu May 31 17:21:40 2018 +0000 @@ -20,15 +20,45 @@ #include "GroveGPS.h" -Serial gps_serial(PE_8, PE_7, 9600); +Serial gps_serial(D1, D0, 9600); + + + +//Thread gpsThread; +GroveGPS gps; + +Semaphore parse; +Thread parsethread(osPriorityBelowNormal); -Thread gpsThread; -GroveGPS gps; + static void parseLine() { + while(1) { + parse.wait(); + if (gps._last_line.find("GPGGA") != std::string::npos) { + gps.parseGGA(); + } + if (gps._last_line.find("GPZDA") != std::string::npos) { + gps.parseZDA(); + } + if (gps._last_line.find("GPVTG") != std::string::npos) { + gps.parseVTG(); + } + gps._last_line = ""; + } + } + void readCharacter(char newCharacter) { + if (newCharacter == '\n') { + parse.release(); + } else { + gps._last_line += newCharacter; + } + } + + void service_serial(void) { - gps.readCharacter(gps_serial.getc()); + readCharacter(gps_serial.getc()); } @@ -44,7 +74,7 @@ void nema_send( void ) { - char nema_mode[] = "$PMTK314,5,5,5,5,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0*"; + char nema_mode[] = "$PMTK314,0,0,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0*"; char nema_cmd[64]; int x = 0; sprintf( nema_cmd, "%s%x\r\n", nema_mode, calc_cs(nema_mode)); @@ -54,11 +84,13 @@ } int GPS_init() { - + gps._last_line = ""; gps_serial.attach( &service_serial, Serial::RxIrq ); gps.gps_gga.new_flag = 0; gps.gps_zda.new_flag = 0; gps.gps_vtg.new_flag = 0; nema_send(); - return 0; + printf("\r\nGPS Init\r\n"); + parsethread.start(parseLine); + return 0; } \ No newline at end of file
diff -r cc5c9faa1cc6 -r 4615d6e99bb4 GroveGPS.h --- a/GroveGPS.h Sun Apr 22 00:06:53 2018 +0000 +++ b/GroveGPS.h Thu May 31 17:21:40 2018 +0000 @@ -5,21 +5,17 @@ #include <stdlib.h> #include <string> + class GroveGPS { public: - GroveGPS() : _last_line("") {} + GroveGPS() : _last_line("") { - void readCharacter(char newCharacter) { - if (newCharacter == '\n') { - parseLine(); - _last_line = ""; - } else { - _last_line += newCharacter; - } } + std::string _last_line; + struct GGA { double utc_time; // Format: hhmmss.sss double latitude; // Format: ddmm.mmmm @@ -102,7 +98,8 @@ if (gps_gga.position_fix==0) { sprintf(buffer, "N/A"); } else { - sprintf(buffer, "%c%f", (gps_gga.ns_indicator == 'N') ? '0' : '-', coordinate); + if(gps_gga.ns_indicator == 'S') coordinate *= -1.000; + sprintf(buffer, "%f", coordinate); } } @@ -110,13 +107,12 @@ double coordinate = convertGPSToDecimal(gps_gga.longitude); if (gps_gga.position_fix==0) sprintf(buffer, "N/A"); - else - sprintf(buffer, "%c%f", (gps_gga.ew_indicator == 'E') ? '0' : '-', coordinate); + else { + if(gps_gga.ew_indicator == 'W') coordinate *= -1.0000; + sprintf(buffer, "%f", coordinate); + } } -private: - std::string _last_line; - double convertGPSToDecimal(double coordinate) { int degrees = coordinate/100.0; @@ -126,18 +122,6 @@ } - void parseLine() { - if (_last_line.find("GPGGA") != std::string::npos) { - parseGGA(); - } - if (_last_line.find("GPZDA") != std::string::npos) { - parseZDA(); - } - if (_last_line.find("GPVTG") != std::string::npos) { - parseVTG(); - } - } - void parseVTG() { char* pEnd; for (int i=0; i<5; i++) {