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

Committer:
falingtrea
Date:
Thu Sep 10 20:03:21 2015 +0000
Revision:
0:d2169fecf3fb
Child:
5:11f41dee386b
Initial release. Only supports SkyTraq Venus GPS chip

Who changed what in which revision?

UserRevisionLine numberNew 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
falingtrea 0:d2169fecf3fb 150 MTSSerial::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 };
falingtrea 0:d2169fecf3fb 204 #endif