GPS Module GTS-4E-60 library , (NMEA protocol) , can be easily imported into other GPS modules after a few minor changes
gts4E60.h
- Committer:
- igbt6
- Date:
- 2015-01-03
- Revision:
- 0:b876c6606429
File content as of revision 0:b876c6606429:
/* @file gts4E60.h @brief GTS-4E-60 GPS Module (FIBOCOM) module Library Easy to change for other module @Author lukasz uszko(luszko@op.pl) Tested on FRDM-KL46Z and FRDM-KL25Z Copyright (c) 2014 lukasz uszko Released under the MIT License (see http://mbed.org/license/mit) Nice tutorial about degree formats and ways of computing them: http://home.online.no/~sigurdhu/Deg_formats.htm NMEA protocol reference manual: https://www.sparkfun.com/datasheets/GPS/NMEA%20Reference%20Manual1.pdf Documentation regarding GTS-4E-60 GPS Module might be found here: http://www.fibocom.com/product/2-1-3-2.html */ //DEMO - HOW TO USE: /* ---------------------------------------- DEMO: 1 version ---------------------------------------- #include "mbed.h" #include "gt4E60.h" int main() { GTS4E60 gps(GPS_PIN_TX,GPS_PIN_RX); Serial debug(USBTX, USBRX); debug.baud(115200); while(1) { if(gps->isDataAvailable()) { if(gps->parseData()) { struct UTC_Time utcTime= gps->getTime(); struct Date date= gps->getDate(); debug.printf("GPS_UTC_TIME: %02d:%02d:%02.3f\r\n",utcTime.hours, utcTime.minutes, utcTime.seconds); debug.printf("GPS_DATE: %02d.%02d.%02d\r\n", date.day, date.month, date.year); debug.printf("GPS_DATA: fixtype: %d, satelites: %d, altitude: %f, speed: %f, heading: %f\r\n",gps->getFixType(), gps->getSatellites(), gps->getAltitude(), gps->getSpeedKm(), gps->getHeading()); debug.printf("GPS_DATA: status: %c, latitude: %f, ns :%c, longitude: %f, ew: %c\r\n",gps->getStatus(), gps->getLatitude(), gps->getNS(), gps->getLongitude(), gps->getEW()); } else { debug.printf("NO GPS FIX FOUND\r\n"); } } } return 0; } ---------------------------------------- DEMO: 2 version error handling---------------------------------------- #include "mbed.h" #include "gt4E60.h" int main() { GTS4E60 gps(GPS_PIN_TX,GPS_PIN_RX); Serial debug(USBTX, USBRX); usbDebug.baud(115200); while(1) { if(gps->isDataAvailable()) { uint8_t ret= gps->parseData(); if(ret==ERROR) { usbDebug.printf("ERROR INCORRECT DATA\r\n"); } else if(ret==NO_FIX_FOUND) { usbDebug.printf("NO GPS FIX FOUND\r\n"); } else if(ret==NO_SATELLITES) { usbDebug.printf("NO SATELLITES FOUND\r\n"); } else if(ret==INVALID_STATUS) { usbDebug.printf("STATUS INVALID\r\n"); } else { struct UTC_Time utcTime= gps->getTime(); struct Date date= gps->getDate(); usbDebug.printf("GPS_UTC_TIME: %02d:%02d:%02.3f\r\n",utcTime.hours, utcTime.minutes, utcTime.seconds); usbDebug.printf("GPS_DATE: %02d.%02d.%02d\r\n", date.day, date.month, date.year); usbDebug.printf("GPS_DATA: fixtype: %d, satelites: %d, altitude: %f, speed: %f, heading: %f\r\n",gps->getFixType(), gps->getSatellites(), gps->getAltitude(), gps->getSpeedKm(), gps->getHeading()); usbDebug.printf("GPS_DATA: status: %c, latitude: %f, ns :%c, longitude: %f, ew: %c\r\n",gps->getStatus(), gps->getLatitude(), gps->getNS(), gps->getLongitude(), gps->getEW()); } } } return 0; } */ #ifndef __GTS4E60_H__ #define __GTS4E60_H__ #include "mbed.h" #include "BufferedSerial.h" #include <string> #define GTS4E60_SERIAL_DEFAULT_BAUD 9600 #define GTS4E60_SERIAL_TIMEOUT 10000 #define GTS4E60_SERIAL_EOL "\r\n" #define GTS4E60_NMEA_BUF_SIZE 512 typedef enum { //NMEA SENTENCES handled by the module: $GPGGA, $GPGSA, $GPRMC, $GPGSV GGA = 0, GSA = 1, RMC = 2, GSV = 3, NR_OF_SUPPORTED_NMEA_SENTENCES, //parseData() return paramteters ERROR =5, NO_FIX_FOUND= 6, NO_SATELLITES= 7, INVALID_STATUS= 8 } GTS4E60_Utility; static const char* nmeaSentencesString[NR_OF_SUPPORTED_NMEA_SENTENCES]= {"GPGGA","GPGSA","GPRMC","GPGSV"}; //deafault serial port on FRDM KL46Z: // UART2: // RX-PTE17 // TX-PTE16 //useful data structs struct UTC_Time { UTC_Time() { hours =0; minutes =0; seconds=0; } int hours; int minutes; float seconds; }; struct Date { Date() { day =0; month =0; year =0; } int day; int month; int year; }; class GTS4E60 { public: GTS4E60 (PinName tx, PinName rx); int write(const char* data); //? void init(); uint8_t parseData(uint8_t param =NULL); int isDataAvailable(); inline int getDataFromRx() { return mGpsSerial.getc(); } //getters UTC_Time getTime(); Date getDate(); float getLongitude(); float getLatitude(); float getAltitude(); float getSpeedKn(); float getSpeedKm(); int getSatelites(); float getCourseT(); float getCourseM(); int getFixType(); int getSatellites(); int getStatus(); char getNS(); char getEW(); float getHeading(); // navigational functions - maybe in future float calcCourseTo(float, float); double calcDistToKm(float, float); double calcDistToM(float, float); private: float trunc ( float v); float nmeaToDecimal(float deg_coord, char nsew); void readData(); void readData(uint8_t nmeaSentence); Serial mGpsSerial; char mNmeaData[GTS4E60_NMEA_BUF_SIZE]; // GGA - Global Positioning System Fixed Data struct UTC_Time mUtcTime; // UTC time int mFixType; // 0 = no fix; 1 = fix; 2=differential fix int mSatellites; // number of satellites used float mHdop; float mAltitude; char mUnits; //GSA //not used here // RMC - Recommended Minimmum Specific GNS Data char mDataStatus;// RMC data status A = Data Valid; V = Data Not valid; float mLatitude; float mLongitude; char NS, EW; float mSpeedKn; // speed in knots/hour float mSpeedKm; // speed in kilometres/hour float mHeading; // heading in degrees derived from previous & current location struct Date mDate; //GSV - GNSS Satellites in View int mNumberOfMsgs; int mMsgNumber; int mSatellitesInView; //useful variables string mFix; string mCardinal; }; #endif // __GTS4E60_H__