Self-navigating boat program with sensors and control system fused

Dependencies:   mbed Servo PID

Committer:
Deanatius
Date:
Fri May 24 16:12:40 2019 +0000
Revision:
1:736ae4695570
Parent:
0:cf5854b3296f
New update to fix motor output

Who changed what in which revision?

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