Allows for a GPS module to be connected to a serial port and exposes an easy to use API to get the GPS data. New feature, added Mbed/LPC17xx RTC synchronisation

Dependents:   SatGPS AntiTheftGPS FLIGHT_CONTROL_AND_COMMUNICATIONS_SYSTEM GPS-Lora ... more

Committer:
AjK
Date:
Thu Apr 21 14:06:17 2011 +0000
Revision:
6:64771e31464e
Parent:
3:28a1b60b0f37
1.16 See ChangeLog.c

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AjK 0:db98027c0bbb 1 /*
AjK 0:db98027c0bbb 2 Copyright (c) 2010 Andy Kirkham
AjK 0:db98027c0bbb 3
AjK 0:db98027c0bbb 4 Permission is hereby granted, free of charge, to any person obtaining a copy
AjK 0:db98027c0bbb 5 of this software and associated documentation files (the "Software"), to deal
AjK 0:db98027c0bbb 6 in the Software without restriction, including without limitation the rights
AjK 0:db98027c0bbb 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
AjK 0:db98027c0bbb 8 copies of the Software, and to permit persons to whom the Software is
AjK 0:db98027c0bbb 9 furnished to do so, subject to the following conditions:
AjK 0:db98027c0bbb 10
AjK 0:db98027c0bbb 11 The above copyright notice and this permission notice shall be included in
AjK 0:db98027c0bbb 12 all copies or substantial portions of the Software.
AjK 0:db98027c0bbb 13
AjK 0:db98027c0bbb 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
AjK 0:db98027c0bbb 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
AjK 0:db98027c0bbb 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AjK 0:db98027c0bbb 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
AjK 0:db98027c0bbb 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
AjK 0:db98027c0bbb 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
AjK 0:db98027c0bbb 20 THE SOFTWARE.
AjK 0:db98027c0bbb 21 */
AjK 0:db98027c0bbb 22
AjK 0:db98027c0bbb 23 #ifndef GPS_H
AjK 0:db98027c0bbb 24 #define GPS_H
AjK 0:db98027c0bbb 25
AjK 0:db98027c0bbb 26 #include "mbed.h"
AjK 2:8aa059e7d8b1 27 #include "GPS_VTG.h"
AjK 0:db98027c0bbb 28 #include "GPS_Time.h"
AjK 0:db98027c0bbb 29 #include "GPS_Geodetic.h"
AjK 0:db98027c0bbb 30
AjK 0:db98027c0bbb 31 #define GPS_RBR 0x00
AjK 0:db98027c0bbb 32 #define GPS_THR 0x00
AjK 0:db98027c0bbb 33 #define GPS_DLL 0x00
AjK 0:db98027c0bbb 34 #define GPS_IER 0x04
AjK 0:db98027c0bbb 35 #define GPS_DML 0x04
AjK 0:db98027c0bbb 36 #define GPS_IIR 0x08
AjK 0:db98027c0bbb 37 #define GPS_FCR 0x08
AjK 0:db98027c0bbb 38 #define GPS_LCR 0x0C
AjK 0:db98027c0bbb 39 #define GPS_LSR 0x14
AjK 0:db98027c0bbb 40 #define GPS_SCR 0x1C
AjK 0:db98027c0bbb 41 #define GPS_ACR 0x20
AjK 0:db98027c0bbb 42 #define GPS_ICR 0x24
AjK 0:db98027c0bbb 43 #define GPS_FDR 0x28
AjK 0:db98027c0bbb 44 #define GPS_TER 0x30
AjK 0:db98027c0bbb 45
AjK 0:db98027c0bbb 46 #define GPS_BUFFER_LEN 128
AjK 0:db98027c0bbb 47 #define GPS_TICKTOCK 10000
AjK 0:db98027c0bbb 48
AjK 1:6aec92e77ad2 49 /** @defgroup API The MODGPS API */
AjK 0:db98027c0bbb 50
AjK 0:db98027c0bbb 51 /** GPS module
AjK 1:6aec92e77ad2 52 * @author Andy Kirkham
AjK 0:db98027c0bbb 53 * @see http://mbed.org/cookbook/MODGPS
AjK 0:db98027c0bbb 54 * @see example1.cpp
AjK 0:db98027c0bbb 55 * @see example2.cpp
AjK 1:6aec92e77ad2 56 * @see API
AjK 1:6aec92e77ad2 57 *
AjK 1:6aec92e77ad2 58 * @image html /media/uploads/AjK/gps_interfaces.png "Wiring up the GPS module"
AjK 0:db98027c0bbb 59 *
AjK 0:db98027c0bbb 60 * Example:
AjK 0:db98027c0bbb 61 * @code
AjK 0:db98027c0bbb 62 * #include "mbed.h"
AjK 0:db98027c0bbb 63 * #include "GPS.h"
AjK 0:db98027c0bbb 64 *
AjK 0:db98027c0bbb 65 * DigitalOut led1(LED1);
AjK 0:db98027c0bbb 66 * Serial pc(USBTX, USBRX);
AjK 0:db98027c0bbb 67 * GPS gps(NC, p10);
AjK 0:db98027c0bbb 68 *
AjK 0:db98027c0bbb 69 * int main() {
AjK 0:db98027c0bbb 70 * GPS_Time t;
AjK 0:db98027c0bbb 71 *
AjK 0:db98027c0bbb 72 * // Wait for the GPS NMEA data to become valid.
AjK 0:db98027c0bbb 73 * while (!gps.isTimeValid()) {
AjK 0:db98027c0bbb 74 * led1 = !led1;
AjK 0:db98027c0bbb 75 * wait(1);
AjK 0:db98027c0bbb 76 * }
AjK 0:db98027c0bbb 77 *
AjK 0:db98027c0bbb 78 * gps.timeNow(&t);
AjK 0:db98027c0bbb 79 *
AjK 0:db98027c0bbb 80 * pc.printf("The time/date is %02d:%02d:%02d %02d/%02d/%04d\r\n",
AjK 0:db98027c0bbb 81 * t.hour, t.minute, t.second, t.day, t.month, t.year);
AjK 0:db98027c0bbb 82 *
AjK 0:db98027c0bbb 83 * // Wait until at least four satellites produce a position fix and a valid quality.
AjK 0:db98027c0bbb 84 * while (gps.numOfSats() < 4 && gps.getGPSquality != 0) {
AjK 0:db98027c0bbb 85 * led1 = !led1;
AjK 0:db98027c0bbb 86 * wait(1);
AjK 0:db98027c0bbb 87 * }
AjK 0:db98027c0bbb 88 *
AjK 0:db98027c0bbb 89 * pc.printf("Lat = %.4f Lon = %.4f Alt = %.1fkm\r\n",
AjK 0:db98027c0bbb 90 * gps.latitude(), gps.longitude, gps.altitude());
AjK 0:db98027c0bbb 91 *
AjK 0:db98027c0bbb 92 * // Make the LED go steady to indicate we have finished.
AjK 0:db98027c0bbb 93 * led1 = 1;
AjK 0:db98027c0bbb 94 *
AjK 0:db98027c0bbb 95 * while(1) {}
AjK 0:db98027c0bbb 96 * }
AjK 0:db98027c0bbb 97 * @endcode
AjK 0:db98027c0bbb 98 */
AjK 0:db98027c0bbb 99
AjK 0:db98027c0bbb 100 class GPS : Serial {
AjK 0:db98027c0bbb 101 public:
AjK 0:db98027c0bbb 102
AjK 0:db98027c0bbb 103 //! The PPS edge type to interrupt on.
AjK 0:db98027c0bbb 104 enum ppsEdgeType {
AjK 0:db98027c0bbb 105 ppsRise = 0, /*!< Use the rising edge (default). */
AjK 0:db98027c0bbb 106 ppsFall /*!< Use the falling edge. */
AjK 0:db98027c0bbb 107 };
AjK 0:db98027c0bbb 108
AjK 0:db98027c0bbb 109 //! A copy of the Serial parity enum
AjK 0:db98027c0bbb 110 enum Parity {
AjK 0:db98027c0bbb 111 None = 0
AjK 0:db98027c0bbb 112 , Odd
AjK 0:db98027c0bbb 113 , Even
AjK 0:db98027c0bbb 114 , Forced1
AjK 0:db98027c0bbb 115 , Forced0
AjK 0:db98027c0bbb 116 };
AjK 0:db98027c0bbb 117
AjK 0:db98027c0bbb 118 //! GPS constructor.
AjK 0:db98027c0bbb 119 /**
AjK 0:db98027c0bbb 120 * The GPS constructor is used to initialise the GPS object.
AjK 0:db98027c0bbb 121 *
AjK 0:db98027c0bbb 122 * @param tx Usually unused and set to NC
AjK 0:db98027c0bbb 123 * @param rx The RX pin the GPS is connected to, p10, p14( OR p25), p27.
AjK 0:db98027c0bbb 124 * @param name An option name for RPC usage.
AjK 0:db98027c0bbb 125 */
AjK 0:db98027c0bbb 126 GPS(PinName tx, PinName rx, const char *name = NULL);
AjK 0:db98027c0bbb 127
AjK 0:db98027c0bbb 128 //! Is the time reported by the GPS valid.
AjK 0:db98027c0bbb 129 /**
AjK 0:db98027c0bbb 130 * Method used to check the validity of the time the GPS module is reporting.
AjK 0:db98027c0bbb 131 *
AjK 0:db98027c0bbb 132 * @code
AjK 0:db98027c0bbb 133 * // Assuming we have a GPS object previously created...
AjK 0:db98027c0bbb 134 * GPS gps(NC, p9);
AjK 0:db98027c0bbb 135 *
AjK 0:db98027c0bbb 136 * if (gps.isTimeValid()) {
AjK 0:db98027c0bbb 137 * // Time is valid :)
AjK 0:db98027c0bbb 138 * }
AjK 0:db98027c0bbb 139 * else {
AjK 0:db98027c0bbb 140 * // Doh, time is not valid :(
AjK 0:db98027c0bbb 141 * )
AjK 0:db98027c0bbb 142 *
AjK 0:db98027c0bbb 143 * @endcode
AjK 0:db98027c0bbb 144 *
AjK 0:db98027c0bbb 145 * @ingroup API
AjK 0:db98027c0bbb 146 * @return bool true if valid, false otherwise
AjK 0:db98027c0bbb 147 */
AjK 0:db98027c0bbb 148 bool isTimeValid(void) { return theTime.status == 'V' ? false : true; }
AjK 0:db98027c0bbb 149
AjK 0:db98027c0bbb 150 //! Is the positional fix reported by the GPS valid.
AjK 0:db98027c0bbb 151 /**
AjK 0:db98027c0bbb 152 * Method used to check the validity of the positional data. This method
AjK 0:db98027c0bbb 153 * returns the GGA field, 0 is "bad, 1 is "ok", etc. See the NMEA GGA
AjK 1:6aec92e77ad2 154 * description for more details.
AjK 1:6aec92e77ad2 155 *
AjK 1:6aec92e77ad2 156 * @code
AjK 1:6aec92e77ad2 157 * // Assuming we have a GPS object previously created...
AjK 1:6aec92e77ad2 158 * GPS gps(NC, p9);
AjK 0:db98027c0bbb 159 *
AjK 1:6aec92e77ad2 160 * if (gps.getGPSquality() == 0) {
AjK 1:6aec92e77ad2 161 * // The location fix is no good/not accurate :(
AjK 1:6aec92e77ad2 162 * }
AjK 1:6aec92e77ad2 163 * else {
AjK 1:6aec92e77ad2 164 * // All good, can use last fix data.
AjK 1:6aec92e77ad2 165 * )
AjK 1:6aec92e77ad2 166 *
AjK 1:6aec92e77ad2 167 * @endcode
AjK 1:6aec92e77ad2 168 *
AjK 1:6aec92e77ad2 169 * @ingroup API
AjK 0:db98027c0bbb 170 * @return int 0 on no fix, 1... (see NMEA GGA for more details).
AjK 0:db98027c0bbb 171 */
AjK 0:db98027c0bbb 172 int getGPSquality(void) { return thePlace.getGPSquality(); }
AjK 0:db98027c0bbb 173
AjK 0:db98027c0bbb 174 //! How many satellites were used in the last fix.
AjK 0:db98027c0bbb 175 /**
AjK 0:db98027c0bbb 176 * Method returns the number of GPS satellites used on the last fix.
AjK 0:db98027c0bbb 177 *
AjK 0:db98027c0bbb 178 * @code
AjK 0:db98027c0bbb 179 * // Assuming we have a GPS object previously created...
AjK 0:db98027c0bbb 180 * GPS gps(NC, p9);
AjK 0:db98027c0bbb 181 *
AjK 0:db98027c0bbb 182 * int sats = gps.numOfSats();
AjK 0:db98027c0bbb 183 *
AjK 0:db98027c0bbb 184 * @endcode
AjK 0:db98027c0bbb 185 *
AjK 0:db98027c0bbb 186 * @ingroup API
AjK 0:db98027c0bbb 187 * @return int The number of satellites.
AjK 0:db98027c0bbb 188 */
AjK 0:db98027c0bbb 189 int numOfSats(void) { return thePlace.numOfSats(); }
AjK 0:db98027c0bbb 190
AjK 0:db98027c0bbb 191 //! What was the last reported latitude (in degrees)
AjK 0:db98027c0bbb 192 /**
AjK 0:db98027c0bbb 193 * Method returns a double in degrees, positive being North, negative being South.
AjK 0:db98027c0bbb 194 *
AjK 0:db98027c0bbb 195 * @code
AjK 0:db98027c0bbb 196 * // Assuming we have a GPS object previously created...
AjK 0:db98027c0bbb 197 * GPS gps(NC, p9);
AjK 0:db98027c0bbb 198 *
AjK 0:db98027c0bbb 199 * double latitude = gps.latitude();
AjK 0:db98027c0bbb 200 *
AjK 0:db98027c0bbb 201 * @endcode
AjK 0:db98027c0bbb 202 *
AjK 0:db98027c0bbb 203 * @ingroup API
AjK 0:db98027c0bbb 204 * @return double Degrees
AjK 0:db98027c0bbb 205 */
AjK 0:db98027c0bbb 206 double latitude(void);
AjK 0:db98027c0bbb 207
AjK 0:db98027c0bbb 208 //! What was the last reported longitude (in degrees)
AjK 0:db98027c0bbb 209 /**
AjK 0:db98027c0bbb 210 * Method returns a double in degrees, positive being East, negative being West.
AjK 0:db98027c0bbb 211 *
AjK 0:db98027c0bbb 212 * @code
AjK 0:db98027c0bbb 213 * // Assuming we have a GPS object previously created...
AjK 0:db98027c0bbb 214 * GPS gps(NC, p9);
AjK 0:db98027c0bbb 215 *
AjK 0:db98027c0bbb 216 * double logitude = gps.logitude();
AjK 0:db98027c0bbb 217 *
AjK 0:db98027c0bbb 218 * @endcode
AjK 0:db98027c0bbb 219 *
AjK 0:db98027c0bbb 220 * @ingroup API
AjK 0:db98027c0bbb 221 * @return double Degrees
AjK 0:db98027c0bbb 222 */
AjK 0:db98027c0bbb 223 double longitude(void);
AjK 0:db98027c0bbb 224
AjK 0:db98027c0bbb 225 //! What was the last reported altitude (in kilometers)
AjK 0:db98027c0bbb 226 /**
AjK 0:db98027c0bbb 227 * Method returns a double in kilometers.
AjK 0:db98027c0bbb 228 *
AjK 0:db98027c0bbb 229 * @code
AjK 0:db98027c0bbb 230 * // Assuming we have a GPS object previously created...
AjK 0:db98027c0bbb 231 * GPS gps(NC, p9);
AjK 0:db98027c0bbb 232 *
AjK 0:db98027c0bbb 233 * double altitude = gps.altitude();
AjK 0:db98027c0bbb 234 *
AjK 0:db98027c0bbb 235 * @endcode
AjK 0:db98027c0bbb 236 *
AjK 0:db98027c0bbb 237 * @ingroup API
AjK 0:db98027c0bbb 238 * @return double Kilometers
AjK 0:db98027c0bbb 239 */
AjK 0:db98027c0bbb 240 double altitude(void);
AjK 0:db98027c0bbb 241
AjK 0:db98027c0bbb 242 //! What was the last reported altitude/height (in kilometers)
AjK 0:db98027c0bbb 243 /**
AjK 0:db98027c0bbb 244 * @see altitude()
AjK 0:db98027c0bbb 245 *
AjK 0:db98027c0bbb 246 * @code
AjK 0:db98027c0bbb 247 * // Assuming we have a GPS object previously created...
AjK 0:db98027c0bbb 248 * GPS gps(NC, p9);
AjK 0:db98027c0bbb 249 *
AjK 0:db98027c0bbb 250 * double height = gps.height();
AjK 0:db98027c0bbb 251 *
AjK 0:db98027c0bbb 252 * @endcode
AjK 0:db98027c0bbb 253 *
AjK 0:db98027c0bbb 254 * Note, this is identical to altitude()
AjK 0:db98027c0bbb 255 * @see altitude()
AjK 0:db98027c0bbb 256 *
AjK 0:db98027c0bbb 257 * @ingroup API
AjK 0:db98027c0bbb 258 * @return double Kilometers
AjK 0:db98027c0bbb 259 */
AjK 0:db98027c0bbb 260 double height(void) { return altitude(); }
AjK 0:db98027c0bbb 261
AjK 2:8aa059e7d8b1 262 //! Get all vector parameters together.
AjK 2:8aa059e7d8b1 263 /**
AjK 2:8aa059e7d8b1 264 * Pass a pointer to a GPS_VTG object and the current
AjK 2:8aa059e7d8b1 265 * GPS data will be copied into it.
AjK 2:8aa059e7d8b1 266 *
AjK 2:8aa059e7d8b1 267 * @code
AjK 2:8aa059e7d8b1 268 * // Assuming we have a GPS object previously created...
AjK 2:8aa059e7d8b1 269 * GPS gps(NC, p9);
AjK 2:8aa059e7d8b1 270 *
AjK 2:8aa059e7d8b1 271 * // Then get the data...
AjK 2:8aa059e7d8b1 272 * GPS_VTG p;
AjK 2:8aa059e7d8b1 273 * gps.vtg(&p);
AjK 2:8aa059e7d8b1 274 * printf("Speed (knots) = %.4f", p.velocity_knots);
AjK 2:8aa059e7d8b1 275 * printf("Speed (kps) = %.4f", p.velocity_kps);
AjK 2:8aa059e7d8b1 276 * printf("Track (true) = %.4f", p.track_true);
AjK 2:8aa059e7d8b1 277 * printf("Track (mag) = %.4f", p.track_mag);
AjK 2:8aa059e7d8b1 278 *
AjK 2:8aa059e7d8b1 279 * @endcode
AjK 2:8aa059e7d8b1 280 *
AjK 2:8aa059e7d8b1 281 * @ingroup API
AjK 2:8aa059e7d8b1 282 * @param g A GSP_VTG pointer to an existing GPS_VTG object.
AjK 2:8aa059e7d8b1 283 * @return GPS_VTG * The pointer passed in.
AjK 2:8aa059e7d8b1 284 */
AjK 2:8aa059e7d8b1 285 GPS_VTG *vtg(GPS_VTG *g);
AjK 2:8aa059e7d8b1 286
AjK 2:8aa059e7d8b1 287 //! Get all vector parameters together.
AjK 2:8aa059e7d8b1 288 /**
AjK 2:8aa059e7d8b1 289 * Get all the vector data at once. For example:-
AjK 2:8aa059e7d8b1 290 *
AjK 2:8aa059e7d8b1 291 * @code
AjK 2:8aa059e7d8b1 292 * // Assuming we have a GPS object previously created...
AjK 2:8aa059e7d8b1 293 * GPS gps(NC, p9);
AjK 2:8aa059e7d8b1 294 *
AjK 2:8aa059e7d8b1 295 * // Then get the data...
AjK 2:8aa059e7d8b1 296 * GPS_VTG *p = gps.vtg();
AjK 2:8aa059e7d8b1 297 * printf("Speed (knots) = %.4f", p->velocity_knots);
AjK 2:8aa059e7d8b1 298 * printf("Speed (kps) = %.4f", p->velocity_kps);
AjK 2:8aa059e7d8b1 299 * printf("Track (true) = %.4f", p->track_true);
AjK 2:8aa059e7d8b1 300 * printf("Track (mag) = %.4f", p->track_mag);
AjK 2:8aa059e7d8b1 301 * delete(p); // then remember to delete the object to prevent memory leaks.
AjK 2:8aa059e7d8b1 302 *
AjK 2:8aa059e7d8b1 303 * @endcode
AjK 2:8aa059e7d8b1 304 *
AjK 2:8aa059e7d8b1 305 * @ingroup API
AjK 2:8aa059e7d8b1 306 * @return GPS_Geodetic * A pointer to the data.
AjK 2:8aa059e7d8b1 307 */
AjK 2:8aa059e7d8b1 308 GPS_VTG *vtg(void) { return vtg(NULL); }
AjK 2:8aa059e7d8b1 309
AjK 0:db98027c0bbb 310 //! Get all three geodetic parameters together.
AjK 0:db98027c0bbb 311 /**
AjK 0:db98027c0bbb 312 * Pass a pointer to a GPS_Geodetic object and the current
AjK 0:db98027c0bbb 313 * GPS data will be copied into it.
AjK 0:db98027c0bbb 314 *
AjK 0:db98027c0bbb 315 * @code
AjK 0:db98027c0bbb 316 * // Assuming we have a GPS object previously created...
AjK 0:db98027c0bbb 317 * GPS gps(NC, p9);
AjK 0:db98027c0bbb 318 *
AjK 0:db98027c0bbb 319 * // Then get the data...
AjK 0:db98027c0bbb 320 * GPS_Geodetic p;
AjK 0:db98027c0bbb 321 * gps.geodetic(&p);
AjK 0:db98027c0bbb 322 * printf("Latitude = %.4f", p.lat);
AjK 0:db98027c0bbb 323 * printf("Longitude = %.4f", p.lon);
AjK 0:db98027c0bbb 324 * printf("Altitude = %.4f", p.alt);
AjK 0:db98027c0bbb 325 *
AjK 0:db98027c0bbb 326 * @endcode
AjK 0:db98027c0bbb 327 *
AjK 0:db98027c0bbb 328 * @ingroup API
AjK 0:db98027c0bbb 329 * @param g A GSP_Geodetic pointer to an existing GPS_Geodetic object.
AjK 0:db98027c0bbb 330 * @return GPS_Geodetic * The pointer passed in.
AjK 0:db98027c0bbb 331 */
AjK 0:db98027c0bbb 332 GPS_Geodetic *geodetic(GPS_Geodetic *g);
AjK 0:db98027c0bbb 333
AjK 0:db98027c0bbb 334 //! Get all three geodetic parameters together.
AjK 0:db98027c0bbb 335 /**
AjK 0:db98027c0bbb 336 * Get all the geodetic data at once. For example:-
AjK 0:db98027c0bbb 337 *
AjK 0:db98027c0bbb 338 * @code
AjK 0:db98027c0bbb 339 * // Assuming we have a GPS object previously created...
AjK 0:db98027c0bbb 340 * GPS gps(NC, p9);
AjK 0:db98027c0bbb 341 *
AjK 0:db98027c0bbb 342 * // Then get the data...
AjK 0:db98027c0bbb 343 * GPS_Geodetic *p = gps.geodetic();
AjK 0:db98027c0bbb 344 * printf("Latitude = %.4f", p->lat);
AjK 0:db98027c0bbb 345 * delete(p); // then remember to delete the object to prevent memory leaks.
AjK 0:db98027c0bbb 346 *
AjK 0:db98027c0bbb 347 * @endcode
AjK 0:db98027c0bbb 348 *
AjK 0:db98027c0bbb 349 * @ingroup API
AjK 0:db98027c0bbb 350 * @return GPS_Geodetic * A pointer to the data.
AjK 0:db98027c0bbb 351 */
AjK 0:db98027c0bbb 352 GPS_Geodetic *geodetic(void) { return geodetic(NULL); }
AjK 0:db98027c0bbb 353
AjK 0:db98027c0bbb 354 //! Take a snap shot of the current time.
AjK 0:db98027c0bbb 355 /**
AjK 0:db98027c0bbb 356 * Pass a pointer to a GPS_Time object to get a copy of the current
AjK 0:db98027c0bbb 357 * time and date as reported by the GPS.
AjK 0:db98027c0bbb 358 *
AjK 0:db98027c0bbb 359 * @code
AjK 0:db98027c0bbb 360 * // Assuming we have a GPS object previously created...
AjK 0:db98027c0bbb 361 * GPS gps(NC, p9);
AjK 0:db98027c0bbb 362 *
AjK 0:db98027c0bbb 363 * // Then get the data...
AjK 0:db98027c0bbb 364 * GPS_Time t;
AjK 0:db98027c0bbb 365 * gps.timeNow(&t);
AjK 0:db98027c0bbb 366 * printf("Year = %d", t.year);
AjK 0:db98027c0bbb 367 *
AjK 0:db98027c0bbb 368 * @endcode
AjK 0:db98027c0bbb 369 *
AjK 0:db98027c0bbb 370 * @ingroup API
AjK 0:db98027c0bbb 371 * @param n A GPS_Time * pointer to an existing GPS_Time object.
AjK 0:db98027c0bbb 372 * @return GPS_Time * The pointer passed in.
AjK 0:db98027c0bbb 373 */
AjK 0:db98027c0bbb 374 GPS_Time * timeNow(GPS_Time *n) { return theTime.timeNow(n); }
AjK 0:db98027c0bbb 375
AjK 0:db98027c0bbb 376 //! Take a snap shot of the current time.
AjK 0:db98027c0bbb 377 /**
AjK 0:db98027c0bbb 378 * Pass a pointer to a GPS_Time object to get a copy of the current
AjK 0:db98027c0bbb 379 * time and date as reported by the GPS.
AjK 0:db98027c0bbb 380 *
AjK 0:db98027c0bbb 381 * @code
AjK 0:db98027c0bbb 382 * // Assuming we have a GPS object previously created...
AjK 0:db98027c0bbb 383 * GPS gps(NC, p9);
AjK 0:db98027c0bbb 384 *
AjK 0:db98027c0bbb 385 * // Then get the data...
AjK 0:db98027c0bbb 386 * GPS_Time *t = gps.timeNow();
AjK 0:db98027c0bbb 387 * printf("Year = %d", t->year);
AjK 0:db98027c0bbb 388 * delete(t); // Avoid memory leaks.
AjK 0:db98027c0bbb 389 *
AjK 0:db98027c0bbb 390 * @endcode
AjK 0:db98027c0bbb 391 *
AjK 0:db98027c0bbb 392 * @ingroup API
AjK 0:db98027c0bbb 393 * @return GPS_Time * The pointer passed in.
AjK 0:db98027c0bbb 394 */
AjK 0:db98027c0bbb 395 GPS_Time * timeNow(void) { GPS_Time *n = new GPS_Time; return theTime.timeNow(n); }
AjK 0:db98027c0bbb 396
AjK 0:db98027c0bbb 397 //! Return the curent day.
AjK 0:db98027c0bbb 398 /**
AjK 0:db98027c0bbb 399 * @code
AjK 0:db98027c0bbb 400 * // Assuming we have a GPS object previously created...
AjK 0:db98027c0bbb 401 * GPS gps(NC, p9);
AjK 0:db98027c0bbb 402 *
AjK 0:db98027c0bbb 403 * // Then get the Julain Day Number.
AjK 0:db98027c0bbb 404 * double julianDayNumber = gps.julianDayNumber();
AjK 0:db98027c0bbb 405 *
AjK 0:db98027c0bbb 406 * @endcode
AjK 0:db98027c0bbb 407 *
AjK 0:db98027c0bbb 408 * @ingroup API
AjK 0:db98027c0bbb 409 * @return double The Julian Date as a double.
AjK 0:db98027c0bbb 410 */
AjK 0:db98027c0bbb 411 double julianDayNumber(void) { return theTime.julian_day_number(); }
AjK 0:db98027c0bbb 412
AjK 0:db98027c0bbb 413 //! Return the curent date/time as a Julian date
AjK 0:db98027c0bbb 414 /**
AjK 0:db98027c0bbb 415 * @code
AjK 0:db98027c0bbb 416 * // Assuming we have a GPS object previously created...
AjK 0:db98027c0bbb 417 * GPS gps(NC, p9);
AjK 0:db98027c0bbb 418 *
AjK 0:db98027c0bbb 419 * // Then get the Julian Date.
AjK 0:db98027c0bbb 420 * double julianDate = gps.julianDate();
AjK 0:db98027c0bbb 421 *
AjK 0:db98027c0bbb 422 * @endcode
AjK 0:db98027c0bbb 423 *
AjK 0:db98027c0bbb 424 * @ingroup API
AjK 0:db98027c0bbb 425 * @return double The Julian Date as a double.
AjK 0:db98027c0bbb 426 */
AjK 0:db98027c0bbb 427 double julianDate(void) { return theTime.julian_date(); }
AjK 0:db98027c0bbb 428
AjK 0:db98027c0bbb 429 //! Get the current sidereal degree angle.
AjK 0:db98027c0bbb 430 /**
AjK 0:db98027c0bbb 431 * @code
AjK 0:db98027c0bbb 432 * // Assuming we have a GPS object previously created...
AjK 0:db98027c0bbb 433 * GPS gps(NC, p9);
AjK 0:db98027c0bbb 434 * double sidereal = gps.siderealDegrees();
AjK 0:db98027c0bbb 435 *
AjK 0:db98027c0bbb 436 * @endcode
AjK 0:db98027c0bbb 437 *
AjK 0:db98027c0bbb 438 * @ingroup API
AjK 0:db98027c0bbb 439 * @return double Sidereal degree angle..
AjK 0:db98027c0bbb 440 */
AjK 0:db98027c0bbb 441 double siderealDegrees(void) { return theTime.siderealDegrees(&theTime, longitude()); }
AjK 0:db98027c0bbb 442
AjK 0:db98027c0bbb 443 //! Get the current sidereal hour angle.
AjK 0:db98027c0bbb 444 /**
AjK 0:db98027c0bbb 445 * @code
AjK 0:db98027c0bbb 446 * // Assuming we have a GPS object previously created...
AjK 0:db98027c0bbb 447 * GPS gps(NC, p9);
AjK 0:db98027c0bbb 448 * double sidereal = gps.siderealHA();
AjK 0:db98027c0bbb 449 *
AjK 0:db98027c0bbb 450 * @endcode
AjK 0:db98027c0bbb 451 *
AjK 0:db98027c0bbb 452 * @ingroup API
AjK 0:db98027c0bbb 453 * @return double Sidereal degree angle..
AjK 0:db98027c0bbb 454 */
AjK 0:db98027c0bbb 455 double siderealHA(void) { return theTime.siderealHA(&theTime, longitude()); }
AjK 0:db98027c0bbb 456
AjK 0:db98027c0bbb 457 //! Optionally, connect a 1PPS single to an Mbed pin.
AjK 0:db98027c0bbb 458 /**
AjK 0:db98027c0bbb 459 * Optional: If the GPS unit has a 1PPS output, use this to
AjK 0:db98027c0bbb 460 * connect that to our internal ISR. Using the 1PPS increases
AjK 0:db98027c0bbb 461 * the GPS_Time time accuracy from +/-0.25s to +/-0.001s
AjK 0:db98027c0bbb 462 *
AjK 0:db98027c0bbb 463 * @code
AjK 0:db98027c0bbb 464 * // Assuming we have a GPS object previously created...
AjK 0:db98027c0bbb 465 * GPS gps(NC, p9);
AjK 0:db98027c0bbb 466 *
AjK 0:db98027c0bbb 467 * gps.ppsAttach(p29); // default to GPS::ppsRise, rising edge.
AjK 0:db98027c0bbb 468 *
AjK 0:db98027c0bbb 469 * // Or...
AjK 0:db98027c0bbb 470 * gps.ppsAttach(p29, GPS::ppsRise); // The default.
AjK 0:db98027c0bbb 471 *
AjK 0:db98027c0bbb 472 * // Or...
AjK 0:db98027c0bbb 473 * gps.ppsAttach(p29, GPS::ppsFall); // If a falling edge.
AjK 0:db98027c0bbb 474 *
AjK 0:db98027c0bbb 475 * @endcode
AjK 0:db98027c0bbb 476 *
AjK 0:db98027c0bbb 477 * <b>Note</b>, before using this function you should attach an actual
AjK 0:db98027c0bbb 478 * callback function using attach_pps()
AjK 0:db98027c0bbb 479 *
AjK 0:db98027c0bbb 480 * @see attach_pps()
AjK 0:db98027c0bbb 481 *
AjK 0:db98027c0bbb 482 * @ingroup API
AjK 0:db98027c0bbb 483 * @param irq A PinName to attach
AjK 0:db98027c0bbb 484 * @param type The type of edge, MAX7456::ppsRise OR MAX7456::ppsFall
AjK 0:db98027c0bbb 485 */
AjK 0:db98027c0bbb 486 void ppsAttach(PinName irq, ppsEdgeType type = ppsRise);
AjK 0:db98027c0bbb 487
AjK 0:db98027c0bbb 488 //! Remove any 1PPS signal previously attached.
AjK 0:db98027c0bbb 489 void ppsUnattach(void);
AjK 0:db98027c0bbb 490
AjK 0:db98027c0bbb 491 //! GPS serial receive interrupt handler.
AjK 0:db98027c0bbb 492 void rx_irq(void);
AjK 0:db98027c0bbb 493
AjK 0:db98027c0bbb 494 //! GPS pps interrupt handler.
AjK 0:db98027c0bbb 495 void pps_irq(void);
AjK 0:db98027c0bbb 496
AjK 0:db98027c0bbb 497 //! A pointer to the UART peripheral base address being used.
AjK 0:db98027c0bbb 498 void *_base;
AjK 0:db98027c0bbb 499
AjK 0:db98027c0bbb 500 //! The RX serial buffer.
AjK 0:db98027c0bbb 501 char buffer[2][GPS_BUFFER_LEN];
AjK 0:db98027c0bbb 502
AjK 0:db98027c0bbb 503 //! The current "active" buffer, i.e. the buffer the ISR is writing to.
AjK 0:db98027c0bbb 504 int active_buffer;
AjK 0:db98027c0bbb 505
AjK 0:db98027c0bbb 506 //! The active buffer "in" pointer.
AjK 0:db98027c0bbb 507 int rx_buffer_in;
AjK 0:db98027c0bbb 508
AjK 0:db98027c0bbb 509 //! Boolean flag set when the "passive" buffer is full and needs processing.
AjK 0:db98027c0bbb 510 bool process_required;
AjK 0:db98027c0bbb 511
AjK 0:db98027c0bbb 512 //! 10ms Ticker callback.
AjK 0:db98027c0bbb 513 void ticktock(void);
AjK 0:db98027c0bbb 514
AjK 0:db98027c0bbb 515 //! Attach a user object/method callback function to the PPS signal
AjK 0:db98027c0bbb 516 /**
AjK 0:db98027c0bbb 517 * Attach a user callback object/method to call when the 1PPS signal activates.
AjK 0:db98027c0bbb 518 *
AjK 0:db98027c0bbb 519 * @code
AjK 0:db98027c0bbb 520 * class FOO {
AjK 0:db98027c0bbb 521 * public:
AjK 0:db98027c0bbb 522 * void myCallback(void);
AjK 0:db98027c0bbb 523 * };
AjK 0:db98027c0bbb 524 *
AjK 0:db98027c0bbb 525 * GPS gps(NC, p9);
AjK 0:db98027c0bbb 526 * Foo foo;
AjK 0:db98027c0bbb 527 *
AjK 0:db98027c0bbb 528 * gps.attach_pps(foo, &FOO::myCallback);
AjK 0:db98027c0bbb 529 *
AjK 0:db98027c0bbb 530 * @endcode
AjK 0:db98027c0bbb 531 *
AjK 0:db98027c0bbb 532 * @ingroup API
AjK 0:db98027c0bbb 533 * @param tptr pointer to the object to call the member function on
AjK 0:db98027c0bbb 534 * @param mptr pointer to the member function to be called
AjK 0:db98027c0bbb 535 */
AjK 0:db98027c0bbb 536 template<typename T>
AjK 0:db98027c0bbb 537 void attach_pps(T* tptr, void (T::*mptr)(void)) { cb_pps.attach(tptr, mptr); }
AjK 0:db98027c0bbb 538
AjK 0:db98027c0bbb 539 //! Attach a user callback function to the PPS signal
AjK 0:db98027c0bbb 540 /**
AjK 0:db98027c0bbb 541 * Attach a user callback function pointer to call when the 1PPS signal activates.
AjK 0:db98027c0bbb 542 *
AjK 0:db98027c0bbb 543 * @code
AjK 0:db98027c0bbb 544 * void myCallback(void) { ... }
AjK 0:db98027c0bbb 545 *
AjK 0:db98027c0bbb 546 * GPS gps(NC, p9);
AjK 0:db98027c0bbb 547 * Foo foo;
AjK 0:db98027c0bbb 548 *
AjK 0:db98027c0bbb 549 * gps.attach_pps(&myCallback);
AjK 0:db98027c0bbb 550 *
AjK 0:db98027c0bbb 551 * @endcode
AjK 0:db98027c0bbb 552 *
AjK 0:db98027c0bbb 553 * @ingroup API
AjK 0:db98027c0bbb 554 * @param fptr Callback function pointer
AjK 0:db98027c0bbb 555 */
AjK 0:db98027c0bbb 556 void attach_pps(void (*fptr)(void)) { cb_pps.attach(fptr); }
AjK 0:db98027c0bbb 557
AjK 0:db98027c0bbb 558 //! A callback object for the 1PPS user API.
AjK 0:db98027c0bbb 559 FunctionPointer cb_pps;
AjK 0:db98027c0bbb 560
AjK 0:db98027c0bbb 561 //! Attach a user callback function to the NMEA RMC message processed signal.
AjK 0:db98027c0bbb 562 /**
AjK 0:db98027c0bbb 563 * Attach a user callback object/method to call when an NMEA RMC packet has been processed.
AjK 0:db98027c0bbb 564 *
AjK 0:db98027c0bbb 565 * @code
AjK 0:db98027c0bbb 566 * class FOO {
AjK 0:db98027c0bbb 567 * public:
AjK 0:db98027c0bbb 568 * void myCallback(void);
AjK 0:db98027c0bbb 569 * };
AjK 0:db98027c0bbb 570 *
AjK 0:db98027c0bbb 571 * GPS gps(NC, p9);
AjK 0:db98027c0bbb 572 * Foo foo;
AjK 0:db98027c0bbb 573 *
AjK 0:db98027c0bbb 574 * gps.attach_rmc(foo, &FOO::myCallback);
AjK 0:db98027c0bbb 575 *
AjK 0:db98027c0bbb 576 * @endcode
AjK 0:db98027c0bbb 577 *
AjK 0:db98027c0bbb 578 * @ingroup API
AjK 0:db98027c0bbb 579 * @param tptr pointer to the object to call the member function on
AjK 0:db98027c0bbb 580 * @param mptr pointer to the member function to be called
AjK 0:db98027c0bbb 581 */
AjK 0:db98027c0bbb 582 template<typename T>
AjK 0:db98027c0bbb 583 void attach_rmc(T* tptr, void (T::*mptr)(void)) { cb_rmc.attach(tptr, mptr); }
AjK 0:db98027c0bbb 584
AjK 0:db98027c0bbb 585 //! Attach a user callback function to the NMEA RMC message processed signal.
AjK 0:db98027c0bbb 586 /**
AjK 0:db98027c0bbb 587 * Attach a user callback function pointer to call when an NMEA RMC packet has been processed.
AjK 0:db98027c0bbb 588 *
AjK 0:db98027c0bbb 589 * @code
AjK 0:db98027c0bbb 590 * void myCallback(void) { ... }
AjK 0:db98027c0bbb 591 *
AjK 0:db98027c0bbb 592 * GPS gps(NC, p9);
AjK 0:db98027c0bbb 593 * Foo foo;
AjK 0:db98027c0bbb 594 *
AjK 0:db98027c0bbb 595 * gps.attach_rmc(&myCallback);
AjK 0:db98027c0bbb 596 *
AjK 0:db98027c0bbb 597 * @endcode
AjK 0:db98027c0bbb 598 *
AjK 0:db98027c0bbb 599 * @ingroup API
AjK 0:db98027c0bbb 600 * @param fptr Callback function pointer.
AjK 0:db98027c0bbb 601 */
AjK 0:db98027c0bbb 602 void attach_rmc(void (*fptr)(void)) { cb_rmc.attach(fptr); }
AjK 0:db98027c0bbb 603
AjK 0:db98027c0bbb 604 //! A callback object for the NMEA RMS message processed signal user API.
AjK 0:db98027c0bbb 605 FunctionPointer cb_rmc;
AjK 0:db98027c0bbb 606
AjK 0:db98027c0bbb 607 //! Attach a user callback function to the NMEA GGA message processed signal.
AjK 0:db98027c0bbb 608 /**
AjK 0:db98027c0bbb 609 * Attach a user callback object/method to call when an NMEA GGA packet has been processed.
AjK 0:db98027c0bbb 610 *
AjK 0:db98027c0bbb 611 * @code
AjK 0:db98027c0bbb 612 * class FOO {
AjK 0:db98027c0bbb 613 * public:
AjK 0:db98027c0bbb 614 * void myCallback(void);
AjK 0:db98027c0bbb 615 * };
AjK 0:db98027c0bbb 616 *
AjK 0:db98027c0bbb 617 * GPS gps(NC, p9);
AjK 0:db98027c0bbb 618 * Foo foo;
AjK 0:db98027c0bbb 619 *
AjK 0:db98027c0bbb 620 * gps.attach_gga(foo, &FOO::myCallback);
AjK 0:db98027c0bbb 621 *
AjK 0:db98027c0bbb 622 * @endcode
AjK 0:db98027c0bbb 623 *
AjK 0:db98027c0bbb 624 * @ingroup API
AjK 0:db98027c0bbb 625 * @param tptr pointer to the object to call the member function on
AjK 0:db98027c0bbb 626 * @param mptr pointer to the member function to be called
AjK 0:db98027c0bbb 627 */
AjK 0:db98027c0bbb 628 template<typename T>
AjK 0:db98027c0bbb 629 void attach_gga(T* tptr, void (T::*mptr)(void)) { cb_gga.attach(tptr, mptr); }
AjK 0:db98027c0bbb 630
AjK 0:db98027c0bbb 631 //! Attach a user callback function to the NMEA GGA message processed signal.
AjK 0:db98027c0bbb 632 /**
AjK 0:db98027c0bbb 633 * Attach a user callback function pointer to call when an NMEA GGA packet has been processed.
AjK 0:db98027c0bbb 634 *
AjK 0:db98027c0bbb 635 * @code
AjK 0:db98027c0bbb 636 * void myCallback(void) { ... }
AjK 0:db98027c0bbb 637 *
AjK 0:db98027c0bbb 638 * GPS gps(NC, p9);
AjK 0:db98027c0bbb 639 * Foo foo;
AjK 0:db98027c0bbb 640 *
AjK 0:db98027c0bbb 641 * gps.attach_gga(&myCallback);
AjK 0:db98027c0bbb 642 *
AjK 0:db98027c0bbb 643 * @endcode
AjK 0:db98027c0bbb 644 *
AjK 0:db98027c0bbb 645 * @ingroup API
AjK 0:db98027c0bbb 646 * @param fptr Callback function pointer.
AjK 0:db98027c0bbb 647 */
AjK 0:db98027c0bbb 648 void attach_gga(void (*fptr)(void)) { cb_gga.attach(fptr); }
AjK 0:db98027c0bbb 649
AjK 0:db98027c0bbb 650 //! A callback object for the NMEA GGA message processed signal user API.
AjK 0:db98027c0bbb 651 FunctionPointer cb_gga;
AjK 0:db98027c0bbb 652
AjK 2:8aa059e7d8b1 653
AjK 2:8aa059e7d8b1 654 //! Attach a user callback function to the NMEA VTG message processed signal.
AjK 2:8aa059e7d8b1 655 /**
AjK 2:8aa059e7d8b1 656 * Attach a user callback object/method to call when an NMEA VTG packet has been processed.
AjK 2:8aa059e7d8b1 657 *
AjK 2:8aa059e7d8b1 658 * @code
AjK 2:8aa059e7d8b1 659 * class FOO {
AjK 2:8aa059e7d8b1 660 * public:
AjK 2:8aa059e7d8b1 661 * void myCallback(void);
AjK 2:8aa059e7d8b1 662 * };
AjK 2:8aa059e7d8b1 663 *
AjK 2:8aa059e7d8b1 664 * GPS gps(NC, p9);
AjK 2:8aa059e7d8b1 665 * Foo foo;
AjK 2:8aa059e7d8b1 666 *
AjK 2:8aa059e7d8b1 667 * gps.attach_vtg(foo, &FOO::myCallback);
AjK 2:8aa059e7d8b1 668 *
AjK 2:8aa059e7d8b1 669 * @endcode
AjK 2:8aa059e7d8b1 670 *
AjK 2:8aa059e7d8b1 671 * @ingroup API
AjK 2:8aa059e7d8b1 672 * @param tptr pointer to the object to call the member function on
AjK 2:8aa059e7d8b1 673 * @param mptr pointer to the member function to be called
AjK 2:8aa059e7d8b1 674 */
AjK 2:8aa059e7d8b1 675 template<typename T>
AjK 2:8aa059e7d8b1 676 void attach_vtg(T* tptr, void (T::*mptr)(void)) { cb_vtg.attach(tptr, mptr); }
AjK 2:8aa059e7d8b1 677
AjK 2:8aa059e7d8b1 678 //! Attach a user callback function to the NMEA VTG message processed signal.
AjK 2:8aa059e7d8b1 679 /**
AjK 2:8aa059e7d8b1 680 * Attach a user callback function pointer to call when an NMEA VTG packet has been processed.
AjK 2:8aa059e7d8b1 681 *
AjK 2:8aa059e7d8b1 682 * @code
AjK 2:8aa059e7d8b1 683 * void myCallback(void) { ... }
AjK 2:8aa059e7d8b1 684 *
AjK 2:8aa059e7d8b1 685 * GPS gps(NC, p9);
AjK 2:8aa059e7d8b1 686 * Foo foo;
AjK 2:8aa059e7d8b1 687 *
AjK 2:8aa059e7d8b1 688 * gps.attach_vtg(&myCallback);
AjK 2:8aa059e7d8b1 689 *
AjK 2:8aa059e7d8b1 690 * @endcode
AjK 2:8aa059e7d8b1 691 *
AjK 2:8aa059e7d8b1 692 * @ingroup API
AjK 2:8aa059e7d8b1 693 * @param fptr Callback function pointer.
AjK 2:8aa059e7d8b1 694 */
AjK 2:8aa059e7d8b1 695 void attach_vtg(void (*fptr)(void)) { cb_vtg.attach(fptr); }
AjK 2:8aa059e7d8b1 696
AjK 2:8aa059e7d8b1 697 //! A callback object for the NMEA RMS message processed signal user API.
AjK 2:8aa059e7d8b1 698 FunctionPointer cb_vtg;
AjK 3:28a1b60b0f37 699
AjK 6:64771e31464e 700 //! Attach a user callback function to the unknown NMEA message.
AjK 6:64771e31464e 701 /**
AjK 6:64771e31464e 702 * Attach a user callback object/method to call when an unknown NMEA packet.
AjK 6:64771e31464e 703 *
AjK 6:64771e31464e 704 * @code
AjK 6:64771e31464e 705 * class FOO {
AjK 6:64771e31464e 706 * public:
AjK 6:64771e31464e 707 * void myCallback(void);
AjK 6:64771e31464e 708 * };
AjK 6:64771e31464e 709 *
AjK 6:64771e31464e 710 * GPS gps(NC, p9);
AjK 6:64771e31464e 711 * Foo foo;
AjK 6:64771e31464e 712 *
AjK 6:64771e31464e 713 * gps.attach_ukn(foo, &FOO::myCallback);
AjK 6:64771e31464e 714 *
AjK 6:64771e31464e 715 * @endcode
AjK 6:64771e31464e 716 *
AjK 6:64771e31464e 717 * @ingroup API
AjK 6:64771e31464e 718 * @param tptr pointer to the object to call the member function on
AjK 6:64771e31464e 719 * @param mptr pointer to the member function to be called
AjK 6:64771e31464e 720 */
AjK 6:64771e31464e 721 template<typename T>
AjK 6:64771e31464e 722 void attach_ukn(T* tptr, void (T::*mptr)(void)) { cb_ukn.attach(tptr, mptr); }
AjK 6:64771e31464e 723
AjK 6:64771e31464e 724 //! Attach a user callback function to the unknown NMEA message.
AjK 6:64771e31464e 725 /**
AjK 6:64771e31464e 726 * Attach a user callback function pointer to call when an unknown NMEA.
AjK 6:64771e31464e 727 *
AjK 6:64771e31464e 728 * @code
AjK 6:64771e31464e 729 * void myCallback(void) { ... }
AjK 6:64771e31464e 730 *
AjK 6:64771e31464e 731 * GPS gps(NC, p9);
AjK 6:64771e31464e 732 * Foo foo;
AjK 6:64771e31464e 733 *
AjK 6:64771e31464e 734 * gps.attach_ukn(&myCallback);
AjK 6:64771e31464e 735 *
AjK 6:64771e31464e 736 * @endcode
AjK 6:64771e31464e 737 *
AjK 6:64771e31464e 738 * @ingroup API
AjK 6:64771e31464e 739 * @param fptr Callback function pointer.
AjK 6:64771e31464e 740 */
AjK 6:64771e31464e 741 void attach_ukn(void (*fptr)(void)) { cb_ukn.attach(fptr); }
AjK 6:64771e31464e 742
AjK 6:64771e31464e 743 //! A callback object for the NMEA RMS message processed signal user API.
AjK 6:64771e31464e 744 FunctionPointer cb_ukn;
AjK 6:64771e31464e 745
AjK 6:64771e31464e 746 /**
AjK 6:64771e31464e 747 * Set's the GGA string memory pointer.
AjK 6:64771e31464e 748 * @param s char pointer ti string.
AjK 6:64771e31464e 749 * @return char s passed in.
AjK 6:64771e31464e 750 */
AjK 6:64771e31464e 751 char * setGga(char *s) { _gga = s; return s; }
AjK 6:64771e31464e 752
AjK 6:64771e31464e 753 /**
AjK 6:64771e31464e 754 * Set's the RMC string memory pointer.
AjK 6:64771e31464e 755 * @param s char pointer ti string.
AjK 6:64771e31464e 756 * @return char s passed in.
AjK 6:64771e31464e 757 */
AjK 6:64771e31464e 758 char * setRmc(char *s) { _rmc = s; return s; };
AjK 6:64771e31464e 759
AjK 6:64771e31464e 760 /**
AjK 6:64771e31464e 761 * Set's the VTG string memory pointer.
AjK 6:64771e31464e 762 * @param s char pointer ti string.
AjK 6:64771e31464e 763 * @return char s passed in.
AjK 6:64771e31464e 764 */
AjK 6:64771e31464e 765 char * setVtg(char *s) { _vtg = s; return s; };
AjK 6:64771e31464e 766
AjK 6:64771e31464e 767 /**
AjK 6:64771e31464e 768 * Set's the UKN string memory pointer.
AjK 6:64771e31464e 769 * @param s char pointer ti string.
AjK 6:64771e31464e 770 * @return char s passed in.
AjK 6:64771e31464e 771 */
AjK 6:64771e31464e 772 char * setUkn(char *s) { _ukn = s; return s; };
AjK 6:64771e31464e 773
AjK 0:db98027c0bbb 774 //! Set the baud rate the GPS module is using.
AjK 0:db98027c0bbb 775 /**
AjK 0:db98027c0bbb 776 * Set the baud rate of the serial port
AjK 0:db98027c0bbb 777 *
AjK 0:db98027c0bbb 778 * @see http://mbed.org/projects/libraries/api/mbed/trunk/Serial#Serial.baud
AjK 0:db98027c0bbb 779 *
AjK 0:db98027c0bbb 780 * @ingroup API
AjK 0:db98027c0bbb 781 * @param baudrate The baudrate to set.
AjK 0:db98027c0bbb 782 */
AjK 0:db98027c0bbb 783 void baud(int baudrate) { Serial::baud(baudrate); }
AjK 0:db98027c0bbb 784
AjK 3:28a1b60b0f37 785 //! Set the serial port format the GPS module is using.
AjK 0:db98027c0bbb 786 /**
AjK 0:db98027c0bbb 787 * Set the transmission format used by the Serial port
AjK 0:db98027c0bbb 788 *
AjK 0:db98027c0bbb 789 * @see http://mbed.org/projects/libraries/api/mbed/trunk/Serial#Serial.format
AjK 0:db98027c0bbb 790 *
AjK 0:db98027c0bbb 791 * @ingroup API
AjK 0:db98027c0bbb 792 * @param bits - The number of bits in a word (5-8; default = 8)
AjK 0:db98027c0bbb 793 * @param parity - The parity used (GPS::None, GPS::Odd, GPS::Even, GPS::Forced1, GPS::Forced0; default = GPS::None)
AjK 0:db98027c0bbb 794 * @param stop_bits - The number of stop bits (1 or 2; default = 1)
AjK 0:db98027c0bbb 795 */
AjK 0:db98027c0bbb 796 void format(int bits, Parity parity, int stop_bits) { Serial::format(bits, (Serial::Parity)parity, stop_bits); }
AjK 0:db98027c0bbb 797
AjK 3:28a1b60b0f37 798 //! Send incoming GPS bytes to Uart0
AjK 3:28a1b60b0f37 799 /**
AjK 3:28a1b60b0f37 800 * Send incoming GPS bytes to Uart0
AjK 3:28a1b60b0f37 801 *
AjK 3:28a1b60b0f37 802 * This can be useful for printing out the bytes from the GPS onto
AjK 3:28a1b60b0f37 803 * a the common debug port Uart0. Note, Uart0 should have been setup
AjK 3:28a1b60b0f37 804 * and initialised before switching this on. Also, realistically,
AjK 3:28a1b60b0f37 805 * you should ensure Uart0 has a higher baud rate than that being
AjK 3:28a1b60b0f37 806 * used by the GPS. Sending of bytes to Uart0 is "raw" and should
AjK 3:28a1b60b0f37 807 * only be used to initially gather data and should NOT be used as
AjK 3:28a1b60b0f37 808 * part of the application design. If you need to forward on the
AjK 3:28a1b60b0f37 809 * data you should come up with a proper strategy.
AjK 3:28a1b60b0f37 810 *
AjK 3:28a1b60b0f37 811 * @ingroup API
AjK 3:28a1b60b0f37 812 * @param b - True to send to Uart0, false otherwise
AjK 3:28a1b60b0f37 813 */
AjK 3:28a1b60b0f37 814 void NmeaOnUart0(bool b) { _nmeaOnUart0 = b; }
AjK 3:28a1b60b0f37 815
AjK 0:db98027c0bbb 816 protected:
AjK 0:db98027c0bbb 817
AjK 0:db98027c0bbb 818 //! Flag set true when a GPS PPS has been attached to a pin.
AjK 0:db98027c0bbb 819 bool _ppsInUse;
AjK 0:db98027c0bbb 820
AjK 0:db98027c0bbb 821 //! An InterruptIn object to "trigger" on the PPS edge.
AjK 0:db98027c0bbb 822 InterruptIn *_pps;
AjK 0:db98027c0bbb 823
AjK 0:db98027c0bbb 824 //! A Ticker object called every 10ms.
AjK 0:db98027c0bbb 825 Ticker *_second100;
AjK 0:db98027c0bbb 826
AjK 0:db98027c0bbb 827 //! A GPS_Time object used to hold the last parsed time/date data.
AjK 0:db98027c0bbb 828 GPS_Time theTime;
AjK 0:db98027c0bbb 829
AjK 0:db98027c0bbb 830 //! A GPS_Geodetic object used to hold the last parsed positional data.
AjK 2:8aa059e7d8b1 831 GPS_Geodetic thePlace;
AjK 2:8aa059e7d8b1 832
AjK 2:8aa059e7d8b1 833 //! A GPS_VTG object used to hold vector data.
AjK 3:28a1b60b0f37 834 GPS_VTG theVTG;
AjK 3:28a1b60b0f37 835
AjK 3:28a1b60b0f37 836 //! Used to record the previous byte received.
AjK 3:28a1b60b0f37 837 char _lastByte;
AjK 3:28a1b60b0f37 838
AjK 6:64771e31464e 839 char *_gga;
AjK 6:64771e31464e 840 char *_rmc;
AjK 6:64771e31464e 841 char *_vtg;
AjK 6:64771e31464e 842 char *_ukn;
AjK 6:64771e31464e 843
AjK 3:28a1b60b0f37 844 //! Used for debugging.
AjK 3:28a1b60b0f37 845 bool _nmeaOnUart0;
AjK 0:db98027c0bbb 846 };
AjK 0:db98027c0bbb 847
AjK 0:db98027c0bbb 848 #endif
AjK 0:db98027c0bbb 849