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:
Evan Hosseini
Date:
Wed Jan 31 09:14:03 2018 -0600
Revision:
13:b41779d6cddb
Parent:
10:465f9db415ea
Pull LED i2c write out of the Ticker ISR

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"
Mike Fiore 6:2050b4795b66 32 #include "NCP5623B.h"
falingtrea 0:d2169fecf3fb 33 #include <string>
falingtrea 0:d2169fecf3fb 34 #include <vector>
falingtrea 0:d2169fecf3fb 35 #include <ctime>
falingtrea 0:d2169fecf3fb 36 #define START_THREAD 1
falingtrea 0:d2169fecf3fb 37
falingtrea 0:d2169fecf3fb 38 using namespace mts;
falingtrea 0:d2169fecf3fb 39
falingtrea 0:d2169fecf3fb 40 class GPSPARSER
falingtrea 0:d2169fecf3fb 41 {
falingtrea 0:d2169fecf3fb 42 public:
falingtrea 0:d2169fecf3fb 43
falingtrea 0:d2169fecf3fb 44 /**
falingtrea 0:d2169fecf3fb 45 * @typedef struct latitude
falingtrea 0:d2169fecf3fb 46 * @brief latitude degrees, minutes, seconds structure
falingtrea 0:d2169fecf3fb 47 * range of degrees : 0 to 90 signed (negative degrees is South)
falingtrea 0:d2169fecf3fb 48 * range of minutes : 0 to 60 unsigned
falingtrea 0:d2169fecf3fb 49 * Range of seconds : 0-9999 unsigned or 1/10000 of a minute.
falingtrea 0:d2169fecf3fb 50 * Multiply by 6 and divide or modulus by 1000 to get seconds and fractional seconds
falingtrea 0:d2169fecf3fb 51 */
falingtrea 0:d2169fecf3fb 52 typedef struct{int8_t degrees; uint8_t minutes; uint16_t seconds;} latitude;
falingtrea 0:d2169fecf3fb 53
falingtrea 0:d2169fecf3fb 54 /**
falingtrea 0:d2169fecf3fb 55 * @typedef struct longitude
falingtrea 0:d2169fecf3fb 56 * @brief longitude degrees, minutes, seconds structure negative degrees is West
falingtrea 0:d2169fecf3fb 57 * range of degrees : 0 to 180 signed (negative degrees is West)
falingtrea 0:d2169fecf3fb 58 * range of minutes : 0 to 60 unsigned
falingtrea 0:d2169fecf3fb 59 * Range of seconds : 0-9999 unsigned or 1/10000 of a minute.
falingtrea 0:d2169fecf3fb 60 * Multiply by 6 and divide or modulus by 1000 to get seconds and fractional seconds
falingtrea 0:d2169fecf3fb 61 */
falingtrea 0:d2169fecf3fb 62 typedef struct{int16_t degrees; uint8_t minutes; uint16_t seconds;} longitude;
falingtrea 0:d2169fecf3fb 63
falingtrea 0:d2169fecf3fb 64 /**
falingtrea 0:d2169fecf3fb 65 * @typdef satellite_prn
falingtrea 0:d2169fecf3fb 66 * @brief satellite prn list, up to 12 valid
falingtrea 0:d2169fecf3fb 67 */
falingtrea 0:d2169fecf3fb 68 typedef uint8_t satellite_prn[12];
falingtrea 0:d2169fecf3fb 69
falingtrea 0:d2169fecf3fb 70 /** Create the GPSPARSER object
falingtrea 0:d2169fecf3fb 71 * @param uart - an MTSSerial object
Mike Fiore 6:2050b4795b66 72 * @param led - an NCP5623B led controller object
falingtrea 0:d2169fecf3fb 73 */
Mike Fiore 6:2050b4795b66 74 GPSPARSER(MTSSerial *uart, NCP5623B* led = NULL);
falingtrea 0:d2169fecf3fb 75
falingtrea 0:d2169fecf3fb 76 /** destroy the GPSPARSER object
falingtrea 0:d2169fecf3fb 77 */
falingtrea 0:d2169fecf3fb 78 ~GPSPARSER(void);
falingtrea 0:d2169fecf3fb 79
falingtrea 0:d2169fecf3fb 80 /** GPS device detected
falingtrea 0:d2169fecf3fb 81 * @return boolean whether GPS device detected
falingtrea 0:d2169fecf3fb 82 */
falingtrea 0:d2169fecf3fb 83 bool gpsDetected(void);
falingtrea 0:d2169fecf3fb 84
falingtrea 0:d2169fecf3fb 85 /** get longitude structure
falingtrea 0:d2169fecf3fb 86 * @return last valid NEMA string longitude data
falingtrea 0:d2169fecf3fb 87 */
falingtrea 0:d2169fecf3fb 88 longitude getLongitude(void);
falingtrea 0:d2169fecf3fb 89
falingtrea 0:d2169fecf3fb 90 /** get latitude structure
falingtrea 0:d2169fecf3fb 91 * @return last valid NEMA string latitude data
falingtrea 0:d2169fecf3fb 92 */
falingtrea 0:d2169fecf3fb 93 latitude getLatitude(void);
falingtrea 0:d2169fecf3fb 94
falingtrea 0:d2169fecf3fb 95 /** get timestamp structure
falingtrea 0:d2169fecf3fb 96 * @return last valid NEMA string time and date data
falingtrea 0:d2169fecf3fb 97 * uses tm struc from ctime standard library
falingtrea 0:d2169fecf3fb 98 */
falingtrea 0:d2169fecf3fb 99 struct tm getTimestamp(void);
falingtrea 0:d2169fecf3fb 100
falingtrea 0:d2169fecf3fb 101 /** get GPS Lock status
falingtrea 0:d2169fecf3fb 102 * @return boolean of last valid NEMA string lock status data
falingtrea 0:d2169fecf3fb 103 */
falingtrea 0:d2169fecf3fb 104 bool getLockStatus(void);
falingtrea 0:d2169fecf3fb 105
falingtrea 0:d2169fecf3fb 106 /** get GPS Fix status
falingtrea 0:d2169fecf3fb 107 * @return last valid NEMA Fix status data
falingtrea 0:d2169fecf3fb 108 * 1 = no fix
falingtrea 0:d2169fecf3fb 109 * 2 = 2D fix - latitude, longitude, time only valid
falingtrea 0:d2169fecf3fb 110 * 3 = 3D fix - all data valid
falingtrea 0:d2169fecf3fb 111 */
falingtrea 0:d2169fecf3fb 112 uint8_t getFixStatus(void);
falingtrea 0:d2169fecf3fb 113
falingtrea 0:d2169fecf3fb 114 /** get GPS Fix qualty
falingtrea 0:d2169fecf3fb 115 * @return last valid NEMA string Fix Quality data
falingtrea 0:d2169fecf3fb 116 * 0 = invalid
falingtrea 0:d2169fecf3fb 117 * 1 = GPS fix (SPS)
falingtrea 0:d2169fecf3fb 118 * 2 = DGPS fix
falingtrea 0:d2169fecf3fb 119 * 3 = PPS fix
falingtrea 0:d2169fecf3fb 120 * 4 = Real Time Kinematic
falingtrea 0:d2169fecf3fb 121 * 5 = Float RTK
falingtrea 0:d2169fecf3fb 122 * 6 = estimated (dead reckoning) (2.3 feature)
falingtrea 0:d2169fecf3fb 123 * 7 = Manual input mode
falingtrea 0:d2169fecf3fb 124 * 8 = Simulation mode
falingtrea 0:d2169fecf3fb 125 */
falingtrea 0:d2169fecf3fb 126 uint8_t getFixQuality(void);
falingtrea 0:d2169fecf3fb 127
falingtrea 0:d2169fecf3fb 128 /** get number of visible satellites
falingtrea 0:d2169fecf3fb 129 * @return last valid NEMA string number of satellites visible
falingtrea 0:d2169fecf3fb 130 */
falingtrea 0:d2169fecf3fb 131 uint8_t getNumSatellites(void);
falingtrea 0:d2169fecf3fb 132
falingtrea 0:d2169fecf3fb 133 /** get calculated altitude
falingtrea 0:d2169fecf3fb 134 * @return last valid NEMA string altitude data in meters
falingtrea 0:d2169fecf3fb 135 */
falingtrea 0:d2169fecf3fb 136 int16_t getAltitude(void);
falingtrea 0:d2169fecf3fb 137
falingtrea 0:d2169fecf3fb 138 private:
falingtrea 0:d2169fecf3fb 139
falingtrea 0:d2169fecf3fb 140 std::string _nema_buff;
falingtrea 0:d2169fecf3fb 141 bool _gps_detected;
falingtrea 0:d2169fecf3fb 142 latitude _gps_latitude;
falingtrea 0:d2169fecf3fb 143 longitude _gps_longitude;
falingtrea 0:d2169fecf3fb 144 struct tm _timestamp;
falingtrea 0:d2169fecf3fb 145 bool _gps_status;
falingtrea 0:d2169fecf3fb 146 uint8_t _fix_status;
falingtrea 0:d2169fecf3fb 147 uint8_t _fix_quality;
falingtrea 0:d2169fecf3fb 148 uint8_t _num_satellites;
falingtrea 0:d2169fecf3fb 149 satellite_prn _satellite_prn;
falingtrea 0:d2169fecf3fb 150 int16_t _msl_altitude;
falingtrea 0:d2169fecf3fb 151
Mike Fiore 5:11f41dee386b 152 MTSSerial *_gps_uart;
falingtrea 0:d2169fecf3fb 153 Thread _getSentenceThread;
Mike Fiore 6:2050b4795b66 154 NCP5623B* _led;
Mike Fiore 6:2050b4795b66 155 int8_t _led_state;
Evan Hosseini 13:b41779d6cddb 156 int8_t _led_state_out;
Mike Fiore 7:bd1013ba8afd 157 Ticker _tick;
Mike Fiore 7:bd1013ba8afd 158 bool _tick_running;
Mike Fiore 8:5fa40fa372e2 159 Mutex _mutex;
falingtrea 0:d2169fecf3fb 160
falingtrea 0:d2169fecf3fb 161 /** Start sentence parser thread
falingtrea 0:d2169fecf3fb 162 *
falingtrea 0:d2169fecf3fb 163 */
falingtrea 0:d2169fecf3fb 164 static void startSentenceThread (void const *p);
falingtrea 0:d2169fecf3fb 165
falingtrea 0:d2169fecf3fb 166 /** Read NEMA sentences from specified serial port and call specific sentence parser
falingtrea 0:d2169fecf3fb 167 */
falingtrea 0:d2169fecf3fb 168 void readNemaSentence (void);
falingtrea 0:d2169fecf3fb 169
falingtrea 0:d2169fecf3fb 170 /** Parse GGA NEMA sentence
falingtrea 0:d2169fecf3fb 171 * @return status of parser attempt
falingtrea 0:d2169fecf3fb 172 */
falingtrea 0:d2169fecf3fb 173 uint8_t parseGGA(char *nema_buf);
falingtrea 0:d2169fecf3fb 174
falingtrea 0:d2169fecf3fb 175 /** Parse GSA NEMA sentence
falingtrea 0:d2169fecf3fb 176 * @return status of parser attempt
falingtrea 0:d2169fecf3fb 177 */
falingtrea 0:d2169fecf3fb 178 uint8_t parseGSA(char *nema_buf);
falingtrea 0:d2169fecf3fb 179
falingtrea 0:d2169fecf3fb 180 /** Parse GSV NEMA sentence
falingtrea 0:d2169fecf3fb 181 * @return status of parser attempt
falingtrea 0:d2169fecf3fb 182 */
falingtrea 0:d2169fecf3fb 183 uint8_t parseGSV(char *nema_buf);
falingtrea 0:d2169fecf3fb 184
falingtrea 0:d2169fecf3fb 185 /** Parse RMC NEMA sentence
falingtrea 0:d2169fecf3fb 186 * @return status of parser attempt
falingtrea 0:d2169fecf3fb 187 */
falingtrea 0:d2169fecf3fb 188 uint8_t parseRMC(char *nema_buf);
falingtrea 0:d2169fecf3fb 189
falingtrea 0:d2169fecf3fb 190 /** Parse VTG NEMA sentence
falingtrea 0:d2169fecf3fb 191 * @return status of parser attempt
falingtrea 0:d2169fecf3fb 192 */
falingtrea 0:d2169fecf3fb 193 uint8_t parseVTG(char *nema_buf);
falingtrea 0:d2169fecf3fb 194
falingtrea 0:d2169fecf3fb 195 /** Parse GLL NEMA sentence
falingtrea 0:d2169fecf3fb 196 * @return status of parser attempt
falingtrea 0:d2169fecf3fb 197 */
falingtrea 0:d2169fecf3fb 198 uint8_t parseGLL(char *nema_buff);
falingtrea 0:d2169fecf3fb 199
falingtrea 0:d2169fecf3fb 200 /** Parse ZDA NEMA sentence
falingtrea 0:d2169fecf3fb 201 * @return status of parser attempt
falingtrea 0:d2169fecf3fb 202 */
falingtrea 0:d2169fecf3fb 203 uint8_t parseZDA(char *nema_buff);
falingtrea 0:d2169fecf3fb 204
Mike Fiore 7:bd1013ba8afd 205 void blinker();
Mike Fiore 7:bd1013ba8afd 206
falingtrea 0:d2169fecf3fb 207 };
Mike Fiore 5:11f41dee386b 208 #endif