GPS Module GTS-4E-60 library , (NMEA protocol) , can be easily imported into other GPS modules after a few minor changes
gts4E60.h@0:b876c6606429, 2015-01-03 (annotated)
- 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?
User | Revision | Line number | New 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__ |