Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of TinyGPS by
TinyGPS.h
00001 /* 00002 TinyGPS - a small GPS library for Arduino providing basic NMEA parsing 00003 Copyright (C) 2008-9 Mikal Hart 00004 All rights reserved. 00005 00006 This library is free software; you can redistribute it and/or 00007 modify it under the terms of the GNU Lesser General Public 00008 License as published by the Free Software Foundation; either 00009 version 2.1 of the License, or (at your option) any later version. 00010 00011 This library is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 Lesser General Public License for more details. 00015 00016 You should have received a copy of the GNU Lesser General Public 00017 License along with this library; if not, write to the Free Software 00018 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 00019 00020 Ported to mbed by Michael Shimniok 00021 */ 00022 00023 #include "mbed.h" 00024 #include "types.h" 00025 00026 #ifndef TinyGPS_h 00027 #define TinyGPS_h 00028 00029 #define _GPS_VERSION 9 // software version of this library 00030 #define _GPS_MPH_PER_KNOT 1.15077945 00031 #define _GPS_MPS_PER_KNOT 0.51444444 00032 #define _GPS_KMPH_PER_KNOT 1.852 00033 #define _GPS_MILES_PER_METER 0.00062137112 00034 #define _GPS_KM_PER_METER 0.001 00035 //#define _GPS_NO_STATS 00036 00037 class TinyGPS 00038 { 00039 public: 00040 00041 /** Create a new GPS parsing object for parsing NMEA sentences 00042 */ 00043 TinyGPS(); 00044 00045 /** Parse a single character received from GPS 00046 * 00047 * @param c is the character received from the GPS 00048 * @returns true if processing ok 00049 */ 00050 bool encode(char c); 00051 00052 /** Shorthand operator for encode() 00053 */ 00054 TinyGPS &operator << (char c) {encode(c); return *this;} 00055 00056 /** Return lat/long in hundred thousandths of a degree and age of fix in milliseconds 00057 * @returns latitude is the latitude of the most recent fix that was parsed 00058 * @returns longitude is the longitude of the most recent fix that was parsed 00059 * @returns fix_age is the age of the fix (if available from the NMEA sentences being parsed) 00060 */ 00061 inline void get_position(long *latitude, long *longitude, unsigned long *fix_age = 0) 00062 { 00063 if (latitude) *latitude = _latitude; 00064 if (longitude) *longitude = _longitude; 00065 if (fix_age) *fix_age = _last_position_fix == GPS_INVALID_FIX_TIME ? 00066 GPS_INVALID_AGE : millis() - _last_position_fix; 00067 } 00068 00069 /** Return the date and time from the parsed NMEA sentences 00070 * 00071 * @returns date as an integer value 00072 * @returns time as an integer value 00073 * @returns fix_age in milliseconds if available 00074 */ 00075 inline void get_datetime(unsigned long *date, unsigned long *time, unsigned long *fix_age = 0) 00076 { 00077 if (date) *date = _date; 00078 if (time) *time = _time; 00079 if (fix_age) *fix_age = _last_time_fix == GPS_INVALID_FIX_TIME ? 00080 GPS_INVALID_AGE : millis() - _last_time_fix; 00081 } 00082 00083 /** signed altitude in centimeters (from GPGGA sentence) 00084 * @returns altitude in centimeters, integer 00085 */ 00086 inline long altitude() { return _altitude; } 00087 00088 /** course in last full GPRMC sentence in 100th of a degree 00089 * @returns course as an integer, 100ths of a degree 00090 */ 00091 inline unsigned long course() { return _course; } 00092 00093 /** speed in last full GPRMC sentence in 100ths of a knot 00094 * @returns speed in 100ths of a knot 00095 */ 00096 unsigned long speed() { return _speed; } 00097 00098 /* horizontal dilution of position in last full GPGGA sentence in 100ths 00099 * @returns hdop in 100ths 00100 */ 00101 unsigned long hdop() { return _hdop; } 00102 00103 /** number of satellites tracked in last full GPGGA sentence 00104 * @returns number of satellites tracked 00105 */ 00106 unsigned long sat_count() { return _sat_count; } 00107 00108 #ifndef _GPS_NO_STATS 00109 void stats(unsigned long *chars, unsigned short *good_sentences, unsigned short *failed_cs); 00110 #endif 00111 00112 /** returns position as double precision 00113 * 00114 * @returns latitude as double precision 00115 * @returns longitude as double precision 00116 * @returns fix age in milliseconds if available 00117 */ 00118 inline void f_get_position(double *latitude, double *longitude, unsigned long *fix_age = 0) 00119 { 00120 long lat, lon; 00121 get_position(&lat, &lon, fix_age); 00122 *latitude = lat / 100000.0; 00123 *longitude = lon / 100000.0; 00124 } 00125 00126 /** Convert date and time of last parsed sentence to integers 00127 * 00128 * @returns year 00129 * @returns month 00130 * @returns day of month 00131 * @returns hour 00132 * @returns minute 00133 * @returns second 00134 * @returns hundreths 00135 * @returns fix_age in milliseconds if available 00136 */ 00137 inline void crack_datetime(int *year, byte *month, byte *day, 00138 byte *hour, byte *minute, byte *second, byte *hundredths = 0, unsigned long *fix_age = 0) 00139 { 00140 unsigned long date, time; 00141 get_datetime(&date, &time, fix_age); 00142 if (year) 00143 { 00144 *year = date % 100; 00145 *year += *year > 80 ? 1900 : 2000; 00146 } 00147 if (month) *month = (date / 100) % 100; 00148 if (day) *day = date / 10000; 00149 if (hour) *hour = time / 1000000; 00150 if (minute) *minute = (time / 10000) % 100; 00151 if (second) *second = (time / 100) % 100; 00152 if (hundredths) *hundredths = time % 100; 00153 } 00154 00155 /** returns altitude as a float 00156 */ 00157 inline double f_altitude() { return altitude() / 100.0; } 00158 00159 /** returns course as a float 00160 */ 00161 inline double f_course() { return course() / 100.0; } 00162 00163 /** returns speed in knots as a float 00164 */ 00165 inline double f_speed_knots() { return speed() / 100.0; } 00166 00167 /** returns speed in mph as a float 00168 */ 00169 inline double f_speed_mph() { return _GPS_MPH_PER_KNOT * f_speed_knots(); } 00170 00171 /** returns speed in meters per second as a float 00172 */ 00173 inline double f_speed_mps() { return _GPS_MPS_PER_KNOT * f_speed_knots(); } 00174 00175 /** returns speed in km per hour as a float 00176 */ 00177 inline double f_speed_kmph() { return _GPS_KMPH_PER_KNOT * f_speed_knots(); } 00178 00179 /** returns hdop as a float 00180 */ 00181 inline double f_hdop() { return hdop() / 100.0; } 00182 00183 /** @returns library version 00184 */ 00185 static int library_version() { return _GPS_VERSION; } 00186 00187 /** determine if RMC sentence parsed since last reset_ready() 00188 */ 00189 inline bool rmc_ready() { return _rmc_ready; } 00190 00191 /** determine if GGA sentence parsed since last reset_ready() 00192 */ 00193 inline bool gga_ready() { return _gga_ready; } 00194 00195 /** determine if GSV sentence parsed since last reset_ready() 00196 */ 00197 inline bool gsv_ready() { return _gsv_ready; } 00198 00199 /** Reset the ready flags for all the parsed sentences 00200 */ 00201 inline void reset_ready() { _gsv_ready = _rmc_ready = _gga_ready = false; } 00202 00203 inline void reset_pos() { _latitude = _longitude = GPS_INVALID_ANGLE; _altitude = GPS_INVALID_ALTITUDE; } 00204 00205 enum {GPS_INVALID_AGE = 0xFFFFFFFF, GPS_INVALID_ANGLE = 999999999, GPS_INVALID_ALTITUDE = 9999, GPS_INVALID_DATE = 0, 00206 GPS_INVALID_TIME = 0xFFFFFFFF, GPS_INVALID_SPEED = 999999999, GPS_INVALID_FIX_TIME = 0xFFFFFFFF}; 00207 00208 private: 00209 enum {_GPS_SENTENCE_GPGGA, _GPS_SENTENCE_GPRMC, _GPS_SENTENCE_GPGSV, _GPS_SENTENCE_OTHER}; 00210 00211 // properties 00212 unsigned long _time, _new_time; 00213 unsigned long _date, _new_date; 00214 long _latitude, _new_latitude; 00215 long _longitude, _new_longitude; 00216 int16_t _altitude, _new_altitude; 00217 unsigned long _speed, _new_speed; 00218 unsigned long _course, _new_course; 00219 unsigned long _hdop, _new_hdop; 00220 unsigned int _sat_count, _new_sat_count; 00221 unsigned long _last_time_fix, _new_time_fix; 00222 unsigned long _last_position_fix, _new_position_fix; 00223 00224 // parsing state variables 00225 byte _parity; 00226 bool _is_checksum_term; 00227 char _term[1024]; 00228 byte _sentence_type; 00229 byte _term_number; 00230 byte _term_offset; 00231 bool _gps_data_good; 00232 bool _rmc_ready; 00233 bool _gga_ready; 00234 bool _gsv_ready; 00235 00236 #ifndef _GPS_NO_STATS 00237 // statistics 00238 unsigned long _encoded_characters; 00239 unsigned short _good_sentences; 00240 unsigned short _failed_checksum; 00241 unsigned short _passed_checksum; 00242 #endif 00243 00244 // internal utilities 00245 int from_hex(char a); 00246 unsigned long parse_decimal(); 00247 unsigned long parse_degrees(); 00248 bool term_complete(); 00249 bool gpsisdigit(char c) { return c >= '0' && c <= '9'; } 00250 long gpsatol(const char *str); 00251 int gpsstrcmp(const char *str1, const char *str2); 00252 }; 00253 00254 // Arduino 0012 workaround 00255 #undef int 00256 #undef char 00257 #undef long 00258 #undef byte 00259 #undef double 00260 #undef abs 00261 #undef round 00262 00263 #endif
Generated on Tue Jul 12 2022 23:37:03 by
1.7.2
