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

Dependents:   Test_gps_sample

gps_sample.cpp

Committer:
schnf30
Date:
2016-05-08
Revision:
3:4d091db92148

File content as of revision 3:4d091db92148:

#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;
}