Dependents:   V2_GPSRTC

Committer:
joosttromp
Date:
Fri Jun 17 12:37:03 2011 +0000
Revision:
0:62fa44dd600b

        

Who changed what in which revision?

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