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 "../../Defines.h"
31//#include "Arduino.h"
32#include <limits.h>
33
34#define _GPS_VERSION "1.1.0" // software version of this library
35#define _GPS_MPH_PER_KNOT 1.15077945
36#define _GPS_MPS_PER_KNOT 0.51444444
37#define _GPS_KMPH_PER_KNOT 1.852
38#define _GPS_MILES_PER_METER 0.00062137112
39#define _GPS_KM_PER_METER 0.001
40#define _GPS_FEET_PER_METER 3.2808399
41#define _GPS_MAX_FIELD_SIZE 15
42#define _GPS_EARTH_MEAN_RADIUS 6371009 // old: 6372795
43
45{
46 uint16_t deg;
47 uint32_t billionths;
49public:
50 RawDegrees() : deg(0), billionths(0), negative(false)
51 {}
52};
53
55{
56 friend class TinyGPSPlus;
57public:
58 enum Quality { Invalid = '0', GPS = '1', DGPS = '2', PPS = '3', RTK = '4', FloatRTK = '5', Estimated = '6', Manual = '7', Simulated = '8' };
59 enum Mode { N = 'N', A = 'A', D = 'D', E = 'E'};
60
61 bool isValid() const { return valid; }
62 bool isUpdated() const { return updated; }
63 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
64 const RawDegrees &rawLat() { updated = false; return rawLatData; }
65 const RawDegrees &rawLng() { updated = false; return rawLngData; }
66 double lat();
67 double lng();
68 Quality FixQuality() { updated = false; return fixQuality; }
69 Mode FixMode() { updated = false; return fixMode; }
70
71 TinyGPSLocation() : valid(false), updated(false), fixQuality(Invalid), fixMode(N)
72 {}
73
74private:
75 bool valid, updated;
76 RawDegrees rawLatData, rawLngData, rawNewLatData, rawNewLngData;
77 Quality fixQuality, newFixQuality;
78 Mode fixMode, newFixMode;
79 uint32_t lastCommitTime;
80 void commit();
81 void setLatitude(const char *term);
82 void setLongitude(const char *term);
83};
84
86{
87 friend class TinyGPSPlus;
88public:
89 bool isValid() const { return valid; }
90 bool isUpdated() const { return updated; }
91 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
92
93 uint32_t value() { updated = false; return date; }
94 uint16_t year();
95 uint8_t month();
96 uint8_t day();
97
98 TinyGPSDate() : valid(false), updated(false), date(0)
99 {}
100
101private:
102 bool valid, updated;
103 uint32_t date, newDate;
104 uint32_t lastCommitTime;
105 void commit();
106 void setDate(const char *term);
107};
108
110{
111 friend class TinyGPSPlus;
112public:
113 bool isValid() const { return valid; }
114 bool isUpdated() const { return updated; }
115 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
116
117 uint32_t value() { updated = false; return time; }
118 uint8_t hour();
119 uint8_t minute();
120 uint8_t second();
121 uint8_t centisecond();
122
123 TinyGPSTime() : valid(false), updated(false), time(0)
124 {}
125
126private:
127 bool valid, updated;
128 uint32_t time, newTime;
129 uint32_t lastCommitTime;
130 void commit();
131 void setTime(const char *term);
132};
133
135{
136 friend class TinyGPSPlus;
137public:
138 bool isValid() const { return valid; }
139 bool isUpdated() const { return updated; }
140 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
141 int32_t value() { updated = false; return val; }
142
143 TinyGPSDecimal() : valid(false), updated(false), val(0)
144 {}
145
146private:
147 bool valid, updated;
148 uint32_t lastCommitTime;
149 int32_t val, newval;
150 void commit();
151 void set(const char *term);
152};
153
155{
156 friend class TinyGPSPlus;
157public:
158 bool isValid() const { return valid; }
159 bool isUpdated() const { return updated; }
160 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
161 uint32_t value() { updated = false; return val; }
162
163 TinyGPSInteger() : valid(false), updated(false), val(0)
164 {}
165
166private:
167 bool valid, updated;
168 uint32_t lastCommitTime;
169 uint32_t val, newval;
170 void commit();
171 void set(const char *term);
172};
173
175{
176 double knots() { return value() / 100.0; }
177 double mph() { return _GPS_MPH_PER_KNOT * value() / 100.0; }
178 double mps() { return _GPS_MPS_PER_KNOT * value() / 100.0; }
179 double kmph() { return _GPS_KMPH_PER_KNOT * value() / 100.0; }
180};
181
183{
184 double deg() { return value() / 100.0; }
185};
186
188{
189 double meters() { return value() / 100.0; }
190 double miles() { return _GPS_MILES_PER_METER * value() / 100.0; }
191 double kilometers() { return _GPS_KM_PER_METER * value() / 100.0; }
192 double feet() { return _GPS_FEET_PER_METER * value() / 100.0; }
193};
194
196{
197 double hdop() { return value() / 100.0; }
198};
199
200class TinyGPSPlus;
202{
203public:
205 TinyGPSCustom(TinyGPSPlus &gps, const char *sentenceName, int termNumber);
206 void begin(TinyGPSPlus &gps, const char *_sentenceName, int _termNumber);
207
208 bool isUpdated() const { return updated; }
209 bool isValid() const { return valid; }
210 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
211 const char *value() { updated = false; return buffer; }
212
213private:
214 void commit();
215 void set(const char *term);
216
217 char stagingBuffer[_GPS_MAX_FIELD_SIZE + 1];
218 char buffer[_GPS_MAX_FIELD_SIZE + 1];
219 unsigned long lastCommitTime;
220 bool valid, updated;
221 const char *sentenceName;
222 int termNumber;
223 friend class TinyGPSPlus;
224 TinyGPSCustom *next;
225};
226
228{
229public:
230 TinyGPSPlus();
231 bool encode(char c); // process one character received from GPS
232 TinyGPSPlus &operator << (char c) {encode(c); return *this;}
233
242
243 static const char *libraryVersion() { return _GPS_VERSION; }
244
245 static double distanceBetween(double lat1, double long1, double lat2, double long2);
246 static double courseTo(double lat1, double long1, double lat2, double long2);
247 static const char *cardinal(double course);
248
249 static int32_t parseDecimal(const char *term);
250 static void parseDegrees(const char *term, RawDegrees &deg);
251
252 uint32_t charsProcessed() const { return encodedCharCount; }
253 uint32_t sentencesWithFix() const { return sentencesWithFixCount; }
254 uint32_t failedChecksum() const { return failedChecksumCount; }
255 uint32_t passedChecksum() const { return passedChecksumCount; }
256 void reset() {
257 // Reset all parsing state variables
258 parity = 0;
259 isChecksumTerm = false;
260 curSentenceType = 0;
261 curTermNumber = 0;
262 curTermOffset = 0;
263 sentenceHasFix = false;
264
265 // Reset statistics
266 encodedCharCount = 0;
267 sentencesWithFixCount = 0;
268 failedChecksumCount = 0;
269 passedChecksumCount = 0;
270
271 // Clear location, date, and time
272 location = TinyGPSLocation(); // Assuming default constructor resets it
273 date = TinyGPSDate(); // Assuming default constructor resets it
274 time = TinyGPSTime(); // Assuming default constructor resets it
275
276 // Clear other attributes if necessary
277 speed = TinyGPSSpeed(); // Assuming default constructor resets it
278 course = TinyGPSCourse(); // Assuming default constructor resets it
279 altitude = TinyGPSAltitude(); // Assuming default constructor resets it
280 satellites = TinyGPSInteger(); // Assuming default constructor resets it
281 hdop = TinyGPSHDOP(); // Assuming default constructor resets it
282
283 // Clear custom elements if applicable
284 customElts = nullptr;
285 customCandidates = nullptr;
286 }
287private:
288 enum {GPS_SENTENCE_GGA, GPS_SENTENCE_RMC, GPS_SENTENCE_OTHER};
289
290 // parsing state variables
291 uint8_t parity;
292 bool isChecksumTerm;
293 char term[_GPS_MAX_FIELD_SIZE];
294 uint8_t curSentenceType;
295 uint8_t curTermNumber;
296 uint8_t curTermOffset;
297 bool sentenceHasFix;
298
299 // custom element support
300 friend class TinyGPSCustom;
301 TinyGPSCustom *customElts;
302 TinyGPSCustom *customCandidates;
303 void insertCustom(TinyGPSCustom *pElt, const char *sentenceName, int index);
304
305 // statistics
306 uint32_t encodedCharCount;
307 uint32_t sentencesWithFixCount;
308 uint32_t failedChecksumCount;
309 uint32_t passedChecksumCount;
310
311 // internal utilities
312 int fromHex(char a);
313 bool endOfTermHandler();
314};
315
316#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:35
#define _GPS_VERSION
Definition: TinyGPS.h:34
#define _GPS_KM_PER_METER
Definition: TinyGPS.h:39
#define _GPS_MILES_PER_METER
Definition: TinyGPS.h:38
#define _GPS_MPS_PER_KNOT
Definition: TinyGPS.h:36
#define _GPS_KMPH_PER_KNOT
Definition: TinyGPS.h:37
#define _GPS_MAX_FIELD_SIZE
Definition: TinyGPS.h:41
#define _GPS_FEET_PER_METER
Definition: TinyGPS.h:40
const char * value()
Definition: TinyGPS.h:211
void begin(TinyGPSPlus &gps, const char *_sentenceName, int _termNumber)
Definition: TinyGPS.cpp:482
bool isValid() const
Definition: TinyGPS.h:209
bool isUpdated() const
Definition: TinyGPS.h:208
uint32_t age() const
Definition: TinyGPS.h:210
static void parseDegrees(const char *term, RawDegrees &deg)
Definition: TinyGPS.cpp:143
TinyGPSPlus & operator<<(char c)
Definition: TinyGPS.h:232
static int32_t parseDecimal(const char *term)
Definition: TinyGPS.cpp:126
TinyGPSAltitude altitude
Definition: TinyGPS.h:239
TinyGPSHDOP hdop
Definition: TinyGPS.h:241
void reset()
Definition: TinyGPS.h:256
TinyGPSTime time
Definition: TinyGPS.h:236
uint32_t passedChecksum() const
Definition: TinyGPS.h:255
TinyGPSInteger satellites
Definition: TinyGPS.h:240
uint32_t sentencesWithFix() const
Definition: TinyGPS.h:253
TinyGPSDate date
Definition: TinyGPS.h:235
TinyGPSLocation location
Definition: TinyGPS.h:234
static const char * cardinal(double course)
Definition: TinyGPS.cpp:345
static const char * libraryVersion()
Definition: TinyGPS.h:243
TinyGPSSpeed speed
Definition: TinyGPS.h:237
static double distanceBetween(double lat1, double long1, double lat2, double long2)
Definition: TinyGPS.cpp:300
TinyGPSCourse course
Definition: TinyGPS.h:238
bool encode(char c)
Definition: TinyGPS.cpp:67
uint32_t charsProcessed() const
Definition: TinyGPS.h:252
static double courseTo(double lat1, double long1, double lat2, double long2)
Definition: TinyGPS.cpp:325
uint32_t failedChecksum() const
Definition: TinyGPS.h:254
uint16_t deg
Definition: TinyGPS.h:46
uint32_t billionths
Definition: TinyGPS.h:47
RawDegrees()
Definition: TinyGPS.h:50
bool negative
Definition: TinyGPS.h:48
double kilometers()
Definition: TinyGPS.h:191
double meters()
Definition: TinyGPS.h:189
double miles()
Definition: TinyGPS.h:190
double feet()
Definition: TinyGPS.h:192
double deg()
Definition: TinyGPS.h:184
bool isUpdated() const
Definition: TinyGPS.h:90
bool isValid() const
Definition: TinyGPS.h:89
TinyGPSDate()
Definition: TinyGPS.h:98
uint8_t month()
Definition: TinyGPS.cpp:417
uint32_t value()
Definition: TinyGPS.h:93
uint16_t year()
Definition: TinyGPS.cpp:410
uint8_t day()
Definition: TinyGPS.cpp:423
uint32_t age() const
Definition: TinyGPS.h:91
uint32_t age() const
Definition: TinyGPS.h:140
bool isValid() const
Definition: TinyGPS.h:138
bool isUpdated() const
Definition: TinyGPS.h:139
int32_t value()
Definition: TinyGPS.h:141
double hdop()
Definition: TinyGPS.h:197
bool isUpdated() const
Definition: TinyGPS.h:159
bool isValid() const
Definition: TinyGPS.h:158
uint32_t value()
Definition: TinyGPS.h:161
uint32_t age() const
Definition: TinyGPS.h:160
Mode FixMode()
Definition: TinyGPS.h:69
const RawDegrees & rawLng()
Definition: TinyGPS.h:65
double lng()
Definition: TinyGPS.cpp:379
Quality FixQuality()
Definition: TinyGPS.h:68
double lat()
Definition: TinyGPS.cpp:372
bool isUpdated() const
Definition: TinyGPS.h:62
bool isValid() const
Definition: TinyGPS.h:61
const RawDegrees & rawLat()
Definition: TinyGPS.h:64
uint32_t age() const
Definition: TinyGPS.h:63
double mph()
Definition: TinyGPS.h:177
double kmph()
Definition: TinyGPS.h:179
double knots()
Definition: TinyGPS.h:176
double mps()
Definition: TinyGPS.h:178
bool isUpdated() const
Definition: TinyGPS.h:114
uint8_t centisecond()
Definition: TinyGPS.cpp:447
uint8_t hour()
Definition: TinyGPS.cpp:429
bool isValid() const
Definition: TinyGPS.h:113
uint8_t second()
Definition: TinyGPS.cpp:441
TinyGPSTime()
Definition: TinyGPS.h:123
uint32_t age() const
Definition: TinyGPS.h:115
uint8_t minute()
Definition: TinyGPS.cpp:435
uint32_t value()
Definition: TinyGPS.h:117