GPS NEMA String parser library. Only supports SkyTraq Venus chip at this time.
Dependents: MTDOT-EVB-LinkCheck-AL MTDOT-BOX-EVB-Factory-Firmware-LIB-108 TelitSensorToCloud mDot_sensor_to_cloud ... more
GPSPARSER.h@5:11f41dee386b, 2015-11-09 (annotated)
- Committer:
- Mike Fiore
- Date:
- Mon Nov 09 12:36:04 2015 -0600
- Revision:
- 5:11f41dee386b
- Parent:
- 0:d2169fecf3fb
- Child:
- 6:2050b4795b66
remove bogus namespace
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
falingtrea | 0:d2169fecf3fb | 1 | /** |
falingtrea | 0:d2169fecf3fb | 2 | * @file GpsParser.h |
falingtrea | 0:d2169fecf3fb | 3 | * @brief NEMA String to Packet Parser - NEMA strings to compact packet data |
falingtrea | 0:d2169fecf3fb | 4 | * @author Tim Barr |
falingtrea | 0:d2169fecf3fb | 5 | * @version 1.0 |
falingtrea | 0:d2169fecf3fb | 6 | * @see http://www.kh-gps.de/nmea.faq |
falingtrea | 0:d2169fecf3fb | 7 | * @see http://www.catb.org/gpsd/NMEA.html |
falingtrea | 0:d2169fecf3fb | 8 | * @see http://www.skytraq.com.tw/products/Venus638LPx_PB_v3.pdf |
falingtrea | 0:d2169fecf3fb | 9 | * |
falingtrea | 0:d2169fecf3fb | 10 | * Copyright (c) 2015 |
falingtrea | 0:d2169fecf3fb | 11 | * |
falingtrea | 0:d2169fecf3fb | 12 | * Licensed under the Apache License, Version 2.0 (the "License"); |
falingtrea | 0:d2169fecf3fb | 13 | * you may not use this file except in compliance with the License. |
falingtrea | 0:d2169fecf3fb | 14 | * You may obtain a copy of the License at |
falingtrea | 0:d2169fecf3fb | 15 | * |
falingtrea | 0:d2169fecf3fb | 16 | * http://www.apache.org/licenses/LICENSE-2.0 |
falingtrea | 0:d2169fecf3fb | 17 | * |
falingtrea | 0:d2169fecf3fb | 18 | * Unless required by applicable law or agreed to in writing, software |
falingtrea | 0:d2169fecf3fb | 19 | * distributed under the License is distributed on an "AS IS" BASIS, |
falingtrea | 0:d2169fecf3fb | 20 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
falingtrea | 0:d2169fecf3fb | 21 | * See the License for the specific language governing permissions and |
falingtrea | 0:d2169fecf3fb | 22 | * limitations under the License. |
falingtrea | 0:d2169fecf3fb | 23 | * |
falingtrea | 0:d2169fecf3fb | 24 | */ |
falingtrea | 0:d2169fecf3fb | 25 | |
falingtrea | 0:d2169fecf3fb | 26 | #ifndef GPSPARSER_H |
falingtrea | 0:d2169fecf3fb | 27 | #define GPSPARSER_H |
falingtrea | 0:d2169fecf3fb | 28 | |
falingtrea | 0:d2169fecf3fb | 29 | #include "mbed.h" |
falingtrea | 0:d2169fecf3fb | 30 | #include "rtos.h" |
falingtrea | 0:d2169fecf3fb | 31 | #include "MTSSerial.h" |
falingtrea | 0:d2169fecf3fb | 32 | #include <string> |
falingtrea | 0:d2169fecf3fb | 33 | #include <vector> |
falingtrea | 0:d2169fecf3fb | 34 | #include <ctime> |
falingtrea | 0:d2169fecf3fb | 35 | #define START_THREAD 1 |
falingtrea | 0:d2169fecf3fb | 36 | |
falingtrea | 0:d2169fecf3fb | 37 | using namespace mts; |
falingtrea | 0:d2169fecf3fb | 38 | |
falingtrea | 0:d2169fecf3fb | 39 | class GPSPARSER |
falingtrea | 0:d2169fecf3fb | 40 | { |
falingtrea | 0:d2169fecf3fb | 41 | public: |
falingtrea | 0:d2169fecf3fb | 42 | |
falingtrea | 0:d2169fecf3fb | 43 | /** |
falingtrea | 0:d2169fecf3fb | 44 | * @typedef struct latitude |
falingtrea | 0:d2169fecf3fb | 45 | * @brief latitude degrees, minutes, seconds structure |
falingtrea | 0:d2169fecf3fb | 46 | * range of degrees : 0 to 90 signed (negative degrees is South) |
falingtrea | 0:d2169fecf3fb | 47 | * range of minutes : 0 to 60 unsigned |
falingtrea | 0:d2169fecf3fb | 48 | * Range of seconds : 0-9999 unsigned or 1/10000 of a minute. |
falingtrea | 0:d2169fecf3fb | 49 | * Multiply by 6 and divide or modulus by 1000 to get seconds and fractional seconds |
falingtrea | 0:d2169fecf3fb | 50 | */ |
falingtrea | 0:d2169fecf3fb | 51 | typedef struct{int8_t degrees; uint8_t minutes; uint16_t seconds;} latitude; |
falingtrea | 0:d2169fecf3fb | 52 | |
falingtrea | 0:d2169fecf3fb | 53 | /** |
falingtrea | 0:d2169fecf3fb | 54 | * @typedef struct longitude |
falingtrea | 0:d2169fecf3fb | 55 | * @brief longitude degrees, minutes, seconds structure negative degrees is West |
falingtrea | 0:d2169fecf3fb | 56 | * range of degrees : 0 to 180 signed (negative degrees is West) |
falingtrea | 0:d2169fecf3fb | 57 | * range of minutes : 0 to 60 unsigned |
falingtrea | 0:d2169fecf3fb | 58 | * Range of seconds : 0-9999 unsigned or 1/10000 of a minute. |
falingtrea | 0:d2169fecf3fb | 59 | * Multiply by 6 and divide or modulus by 1000 to get seconds and fractional seconds |
falingtrea | 0:d2169fecf3fb | 60 | */ |
falingtrea | 0:d2169fecf3fb | 61 | typedef struct{int16_t degrees; uint8_t minutes; uint16_t seconds;} longitude; |
falingtrea | 0:d2169fecf3fb | 62 | |
falingtrea | 0:d2169fecf3fb | 63 | /** |
falingtrea | 0:d2169fecf3fb | 64 | * @typdef satellite_prn |
falingtrea | 0:d2169fecf3fb | 65 | * @brief satellite prn list, up to 12 valid |
falingtrea | 0:d2169fecf3fb | 66 | */ |
falingtrea | 0:d2169fecf3fb | 67 | typedef uint8_t satellite_prn[12]; |
falingtrea | 0:d2169fecf3fb | 68 | |
falingtrea | 0:d2169fecf3fb | 69 | /** Create the GPSPARSER object |
falingtrea | 0:d2169fecf3fb | 70 | * @param uart - an MTSSerial object |
falingtrea | 0:d2169fecf3fb | 71 | */ |
falingtrea | 0:d2169fecf3fb | 72 | GPSPARSER(MTSSerial *uart); |
falingtrea | 0:d2169fecf3fb | 73 | |
falingtrea | 0:d2169fecf3fb | 74 | /** destroy the GPSPARSER object |
falingtrea | 0:d2169fecf3fb | 75 | */ |
falingtrea | 0:d2169fecf3fb | 76 | ~GPSPARSER(void); |
falingtrea | 0:d2169fecf3fb | 77 | |
falingtrea | 0:d2169fecf3fb | 78 | /** GPS device detected |
falingtrea | 0:d2169fecf3fb | 79 | * @return boolean whether GPS device detected |
falingtrea | 0:d2169fecf3fb | 80 | */ |
falingtrea | 0:d2169fecf3fb | 81 | bool gpsDetected(void); |
falingtrea | 0:d2169fecf3fb | 82 | |
falingtrea | 0:d2169fecf3fb | 83 | /** get longitude structure |
falingtrea | 0:d2169fecf3fb | 84 | * @return last valid NEMA string longitude data |
falingtrea | 0:d2169fecf3fb | 85 | */ |
falingtrea | 0:d2169fecf3fb | 86 | longitude getLongitude(void); |
falingtrea | 0:d2169fecf3fb | 87 | |
falingtrea | 0:d2169fecf3fb | 88 | /** get latitude structure |
falingtrea | 0:d2169fecf3fb | 89 | * @return last valid NEMA string latitude data |
falingtrea | 0:d2169fecf3fb | 90 | */ |
falingtrea | 0:d2169fecf3fb | 91 | latitude getLatitude(void); |
falingtrea | 0:d2169fecf3fb | 92 | |
falingtrea | 0:d2169fecf3fb | 93 | /** get timestamp structure |
falingtrea | 0:d2169fecf3fb | 94 | * @return last valid NEMA string time and date data |
falingtrea | 0:d2169fecf3fb | 95 | * uses tm struc from ctime standard library |
falingtrea | 0:d2169fecf3fb | 96 | */ |
falingtrea | 0:d2169fecf3fb | 97 | struct tm getTimestamp(void); |
falingtrea | 0:d2169fecf3fb | 98 | |
falingtrea | 0:d2169fecf3fb | 99 | /** get GPS Lock status |
falingtrea | 0:d2169fecf3fb | 100 | * @return boolean of last valid NEMA string lock status data |
falingtrea | 0:d2169fecf3fb | 101 | */ |
falingtrea | 0:d2169fecf3fb | 102 | bool getLockStatus(void); |
falingtrea | 0:d2169fecf3fb | 103 | |
falingtrea | 0:d2169fecf3fb | 104 | /** get GPS Fix status |
falingtrea | 0:d2169fecf3fb | 105 | * @return last valid NEMA Fix status data |
falingtrea | 0:d2169fecf3fb | 106 | * 1 = no fix |
falingtrea | 0:d2169fecf3fb | 107 | * 2 = 2D fix - latitude, longitude, time only valid |
falingtrea | 0:d2169fecf3fb | 108 | * 3 = 3D fix - all data valid |
falingtrea | 0:d2169fecf3fb | 109 | */ |
falingtrea | 0:d2169fecf3fb | 110 | uint8_t getFixStatus(void); |
falingtrea | 0:d2169fecf3fb | 111 | |
falingtrea | 0:d2169fecf3fb | 112 | /** get GPS Fix qualty |
falingtrea | 0:d2169fecf3fb | 113 | * @return last valid NEMA string Fix Quality data |
falingtrea | 0:d2169fecf3fb | 114 | * 0 = invalid |
falingtrea | 0:d2169fecf3fb | 115 | * 1 = GPS fix (SPS) |
falingtrea | 0:d2169fecf3fb | 116 | * 2 = DGPS fix |
falingtrea | 0:d2169fecf3fb | 117 | * 3 = PPS fix |
falingtrea | 0:d2169fecf3fb | 118 | * 4 = Real Time Kinematic |
falingtrea | 0:d2169fecf3fb | 119 | * 5 = Float RTK |
falingtrea | 0:d2169fecf3fb | 120 | * 6 = estimated (dead reckoning) (2.3 feature) |
falingtrea | 0:d2169fecf3fb | 121 | * 7 = Manual input mode |
falingtrea | 0:d2169fecf3fb | 122 | * 8 = Simulation mode |
falingtrea | 0:d2169fecf3fb | 123 | */ |
falingtrea | 0:d2169fecf3fb | 124 | uint8_t getFixQuality(void); |
falingtrea | 0:d2169fecf3fb | 125 | |
falingtrea | 0:d2169fecf3fb | 126 | /** get number of visible satellites |
falingtrea | 0:d2169fecf3fb | 127 | * @return last valid NEMA string number of satellites visible |
falingtrea | 0:d2169fecf3fb | 128 | */ |
falingtrea | 0:d2169fecf3fb | 129 | uint8_t getNumSatellites(void); |
falingtrea | 0:d2169fecf3fb | 130 | |
falingtrea | 0:d2169fecf3fb | 131 | /** get calculated altitude |
falingtrea | 0:d2169fecf3fb | 132 | * @return last valid NEMA string altitude data in meters |
falingtrea | 0:d2169fecf3fb | 133 | */ |
falingtrea | 0:d2169fecf3fb | 134 | int16_t getAltitude(void); |
falingtrea | 0:d2169fecf3fb | 135 | |
falingtrea | 0:d2169fecf3fb | 136 | private: |
falingtrea | 0:d2169fecf3fb | 137 | |
falingtrea | 0:d2169fecf3fb | 138 | std::string _nema_buff; |
falingtrea | 0:d2169fecf3fb | 139 | bool _gps_detected; |
falingtrea | 0:d2169fecf3fb | 140 | latitude _gps_latitude; |
falingtrea | 0:d2169fecf3fb | 141 | longitude _gps_longitude; |
falingtrea | 0:d2169fecf3fb | 142 | struct tm _timestamp; |
falingtrea | 0:d2169fecf3fb | 143 | bool _gps_status; |
falingtrea | 0:d2169fecf3fb | 144 | uint8_t _fix_status; |
falingtrea | 0:d2169fecf3fb | 145 | uint8_t _fix_quality; |
falingtrea | 0:d2169fecf3fb | 146 | uint8_t _num_satellites; |
falingtrea | 0:d2169fecf3fb | 147 | satellite_prn _satellite_prn; |
falingtrea | 0:d2169fecf3fb | 148 | int16_t _msl_altitude; |
falingtrea | 0:d2169fecf3fb | 149 | |
Mike Fiore |
5:11f41dee386b | 150 | MTSSerial *_gps_uart; |
falingtrea | 0:d2169fecf3fb | 151 | Thread _getSentenceThread; |
falingtrea | 0:d2169fecf3fb | 152 | |
falingtrea | 0:d2169fecf3fb | 153 | /** Detect and initialize GPS device |
falingtrea | 0:d2169fecf3fb | 154 | * @return status of initialization |
falingtrea | 0:d2169fecf3fb | 155 | * @note rewrite this code for specific GPS device. This code supports Skytraq Venus chip |
falingtrea | 0:d2169fecf3fb | 156 | */ |
falingtrea | 0:d2169fecf3fb | 157 | uint8_t initGps (void); |
falingtrea | 0:d2169fecf3fb | 158 | |
falingtrea | 0:d2169fecf3fb | 159 | /** Start sentence parser thread |
falingtrea | 0:d2169fecf3fb | 160 | * |
falingtrea | 0:d2169fecf3fb | 161 | */ |
falingtrea | 0:d2169fecf3fb | 162 | static void startSentenceThread (void const *p); |
falingtrea | 0:d2169fecf3fb | 163 | |
falingtrea | 0:d2169fecf3fb | 164 | /** Read NEMA sentences from specified serial port and call specific sentence parser |
falingtrea | 0:d2169fecf3fb | 165 | */ |
falingtrea | 0:d2169fecf3fb | 166 | void readNemaSentence (void); |
falingtrea | 0:d2169fecf3fb | 167 | |
falingtrea | 0:d2169fecf3fb | 168 | /** Parse GGA NEMA sentence |
falingtrea | 0:d2169fecf3fb | 169 | * @return status of parser attempt |
falingtrea | 0:d2169fecf3fb | 170 | */ |
falingtrea | 0:d2169fecf3fb | 171 | uint8_t parseGGA(char *nema_buf); |
falingtrea | 0:d2169fecf3fb | 172 | |
falingtrea | 0:d2169fecf3fb | 173 | /** Parse GSA NEMA sentence |
falingtrea | 0:d2169fecf3fb | 174 | * @return status of parser attempt |
falingtrea | 0:d2169fecf3fb | 175 | */ |
falingtrea | 0:d2169fecf3fb | 176 | uint8_t parseGSA(char *nema_buf); |
falingtrea | 0:d2169fecf3fb | 177 | |
falingtrea | 0:d2169fecf3fb | 178 | /** Parse GSV NEMA sentence |
falingtrea | 0:d2169fecf3fb | 179 | * @return status of parser attempt |
falingtrea | 0:d2169fecf3fb | 180 | */ |
falingtrea | 0:d2169fecf3fb | 181 | uint8_t parseGSV(char *nema_buf); |
falingtrea | 0:d2169fecf3fb | 182 | |
falingtrea | 0:d2169fecf3fb | 183 | /** Parse RMC NEMA sentence |
falingtrea | 0:d2169fecf3fb | 184 | * @return status of parser attempt |
falingtrea | 0:d2169fecf3fb | 185 | */ |
falingtrea | 0:d2169fecf3fb | 186 | uint8_t parseRMC(char *nema_buf); |
falingtrea | 0:d2169fecf3fb | 187 | |
falingtrea | 0:d2169fecf3fb | 188 | /** Parse VTG NEMA sentence |
falingtrea | 0:d2169fecf3fb | 189 | * @return status of parser attempt |
falingtrea | 0:d2169fecf3fb | 190 | */ |
falingtrea | 0:d2169fecf3fb | 191 | uint8_t parseVTG(char *nema_buf); |
falingtrea | 0:d2169fecf3fb | 192 | |
falingtrea | 0:d2169fecf3fb | 193 | /** Parse GLL NEMA sentence |
falingtrea | 0:d2169fecf3fb | 194 | * @return status of parser attempt |
falingtrea | 0:d2169fecf3fb | 195 | */ |
falingtrea | 0:d2169fecf3fb | 196 | uint8_t parseGLL(char *nema_buff); |
falingtrea | 0:d2169fecf3fb | 197 | |
falingtrea | 0:d2169fecf3fb | 198 | /** Parse ZDA NEMA sentence |
falingtrea | 0:d2169fecf3fb | 199 | * @return status of parser attempt |
falingtrea | 0:d2169fecf3fb | 200 | */ |
falingtrea | 0:d2169fecf3fb | 201 | uint8_t parseZDA(char *nema_buff); |
falingtrea | 0:d2169fecf3fb | 202 | |
falingtrea | 0:d2169fecf3fb | 203 | }; |
Mike Fiore |
5:11f41dee386b | 204 | #endif |