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: 02_DPPU_JUANDA_120 02_DPPU_JUANDA_120_Latest_copy 02_DPPU_JUANDA_120_Latest
Diff: GPS.h
- Revision:
- 39:9b4b9433e220
- Parent:
- 38:e6cab4632d84
- Child:
- 40:295099ff5338
diff -r e6cab4632d84 -r 9b4b9433e220 GPS.h
--- a/GPS.h Fri Apr 11 16:30:54 2014 +0000
+++ b/GPS.h Fri Apr 11 19:16:03 2014 +0000
@@ -18,32 +18,139 @@
class GPSParser
{
public:
- #define WAIT -1
- #define NOT_FOUND 0
+ //
+ #define WAIT -1 //!< wait for more incoming data (the start of a message was found, or no data available)
+ #define NOT_FOUND 0 //!< a parser concluded the the current offset of the pipe doe not contain a valid message
+
+ #define UNKNOWN 0x000000 //!< message type is unknown
+ #define UBX 0x100000 //!< message if of protocol NMEA
+ #define NMEA 0x200000 //!< message if of protocol UBX
+ #define LENGTH(x) (x & 0x00FFFF) //!< extract/mask the length
+ #define PROTOCOL(x) (x & 0xFF0000) //!< extract/mask the type
+
+ /** 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;
- #define UNKNOWN 0x000000
- #define UBX 0x100000
- #define NMEA 0x200000
- #define LENGTH(x) (x & 0x00FFFF)
- #define PROTOCOL(x) (x & 0xFF0000)
-
- 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);
- virtual int sendUbx(unsigned char cls, unsigned char id, const void* buf = NULL, int len = 0);
+
+ /** 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 send(const char* buf, int len);
+
+ /** 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];
+
+ static const char toHex[16]; //!< num to hex conversion
};
/** gps class which uses a serial port
@@ -64,6 +171,7 @@
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
@@ -72,6 +180,7 @@
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
@@ -96,6 +205,7 @@
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.
*/
@@ -133,23 +243,28 @@
\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);
+ 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