Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Test_gps_event_vitesse_bluetooth gpsmpu60500 Test_gps_event_vitesse_bluetooth_ok
Fork of gps_event_vitesse by
Revision 0:ba9bedfe1044, committed 2016-05-16
- Comitter:
- schnf30
- Date:
- Mon May 16 21:40:59 2016 +0000
- Child:
- 1:dfc738d8aba1
- Commit message:
- Les libraires sont event et se base sur la reception de trame NMEA. ; 2 m?thodes sont utilis?es pour mesur?es la vitesse.; - M?thode 1 calcule a partir des angles et de l mesure de temps.; - M?thode 2 acquisition ? partir de la trame GPRMC.
Changed in this revision
| gps_event_vitesse.cpp | Show annotated file Show diff for this revision Revisions of this file |
| gps_event_vitesse.h | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/gps_event_vitesse.cpp Mon May 16 21:40:59 2016 +0000
@@ -0,0 +1,177 @@
+#include "gps_event_vitesse.h"
+//#define debug_gps // permet d'avoir des informations de fonctionnement sur l'interface usb e, mode com.
+
+#ifdef debig_gps
+extern Serial pc;
+#endif
+
+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;
+ _old_lock = 0;
+ _vitesse_gps_ok = 0;
+ _gps_data_ok = false;
+ attach(this,&Gps::receive, Serial::RxIrq);
+}
+
+void Gps::receive()
+{
+ char data;
+ 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
+ double latitude, longitude, time;
+ char status;
+ double speed;
+ int lock;
+ if(sscanf(_msg, "$GPGGA,%lf,%lf,%c,%lf,%c,%d,%d", &time, &latitude, &_ns, &longitude, &_ew, &lock,&_nbsattelite) >= 1) {
+#ifdef debug_gps
+ pc.printf("Message %s\r\n",_msg);
+#endif
+ _old_lock = _lock;
+ _lock = lock;
+ _old_time = _time;
+ _time = time;
+ _old_latitude = _latitude;
+ _latitude = latitude;
+ _old_longitude = _longitude;
+ _longitude = longitude;
+ if(_ns == 'S') _latitude *= -1.0;
+ if(_ew == 'W') _longitude *= -1.0;
+ double degrees = _trunc(_latitude / 100.0f);
+ double minutes = _latitude - (degrees * 100.0f);
+ _latitude = degrees + minutes / 60.0f;
+ degrees = _trunc(_longitude / 100.0f);
+ minutes = _longitude - (degrees * 100.0f);
+ _longitude = degrees + minutes / 60.0f;
+ _gps_data_ok = true;
+ _num = 0;
+ _msg[0] = 0;
+ } else if(sscanf(_msg, "$GPRMC,%lf,%c,%lf,%c,%lf,%c,%lf", &time,&status, &latitude, &_ns, &longitude, &_ew, &speed) >= 1) {
+#ifdef debug_gps
+ pc.printf("Message %s\r\n",_msg);
+#endif
+ _vitesse_gps_ok = (status == 'A');
+ if (_vitesse_gps_ok) {
+ speed = speed * 4.98f / 2.69f;
+ _vitesse_gps = (float) speed;
+ } else _vitesse_gps = 1000;
+ }
+ break;
+ default:
+ if ((_num < trame_nmea_max)&&(_msg [0] == '$')) {
+ _msg [_num++] = data;
+ _msg [_num] = 0;
+ }
+ }
+ }
+}
+
+double Gps::_trunc(double v)
+{
+ if(v < 0.0) {
+ v*= -1.0;
+ v = floor(v);
+ v*=-1.0;
+ } else {
+ v = floor(v);
+ }
+ return v;
+}
+double Gps::time()
+{
+ return _time;
+}
+
+double Gps::latitude()
+{
+ return _latitude;
+}
+char Gps::ns()
+{
+ return _ns;
+}
+
+double Gps::longitude()
+{
+ return _longitude;
+}
+char Gps::ew()
+{
+ return _ew;
+}
+int Gps::lock()
+{
+ return _lock;
+}
+int Gps::nbsattelite()
+{
+ return _nbsattelite;
+}
+
+char Gps::sample()
+{
+ if (_gps_data_ok) {
+ _gps_data_ok = false;
+ return true;
+ } else return false;
+}
+double Gps::_time_sec(double time)
+{
+ double heure, minute, seconde;
+ heure = _trunc(time/10000);
+ minute = _trunc((time-heure*10000)/100);
+ seconde = time - heure*10000 - minute *100;
+ return (heure * 3600.0 + minute * 60 + seconde);
+}
+float Gps::vitesse()
+{
+ double vitesse, duree;
+ double latitude_rad;
+ double old_latitude_rad;
+ double longitude_rad;
+ double old_longitude_rad;
+ if (vitesse_ok()) {
+ latitude_rad = pi * _latitude /180.0f;
+ old_latitude_rad = pi * _old_latitude / 180.0f;
+ longitude_rad = pi * _longitude / 180.0f;
+ old_longitude_rad = pi * _old_longitude /180.0f;
+ vitesse = acos(sin(latitude_rad)*sin(old_latitude_rad)+cos(latitude_rad)*cos(old_latitude_rad)*cos(longitude_rad-old_longitude_rad));
+ vitesse = vitesse * rayon;
+ duree = _time_sec(_time) - _time_sec(_old_time);
+ if (duree!=0) vitesse = (vitesse / duree) *3.6f;
+ else vitesse = 2000.0;
+ } else vitesse = 1000.0;
+ return (float) vitesse;
+}
+char Gps::vitesse_ok()
+{
+ char vitesse_ok;
+ vitesse_ok = (_lock && _old_lock);
+ return vitesse_ok;
+}
+float Gps::vitesse_gps()
+{
+ return _vitesse_gps;
+}
+char Gps::vitesse_gps_ok()
+{
+ char vitesse_ok;
+ vitesse_ok = (_lock && _vitesse_gps_ok);
+ return vitesse_ok;
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/gps_event_vitesse.h Mon May 16 21:40:59 2016 +0000
@@ -0,0 +1,46 @@
+#ifndef _Sf_gps_rs232_
+#define _Sf_gps_rs232_
+#include "mbed.h"
+#define trame_nmea_max 84
+
+const double pi = 3.14159265;
+const double rayon = 6378137.0;
+
+class Gps : public Serial
+{
+public:
+ Gps(PinName Txd, PinName Rxd);
+ void receive(); //recoit les data gps et les stocks puis produit les donnees en cas de reception
+ double time(); // date
+ double latitude();
+ char ns(); // nombre satellite.
+ double longitude();
+ char ew();
+ int lock();
+ int nbsattelite();
+ char sample();
+ float vitesse();
+ char vitesse_ok();
+ float vitesse_gps();
+ char vitesse_gps_ok();
+private:
+ unsigned int _num; // nombre caractere recu dans la phrase gps en court
+ char _msg[trame_nmea_max+1]; //
+ float _time; // date
+ float _old_time;
+ float _latitude;
+ float _old_latitude;
+ char _ns;
+ float _longitude;
+ float _old_longitude;
+ char _ew;
+ int _lock;
+ int _old_lock;
+ int _nbsattelite;
+ char _gps_data_ok;
+ double _trunc(double v);
+ double _time_sec(double time);
+ float _vitesse_gps;
+ char _vitesse_gps_ok;
+};
+#endif
\ No newline at end of file
