Cette librairie permet de gérer les event d'un gps NMEA rs232.

Dependents:   Test_gps_sample

Revision:
3:4d091db92148
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gps_sample.cpp	Sun May 08 19:18:53 2016 +0000
@@ -0,0 +1,101 @@
+#include "gps_sample.h"
+
+Gps::Gps(PinName Txd, PinName Rxd) : Serial(Txd,Rxd)
+{
+    _num = 0;
+    _msg[0] = 0;
+    _time = 0; // date
+    _latitude = 0;
+    _ns = 0; // nombre satellite.
+    _longitude = 0;
+    _ew = 0;
+    _lock = 0;
+}
+// Gps sample
+char Gps::sample()
+{
+    char data, _gps_data_ok = false;
+    if(readable()) {
+        data = getc();
+        switch (data) {
+            case '$' :  // debut de phrase Gps
+                _num = 1;
+                _msg [0] = '$';
+                _msg [1] = 0;
+                break;
+            case '\f' :
+                break;
+            case '\r' : // fin de phrase Gps
+                if (_msg [0] == '$') { // on a recu un message. // faudrait tester la parite a voir
+                    if(sscanf(_msg, "$GPGGA,%f,%f,%c,%f,%c,%d,%d", &_time, &_latitude, &_ns, &_longitude, &_ew, &_lock,&_nbsattelite) >= 1) {
+                        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;
+                        _gps_data_ok = true;
+                        _num = 0;
+                        _msg[0] = 0;
+                    }
+                }
+                break;
+            default:
+                if ((_num < trame_nmea_max)&&(_msg [0] == '$')) {
+                    _msg [_num++] = data;
+                    _msg [_num] = 0;
+                }
+        }
+    }
+    return _gps_data_ok;
+}
+
+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::time()
+{
+    return _time;
+}
+
+float Gps::latitude()
+{
+    return _latitude;
+}
+char Gps::ns()
+{
+    return _ns;
+}
+
+float Gps::longitude()
+{
+    return _longitude;
+}
+char Gps::ew()
+{
+    return _ew;
+}
+int Gps::lock()
+{
+    return _lock;
+}
+int Gps::nbsattelite()
+{
+    return _nbsattelite;
+}
+