An implementation of the Sirf Binary and NMEA Protocol for gps devices using the SiRFstarIII chipset

GpsInterface.cpp

Committer:
p3p
Date:
2012-06-28
Revision:
0:43da35949666

File content as of revision 0:43da35949666:

#include "GpsInterface.h"

namespace SirfStarIII {

GpsInterface::GpsInterface(PinName tx, PinName rx) : SirfStarIII(tx, rx) {
    receiveCallback(BinaryPacket::ID_GeodeticNavigationData, this,  &GpsInterface::onReceiveGeodeticNavigationData);
    receiveCallback(BinaryPacket::ID_MeasuredTrackingData, this,  &GpsInterface::onReceiveMeasuredTrackingData);
    receiveCallback(BinaryPacket::ID_DGPSStatus, this,  &GpsInterface::onReceiveDGPSStatus);
    receiveCallback(NMEAPacket::ID_RMC, this,  &GpsInterface::onReceiveRMC);
}

void GpsInterface::onReceiveGeodeticNavigationData(SimpleSerialProtocol::Packet* packet) {
    if(!packet)return;
    
    if (packet->_valid) {
        BinaryPacket::GeodeticNavigationData::Interface* interface = packet->interpretData<BinaryPacket::GeodeticNavigationData::Interface>();
        if (interface) {
            BinaryPacket::GeodeticNavigationData::swapByteOrder(interface);
            _fix.sats =  interface->satalites_in_fix;
            _position.longitude = (((float)interface->longitude)/10000000);
            _position.latitude = (((float)interface->latitude)/10000000);

            _time.year = interface->year;
            _time.month = interface->month;
            _time.day = interface->day;
            _time.hours = interface->hour;
            _time.minutes = interface->minute;
            _time.seconds = interface->second/1000;
        }
    }
    return;
}

void GpsInterface::onReceiveMeasuredTrackingData(SimpleSerialProtocol::Packet* packet) {
    if(!packet)return;
    
    if (packet->_valid) {
        BinaryPacket::MeasuredTrackingData::Interface* interface = packet->interpretData<BinaryPacket::MeasuredTrackingData::Interface>();
        if (interface) {

        }
    }
    return;
}

void GpsInterface::onReceiveDGPSStatus(SimpleSerialProtocol::Packet* packet) {
    if(!packet)return;
    
    if (packet->_valid) {
        BinaryPacket::DGPSStatus::Interface* interface = packet->interpretData<BinaryPacket::DGPSStatus::Interface>();
        if (interface) {

        }
    }
    return;
}

void GpsInterface::onReceiveRMC(SimpleSerialProtocol::Packet* packet) {
    if(!packet)return;
    
    NMEAPacket::NMEAPacket nmeaPacket;
    if (packet->_valid) {
        nmeaPacket.interpretData(packet);
        float time = atof(nmeaPacket._fields[1].c_str());
        _time.seconds = (int)time % 100;
        _time.minutes = (int)(time / 100)%100;
        _time.hours =  (int)(time / 10000);

        //   2 Time Status
        _position.latitude.set(atof(nmeaPacket._fields[3].c_str()), (char)nmeaPacket._fields[4].c_str()[0]);
        _position.longitude.set(atof(nmeaPacket._fields[5].c_str()), (char)nmeaPacket._fields[6].c_str()[0]);
        _position.speed = atof(nmeaPacket._fields[7].c_str());
        _position.course = atof(nmeaPacket._fields[8].c_str());

        uint32_t date = atoi(nmeaPacket._fields[9].c_str());
        _time.year = 2000 + (date % 100);
        date /= 100;
        _time.month = date % 100;
        _time.day = date / 100;

        // 10   magnetic variation
        // 11   mode
    }

    return;
}

}