Serial RX interrupt driving GPS(NMEA) library

Committer:
JST2011
Date:
Sun Jul 01 15:14:45 2012 +0000
Revision:
0:94c22ada3c5a
*Fixed calculation around longitude

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JST2011 0:94c22ada3c5a 1 #include "GPS.h"
JST2011 0:94c22ada3c5a 2
JST2011 0:94c22ada3c5a 3 GPS::GPS(PinName tx, PinName rx) : _gps(tx, rx) {
JST2011 0:94c22ada3c5a 4 _gps.baud(4800);
JST2011 0:94c22ada3c5a 5 _gps.printf("$PSRF103,2,0,0,1*26\r\n");
JST2011 0:94c22ada3c5a 6 _gps.printf("$PSRF103,3,0,0,1*27\r\n");
JST2011 0:94c22ada3c5a 7 _gps.printf("$PSRF103,4,0,0,1*20\r\n");
JST2011 0:94c22ada3c5a 8 flag_gps_get = 0;
JST2011 0:94c22ada3c5a 9 flag_gps_getend = 0;
JST2011 0:94c22ada3c5a 10 _gps.attach(this,&GPS::sample,Serial::RxIrq);
JST2011 0:94c22ada3c5a 11 count = 0;
JST2011 0:94c22ada3c5a 12 flag_gga = 0;
JST2011 0:94c22ada3c5a 13 }
JST2011 0:94c22ada3c5a 14
JST2011 0:94c22ada3c5a 15 void GPS::sample() {
JST2011 0:94c22ada3c5a 16 getline();
JST2011 0:94c22ada3c5a 17 if(flag_gps_getend){
JST2011 0:94c22ada3c5a 18 if(sscanf(msg, "$GPGGA,%f,%f,%c,%f,%c,%d", &_time, &_latitude, &_ns, &_longitude, &_ew, &_lock) >= 1) {
JST2011 0:94c22ada3c5a 19 flag_gga = 1;
JST2011 0:94c22ada3c5a 20 strcpy(gga,msg);
JST2011 0:94c22ada3c5a 21 float degrees = floor(_latitude / 100.0f);
JST2011 0:94c22ada3c5a 22 float minutes = _latitude - (degrees * 100.0f);
JST2011 0:94c22ada3c5a 23 _latitude = degrees + minutes / 60.0f;
JST2011 0:94c22ada3c5a 24 degrees = floor(_longitude / 100.0f);
JST2011 0:94c22ada3c5a 25 minutes = _longitude - (degrees * 100.0f);
JST2011 0:94c22ada3c5a 26 _longitude = degrees + minutes /60.0f;
JST2011 0:94c22ada3c5a 27 }
JST2011 0:94c22ada3c5a 28 flag_gps_getend = 0;
JST2011 0:94c22ada3c5a 29 }
JST2011 0:94c22ada3c5a 30 }
JST2011 0:94c22ada3c5a 31
JST2011 0:94c22ada3c5a 32 char* GPS::getGGA(){
JST2011 0:94c22ada3c5a 33 if(flag_gga){
JST2011 0:94c22ada3c5a 34 // strcpy(gga,msg);
JST2011 0:94c22ada3c5a 35 flag_gga = 0;
JST2011 0:94c22ada3c5a 36 }
JST2011 0:94c22ada3c5a 37 return gga;
JST2011 0:94c22ada3c5a 38 }
JST2011 0:94c22ada3c5a 39
JST2011 0:94c22ada3c5a 40 float GPS::longitude(){
JST2011 0:94c22ada3c5a 41 return _longitude;
JST2011 0:94c22ada3c5a 42 }
JST2011 0:94c22ada3c5a 43
JST2011 0:94c22ada3c5a 44 float GPS::latitude(){
JST2011 0:94c22ada3c5a 45 return _latitude;
JST2011 0:94c22ada3c5a 46 }
JST2011 0:94c22ada3c5a 47
JST2011 0:94c22ada3c5a 48 float GPS::time(){
JST2011 0:94c22ada3c5a 49 return _time;
JST2011 0:94c22ada3c5a 50 }
JST2011 0:94c22ada3c5a 51
JST2011 0:94c22ada3c5a 52 int GPS::ns(){
JST2011 0:94c22ada3c5a 53 int d;
JST2011 0:94c22ada3c5a 54 if(_ns == 'N'){
JST2011 0:94c22ada3c5a 55 d = 1;
JST2011 0:94c22ada3c5a 56 }else{
JST2011 0:94c22ada3c5a 57 d = -1;
JST2011 0:94c22ada3c5a 58 }
JST2011 0:94c22ada3c5a 59 return d;
JST2011 0:94c22ada3c5a 60 }
JST2011 0:94c22ada3c5a 61
JST2011 0:94c22ada3c5a 62 int GPS::ew(){
JST2011 0:94c22ada3c5a 63 int d;
JST2011 0:94c22ada3c5a 64 if(_ew == 'E'){
JST2011 0:94c22ada3c5a 65 d = 1;
JST2011 0:94c22ada3c5a 66 }else{
JST2011 0:94c22ada3c5a 67 d = -1;
JST2011 0:94c22ada3c5a 68 }
JST2011 0:94c22ada3c5a 69 return d;
JST2011 0:94c22ada3c5a 70 }
JST2011 0:94c22ada3c5a 71
JST2011 0:94c22ada3c5a 72 int GPS::lock(){
JST2011 0:94c22ada3c5a 73 return _lock;
JST2011 0:94c22ada3c5a 74 }
JST2011 0:94c22ada3c5a 75
JST2011 0:94c22ada3c5a 76 void GPS::getline() {
JST2011 0:94c22ada3c5a 77 char temp;
JST2011 0:94c22ada3c5a 78 temp = _gps.getc();
JST2011 0:94c22ada3c5a 79 if(temp == '$'){
JST2011 0:94c22ada3c5a 80 flag_gps_get = 1;
JST2011 0:94c22ada3c5a 81 count = 0;
JST2011 0:94c22ada3c5a 82 }
JST2011 0:94c22ada3c5a 83 if(flag_gps_get){
JST2011 0:94c22ada3c5a 84 msg[count] = temp;
JST2011 0:94c22ada3c5a 85 if(temp == '\r'){
JST2011 0:94c22ada3c5a 86 msg[count] = '\0';
JST2011 0:94c22ada3c5a 87 flag_gps_getend = 1;
JST2011 0:94c22ada3c5a 88 flag_gps_get = 0;
JST2011 0:94c22ada3c5a 89 }
JST2011 0:94c22ada3c5a 90 count ++;
JST2011 0:94c22ada3c5a 91 }
JST2011 0:94c22ada3c5a 92 }