GPS Module GTS-4E-60 library , (NMEA protocol) , can be easily imported into other GPS modules after a few minor changes
Diff: gts4E60.h
- Revision:
- 0:b876c6606429
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gts4E60.h Sat Jan 03 11:54:41 2015 +0000 @@ -0,0 +1,222 @@ +/* + @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__