* add C027_Support fork
Fork of C027_Support by
Diff: GPS.h
- Revision:
- 2:b6012cd91657
- Parent:
- 1:f41579f4e2ed
- Child:
- 3:c7cd4887560d
--- a/GPS.h Mon Oct 21 19:46:34 2013 +0000 +++ b/GPS.h Fri Oct 25 08:47:22 2013 +0000 @@ -1,12 +1,74 @@ #pragma once +#include "mbed.h" +#include "Pipe.h" #include "SerialPipe.h" +#include "C027_PinNames.h" + +class GPSParser +{ +public: + #define WAIT -1 + #define NOT_FOUND 0 + + #define UBX 0x100000 + #define NMEA 0x200000 + #define LENGTH(x) (x & 0x00FFFF) + #define PROTOCOL(x) (x & 0xFF0000) -class GPS : public SerialPipe + virtual int getMessage(char* buf, int len) = 0; + virtual int putNmea(const char* buf, int len) = 0; + virtual int putUbx(const unsigned char cls, unsigned char id, unsigned char* buf, int len) = 0; + + static const char* findNmeaItemPos(int ix, const char* start, const char* end); + static bool getNmeaItem(int ix, char* buf, int len, double& val); + static bool getNmeaItem(int ix, char* buf, int len, int& val, int base/*=10*/); + static bool getNmeaItem(int ix, char* buf, int len, char& val); +protected: + static int _getMessage(Pipe<char>* pipe, char* buf, int len); + static int _parseNmea(Pipe<char>* pipe, int len); + static int _parseUbx(Pipe<char>* pipe, int len); + static int _putNmea(Stream* stream, const char* buf, int len); + static int _putUbx(Stream* stream, const unsigned char cls, unsigned char id, unsigned char* buf, int len); + static const char toHex[16]; +}; + +class GPSSerial : public Serial, public GPSParser { public: - GPS() : SerialPipe(GPSTXD, GPSRXD, 256, "gps") - { - baud(GPSBAUD); - } + GPSSerial(PinName tx = GPSTXD, PinName rx = GPSRXD, int baudrate = GPSBAUD); + virtual ~GPSSerial(void); + + virtual int getMessage(char* buf, int len); + virtual int putNmea(const char* buf, int len) + { return _putNmea(this, buf, len); } + virtual int putUbx(const unsigned char cls, unsigned char id, unsigned char* buf, int len) + { return _putUbx(this, cls, id, buf, len); } +protected: + void serialRxIrq(void); + virtual char next(void) { return _pipe.next(); } + Pipe<char> _pipe; }; + +class GPSI2C : public I2C, public GPSParser +{ +public: + GPSI2C(PinName sda = GPSSDA, PinName scl = GPSSCL); + bool detect(void); + + virtual int getMessage(char* buf, int len); + // + virtual int putNmea(const char* buf, int len) + { return 0/*_putNmea(NULL, buf, len)*/; } + virtual int putUbx(const unsigned char cls, unsigned char id, unsigned char* buf, int len) + { return 0/*_putUbx(NULL, cls, id, buf, len)*/; } +protected: + virtual char next(void) { return _pipe.next(); } + int _get(char* buf, int len); // read the NMEA or UBX stream + int _put(const char* buf, int len); // Write the NMEA or UBX stream + + Pipe<char> _pipe; + bool found; + static const char REGLEN; + static const char REGSTREAM; +};