CQ出版 Interface 2014年10月号のC027(MAX7-Q)GPSテスト記事のプログラム。 CQ publishing Interface 2014.10 issue, C027 GPS(MAX-7Q) test program.
Dependencies: C027 C027_Support mbed
Diff: C027_Support/GPS.h
- Revision:
- 3:002503ab7199
- Parent:
- 2:bc413454a83e
--- a/C027_Support/GPS.h Mon Jul 28 15:45:16 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,284 +0,0 @@ -#pragma once - -#include "mbed.h" -#include "Pipe.h" -#include "SerialPipe.h" - -#ifdef TARGET_UBLOX_C027 - // if we detect the C027 platform we will assign the - // default pinname and baudrate in the constructor - // this helper macro will be used. - #define _C027DEFAULT(name) = name -#else - #define _C027DEFAULT(name) -#endif - -/** basic gps parser class -*/ -class GPSParser -{ -public: - enum { - // getLine Responses - WAIT = -1, //!< wait for more incoming data (the start of a message was found, or no data available) - NOT_FOUND = 0, //!< a parser concluded the the current offset of the pipe doe not contain a valid message - - #define LENGTH(x) (x & 0x00FFFF) //!< extract/mask the length - #define PROTOCOL(x) (x & 0xFF0000) //!< extract/mask the type - - UNKNOWN = 0x000000, //!< message type is unknown - UBX = 0x100000, //!< message if of protocol NMEA - NMEA = 0x200000 //!< message if of protocol UBX - }; - - /** Get a line from the physical interface. This fucntion - needs to be implemented in the inherited class. - \param buf the buffer to store it - \param len size of the buffer - \return type and length if something was found, - WAIT if not enough data is available - NOT_FOUND if nothing was found - */ - virtual int getMessage(char* buf, int len) = 0; - - /** send a buffer - \param buf the buffer to write - \param len size of the buffer to write - \return bytes written - */ - virtual int send(const char* buf, int len); - - /** send a NMEA message, this function just takes the - payload and calculates and adds checksum. ($ and *XX\r\n will be added) - \param buf the message payload to write - \param len size of the message payload to write - \return total bytes written - */ - virtual int sendNmea(const char* buf, int len); - - /** send a UBX message, this function just takes the - payload and calculates and adds checksum. - \param cls the UBX class id - \param id the UBX message id - \param buf the message payload to write - \param len size of the message payload to write - \return total bytes written - */ - virtual int sendUbx(unsigned char cls, unsigned char id, - const void* buf = NULL, int len = 0); - - /** Power off the gps, it can be again woken up by an - edge on the serial port on the external interrupt pin. - */ - void powerOff(void); - - /** get the first character of a NMEA field - \param ix the index of the field to find - \param start the start of the buffer - \param end the end of the buffer - \return the pointer to the first character of the field. - */ - static const char* findNmeaItemPos(int ix, const char* start, const char* end); - - /** extract a double value from a buffer containing a NMEA message - \param ix the index of the field to extract - \param buf the NMEA message - \param len the size of the NMEA message - \param val the extracted value - \return true if successful, false otherwise - */ - static bool getNmeaItem(int ix, char* buf, int len, double& val); - - /** extract a interger value from a buffer containing a NMEA message - \param ix the index of the field to extract - \param buf the NMEA message - \param len the size of the NMEA message - \param val the extracted value - \param base the numeric base to be used (e.g. 8, 10 or 16) - \return true if successful, false otherwise - */ - static bool getNmeaItem(int ix, char* buf, int len, int& val, int base/*=10*/); - - /** extract a char value from a buffer containing a NMEA message - \param ix the index of the field to extract - \param buf the NMEA message - \param len the size of the NMEA message - \param val the extracted value - \return true if successful, false otherwise - */ - static bool getNmeaItem(int ix, char* buf, int len, char& val); - - /** extract a latitude/longitude value from a buffer containing a NMEA message - \param ix the index of the field to extract (will extract ix and ix + 1) - \param buf the NMEA message - \param len the size of the NMEA message - \param val the extracted latitude or longitude - \return true if successful, false otherwise - */ - static bool getNmeaAngle(int ix, char* buf, int len, double& val); - -protected: - /** Get a line from the physical interface. - \param pipe the receiveing pipe to parse messages - \param buf the buffer to store it - \param len size of the buffer - \return type and length if something was found, - WAIT if not enough data is available - NOT_FOUND if nothing was found - */ - static int _getMessage(Pipe<char>* pipe, char* buf, int len); - - /** Check if the current offset of the pipe contains a NMEA message. - \param pipe the receiveing pipe to parse messages - \param len numer of bytes to parse at maximum - \return length if something was found (including the NMEA frame) - WAIT if not enough data is available - NOT_FOUND if nothing was found - */ - static int _parseNmea(Pipe<char>* pipe, int len); - - /** Check if the current offset of the pipe contains a UBX message. - \param pipe the receiveing pipe to parse messages - \param len numer of bytes to parse at maximum - \return length if something was found (including the UBX frame) - WAIT if not enough data is available - NOT_FOUND if nothing was found - */ - static int _parseUbx(Pipe<char>* pipe, int len); - - /** Write bytes to the physical interface. This function - needs to be implemented by the inherited class. - \param buf the buffer to write - \param len size of the buffer to write - \return bytes written - */ - virtual int _send(const void* buf, int len) = 0; - - static const char toHex[16]; //!< num to hex conversion -}; - -/** gps class which uses a serial port - as physical interface. -*/ -class GPSSerial : public SerialPipe, public GPSParser -{ -public: - /** Constructor - \param tx is the serial ports transmit pin (gps to CPU) - \param rx is the serial ports receive pin (CPU to gps) - \param baudrate the baudrate of the gps use 9600 - \param rxSize the size of the serial rx buffer - \param txSize the size of the serial tx buffer - */ - GPSSerial(PinName tx _C027DEFAULT( GPSTXD ), - PinName rx _C027DEFAULT( GPSRXD ), - int baudrate _C027DEFAULT( GPSBAUD ), - int rxSize = 256 , - int txSize = 128 ); - - /** Get a line from the physical interface. - \param buf the buffer to store it - \param len size of the buffer - \return type and length if something was found, - WAIT if not enough data is available - NOT_FOUND if nothing was found - */ - virtual int getMessage(char* buf, int len); - -protected: - /** Write bytes to the physical interface. - \param buf the buffer to write - \param len size of the buffer to write - \return bytes written - */ - virtual int _send(const void* buf, int len); -}; - -/** gps class which uses a i2c as physical interface. -*/ -class GPSI2C : public I2C, public GPSParser -{ -public: - /** Constructor - \param sda is the I2C SDA pin (between CPU and GPS) - \param scl is the I2C SCL pin (CPU to GPS) - \param adr the I2C address of the GPS set to (66<<1) - \param rxSize the size of the serial rx buffer - */ - GPSI2C(PinName sda _C027DEFAULT( GPSSDA ), - PinName scl _C027DEFAULT( GPSSCL ), - unsigned char i2cAdr _C027DEFAULT( GPSADR ), - int rxSize = 256 ); - - /** helper function to probe the i2c device - \return true if successfully detected the gps. - */ - bool detect(void); - - /** Get a line from the physical interface. - \param buf the buffer to store it - \param len size of the buffer - \return type and length if something was found, - WAIT if not enough data is available - NOT_FOUND if nothing was found - */ - virtual int getMessage(char* buf, int len); - - /** send a buffer - \param buf the buffer to write - \param len size of the buffer to write - \return bytes written - */ - virtual int send(const char* buf, int len); - - /** send a NMEA message, this function just takes the - payload and calculates and adds checksum. ($ and *XX\r\n will be added) - \param buf the message payload to write - \param len size of the message payload to write - \return total bytes written - */ - virtual int sendNmea(const char* buf, int len); - - /** send a UBX message, this function just takes the - payload and calculates and adds checksum. - \param cls the UBX class id - \param id the UBX message id - \param buf the message payload to write - \param len size of the message payload to write - \return total bytes written - */ - virtual int sendUbx(unsigned char cls, unsigned char id, - const void* buf = NULL, int len = 0); - -protected: - /** check if the port is writeable (like SerialPipe) - \return true if writeable - */ - bool writeable(void) { return true; } - - /** Write a character (like SerialPipe) - \param c the character to write - \return true if succesffully written - */ - bool putc(int c) { char ch = c; return send(&ch, 1); } - - /** Write bytes to the physical interface. - \param buf the buffer to write - \param len size of the buffer to write - \return bytes written - */ - virtual int _send(const void* buf, int len); - - /** read bytes from the physical interface. - \param buf the buffer to read into - \param len size of the read buffer - \return bytes read - */ - int _get(char* buf, int len); - - Pipe<char> _pipe; //!< the rx pipe - bool found; //!< flag if device is detected. - unsigned char _i2cAdr; //!< the i2c address - static const char REGLEN; //!< the length i2c register address - static const char REGSTREAM;//!< the stream i2c register address -};