fix cordinate and speed data

Fork of GPS by Simon Ford

Committer:
yanay_amir
Date:
Mon Jun 13 07:15:55 2016 +0000
Revision:
1:014d955e3c29
Parent:
0:15611c7938a3
EM-406 LIBERY (FIXED CORDINATE+SPEED DATA)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
simon 0:15611c7938a3 1 /* mbed EM-406 GPS Module Library
simon 0:15611c7938a3 2 * Copyright (c) 2008-2010, sford
simon 0:15611c7938a3 3 *
simon 0:15611c7938a3 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
simon 0:15611c7938a3 5 * of this software and associated documentation files (the "Software"), to deal
simon 0:15611c7938a3 6 * in the Software without restriction, including without limitation the rights
simon 0:15611c7938a3 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
simon 0:15611c7938a3 8 * copies of the Software, and to permit persons to whom the Software is
simon 0:15611c7938a3 9 * furnished to do so, subject to the following conditions:
simon 0:15611c7938a3 10 *
simon 0:15611c7938a3 11 * The above copyright notice and this permission notice shall be included in
simon 0:15611c7938a3 12 * all copies or substantial portions of the Software.
simon 0:15611c7938a3 13 *
simon 0:15611c7938a3 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
simon 0:15611c7938a3 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
simon 0:15611c7938a3 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
simon 0:15611c7938a3 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
simon 0:15611c7938a3 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
simon 0:15611c7938a3 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
simon 0:15611c7938a3 20 * THE SOFTWARE.
simon 0:15611c7938a3 21 */
simon 0:15611c7938a3 22
simon 0:15611c7938a3 23 #include "GPS.h"
yanay_amir 1:014d955e3c29 24 #define GPS_KMPH_PER_KNOT 1.852
yanay_amir 1:014d955e3c29 25
yanay_amir 1:014d955e3c29 26
simon 0:15611c7938a3 27 GPS::GPS(PinName tx, PinName rx) : _gps(tx, rx) {
simon 0:15611c7938a3 28 _gps.baud(4800);
simon 0:15611c7938a3 29 longitude = 0.0;
simon 0:15611c7938a3 30 latitude = 0.0;
simon 0:15611c7938a3 31 }
yanay_amir 1:014d955e3c29 32
simon 0:15611c7938a3 33 int GPS::sample() {
yanay_amir 1:014d955e3c29 34 float time, timefix;
yanay_amir 1:014d955e3c29 35 char ns, ew, ns2, ew2, warning;
simon 0:15611c7938a3 36 int lock;
yanay_amir 1:014d955e3c29 37
simon 0:15611c7938a3 38 while(1) {
simon 0:15611c7938a3 39 getline();
yanay_amir 1:014d955e3c29 40
simon 0:15611c7938a3 41 // Check if it is a GPGGA msg (matches both locked and non-locked msg)
yanay_amir 1:014d955e3c29 42 if(sscanf(msg, "GPGGA,%f,%f,%c,%f,%c,%d", &time, &latitude, &ns, &longitude, &ew, &lock) >= 1)
yanay_amir 1:014d955e3c29 43 {
yanay_amir 1:014d955e3c29 44 if(!lock)
yanay_amir 1:014d955e3c29 45 {
yanay_amir 1:014d955e3c29 46 longitude = 0.0;
yanay_amir 1:014d955e3c29 47 latitude = 0.0;
simon 0:15611c7938a3 48 return 0;
yanay_amir 1:014d955e3c29 49 } else
yanay_amir 1:014d955e3c29 50
yanay_amir 1:014d955e3c29 51 {
yanay_amir 1:014d955e3c29 52 if(ns == 'S') { latitude *= -1.0; }
yanay_amir 1:014d955e3c29 53 if(ew == 'W') { longitude *= -1.0; }
yanay_amir 1:014d955e3c29 54 float degrees = trunc(latitude / 100.0f);
yanay_amir 1:014d955e3c29 55 float minutes = latitude - (degrees * 100.0f);
yanay_amir 1:014d955e3c29 56 latitude = degrees + minutes / 60.0f;
yanay_amir 1:014d955e3c29 57 degrees = trunc(longitude / 100.0f );
yanay_amir 1:014d955e3c29 58 // Edit:original GPS.h had, degrees = trunc(longitude/100.f*0.01f);
yanay_amir 1:014d955e3c29 59 minutes = longitude - (degrees * 100.0f);
yanay_amir 1:014d955e3c29 60 longitude = degrees + minutes / 60.0f;
yanay_amir 1:014d955e3c29 61 return 1;
simon 0:15611c7938a3 62 }
yanay_amir 1:014d955e3c29 63 }
yanay_amir 1:014d955e3c29 64 else
yanay_amir 1:014d955e3c29 65 {
yanay_amir 1:014d955e3c29 66 if (sscanf(msg, "GPRMC,%f,%c,%f,%c,%f,%c,%f,%f", &timefix,&warning,&lat2,&ns2,&lon2,
yanay_amir 1:014d955e3c29 67 &ew2,&speedgnd,&course) >=1)
yanay_amir 1:014d955e3c29 68
yanay_amir 1:014d955e3c29 69 {
yanay_amir 1:014d955e3c29 70 speedgnd*=GPS_KMPH_PER_KNOT;//speedgnd is in knots
yanay_amir 1:014d955e3c29 71 if(ns == 'S') {lat2 *= -1.0;}
yanay_amir 1:014d955e3c29 72 if(ew == 'W') { lon2 *= -1.0;}
yanay_amir 1:014d955e3c29 73 float deg = trunc( lat2/100.0f);
yanay_amir 1:014d955e3c29 74 float min= lat2 - (deg*100.0f);
yanay_amir 1:014d955e3c29 75 lat2 = deg + min/60.0f;
yanay_amir 1:014d955e3c29 76 deg = trunc(lon2/100.0f); // This line too maybe should have had (lon/100.0f*0.0f);
yanay_amir 1:014d955e3c29 77 min= lon2 - (deg*100.0f);
yanay_amir 1:014d955e3c29 78 lon2 = deg + min/60.0f;
yanay_amir 1:014d955e3c29 79
yanay_amir 1:014d955e3c29 80 return 1;
yanay_amir 1:014d955e3c29 81
yanay_amir 1:014d955e3c29 82 }
simon 0:15611c7938a3 83 }
yanay_amir 1:014d955e3c29 84
simon 0:15611c7938a3 85 }
simon 0:15611c7938a3 86 }
yanay_amir 1:014d955e3c29 87
simon 0:15611c7938a3 88 float GPS::trunc(float v) {
yanay_amir 1:014d955e3c29 89 if(v < 0.0) { // floor(x) returns the largest integer value not greater than x.
simon 0:15611c7938a3 90 v*= -1.0;
simon 0:15611c7938a3 91 v = floor(v);
simon 0:15611c7938a3 92 v*=-1.0;
simon 0:15611c7938a3 93 } else {
simon 0:15611c7938a3 94 v = floor(v);
simon 0:15611c7938a3 95 }
simon 0:15611c7938a3 96 return v;
simon 0:15611c7938a3 97 }
yanay_amir 1:014d955e3c29 98
simon 0:15611c7938a3 99 void GPS::getline() {
simon 0:15611c7938a3 100 while(_gps.getc() != '$'); // wait for the start of a line
simon 0:15611c7938a3 101 for(int i=0; i<256; i++) {
simon 0:15611c7938a3 102 msg[i] = _gps.getc();
simon 0:15611c7938a3 103 if(msg[i] == '\r') {
simon 0:15611c7938a3 104 msg[i] = 0;
simon 0:15611c7938a3 105 return;
simon 0:15611c7938a3 106 }
simon 0:15611c7938a3 107 }
simon 0:15611c7938a3 108 error("Overflowed message limit");
simon 0:15611c7938a3 109 }
yanay_amir 1:014d955e3c29 110