Slight update to sford's GPS library. Returns more data from the NMEA sentence and allows for different serial speeds (e.g. used for the Adafruit Ultimate GPSv3 Breakout Board).

Dependents:   GPS_HelloWorld servo_sensor

Fork of GPS by Simon Ford

Committer:
8fromPi
Date:
Sat Nov 02 16:17:58 2013 +0000
Revision:
1:1d60e6a0ffd9
Parent:
0:15611c7938a3
GPS lib from sford with light modifications to get more data from the NMEA sentence and to allow for modules with different serial speeds

Who changed what in which revision?

UserRevisionLine numberNew contents of line
8fromPi 1:1d60e6a0ffd9 1 /* mbed GPS Module Library
simon 0:15611c7938a3 2 * Copyright (c) 2008-2010, sford
8fromPi 1:1d60e6a0ffd9 3 * Copyright (c) 2013, B.Adryan
simon 0:15611c7938a3 4 *
simon 0:15611c7938a3 5 * Permission is hereby granted, free of charge, to any person obtaining a copy
simon 0:15611c7938a3 6 * of this software and associated documentation files (the "Software"), to deal
simon 0:15611c7938a3 7 * in the Software without restriction, including without limitation the rights
simon 0:15611c7938a3 8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
simon 0:15611c7938a3 9 * copies of the Software, and to permit persons to whom the Software is
simon 0:15611c7938a3 10 * furnished to do so, subject to the following conditions:
simon 0:15611c7938a3 11 *
simon 0:15611c7938a3 12 * The above copyright notice and this permission notice shall be included in
simon 0:15611c7938a3 13 * all copies or substantial portions of the Software.
simon 0:15611c7938a3 14 *
simon 0:15611c7938a3 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
simon 0:15611c7938a3 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
simon 0:15611c7938a3 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
simon 0:15611c7938a3 18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
simon 0:15611c7938a3 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
simon 0:15611c7938a3 20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
simon 0:15611c7938a3 21 * THE SOFTWARE.
simon 0:15611c7938a3 22 */
simon 0:15611c7938a3 23
simon 0:15611c7938a3 24 #include "GPS.h"
simon 0:15611c7938a3 25
8fromPi 1:1d60e6a0ffd9 26 GPS::GPS(PinName tx, PinName rx, int Baud) : _gps(tx, rx) {
8fromPi 1:1d60e6a0ffd9 27 _gps.baud(Baud);
simon 0:15611c7938a3 28 longitude = 0.0;
simon 0:15611c7938a3 29 latitude = 0.0;
simon 0:15611c7938a3 30 }
simon 0:15611c7938a3 31
simon 0:15611c7938a3 32 int GPS::sample() {
8fromPi 1:1d60e6a0ffd9 33 char ns, ew, unit;
simon 0:15611c7938a3 34 int lock;
simon 0:15611c7938a3 35
simon 0:15611c7938a3 36 while(1) {
simon 0:15611c7938a3 37 getline();
simon 0:15611c7938a3 38
simon 0:15611c7938a3 39 // Check if it is a GPGGA msg (matches both locked and non-locked msg)
8fromPi 1:1d60e6a0ffd9 40 if(sscanf(msg, "GPGGA,%f,%f,%c,%f,%c,%d,%d,%f,%f,%c,%f", &time, &latitude, &ns, &longitude, &ew, &lock, &sats, &hdop, &alt, &unit, &geoid) >= 1) {
simon 0:15611c7938a3 41 if(!lock) {
8fromPi 1:1d60e6a0ffd9 42 time = 0.0;
simon 0:15611c7938a3 43 longitude = 0.0;
8fromPi 1:1d60e6a0ffd9 44 latitude = 0.0;
8fromPi 1:1d60e6a0ffd9 45 sats = 0;
8fromPi 1:1d60e6a0ffd9 46 hdop = 0.0;
8fromPi 1:1d60e6a0ffd9 47 alt = 0.0;
8fromPi 1:1d60e6a0ffd9 48 geoid = 0.0;
simon 0:15611c7938a3 49 return 0;
simon 0:15611c7938a3 50 } else {
8fromPi 1:1d60e6a0ffd9 51 //GPGGA format according http://aprs.gids.nl/nmea/#gga
8fromPi 1:1d60e6a0ffd9 52 // time (float), lat (f), (N/S) (c), long (f), (E/W) (c), fix (d), sats (d),
8fromPi 1:1d60e6a0ffd9 53 // hdop (float), altitude (float), M, geoid (float), M, , ,
8fromPi 1:1d60e6a0ffd9 54 //GPGGA,092010.000,5210.9546,N,00008.8913,E,1,07,1.3,9.7,M,47.0,M,,0000*5D
8fromPi 1:1d60e6a0ffd9 55
simon 0:15611c7938a3 56 if(ns == 'S') { latitude *= -1.0; }
simon 0:15611c7938a3 57 if(ew == 'W') { longitude *= -1.0; }
simon 0:15611c7938a3 58 float degrees = trunc(latitude / 100.0f);
simon 0:15611c7938a3 59 float minutes = latitude - (degrees * 100.0f);
simon 0:15611c7938a3 60 latitude = degrees + minutes / 60.0f;
simon 0:15611c7938a3 61 degrees = trunc(longitude / 100.0f * 0.01f);
simon 0:15611c7938a3 62 minutes = longitude - (degrees * 100.0f);
simon 0:15611c7938a3 63 longitude = degrees + minutes / 60.0f;
simon 0:15611c7938a3 64 return 1;
simon 0:15611c7938a3 65 }
simon 0:15611c7938a3 66 }
simon 0:15611c7938a3 67 }
simon 0:15611c7938a3 68 }
simon 0:15611c7938a3 69
simon 0:15611c7938a3 70 float GPS::trunc(float v) {
simon 0:15611c7938a3 71 if(v < 0.0) {
simon 0:15611c7938a3 72 v*= -1.0;
simon 0:15611c7938a3 73 v = floor(v);
simon 0:15611c7938a3 74 v*=-1.0;
simon 0:15611c7938a3 75 } else {
simon 0:15611c7938a3 76 v = floor(v);
simon 0:15611c7938a3 77 }
simon 0:15611c7938a3 78 return v;
simon 0:15611c7938a3 79 }
simon 0:15611c7938a3 80
simon 0:15611c7938a3 81 void GPS::getline() {
simon 0:15611c7938a3 82 while(_gps.getc() != '$'); // wait for the start of a line
simon 0:15611c7938a3 83 for(int i=0; i<256; i++) {
simon 0:15611c7938a3 84 msg[i] = _gps.getc();
simon 0:15611c7938a3 85 if(msg[i] == '\r') {
simon 0:15611c7938a3 86 msg[i] = 0;
simon 0:15611c7938a3 87 return;
simon 0:15611c7938a3 88 }
simon 0:15611c7938a3 89 }
simon 0:15611c7938a3 90 error("Overflowed message limit");
8fromPi 1:1d60e6a0ffd9 91 }