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:
OkiAviation
Date:
Wed Sep 14 01:38:28 2016 +0000
Revision:
0:2576f9f1dc71
Ported the TinyGPSPlus Library (originally by Mikal Hart) to mbed. The Port is heavily inspired by Sergey Drobyshevskiy (dROb), wo ported the TinyGPS library to mbed.

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)