GPS Module GTS-4E-60 library , (NMEA protocol) , can be easily imported into other GPS modules after a few minor changes

Committer:
igbt6
Date:
Sat Jan 03 11:54:41 2015 +0000
Revision:
0:b876c6606429
Version 0.01 of library for GPS module FIBOCOM GTS-4E-60 (NMEA protocol)  released

Who changed what in which revision?

UserRevisionLine numberNew contents of line
igbt6 0:b876c6606429 1 /*
igbt6 0:b876c6606429 2 @file gts4E60.h
igbt6 0:b876c6606429 3
igbt6 0:b876c6606429 4 @brief GTS-4E-60 GPS Module (FIBOCOM) module Library
igbt6 0:b876c6606429 5 Easy to change for other module
igbt6 0:b876c6606429 6
igbt6 0:b876c6606429 7 @Author lukasz uszko(luszko@op.pl)
igbt6 0:b876c6606429 8
igbt6 0:b876c6606429 9 Tested on FRDM-KL46Z and FRDM-KL25Z
igbt6 0:b876c6606429 10
igbt6 0:b876c6606429 11 Copyright (c) 2014 lukasz uszko
igbt6 0:b876c6606429 12 Released under the MIT License (see http://mbed.org/license/mit)
igbt6 0:b876c6606429 13
igbt6 0:b876c6606429 14 Nice tutorial about degree formats and ways of computing them:
igbt6 0:b876c6606429 15 http://home.online.no/~sigurdhu/Deg_formats.htm
igbt6 0:b876c6606429 16
igbt6 0:b876c6606429 17 NMEA protocol reference manual:
igbt6 0:b876c6606429 18 https://www.sparkfun.com/datasheets/GPS/NMEA%20Reference%20Manual1.pdf
igbt6 0:b876c6606429 19
igbt6 0:b876c6606429 20 Documentation regarding GTS-4E-60 GPS Module might be found here:
igbt6 0:b876c6606429 21 http://www.fibocom.com/product/2-1-3-2.html
igbt6 0:b876c6606429 22 */
igbt6 0:b876c6606429 23
igbt6 0:b876c6606429 24 //DEMO - HOW TO USE:
igbt6 0:b876c6606429 25 /*
igbt6 0:b876c6606429 26 ---------------------------------------- DEMO: 1 version ----------------------------------------
igbt6 0:b876c6606429 27 #include "mbed.h"
igbt6 0:b876c6606429 28 #include "gt4E60.h"
igbt6 0:b876c6606429 29 int main()
igbt6 0:b876c6606429 30 {
igbt6 0:b876c6606429 31 GTS4E60 gps(GPS_PIN_TX,GPS_PIN_RX);
igbt6 0:b876c6606429 32 Serial debug(USBTX, USBRX);
igbt6 0:b876c6606429 33 debug.baud(115200);
igbt6 0:b876c6606429 34 while(1) {
igbt6 0:b876c6606429 35 if(gps->isDataAvailable()) {
igbt6 0:b876c6606429 36 if(gps->parseData()) {
igbt6 0:b876c6606429 37 struct UTC_Time utcTime= gps->getTime();
igbt6 0:b876c6606429 38 struct Date date= gps->getDate();
igbt6 0:b876c6606429 39 debug.printf("GPS_UTC_TIME: %02d:%02d:%02.3f\r\n",utcTime.hours, utcTime.minutes, utcTime.seconds);
igbt6 0:b876c6606429 40 debug.printf("GPS_DATE: %02d.%02d.%02d\r\n", date.day, date.month, date.year);
igbt6 0:b876c6606429 41 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());
igbt6 0:b876c6606429 42 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());
igbt6 0:b876c6606429 43 } else {
igbt6 0:b876c6606429 44 debug.printf("NO GPS FIX FOUND\r\n");
igbt6 0:b876c6606429 45 }
igbt6 0:b876c6606429 46 }
igbt6 0:b876c6606429 47 }
igbt6 0:b876c6606429 48 return 0;
igbt6 0:b876c6606429 49 }
igbt6 0:b876c6606429 50
igbt6 0:b876c6606429 51 ---------------------------------------- DEMO: 2 version error handling----------------------------------------
igbt6 0:b876c6606429 52 #include "mbed.h"
igbt6 0:b876c6606429 53 #include "gt4E60.h"
igbt6 0:b876c6606429 54 int main()
igbt6 0:b876c6606429 55 {
igbt6 0:b876c6606429 56 GTS4E60 gps(GPS_PIN_TX,GPS_PIN_RX);
igbt6 0:b876c6606429 57 Serial debug(USBTX, USBRX);
igbt6 0:b876c6606429 58 usbDebug.baud(115200);
igbt6 0:b876c6606429 59 while(1) {
igbt6 0:b876c6606429 60 if(gps->isDataAvailable()) {
igbt6 0:b876c6606429 61 uint8_t ret= gps->parseData();
igbt6 0:b876c6606429 62 if(ret==ERROR) {
igbt6 0:b876c6606429 63 usbDebug.printf("ERROR INCORRECT DATA\r\n");
igbt6 0:b876c6606429 64 } else if(ret==NO_FIX_FOUND) {
igbt6 0:b876c6606429 65 usbDebug.printf("NO GPS FIX FOUND\r\n");
igbt6 0:b876c6606429 66 } else if(ret==NO_SATELLITES) {
igbt6 0:b876c6606429 67 usbDebug.printf("NO SATELLITES FOUND\r\n");
igbt6 0:b876c6606429 68 } else if(ret==INVALID_STATUS) {
igbt6 0:b876c6606429 69 usbDebug.printf("STATUS INVALID\r\n");
igbt6 0:b876c6606429 70 } else {
igbt6 0:b876c6606429 71 struct UTC_Time utcTime= gps->getTime();
igbt6 0:b876c6606429 72 struct Date date= gps->getDate();
igbt6 0:b876c6606429 73 usbDebug.printf("GPS_UTC_TIME: %02d:%02d:%02.3f\r\n",utcTime.hours, utcTime.minutes, utcTime.seconds);
igbt6 0:b876c6606429 74 usbDebug.printf("GPS_DATE: %02d.%02d.%02d\r\n", date.day, date.month, date.year);
igbt6 0:b876c6606429 75 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());
igbt6 0:b876c6606429 76 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());
igbt6 0:b876c6606429 77 }
igbt6 0:b876c6606429 78 }
igbt6 0:b876c6606429 79 }
igbt6 0:b876c6606429 80 return 0;
igbt6 0:b876c6606429 81 }
igbt6 0:b876c6606429 82 */
igbt6 0:b876c6606429 83 #ifndef __GTS4E60_H__
igbt6 0:b876c6606429 84 #define __GTS4E60_H__
igbt6 0:b876c6606429 85
igbt6 0:b876c6606429 86 #include "mbed.h"
igbt6 0:b876c6606429 87 #include "BufferedSerial.h"
igbt6 0:b876c6606429 88 #include <string>
igbt6 0:b876c6606429 89
igbt6 0:b876c6606429 90 #define GTS4E60_SERIAL_DEFAULT_BAUD 9600
igbt6 0:b876c6606429 91 #define GTS4E60_SERIAL_TIMEOUT 10000
igbt6 0:b876c6606429 92 #define GTS4E60_SERIAL_EOL "\r\n"
igbt6 0:b876c6606429 93 #define GTS4E60_NMEA_BUF_SIZE 512
igbt6 0:b876c6606429 94
igbt6 0:b876c6606429 95
igbt6 0:b876c6606429 96 typedef enum {
igbt6 0:b876c6606429 97 //NMEA SENTENCES handled by the module: $GPGGA, $GPGSA, $GPRMC, $GPGSV
igbt6 0:b876c6606429 98 GGA = 0,
igbt6 0:b876c6606429 99 GSA = 1,
igbt6 0:b876c6606429 100 RMC = 2,
igbt6 0:b876c6606429 101 GSV = 3,
igbt6 0:b876c6606429 102 NR_OF_SUPPORTED_NMEA_SENTENCES,
igbt6 0:b876c6606429 103 //parseData() return paramteters
igbt6 0:b876c6606429 104 ERROR =5,
igbt6 0:b876c6606429 105 NO_FIX_FOUND= 6,
igbt6 0:b876c6606429 106 NO_SATELLITES= 7,
igbt6 0:b876c6606429 107 INVALID_STATUS= 8
igbt6 0:b876c6606429 108 } GTS4E60_Utility;
igbt6 0:b876c6606429 109 static const char* nmeaSentencesString[NR_OF_SUPPORTED_NMEA_SENTENCES]= {"GPGGA","GPGSA","GPRMC","GPGSV"};
igbt6 0:b876c6606429 110
igbt6 0:b876c6606429 111
igbt6 0:b876c6606429 112 //deafault serial port on FRDM KL46Z:
igbt6 0:b876c6606429 113 // UART2:
igbt6 0:b876c6606429 114 // RX-PTE17
igbt6 0:b876c6606429 115 // TX-PTE16
igbt6 0:b876c6606429 116
igbt6 0:b876c6606429 117 //useful data structs
igbt6 0:b876c6606429 118 struct UTC_Time {
igbt6 0:b876c6606429 119 UTC_Time() {
igbt6 0:b876c6606429 120 hours =0;
igbt6 0:b876c6606429 121 minutes =0;
igbt6 0:b876c6606429 122 seconds=0;
igbt6 0:b876c6606429 123 }
igbt6 0:b876c6606429 124 int hours;
igbt6 0:b876c6606429 125 int minutes;
igbt6 0:b876c6606429 126 float seconds;
igbt6 0:b876c6606429 127 };
igbt6 0:b876c6606429 128
igbt6 0:b876c6606429 129
igbt6 0:b876c6606429 130 struct Date {
igbt6 0:b876c6606429 131 Date() {
igbt6 0:b876c6606429 132 day =0;
igbt6 0:b876c6606429 133 month =0;
igbt6 0:b876c6606429 134 year =0;
igbt6 0:b876c6606429 135 }
igbt6 0:b876c6606429 136 int day;
igbt6 0:b876c6606429 137 int month;
igbt6 0:b876c6606429 138 int year;
igbt6 0:b876c6606429 139 };
igbt6 0:b876c6606429 140
igbt6 0:b876c6606429 141
igbt6 0:b876c6606429 142
igbt6 0:b876c6606429 143 class GTS4E60
igbt6 0:b876c6606429 144 {
igbt6 0:b876c6606429 145 public:
igbt6 0:b876c6606429 146 GTS4E60 (PinName tx, PinName rx);
igbt6 0:b876c6606429 147 int write(const char* data); //?
igbt6 0:b876c6606429 148 void init();
igbt6 0:b876c6606429 149 uint8_t parseData(uint8_t param =NULL);
igbt6 0:b876c6606429 150 int isDataAvailable();
igbt6 0:b876c6606429 151 inline int getDataFromRx() {
igbt6 0:b876c6606429 152 return mGpsSerial.getc();
igbt6 0:b876c6606429 153 }
igbt6 0:b876c6606429 154
igbt6 0:b876c6606429 155 //getters
igbt6 0:b876c6606429 156 UTC_Time getTime();
igbt6 0:b876c6606429 157 Date getDate();
igbt6 0:b876c6606429 158 float getLongitude();
igbt6 0:b876c6606429 159 float getLatitude();
igbt6 0:b876c6606429 160 float getAltitude();
igbt6 0:b876c6606429 161 float getSpeedKn();
igbt6 0:b876c6606429 162 float getSpeedKm();
igbt6 0:b876c6606429 163 int getSatelites();
igbt6 0:b876c6606429 164 float getCourseT();
igbt6 0:b876c6606429 165 float getCourseM();
igbt6 0:b876c6606429 166 int getFixType();
igbt6 0:b876c6606429 167 int getSatellites();
igbt6 0:b876c6606429 168 int getStatus();
igbt6 0:b876c6606429 169 char getNS();
igbt6 0:b876c6606429 170 char getEW();
igbt6 0:b876c6606429 171 float getHeading();
igbt6 0:b876c6606429 172
igbt6 0:b876c6606429 173 // navigational functions - maybe in future
igbt6 0:b876c6606429 174 float calcCourseTo(float, float);
igbt6 0:b876c6606429 175 double calcDistToKm(float, float);
igbt6 0:b876c6606429 176 double calcDistToM(float, float);
igbt6 0:b876c6606429 177
igbt6 0:b876c6606429 178
igbt6 0:b876c6606429 179 private:
igbt6 0:b876c6606429 180
igbt6 0:b876c6606429 181 float trunc ( float v);
igbt6 0:b876c6606429 182 float nmeaToDecimal(float deg_coord, char nsew);
igbt6 0:b876c6606429 183 void readData();
igbt6 0:b876c6606429 184 void readData(uint8_t nmeaSentence);
igbt6 0:b876c6606429 185 Serial mGpsSerial;
igbt6 0:b876c6606429 186 char mNmeaData[GTS4E60_NMEA_BUF_SIZE];
igbt6 0:b876c6606429 187
igbt6 0:b876c6606429 188 // GGA - Global Positioning System Fixed Data
igbt6 0:b876c6606429 189 struct UTC_Time mUtcTime; // UTC time
igbt6 0:b876c6606429 190 int mFixType; // 0 = no fix; 1 = fix; 2=differential fix
igbt6 0:b876c6606429 191 int mSatellites; // number of satellites used
igbt6 0:b876c6606429 192 float mHdop;
igbt6 0:b876c6606429 193 float mAltitude;
igbt6 0:b876c6606429 194 char mUnits;
igbt6 0:b876c6606429 195
igbt6 0:b876c6606429 196 //GSA
igbt6 0:b876c6606429 197 //not used here
igbt6 0:b876c6606429 198
igbt6 0:b876c6606429 199 // RMC - Recommended Minimmum Specific GNS Data
igbt6 0:b876c6606429 200 char mDataStatus;// RMC data status A = Data Valid; V = Data Not valid;
igbt6 0:b876c6606429 201 float mLatitude;
igbt6 0:b876c6606429 202 float mLongitude;
igbt6 0:b876c6606429 203 char NS, EW;
igbt6 0:b876c6606429 204 float mSpeedKn; // speed in knots/hour
igbt6 0:b876c6606429 205 float mSpeedKm; // speed in kilometres/hour
igbt6 0:b876c6606429 206 float mHeading; // heading in degrees derived from previous & current location
igbt6 0:b876c6606429 207 struct Date mDate;
igbt6 0:b876c6606429 208
igbt6 0:b876c6606429 209 //GSV - GNSS Satellites in View
igbt6 0:b876c6606429 210 int mNumberOfMsgs;
igbt6 0:b876c6606429 211 int mMsgNumber;
igbt6 0:b876c6606429 212 int mSatellitesInView;
igbt6 0:b876c6606429 213
igbt6 0:b876c6606429 214 //useful variables
igbt6 0:b876c6606429 215 string mFix;
igbt6 0:b876c6606429 216 string mCardinal;
igbt6 0:b876c6606429 217
igbt6 0:b876c6606429 218 };
igbt6 0:b876c6606429 219
igbt6 0:b876c6606429 220
igbt6 0:b876c6606429 221
igbt6 0:b876c6606429 222 #endif // __GTS4E60_H__