mbed port of the TinyGPSPlus library for Arduino, by Mikal Hart. The port is heavily inspired by Sergey Drobyshevskiy (dROb)'s port of the TinyGPS library.

Dependents:   ZZ_SSL_Main_L476 Sample_program_Font72

Fork of TinyGPSPlus by カレヴィ アンダース

Committer:
WaleedElmughrabi
Date:
Wed Nov 07 03:42:07 2018 +0000
Revision:
2:9fb16575b0f8
Parent:
0:2576f9f1dc71
UK time

Who changed what in which revision?

UserRevisionLine numberNew contents of line
OkiAviation 0:2576f9f1dc71 1 /*
OkiAviation 0:2576f9f1dc71 2 TinyGPS++ - a small GPS library for Arduino providing universal NMEA parsing
OkiAviation 0:2576f9f1dc71 3 Based on work by and "distanceBetween" and "courseTo" courtesy of Maarten Lamers.
OkiAviation 0:2576f9f1dc71 4 Suggestion to add satellites, courseTo(), and cardinal() by Matt Monson.
OkiAviation 0:2576f9f1dc71 5 Location precision improvements suggested by Wayne Holder.
OkiAviation 0:2576f9f1dc71 6 Copyright (C) 2008-2013 Mikal Hart
OkiAviation 0:2576f9f1dc71 7 All rights reserved.
OkiAviation 0:2576f9f1dc71 8
OkiAviation 0:2576f9f1dc71 9 This library is free software; you can redistribute it and/or
OkiAviation 0:2576f9f1dc71 10 modify it under the terms of the GNU Lesser General Public
OkiAviation 0:2576f9f1dc71 11 License as published by the Free Software Foundation; either
OkiAviation 0:2576f9f1dc71 12 version 2.1 of the License, or (at your option) any later version.
OkiAviation 0:2576f9f1dc71 13
OkiAviation 0:2576f9f1dc71 14 This library is distributed in the hope that it will be useful,
OkiAviation 0:2576f9f1dc71 15 but WITHOUT ANY WARRANTY; without even the implied warranty of
OkiAviation 0:2576f9f1dc71 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
OkiAviation 0:2576f9f1dc71 17 Lesser General Public License for more details.
OkiAviation 0:2576f9f1dc71 18
OkiAviation 0:2576f9f1dc71 19 You should have received a copy of the GNU Lesser General Public
OkiAviation 0:2576f9f1dc71 20 License along with this library; if not, write to the Free Software
OkiAviation 0:2576f9f1dc71 21 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
OkiAviation 0:2576f9f1dc71 22 */
OkiAviation 0:2576f9f1dc71 23
OkiAviation 0:2576f9f1dc71 24 #ifndef __TinyGPSPlus_h
OkiAviation 0:2576f9f1dc71 25 #define __TinyGPSPlus_h
OkiAviation 0:2576f9f1dc71 26
OkiAviation 0:2576f9f1dc71 27 /*#if defined(ARDUINO) && ARDUINO >= 100
OkiAviation 0:2576f9f1dc71 28 #include "Arduino.h"
OkiAviation 0:2576f9f1dc71 29 #else
OkiAviation 0:2576f9f1dc71 30 #include "WProgram.h"
OkiAviation 0:2576f9f1dc71 31 #endif
OkiAviation 0:2576f9f1dc71 32 */
OkiAviation 0:2576f9f1dc71 33
OkiAviation 0:2576f9f1dc71 34 #include "mbed.h"
OkiAviation 0:2576f9f1dc71 35 #include "types.h"
OkiAviation 0:2576f9f1dc71 36
OkiAviation 0:2576f9f1dc71 37 #include <stdlib.h>
OkiAviation 0:2576f9f1dc71 38 #include <limits.h>
OkiAviation 0:2576f9f1dc71 39
OkiAviation 0:2576f9f1dc71 40 #define _GPS_VERSION "0.92" // software version of this library
OkiAviation 0:2576f9f1dc71 41 #define _GPS_MPH_PER_KNOT 1.15077945
OkiAviation 0:2576f9f1dc71 42 #define _GPS_MPS_PER_KNOT 0.51444444
OkiAviation 0:2576f9f1dc71 43 #define _GPS_KMPH_PER_KNOT 1.852
OkiAviation 0:2576f9f1dc71 44 #define _GPS_MILES_PER_METER 0.00062137112
OkiAviation 0:2576f9f1dc71 45 #define _GPS_KM_PER_METER 0.001
OkiAviation 0:2576f9f1dc71 46 #define _GPS_FEET_PER_METER 3.2808399
OkiAviation 0:2576f9f1dc71 47 #define _GPS_MAX_FIELD_SIZE 15
OkiAviation 0:2576f9f1dc71 48
OkiAviation 0:2576f9f1dc71 49 #define PI 3.1415926535897932384626433832795
OkiAviation 0:2576f9f1dc71 50 #define HALF_PI 1.5707963267948966192313216916398
OkiAviation 0:2576f9f1dc71 51 #define TWO_PI 6.283185307179586476925286766559
OkiAviation 0:2576f9f1dc71 52 #define DEG_TO_RAD 0.017453292519943295769236907684886
OkiAviation 0:2576f9f1dc71 53 #define RAD_TO_DEG 57.295779513082320876798154814105
OkiAviation 0:2576f9f1dc71 54 #define EULER 2.718281828459045235360287471352
OkiAviation 0:2576f9f1dc71 55 #define radians(deg) ((deg)*DEG_TO_RAD)
OkiAviation 0:2576f9f1dc71 56 #define degrees(rad) ((rad)*RAD_TO_DEG)
OkiAviation 0:2576f9f1dc71 57 #define sq(x) ((x)*(x))
OkiAviation 0:2576f9f1dc71 58
OkiAviation 0:2576f9f1dc71 59
OkiAviation 0:2576f9f1dc71 60 struct RawDegrees
OkiAviation 0:2576f9f1dc71 61 {
OkiAviation 0:2576f9f1dc71 62 uint16_t deg;
OkiAviation 0:2576f9f1dc71 63 uint32_t billionths;
OkiAviation 0:2576f9f1dc71 64 bool negative;
OkiAviation 0:2576f9f1dc71 65 public:
OkiAviation 0:2576f9f1dc71 66 RawDegrees() : deg(0), billionths(0), negative(false)
OkiAviation 0:2576f9f1dc71 67 {}
OkiAviation 0:2576f9f1dc71 68 };
OkiAviation 0:2576f9f1dc71 69
OkiAviation 0:2576f9f1dc71 70 struct TinyGPSLocation
OkiAviation 0:2576f9f1dc71 71 {
OkiAviation 0:2576f9f1dc71 72 friend class TinyGPSPlus;
OkiAviation 0:2576f9f1dc71 73 public:
OkiAviation 0:2576f9f1dc71 74 bool isValid() const { return valid; }
OkiAviation 0:2576f9f1dc71 75 bool isUpdated() const { return updated; }
OkiAviation 0:2576f9f1dc71 76 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
OkiAviation 0:2576f9f1dc71 77 const RawDegrees &rawLat() { updated = false; return rawLatData; }
OkiAviation 0:2576f9f1dc71 78 const RawDegrees &rawLng() { updated = false; return rawLngData; }
OkiAviation 0:2576f9f1dc71 79 double lat();
OkiAviation 0:2576f9f1dc71 80 double lng();
OkiAviation 0:2576f9f1dc71 81
OkiAviation 0:2576f9f1dc71 82 TinyGPSLocation() : valid(false), updated(false)
OkiAviation 0:2576f9f1dc71 83 {}
OkiAviation 0:2576f9f1dc71 84
OkiAviation 0:2576f9f1dc71 85 private:
OkiAviation 0:2576f9f1dc71 86 bool valid, updated;
OkiAviation 0:2576f9f1dc71 87 RawDegrees rawLatData, rawLngData, rawNewLatData, rawNewLngData;
OkiAviation 0:2576f9f1dc71 88 uint32_t lastCommitTime;
OkiAviation 0:2576f9f1dc71 89 void commit();
OkiAviation 0:2576f9f1dc71 90 void setLatitude(const char *term);
OkiAviation 0:2576f9f1dc71 91 void setLongitude(const char *term);
OkiAviation 0:2576f9f1dc71 92 };
OkiAviation 0:2576f9f1dc71 93
OkiAviation 0:2576f9f1dc71 94 struct TinyGPSDate
OkiAviation 0:2576f9f1dc71 95 {
OkiAviation 0:2576f9f1dc71 96 friend class TinyGPSPlus;
OkiAviation 0:2576f9f1dc71 97 public:
OkiAviation 0:2576f9f1dc71 98 bool isValid() const { return valid; }
OkiAviation 0:2576f9f1dc71 99 bool isUpdated() const { return updated; }
OkiAviation 0:2576f9f1dc71 100 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
OkiAviation 0:2576f9f1dc71 101
OkiAviation 0:2576f9f1dc71 102 uint32_t value() { updated = false; return date; }
OkiAviation 0:2576f9f1dc71 103 uint16_t year();
OkiAviation 0:2576f9f1dc71 104 uint8_t month();
OkiAviation 0:2576f9f1dc71 105 uint8_t day();
OkiAviation 0:2576f9f1dc71 106
OkiAviation 0:2576f9f1dc71 107 TinyGPSDate() : valid(false), updated(false), date(0)
OkiAviation 0:2576f9f1dc71 108 {}
OkiAviation 0:2576f9f1dc71 109
OkiAviation 0:2576f9f1dc71 110 private:
OkiAviation 0:2576f9f1dc71 111 bool valid, updated;
OkiAviation 0:2576f9f1dc71 112 uint32_t date, newDate;
OkiAviation 0:2576f9f1dc71 113 uint32_t lastCommitTime;
OkiAviation 0:2576f9f1dc71 114 void commit();
OkiAviation 0:2576f9f1dc71 115 void setDate(const char *term);
OkiAviation 0:2576f9f1dc71 116 };
OkiAviation 0:2576f9f1dc71 117
OkiAviation 0:2576f9f1dc71 118 struct TinyGPSTime
OkiAviation 0:2576f9f1dc71 119 {
OkiAviation 0:2576f9f1dc71 120 friend class TinyGPSPlus;
OkiAviation 0:2576f9f1dc71 121 public:
OkiAviation 0:2576f9f1dc71 122 bool isValid() const { return valid; }
OkiAviation 0:2576f9f1dc71 123 bool isUpdated() const { return updated; }
OkiAviation 0:2576f9f1dc71 124 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
OkiAviation 0:2576f9f1dc71 125
OkiAviation 0:2576f9f1dc71 126 uint32_t value() { updated = false; return time; }
OkiAviation 0:2576f9f1dc71 127 uint8_t hour();
OkiAviation 0:2576f9f1dc71 128 uint8_t minute();
OkiAviation 0:2576f9f1dc71 129 uint8_t second();
OkiAviation 0:2576f9f1dc71 130 uint8_t centisecond();
OkiAviation 0:2576f9f1dc71 131
OkiAviation 0:2576f9f1dc71 132 TinyGPSTime() : valid(false), updated(false), time(0)
OkiAviation 0:2576f9f1dc71 133 {}
OkiAviation 0:2576f9f1dc71 134
OkiAviation 0:2576f9f1dc71 135 private:
OkiAviation 0:2576f9f1dc71 136 bool valid, updated;
OkiAviation 0:2576f9f1dc71 137 uint32_t time, newTime;
OkiAviation 0:2576f9f1dc71 138 uint32_t lastCommitTime;
OkiAviation 0:2576f9f1dc71 139 void commit();
OkiAviation 0:2576f9f1dc71 140 void setTime(const char *term);
OkiAviation 0:2576f9f1dc71 141 };
OkiAviation 0:2576f9f1dc71 142
OkiAviation 0:2576f9f1dc71 143 struct TinyGPSDecimal
OkiAviation 0:2576f9f1dc71 144 {
OkiAviation 0:2576f9f1dc71 145 friend class TinyGPSPlus;
OkiAviation 0:2576f9f1dc71 146 public:
OkiAviation 0:2576f9f1dc71 147 bool isValid() const { return valid; }
OkiAviation 0:2576f9f1dc71 148 bool isUpdated() const { return updated; }
OkiAviation 0:2576f9f1dc71 149 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
OkiAviation 0:2576f9f1dc71 150 int32_t value() { updated = false; return val; }
OkiAviation 0:2576f9f1dc71 151
OkiAviation 0:2576f9f1dc71 152 TinyGPSDecimal() : valid(false), updated(false), val(0)
OkiAviation 0:2576f9f1dc71 153 {}
OkiAviation 0:2576f9f1dc71 154
OkiAviation 0:2576f9f1dc71 155 private:
OkiAviation 0:2576f9f1dc71 156 bool valid, updated;
OkiAviation 0:2576f9f1dc71 157 uint32_t lastCommitTime;
OkiAviation 0:2576f9f1dc71 158 int32_t val, newval;
OkiAviation 0:2576f9f1dc71 159 void commit();
OkiAviation 0:2576f9f1dc71 160 void set(const char *term);
OkiAviation 0:2576f9f1dc71 161 };
OkiAviation 0:2576f9f1dc71 162
OkiAviation 0:2576f9f1dc71 163 struct TinyGPSInteger
OkiAviation 0:2576f9f1dc71 164 {
OkiAviation 0:2576f9f1dc71 165 friend class TinyGPSPlus;
OkiAviation 0:2576f9f1dc71 166 public:
OkiAviation 0:2576f9f1dc71 167 bool isValid() const { return valid; }
OkiAviation 0:2576f9f1dc71 168 bool isUpdated() const { return updated; }
OkiAviation 0:2576f9f1dc71 169 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
OkiAviation 0:2576f9f1dc71 170 uint32_t value() { updated = false; return val; }
OkiAviation 0:2576f9f1dc71 171
OkiAviation 0:2576f9f1dc71 172 TinyGPSInteger() : valid(false), updated(false), val(0)
OkiAviation 0:2576f9f1dc71 173 {}
OkiAviation 0:2576f9f1dc71 174
OkiAviation 0:2576f9f1dc71 175 private:
OkiAviation 0:2576f9f1dc71 176 bool valid, updated;
OkiAviation 0:2576f9f1dc71 177 uint32_t lastCommitTime;
OkiAviation 0:2576f9f1dc71 178 uint32_t val, newval;
OkiAviation 0:2576f9f1dc71 179 void commit();
OkiAviation 0:2576f9f1dc71 180 void set(const char *term);
OkiAviation 0:2576f9f1dc71 181 };
OkiAviation 0:2576f9f1dc71 182
OkiAviation 0:2576f9f1dc71 183 struct TinyGPSSpeed : TinyGPSDecimal
OkiAviation 0:2576f9f1dc71 184 {
OkiAviation 0:2576f9f1dc71 185 double knots() { return value() / 100.0; }
OkiAviation 0:2576f9f1dc71 186 double mph() { return _GPS_MPH_PER_KNOT * value() / 100.0; }
OkiAviation 0:2576f9f1dc71 187 double mps() { return _GPS_MPS_PER_KNOT * value() / 100.0; }
OkiAviation 0:2576f9f1dc71 188 double kmph() { return _GPS_KMPH_PER_KNOT * value() / 100.0; }
OkiAviation 0:2576f9f1dc71 189 };
OkiAviation 0:2576f9f1dc71 190
OkiAviation 0:2576f9f1dc71 191 struct TinyGPSCourse : public TinyGPSDecimal
OkiAviation 0:2576f9f1dc71 192 {
OkiAviation 0:2576f9f1dc71 193 double deg() { return value() / 100.0; }
OkiAviation 0:2576f9f1dc71 194 };
OkiAviation 0:2576f9f1dc71 195
OkiAviation 0:2576f9f1dc71 196 struct TinyGPSAltitude : TinyGPSDecimal
OkiAviation 0:2576f9f1dc71 197 {
OkiAviation 0:2576f9f1dc71 198 double meters() { return value() / 100.0; }
OkiAviation 0:2576f9f1dc71 199 double miles() { return _GPS_MILES_PER_METER * value() / 100.0; }
OkiAviation 0:2576f9f1dc71 200 double kilometers() { return _GPS_KM_PER_METER * value() / 100.0; }
OkiAviation 0:2576f9f1dc71 201 double feet() { return _GPS_FEET_PER_METER * value() / 100.0; }
OkiAviation 0:2576f9f1dc71 202 };
OkiAviation 0:2576f9f1dc71 203
OkiAviation 0:2576f9f1dc71 204 class TinyGPSPlus;
OkiAviation 0:2576f9f1dc71 205 class TinyGPSCustom
OkiAviation 0:2576f9f1dc71 206 {
OkiAviation 0:2576f9f1dc71 207 public:
OkiAviation 0:2576f9f1dc71 208 TinyGPSCustom() {};
OkiAviation 0:2576f9f1dc71 209 TinyGPSCustom(TinyGPSPlus &gps, const char *sentenceName, int termNumber);
OkiAviation 0:2576f9f1dc71 210 void begin(TinyGPSPlus &gps, const char *_sentenceName, int _termNumber);
OkiAviation 0:2576f9f1dc71 211
OkiAviation 0:2576f9f1dc71 212 bool isUpdated() const { return updated; }
OkiAviation 0:2576f9f1dc71 213 bool isValid() const { return valid; }
OkiAviation 0:2576f9f1dc71 214 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
OkiAviation 0:2576f9f1dc71 215 const char *value() { updated = false; return buffer; }
OkiAviation 0:2576f9f1dc71 216
OkiAviation 0:2576f9f1dc71 217 private:
OkiAviation 0:2576f9f1dc71 218 void commit();
OkiAviation 0:2576f9f1dc71 219 void set(const char *term);
OkiAviation 0:2576f9f1dc71 220
OkiAviation 0:2576f9f1dc71 221 char stagingBuffer[_GPS_MAX_FIELD_SIZE + 1];
OkiAviation 0:2576f9f1dc71 222 char buffer[_GPS_MAX_FIELD_SIZE + 1];
OkiAviation 0:2576f9f1dc71 223 unsigned long lastCommitTime;
OkiAviation 0:2576f9f1dc71 224 bool valid, updated;
OkiAviation 0:2576f9f1dc71 225 const char *sentenceName;
OkiAviation 0:2576f9f1dc71 226 int termNumber;
OkiAviation 0:2576f9f1dc71 227 friend class TinyGPSPlus;
OkiAviation 0:2576f9f1dc71 228 TinyGPSCustom *next;
OkiAviation 0:2576f9f1dc71 229 };
OkiAviation 0:2576f9f1dc71 230
OkiAviation 0:2576f9f1dc71 231 class TinyGPSPlus
OkiAviation 0:2576f9f1dc71 232 {
OkiAviation 0:2576f9f1dc71 233 public:
OkiAviation 0:2576f9f1dc71 234 TinyGPSPlus();
OkiAviation 0:2576f9f1dc71 235 bool encode(char c); // process one character received from GPS
OkiAviation 0:2576f9f1dc71 236 TinyGPSPlus &operator << (char c) {encode(c); return *this;}
OkiAviation 0:2576f9f1dc71 237
OkiAviation 0:2576f9f1dc71 238 TinyGPSLocation location;
OkiAviation 0:2576f9f1dc71 239 TinyGPSDate date;
OkiAviation 0:2576f9f1dc71 240 TinyGPSTime time;
OkiAviation 0:2576f9f1dc71 241 TinyGPSSpeed speed;
OkiAviation 0:2576f9f1dc71 242 TinyGPSCourse course;
OkiAviation 0:2576f9f1dc71 243 TinyGPSAltitude altitude;
OkiAviation 0:2576f9f1dc71 244 TinyGPSInteger satellites;
OkiAviation 0:2576f9f1dc71 245 TinyGPSDecimal hdop;
OkiAviation 0:2576f9f1dc71 246
OkiAviation 0:2576f9f1dc71 247 static const char *libraryVersion() { return _GPS_VERSION; }
OkiAviation 0:2576f9f1dc71 248
OkiAviation 0:2576f9f1dc71 249 static double distanceBetween(double lat1, double long1, double lat2, double long2);
OkiAviation 0:2576f9f1dc71 250 static double courseTo(double lat1, double long1, double lat2, double long2);
OkiAviation 0:2576f9f1dc71 251 static const char *cardinal(double course);
OkiAviation 0:2576f9f1dc71 252
OkiAviation 0:2576f9f1dc71 253 static int32_t parseDecimal(const char *term);
OkiAviation 0:2576f9f1dc71 254 static void parseDegrees(const char *term, RawDegrees &deg);
OkiAviation 0:2576f9f1dc71 255
OkiAviation 0:2576f9f1dc71 256 uint32_t charsProcessed() const { return encodedCharCount; }
OkiAviation 0:2576f9f1dc71 257 uint32_t sentencesWithFix() const { return sentencesWithFixCount; }
OkiAviation 0:2576f9f1dc71 258 uint32_t failedChecksum() const { return failedChecksumCount; }
OkiAviation 0:2576f9f1dc71 259 uint32_t passedChecksum() const { return passedChecksumCount; }
OkiAviation 0:2576f9f1dc71 260
OkiAviation 0:2576f9f1dc71 261 private:
OkiAviation 0:2576f9f1dc71 262 enum {GPS_SENTENCE_GPGGA, GPS_SENTENCE_GPRMC, GPS_SENTENCE_OTHER};
OkiAviation 0:2576f9f1dc71 263
OkiAviation 0:2576f9f1dc71 264 // parsing state variables
OkiAviation 0:2576f9f1dc71 265 uint8_t parity;
OkiAviation 0:2576f9f1dc71 266 bool isChecksumTerm;
OkiAviation 0:2576f9f1dc71 267 char term[_GPS_MAX_FIELD_SIZE];
OkiAviation 0:2576f9f1dc71 268 uint8_t curSentenceType;
OkiAviation 0:2576f9f1dc71 269 uint8_t curTermNumber;
OkiAviation 0:2576f9f1dc71 270 uint8_t curTermOffset;
OkiAviation 0:2576f9f1dc71 271 bool sentenceHasFix;
OkiAviation 0:2576f9f1dc71 272
OkiAviation 0:2576f9f1dc71 273 // custom element support
OkiAviation 0:2576f9f1dc71 274 friend class TinyGPSCustom;
OkiAviation 0:2576f9f1dc71 275 TinyGPSCustom *customElts;
OkiAviation 0:2576f9f1dc71 276 TinyGPSCustom *customCandidates;
OkiAviation 0:2576f9f1dc71 277 void insertCustom(TinyGPSCustom *pElt, const char *sentenceName, int index);
OkiAviation 0:2576f9f1dc71 278
OkiAviation 0:2576f9f1dc71 279
OkiAviation 0:2576f9f1dc71 280 // statistics
OkiAviation 0:2576f9f1dc71 281 uint32_t encodedCharCount;
OkiAviation 0:2576f9f1dc71 282 uint32_t sentencesWithFixCount;
OkiAviation 0:2576f9f1dc71 283 uint32_t failedChecksumCount;
OkiAviation 0:2576f9f1dc71 284 uint32_t passedChecksumCount;
OkiAviation 0:2576f9f1dc71 285
OkiAviation 0:2576f9f1dc71 286 // internal utilities
OkiAviation 0:2576f9f1dc71 287 int fromHex(char a);
OkiAviation 0:2576f9f1dc71 288 bool endOfTermHandler();
OkiAviation 0:2576f9f1dc71 289 };
OkiAviation 0:2576f9f1dc71 290
OkiAviation 0:2576f9f1dc71 291 #endif // def(__TinyGPSPlus_h)