Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __TinyGPSPlus_h
00025 #define __TinyGPSPlus_h
00026
00027 #if defined(ARDUINO) && ARDUINO >= 100
00028 #include "Arduino.h"
00029 #else
00030 #include "WProgram.h"
00031 #endif
00032 #include <limits.h>
00033
00034 #define _GPS_VERSION "0.92" // software version of this library
00035 #define _GPS_MPH_PER_KNOT 1.15077945
00036 #define _GPS_MPS_PER_KNOT 0.51444444
00037 #define _GPS_KMPH_PER_KNOT 1.852
00038 #define _GPS_MILES_PER_METER 0.00062137112
00039 #define _GPS_KM_PER_METER 0.001
00040 #define _GPS_FEET_PER_METER 3.2808399
00041 #define _GPS_MAX_FIELD_SIZE 15
00042
00043 struct RawDegrees
00044 {
00045 uint16_t deg;
00046 uint32_t billionths;
00047 bool negative;
00048 public:
00049 RawDegrees() : deg(0), billionths(0), negative(false)
00050 {}
00051 };
00052
00053 struct TinyGPSLocation
00054 {
00055 friend class TinyGPSPlus;
00056 public:
00057 bool isValid() const { return valid; }
00058 bool isUpdated() const { return updated; }
00059 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
00060 const RawDegrees &rawLat() { updated = false; return rawLatData; }
00061 const RawDegrees &rawLng() { updated = false; return rawLngData; }
00062 double lat();
00063 double lng();
00064
00065 TinyGPSLocation() : valid(false), updated(false)
00066 {}
00067
00068 private:
00069 bool valid, updated;
00070 RawDegrees rawLatData, rawLngData, rawNewLatData, rawNewLngData;
00071 uint32_t lastCommitTime;
00072 void commit();
00073 void setLatitude(const char *term);
00074 void setLongitude(const char *term);
00075 };
00076
00077 struct TinyGPSDate
00078 {
00079 friend class TinyGPSPlus;
00080 public:
00081 bool isValid() const { return valid; }
00082 bool isUpdated() const { return updated; }
00083 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
00084
00085 uint32_t value() { updated = false; return date; }
00086 uint16_t year();
00087 uint8_t month();
00088 uint8_t day();
00089
00090 TinyGPSDate() : valid(false), updated(false), date(0)
00091 {}
00092
00093 private:
00094 bool valid, updated;
00095 uint32_t date, newDate;
00096 uint32_t lastCommitTime;
00097 void commit();
00098 void setDate(const char *term);
00099 };
00100
00101 struct TinyGPSTime
00102 {
00103 friend class TinyGPSPlus;
00104 public:
00105 bool isValid() const { return valid; }
00106 bool isUpdated() const { return updated; }
00107 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
00108
00109 uint32_t value() { updated = false; return time; }
00110 uint8_t hour();
00111 uint8_t minute();
00112 uint8_t second();
00113 uint8_t centisecond();
00114
00115 TinyGPSTime() : valid(false), updated(false), time(0)
00116 {}
00117
00118 private:
00119 bool valid, updated;
00120 uint32_t time, newTime;
00121 uint32_t lastCommitTime;
00122 void commit();
00123 void setTime(const char *term);
00124 };
00125
00126 struct TinyGPSDecimal
00127 {
00128 friend class TinyGPSPlus;
00129 public:
00130 bool isValid() const { return valid; }
00131 bool isUpdated() const { return updated; }
00132 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
00133 int32_t value() { updated = false; return val; }
00134
00135 TinyGPSDecimal() : valid(false), updated(false), val(0)
00136 {}
00137
00138 private:
00139 bool valid, updated;
00140 uint32_t lastCommitTime;
00141 int32_t val, newval;
00142 void commit();
00143 void set(const char *term);
00144 };
00145
00146 struct TinyGPSInteger
00147 {
00148 friend class TinyGPSPlus;
00149 public:
00150 bool isValid() const { return valid; }
00151 bool isUpdated() const { return updated; }
00152 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
00153 uint32_t value() { updated = false; return val; }
00154
00155 TinyGPSInteger() : valid(false), updated(false), val(0)
00156 {}
00157
00158 private:
00159 bool valid, updated;
00160 uint32_t lastCommitTime;
00161 uint32_t val, newval;
00162 void commit();
00163 void set(const char *term);
00164 };
00165
00166 struct TinyGPSSpeed : TinyGPSDecimal
00167 {
00168 double knots() { return value() / 100.0; }
00169 double mph() { return _GPS_MPH_PER_KNOT * value() / 100.0; }
00170 double mps() { return _GPS_MPS_PER_KNOT * value() / 100.0; }
00171 double kmph() { return _GPS_KMPH_PER_KNOT * value() / 100.0; }
00172 };
00173
00174 struct TinyGPSCourse : public TinyGPSDecimal
00175 {
00176 double deg() { return value() / 100.0; }
00177 };
00178
00179 struct TinyGPSAltitude : TinyGPSDecimal
00180 {
00181 double meters() { return value() / 100.0; }
00182 double miles() { return _GPS_MILES_PER_METER * value() / 100.0; }
00183 double kilometers() { return _GPS_KM_PER_METER * value() / 100.0; }
00184 double feet() { return _GPS_FEET_PER_METER * value() / 100.0; }
00185 };
00186
00187 class TinyGPSPlus;
00188 class TinyGPSCustom
00189 {
00190 public:
00191 TinyGPSCustom() {};
00192 TinyGPSCustom(TinyGPSPlus &gps, const char *sentenceName, int termNumber);
00193 void begin(TinyGPSPlus &gps, const char *_sentenceName, int _termNumber);
00194
00195 bool isUpdated() const { return updated; }
00196 bool isValid() const { return valid; }
00197 uint32_t age() const { return valid ? millis() - lastCommitTime : (uint32_t)ULONG_MAX; }
00198 const char *value() { updated = false; return buffer; }
00199
00200 private:
00201 void commit();
00202 void set(const char *term);
00203
00204 char stagingBuffer[_GPS_MAX_FIELD_SIZE + 1];
00205 char buffer[_GPS_MAX_FIELD_SIZE + 1];
00206 unsigned long lastCommitTime;
00207 bool valid, updated;
00208 const char *sentenceName;
00209 int termNumber;
00210 friend class TinyGPSPlus;
00211 TinyGPSCustom *next;
00212 };
00213
00214 class TinyGPSPlus
00215 {
00216 public:
00217 TinyGPSPlus();
00218 bool encode(char c);
00219 TinyGPSPlus &operator << (char c) {encode(c); return *this;}
00220
00221 TinyGPSLocation location;
00222 TinyGPSDate date;
00223 TinyGPSTime time;
00224 TinyGPSSpeed speed;
00225 TinyGPSCourse course;
00226 TinyGPSAltitude altitude;
00227 TinyGPSInteger satellites;
00228 TinyGPSDecimal hdop;
00229
00230 static const char *libraryVersion() { return _GPS_VERSION; }
00231
00232 static double distanceBetween(double lat1, double long1, double lat2, double long2);
00233 static double courseTo(double lat1, double long1, double lat2, double long2);
00234 static const char *cardinal(double course);
00235
00236 static int32_t parseDecimal(const char *term);
00237 static void parseDegrees(const char *term, RawDegrees °);
00238
00239 uint32_t charsProcessed() const { return encodedCharCount; }
00240 uint32_t sentencesWithFix() const { return sentencesWithFixCount; }
00241 uint32_t failedChecksum() const { return failedChecksumCount; }
00242 uint32_t passedChecksum() const { return passedChecksumCount; }
00243
00244 private:
00245 enum {GPS_SENTENCE_GPGGA, GPS_SENTENCE_GPRMC, GPS_SENTENCE_OTHER};
00246
00247
00248 uint8_t parity;
00249 bool isChecksumTerm;
00250 char term[_GPS_MAX_FIELD_SIZE];
00251 uint8_t curSentenceType;
00252 uint8_t curTermNumber;
00253 uint8_t curTermOffset;
00254 bool sentenceHasFix;
00255
00256
00257 friend class TinyGPSCustom;
00258 TinyGPSCustom *customElts;
00259 TinyGPSCustom *customCandidates;
00260 void insertCustom(TinyGPSCustom *pElt, const char *sentenceName, int index);
00261
00262
00263 uint32_t encodedCharCount;
00264 uint32_t sentencesWithFixCount;
00265 uint32_t failedChecksumCount;
00266 uint32_t passedChecksumCount;
00267
00268
00269 int fromHex(char a);
00270 bool endOfTermHandler();
00271 };
00272
00273 #endif // def(__TinyGPSPlus_h)