Library for the EM-406 GPS module

Fork of GPS by Simon Ford

Revision:
1:455c3e604c92
Parent:
0:15611c7938a3
Child:
2:4ebd0e486b5a
--- a/GPS.cpp	Tue Jun 08 14:10:27 2010 +0000
+++ b/GPS.cpp	Sat Mar 30 08:11:26 2013 +0000
@@ -1,81 +1,111 @@
-/* mbed EM-406 GPS Module Library
- * Copyright (c) 2008-2010, sford
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
- 
 #include "GPS.h"
 
-GPS::GPS(PinName tx, PinName rx) : _gps(tx, rx) {
-    _gps.baud(4800);    
-    longitude = 0.0;
-    latitude = 0.0;        
+GPS::GPS(PinName tx,PinName rx):_gps(tx,rx)
+{
+ _gps.baud(4800);
+ longitude=0.0;
+ latitude=0.0;
+}
+
+int GPS::sample()
+{
+ float dummy,d1,d2;
+ int lock;
+ while(1) 
+ {
+  getline();
+  fok_jel='°';
+  if(sscanf(msg,"GPGGA,%f,%f,%c,%f,%c,%d,%f,%f,%f",&time,&latitude,&ns,&longitude,&ew,&lock,&d1,&d2,&altitude)>=1) 
+  {
+   ora=elso2(time)+1;
+   perc=kozepso2(time);
+   masodperc=utolso2(time);
+   if(lock==0) 
+   {
+    nincs_adat();
+    altitude=0.0;
+   } 
+   fokpercmasodperc();
+   return 1;
+  }
+  if(sscanf(msg,"GPRMC,%f,%c,%f,%c,%f,%c,%f,%f,%f",&time,&status,&latitude,&ns,&longitude,&ew,&speed,&dummy,&date)>=1) 
+  {
+   nap=elso2(date);
+   ho=kozepso2(date);
+   ev=utolso2(date);
+   ora=elso2(time)+1;
+   perc=kozepso2(time);
+   masodperc=utolso2(time);
+   if(status=='V') 
+   {
+    nincs_adat();
+    speed=0.0;
+   }
+   fokpercmasodperc();
+   return 1;
+  }
+ }
 }
 
-int GPS::sample() {
-    float time;
-    char ns, ew;
-    int lock;
-
-    while(1) {        
-        getline();
+void GPS::fokpercmasodperc()
+{
+ long_fok=fok_szamol(longitude);
+ long_perc=perc_szamol(longitude);
+ long_masodperc=masodperc_szamol(longitude);
+ lati_fok=fok_szamol(latitude);
+ lati_perc=perc_szamol(latitude);
+ lati_masodperc=masodperc_szamol(latitude);
+}
 
-        // Check if it is a GPGGA msg (matches both locked and non-locked msg)
-        if(sscanf(msg, "GPGGA,%f,%f,%c,%f,%c,%d", &time, &latitude, &ns, &longitude, &ew, &lock) >= 1) { 
-            if(!lock) {
-                longitude = 0.0;
-                latitude = 0.0;        
-                return 0;
-            } else {
-                if(ns == 'S') {    latitude  *= -1.0; }
-                if(ew == 'W') {    longitude *= -1.0; }
-                float degrees = trunc(latitude / 100.0f);
-                float minutes = latitude - (degrees * 100.0f);
-                latitude = degrees + minutes / 60.0f;    
-                degrees = trunc(longitude / 100.0f * 0.01f);
-                minutes = longitude - (degrees * 100.0f);
-                longitude = degrees + minutes / 60.0f;
-                return 1;
-            }
-        }
-    }
+void GPS::nincs_adat()
+{
+ longitude=0.0;
+ ew='?';
+ latitude=0.0;
+ ns='?';
+}
+
+int GPS::fok_szamol(float f)
+{
+ return (int)(f/100);
+}
+
+int GPS::perc_szamol(float f)
+{
+ return (int)(f-fok_szamol(f)*100);
 }
 
-float GPS::trunc(float v) {
-    if(v < 0.0) {
-        v*= -1.0;
-        v = floor(v);
-        v*=-1.0;
-    } else {
-        v = floor(v);
-    }
-    return v;
+float GPS::masodperc_szamol(float f)
+{
+ return (f-fok_szamol(f)*100-perc_szamol(f))*60;
+}
+
+int GPS::elso2(float d)
+{
+ return (int)floor(d/10000);
+}
+
+int GPS::kozepso2(float d)
+{
+ return (int)floor((d-elso2(d)*10000)/100);
 }
 
-void GPS::getline() {
-    while(_gps.getc() != '$');    // wait for the start of a line
-    for(int i=0; i<256; i++) {
-        msg[i] = _gps.getc();
-        if(msg[i] == '\r') {
-            msg[i] = 0;
-            return;
-        }
-    }
-    error("Overflowed message limit");
+int GPS::utolso2(float d)
+{
+ return (int)floor(d-elso2(d)*10000-kozepso2(d)*100);
 }
+
+void GPS::getline()
+{
+ while(_gps.getc() != '$');    // wait for the start of a line
+ for(int i=0;i<256;i++) 
+ {
+  msg[i]=_gps.getc();
+  if(msg[i]=='\r') 
+  {
+   msg[i]=0;
+   return;
+  }
+ }
+ error("Tul hosszu szoveg !");
+}