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
Diff: GPSPARSER.h
- Revision:
- 0:d2169fecf3fb
- Child:
- 5:11f41dee386b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/GPSPARSER.h Thu Sep 10 20:03:21 2015 +0000
@@ -0,0 +1,204 @@
+/**
+ * @file GpsParser.h
+ * @brief NEMA String to Packet Parser - NEMA strings to compact packet data
+ * @author Tim Barr
+ * @version 1.0
+ * @see http://www.kh-gps.de/nmea.faq
+ * @see http://www.catb.org/gpsd/NMEA.html
+ * @see http://www.skytraq.com.tw/products/Venus638LPx_PB_v3.pdf
+ *
+ * Copyright (c) 2015
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef GPSPARSER_H
+#define GPSPARSER_H
+
+#include "mbed.h"
+#include "rtos.h"
+#include "MTSSerial.h"
+#include <string>
+#include <vector>
+#include <ctime>
+#define START_THREAD 1
+
+using namespace mts;
+
+class GPSPARSER
+{
+public:
+
+ /**
+ * @typedef struct latitude
+ * @brief latitude degrees, minutes, seconds structure
+ * range of degrees : 0 to 90 signed (negative degrees is South)
+ * range of minutes : 0 to 60 unsigned
+ * Range of seconds : 0-9999 unsigned or 1/10000 of a minute.
+ * Multiply by 6 and divide or modulus by 1000 to get seconds and fractional seconds
+ */
+ typedef struct{int8_t degrees; uint8_t minutes; uint16_t seconds;} latitude;
+
+ /**
+ * @typedef struct longitude
+ * @brief longitude degrees, minutes, seconds structure negative degrees is West
+ * range of degrees : 0 to 180 signed (negative degrees is West)
+ * range of minutes : 0 to 60 unsigned
+ * Range of seconds : 0-9999 unsigned or 1/10000 of a minute.
+ * Multiply by 6 and divide or modulus by 1000 to get seconds and fractional seconds
+ */
+ typedef struct{int16_t degrees; uint8_t minutes; uint16_t seconds;} longitude;
+
+ /**
+ * @typdef satellite_prn
+ * @brief satellite prn list, up to 12 valid
+ */
+ typedef uint8_t satellite_prn[12];
+
+ /** Create the GPSPARSER object
+ * @param uart - an MTSSerial object
+ */
+ GPSPARSER(MTSSerial *uart);
+
+ /** destroy the GPSPARSER object
+ */
+ ~GPSPARSER(void);
+
+ /** GPS device detected
+ * @return boolean whether GPS device detected
+ */
+ bool gpsDetected(void);
+
+ /** get longitude structure
+ * @return last valid NEMA string longitude data
+ */
+ longitude getLongitude(void);
+
+ /** get latitude structure
+ * @return last valid NEMA string latitude data
+ */
+ latitude getLatitude(void);
+
+ /** get timestamp structure
+ * @return last valid NEMA string time and date data
+ * uses tm struc from ctime standard library
+ */
+ struct tm getTimestamp(void);
+
+ /** get GPS Lock status
+ * @return boolean of last valid NEMA string lock status data
+ */
+ bool getLockStatus(void);
+
+ /** get GPS Fix status
+ * @return last valid NEMA Fix status data
+ * 1 = no fix
+ * 2 = 2D fix - latitude, longitude, time only valid
+ * 3 = 3D fix - all data valid
+ */
+ uint8_t getFixStatus(void);
+
+ /** get GPS Fix qualty
+ * @return last valid NEMA string Fix Quality data
+ * 0 = invalid
+ * 1 = GPS fix (SPS)
+ * 2 = DGPS fix
+ * 3 = PPS fix
+ * 4 = Real Time Kinematic
+ * 5 = Float RTK
+ * 6 = estimated (dead reckoning) (2.3 feature)
+ * 7 = Manual input mode
+ * 8 = Simulation mode
+ */
+ uint8_t getFixQuality(void);
+
+ /** get number of visible satellites
+ * @return last valid NEMA string number of satellites visible
+ */
+ uint8_t getNumSatellites(void);
+
+ /** get calculated altitude
+ * @return last valid NEMA string altitude data in meters
+ */
+ int16_t getAltitude(void);
+
+private:
+
+ std::string _nema_buff;
+ bool _gps_detected;
+ latitude _gps_latitude;
+ longitude _gps_longitude;
+ struct tm _timestamp;
+ bool _gps_status;
+ uint8_t _fix_status;
+ uint8_t _fix_quality;
+ uint8_t _num_satellites;
+ satellite_prn _satellite_prn;
+ int16_t _msl_altitude;
+
+ MTSSerial::MTSSerial *_gps_uart;
+ Thread _getSentenceThread;
+
+ /** Detect and initialize GPS device
+ * @return status of initialization
+ * @note rewrite this code for specific GPS device. This code supports Skytraq Venus chip
+ */
+ uint8_t initGps (void);
+
+ /** Start sentence parser thread
+ *
+ */
+ static void startSentenceThread (void const *p);
+
+ /** Read NEMA sentences from specified serial port and call specific sentence parser
+ */
+ void readNemaSentence (void);
+
+ /** Parse GGA NEMA sentence
+ * @return status of parser attempt
+ */
+ uint8_t parseGGA(char *nema_buf);
+
+ /** Parse GSA NEMA sentence
+ * @return status of parser attempt
+ */
+ uint8_t parseGSA(char *nema_buf);
+
+ /** Parse GSV NEMA sentence
+ * @return status of parser attempt
+ */
+ uint8_t parseGSV(char *nema_buf);
+
+ /** Parse RMC NEMA sentence
+ * @return status of parser attempt
+ */
+ uint8_t parseRMC(char *nema_buf);
+
+ /** Parse VTG NEMA sentence
+ * @return status of parser attempt
+ */
+ uint8_t parseVTG(char *nema_buf);
+
+ /** Parse GLL NEMA sentence
+ * @return status of parser attempt
+ */
+ uint8_t parseGLL(char *nema_buff);
+
+ /** Parse ZDA NEMA sentence
+ * @return status of parser attempt
+ */
+ uint8_t parseZDA(char *nema_buff);
+
+};
+#endif
\ No newline at end of file