ESP_IOT v2.5
IOT ESP Coding
TinyGPS.h
Go to the documentation of this file.
1/*
2TinyGPS++ - a small GPS library for Arduino providing universal NMEA parsing
3Based on work by and "distanceBetween" and "courseTo" courtesy of Maarten Lamers.
4Suggestion to add satellites, courseTo(), and cardinal() by Matt Monson.
5Location precision improvements suggested by Wayne Holder.
6Copyright (C) 2008-2024 Mikal Hart
7All rights reserved.
8
9This library is free software; you can redistribute it and/or
10modify it under the terms of the GNU Lesser General Public
11License as published by the Free Software Foundation; either
12version 2.1 of the License, or (at your option) any later version.
13
14This library is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17Lesser General Public License for more details.
18
19You should have received a copy of the GNU Lesser General Public
20License along with this library; if not, write to the Free Software
21Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22*/
23
24
25
26#ifndef __TinyGPSPlus_h
27#define __TinyGPSPlus_h
28
29#include <inttypes.h>
30#include "Arduino.h"
31#include <limits.h>
32
33#define _GPS_VERSION "1.1.0" // software version of this library
34#define _GPS_MPH_PER_KNOT 1.15077945
35#define _GPS_MPS_PER_KNOT 0.51444444
36#define _GPS_KMPH_PER_KNOT 1.852
37#define _GPS_MILES_PER_METER 0.00062137112
38#define _GPS_KM_PER_METER 0.001
39#define _GPS_FEET_PER_METER 3.2808399
40#define _GPS_MAX_FIELD_SIZE 15
41#define _GPS_EARTH_MEAN_RADIUS 6371009 // old: 6372795
42
44{
45 uint16_t deg;
46 uint32_t billionths;
48public:
49 RawDegrees() : deg(0), billionths(0), negative(false)
50 {}
51};
52
54{
55 friend class TinyGPSPlus;
56public:
57 enum Quality { Invalid = '0', GPS = '1', DGPS = '2', PPS = '3', RTK = '4', FloatRTK = '5', Estimated = '6', Manual = '7', Simulated = '8' };
58 enum Mode { N = 'N', A = 'A', D = 'D', E = 'E'};
59
60 bool isValid() const { return valid; }
61 bool isUpdated() const { return updated; }
62 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
63 const RawDegrees &rawLat() { updated = false; return rawLatData; }
64 const RawDegrees &rawLng() { updated = false; return rawLngData; }
65 double lat();
66 double lng();
67 Quality FixQuality() { updated = false; return fixQuality; }
68 Mode FixMode() { updated = false; return fixMode; }
69
70 TinyGPSLocation() : valid(false), updated(false), fixQuality(Invalid), fixMode(N)
71 {}
72
73private:
74 bool valid, updated;
75 RawDegrees rawLatData, rawLngData, rawNewLatData, rawNewLngData;
76 Quality fixQuality, newFixQuality;
77 Mode fixMode, newFixMode;
78 uint32_t lastCommitTime;
79 void commit();
80 void setLatitude(const char *term);
81 void setLongitude(const char *term);
82};
83
85{
86 friend class TinyGPSPlus;
87public:
88 bool isValid() const { return valid; }
89 bool isUpdated() const { return updated; }
90 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
91
92 uint32_t value() { updated = false; return date; }
93 uint16_t year();
94 uint8_t month();
95 uint8_t day();
96
97 TinyGPSDate() : valid(false), updated(false), date(0)
98 {}
99
100private:
101 bool valid, updated;
102 uint32_t date, newDate;
103 uint32_t lastCommitTime;
104 void commit();
105 void setDate(const char *term);
106};
107
109{
110 friend class TinyGPSPlus;
111public:
112 bool isValid() const { return valid; }
113 bool isUpdated() const { return updated; }
114 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
115
116 uint32_t value() { updated = false; return time; }
117 uint8_t hour();
118 uint8_t minute();
119 uint8_t second();
120 uint8_t centisecond();
121
122 TinyGPSTime() : valid(false), updated(false), time(0)
123 {}
124
125private:
126 bool valid, updated;
127 uint32_t time, newTime;
128 uint32_t lastCommitTime;
129 void commit();
130 void setTime(const char *term);
131};
132
134{
135 friend class TinyGPSPlus;
136public:
137 bool isValid() const { return valid; }
138 bool isUpdated() const { return updated; }
139 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
140 int32_t value() { updated = false; return val; }
141
142 TinyGPSDecimal() : valid(false), updated(false), val(0)
143 {}
144
145private:
146 bool valid, updated;
147 uint32_t lastCommitTime;
148 int32_t val, newval;
149 void commit();
150 void set(const char *term);
151};
152
154{
155 friend class TinyGPSPlus;
156public:
157 bool isValid() const { return valid; }
158 bool isUpdated() const { return updated; }
159 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
160 uint32_t value() { updated = false; return val; }
161
162 TinyGPSInteger() : valid(false), updated(false), val(0)
163 {}
164
165private:
166 bool valid, updated;
167 uint32_t lastCommitTime;
168 uint32_t val, newval;
169 void commit();
170 void set(const char *term);
171};
172
174{
175 double knots() { return value() / 100.0; }
176 double mph() { return _GPS_MPH_PER_KNOT * value() / 100.0; }
177 double mps() { return _GPS_MPS_PER_KNOT * value() / 100.0; }
178 double kmph() { return _GPS_KMPH_PER_KNOT * value() / 100.0; }
179};
180
182{
183 double deg() { return value() / 100.0; }
184};
185
187{
188 double meters() { return value() / 100.0; }
189 double miles() { return _GPS_MILES_PER_METER * value() / 100.0; }
190 double kilometers() { return _GPS_KM_PER_METER * value() / 100.0; }
191 double feet() { return _GPS_FEET_PER_METER * value() / 100.0; }
192};
193
195{
196 double hdop() { return value() / 100.0; }
197};
198
199class TinyGPSPlus;
201{
202public:
204 TinyGPSCustom(TinyGPSPlus &gps, const char *sentenceName, int termNumber);
205 void begin(TinyGPSPlus &gps, const char *_sentenceName, int _termNumber);
206
207 bool isUpdated() const { return updated; }
208 bool isValid() const { return valid; }
209 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
210 const char *value() { updated = false; return buffer; }
211
212private:
213 void commit();
214 void set(const char *term);
215
216 char stagingBuffer[_GPS_MAX_FIELD_SIZE + 1];
217 char buffer[_GPS_MAX_FIELD_SIZE + 1];
218 unsigned long lastCommitTime;
219 bool valid, updated;
220 const char *sentenceName;
221 int termNumber;
222 friend class TinyGPSPlus;
223 TinyGPSCustom *next;
224};
225
227{
228public:
229 TinyGPSPlus();
230 bool encode(char c); // process one character received from GPS
231 TinyGPSPlus &operator << (char c) {encode(c); return *this;}
232
241
242 static const char *libraryVersion() { return _GPS_VERSION; }
243
244 static double distanceBetween(double lat1, double long1, double lat2, double long2);
245 static double courseTo(double lat1, double long1, double lat2, double long2);
246 static const char *cardinal(double course);
247
248 static int32_t parseDecimal(const char *term);
249 static void parseDegrees(const char *term, RawDegrees &deg);
250
251 uint32_t charsProcessed() const { return encodedCharCount; }
252 uint32_t sentencesWithFix() const { return sentencesWithFixCount; }
253 uint32_t failedChecksum() const { return failedChecksumCount; }
254 uint32_t passedChecksum() const { return passedChecksumCount; }
255 void reset() {
256 // Reset all parsing state variables
257 parity = 0;
258 isChecksumTerm = false;
259 curSentenceType = 0;
260 curTermNumber = 0;
261 curTermOffset = 0;
262 sentenceHasFix = false;
263
264 // Reset statistics
265 encodedCharCount = 0;
266 sentencesWithFixCount = 0;
267 failedChecksumCount = 0;
268 passedChecksumCount = 0;
269
270 // Clear location, date, and time
271 location = TinyGPSLocation(); // Assuming default constructor resets it
272 date = TinyGPSDate(); // Assuming default constructor resets it
273 time = TinyGPSTime(); // Assuming default constructor resets it
274
275 // Clear other attributes if necessary
276 speed = TinyGPSSpeed(); // Assuming default constructor resets it
277 course = TinyGPSCourse(); // Assuming default constructor resets it
278 altitude = TinyGPSAltitude(); // Assuming default constructor resets it
279 satellites = TinyGPSInteger(); // Assuming default constructor resets it
280 hdop = TinyGPSHDOP(); // Assuming default constructor resets it
281
282 // Clear custom elements if applicable
283 customElts = nullptr;
284 customCandidates = nullptr;
285 }
286private:
287 enum {GPS_SENTENCE_GGA, GPS_SENTENCE_RMC, GPS_SENTENCE_OTHER};
288
289 // parsing state variables
290 uint8_t parity;
291 bool isChecksumTerm;
292 char term[_GPS_MAX_FIELD_SIZE];
293 uint8_t curSentenceType;
294 uint8_t curTermNumber;
295 uint8_t curTermOffset;
296 bool sentenceHasFix;
297
298 // custom element support
299 friend class TinyGPSCustom;
300 TinyGPSCustom *customElts;
301 TinyGPSCustom *customCandidates;
302 void insertCustom(TinyGPSCustom *pElt, const char *sentenceName, int index);
303
304 // statistics
305 uint32_t encodedCharCount;
306 uint32_t sentencesWithFixCount;
307 uint32_t failedChecksumCount;
308 uint32_t passedChecksumCount;
309
310 // internal utilities
311 int fromHex(char a);
312 bool endOfTermHandler();
313};
314
315#endif // def(__TinyGPSPlus_h)
MultipleSatellite gps(Serial1, GPSBaud, SERIAL_8N1, TinyGPS_RXPin, TinyGPS_TXPin)
unsigned long millis()
Definition: TinyGPS.cpp:35
#define _GPS_MPH_PER_KNOT
Definition: TinyGPS.h:34
#define _GPS_VERSION
Definition: TinyGPS.h:33
#define _GPS_KM_PER_METER
Definition: TinyGPS.h:38
#define _GPS_MILES_PER_METER
Definition: TinyGPS.h:37
#define _GPS_MPS_PER_KNOT
Definition: TinyGPS.h:35
#define _GPS_KMPH_PER_KNOT
Definition: TinyGPS.h:36
#define _GPS_MAX_FIELD_SIZE
Definition: TinyGPS.h:40
#define _GPS_FEET_PER_METER
Definition: TinyGPS.h:39
const char * value()
Definition: TinyGPS.h:210
void begin(TinyGPSPlus &gps, const char *_sentenceName, int _termNumber)
Definition: TinyGPS.cpp:482
bool isValid() const
Definition: TinyGPS.h:208
bool isUpdated() const
Definition: TinyGPS.h:207
uint32_t age() const
Definition: TinyGPS.h:209
static void parseDegrees(const char *term, RawDegrees &deg)
Definition: TinyGPS.cpp:143
TinyGPSPlus & operator<<(char c)
Definition: TinyGPS.h:231
static int32_t parseDecimal(const char *term)
Definition: TinyGPS.cpp:126
TinyGPSAltitude altitude
Definition: TinyGPS.h:238
TinyGPSHDOP hdop
Definition: TinyGPS.h:240
void reset()
Definition: TinyGPS.h:255
TinyGPSTime time
Definition: TinyGPS.h:235
uint32_t passedChecksum() const
Definition: TinyGPS.h:254
TinyGPSInteger satellites
Definition: TinyGPS.h:239
uint32_t sentencesWithFix() const
Definition: TinyGPS.h:252
TinyGPSDate date
Definition: TinyGPS.h:234
TinyGPSLocation location
Definition: TinyGPS.h:233
static const char * cardinal(double course)
Definition: TinyGPS.cpp:345
static const char * libraryVersion()
Definition: TinyGPS.h:242
TinyGPSSpeed speed
Definition: TinyGPS.h:236
static double distanceBetween(double lat1, double long1, double lat2, double long2)
Definition: TinyGPS.cpp:300
TinyGPSCourse course
Definition: TinyGPS.h:237
bool encode(char c)
Definition: TinyGPS.cpp:67
uint32_t charsProcessed() const
Definition: TinyGPS.h:251
static double courseTo(double lat1, double long1, double lat2, double long2)
Definition: TinyGPS.cpp:325
uint32_t failedChecksum() const
Definition: TinyGPS.h:253
uint16_t deg
Definition: TinyGPS.h:45
uint32_t billionths
Definition: TinyGPS.h:46
RawDegrees()
Definition: TinyGPS.h:49
bool negative
Definition: TinyGPS.h:47
double kilometers()
Definition: TinyGPS.h:190
double meters()
Definition: TinyGPS.h:188
double miles()
Definition: TinyGPS.h:189
double feet()
Definition: TinyGPS.h:191
double deg()
Definition: TinyGPS.h:183
bool isUpdated() const
Definition: TinyGPS.h:89
bool isValid() const
Definition: TinyGPS.h:88
TinyGPSDate()
Definition: TinyGPS.h:97
uint8_t month()
Definition: TinyGPS.cpp:417
uint32_t value()
Definition: TinyGPS.h:92
uint16_t year()
Definition: TinyGPS.cpp:410
uint8_t day()
Definition: TinyGPS.cpp:423
uint32_t age() const
Definition: TinyGPS.h:90
uint32_t age() const
Definition: TinyGPS.h:139
bool isValid() const
Definition: TinyGPS.h:137
bool isUpdated() const
Definition: TinyGPS.h:138
int32_t value()
Definition: TinyGPS.h:140
double hdop()
Definition: TinyGPS.h:196
bool isUpdated() const
Definition: TinyGPS.h:158
bool isValid() const
Definition: TinyGPS.h:157
uint32_t value()
Definition: TinyGPS.h:160
uint32_t age() const
Definition: TinyGPS.h:159
Mode FixMode()
Definition: TinyGPS.h:68
const RawDegrees & rawLng()
Definition: TinyGPS.h:64
double lng()
Definition: TinyGPS.cpp:379
Quality FixQuality()
Definition: TinyGPS.h:67
double lat()
Definition: TinyGPS.cpp:372
bool isUpdated() const
Definition: TinyGPS.h:61
bool isValid() const
Definition: TinyGPS.h:60
const RawDegrees & rawLat()
Definition: TinyGPS.h:63
uint32_t age() const
Definition: TinyGPS.h:62
double mph()
Definition: TinyGPS.h:176
double kmph()
Definition: TinyGPS.h:178
double knots()
Definition: TinyGPS.h:175
double mps()
Definition: TinyGPS.h:177
bool isUpdated() const
Definition: TinyGPS.h:113
uint8_t centisecond()
Definition: TinyGPS.cpp:447
uint8_t hour()
Definition: TinyGPS.cpp:429
bool isValid() const
Definition: TinyGPS.h:112
uint8_t second()
Definition: TinyGPS.cpp:441
TinyGPSTime()
Definition: TinyGPS.h:122
uint32_t age() const
Definition: TinyGPS.h:114
uint8_t minute()
Definition: TinyGPS.cpp:435
uint32_t value()
Definition: TinyGPS.h:116