This class provides an API to communicate with a u-blox GNSS chip. The files here were originally part of the C027_Support library (https://developer.mbed.org/teams/ublox/code/C027_Support/ at revision 138:dafbbf31bf76) but have been separated out, primarily for use on the u-blox C030 board where the cellular interace portion of the C027_Support library will instead be provided through the new mbed Cellular API.

Dependents:   example-ublox-at-cellular-interface-ext example-low-power-sleep example-C030-out-of-box-demo example-C030-out-of-box-demo ... more

Committer:
RobMeades
Date:
Thu Apr 13 14:45:17 2017 +0000
Revision:
2:b10ca4aa2e5e
Parent:
1:ef70a58a6c98
Child:
3:2a1cd49ead85
Remove deprecation warnings and warning about lack of bracing around empty else condition.  Changed bracing style to ARM standard.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rob.meades@u-blox.com 1:ef70a58a6c98 1 /* mbed Microcontroller Library
rob.meades@u-blox.com 1:ef70a58a6c98 2 * Copyright (c) 2017 u-blox
rob.meades@u-blox.com 1:ef70a58a6c98 3 *
rob.meades@u-blox.com 1:ef70a58a6c98 4 * Licensed under the Apache License, Version 2.0 (the "License");
rob.meades@u-blox.com 1:ef70a58a6c98 5 * you may not use this file except in compliance with the License.
rob.meades@u-blox.com 1:ef70a58a6c98 6 * You may obtain a copy of the License at
rob.meades@u-blox.com 1:ef70a58a6c98 7 *
rob.meades@u-blox.com 1:ef70a58a6c98 8 * http://www.apache.org/licenses/LICENSE-2.0
rob.meades@u-blox.com 1:ef70a58a6c98 9 *
rob.meades@u-blox.com 1:ef70a58a6c98 10 * Unless required by applicable law or agreed to in writing, software
rob.meades@u-blox.com 1:ef70a58a6c98 11 * distributed under the License is distributed on an "AS IS" BASIS,
rob.meades@u-blox.com 1:ef70a58a6c98 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rob.meades@u-blox.com 1:ef70a58a6c98 13 * See the License for the specific language governing permissions and
rob.meades@u-blox.com 1:ef70a58a6c98 14 * limitations under the License.
rob.meades@u-blox.com 1:ef70a58a6c98 15 */
rob.meades@u-blox.com 1:ef70a58a6c98 16
rob.meades@u-blox.com 1:ef70a58a6c98 17 #ifndef GNSS_H
rob.meades@u-blox.com 1:ef70a58a6c98 18 #define GNSS_H
rob.meades@u-blox.com 1:ef70a58a6c98 19
rob.meades@u-blox.com 1:ef70a58a6c98 20 /**
rob.meades@u-blox.com 1:ef70a58a6c98 21 * @file gnss.h
rob.meades@u-blox.com 1:ef70a58a6c98 22 * This file defines a class that communicates with a u-blox GNSS chip.
rob.meades@u-blox.com 1:ef70a58a6c98 23 */
rob.meades@u-blox.com 1:ef70a58a6c98 24
rob.meades@u-blox.com 1:ef70a58a6c98 25 #include "mbed.h"
rob.meades@u-blox.com 1:ef70a58a6c98 26 #include "pipe.h"
rob.meades@u-blox.com 1:ef70a58a6c98 27 #include "serial_pipe.h"
rob.meades@u-blox.com 1:ef70a58a6c98 28
rob.meades@u-blox.com 1:ef70a58a6c98 29 #ifdef TARGET_UBLOX_C030
RobMeades 2:b10ca4aa2e5e 30 # define GNSS_IF(onboard, shield) onboard
rob.meades@u-blox.com 1:ef70a58a6c98 31 #else
RobMeades 2:b10ca4aa2e5e 32 # define GNSS_IF(onboard, shield) shield
rob.meades@u-blox.com 1:ef70a58a6c98 33 #endif
rob.meades@u-blox.com 1:ef70a58a6c98 34
rob.meades@u-blox.com 1:ef70a58a6c98 35 /** basic GNSS parser class
rob.meades@u-blox.com 1:ef70a58a6c98 36 */
rob.meades@u-blox.com 1:ef70a58a6c98 37 class GnssParser
rob.meades@u-blox.com 1:ef70a58a6c98 38 {
rob.meades@u-blox.com 1:ef70a58a6c98 39 public:
rob.meades@u-blox.com 1:ef70a58a6c98 40 //! Constructor
rob.meades@u-blox.com 1:ef70a58a6c98 41 GnssParser();
rob.meades@u-blox.com 1:ef70a58a6c98 42 //! Destructor
rob.meades@u-blox.com 1:ef70a58a6c98 43 virtual ~GnssParser(void);
rob.meades@u-blox.com 1:ef70a58a6c98 44
rob.meades@u-blox.com 1:ef70a58a6c98 45 /** Power on / Wake up the GNSS
rob.meades@u-blox.com 1:ef70a58a6c98 46 */
rob.meades@u-blox.com 1:ef70a58a6c98 47 virtual bool init(PinName pn) = 0;
rob.meades@u-blox.com 1:ef70a58a6c98 48
rob.meades@u-blox.com 1:ef70a58a6c98 49 enum {
rob.meades@u-blox.com 1:ef70a58a6c98 50 // getLine Responses
rob.meades@u-blox.com 1:ef70a58a6c98 51 WAIT = -1, //!< wait for more incoming data (the start of a message was found, or no data available)
rob.meades@u-blox.com 1:ef70a58a6c98 52 NOT_FOUND = 0, //!< a parser concluded the the current offset of the pipe doe not contain a valid message
rob.meades@u-blox.com 1:ef70a58a6c98 53
rob.meades@u-blox.com 1:ef70a58a6c98 54 #define LENGTH(x) (x & 0x00FFFF) //!< extract/mask the length
rob.meades@u-blox.com 1:ef70a58a6c98 55 #define PROTOCOL(x) (x & 0xFF0000) //!< extract/mask the type
rob.meades@u-blox.com 1:ef70a58a6c98 56
rob.meades@u-blox.com 1:ef70a58a6c98 57 UNKNOWN = 0x000000, //!< message type is unknown
rob.meades@u-blox.com 1:ef70a58a6c98 58 UBX = 0x100000, //!< message if of protocol NMEA
rob.meades@u-blox.com 1:ef70a58a6c98 59 NMEA = 0x200000 //!< message if of protocol UBX
rob.meades@u-blox.com 1:ef70a58a6c98 60 };
rob.meades@u-blox.com 1:ef70a58a6c98 61
rob.meades@u-blox.com 1:ef70a58a6c98 62 /** Get a line from the physical interface. This function
rob.meades@u-blox.com 1:ef70a58a6c98 63 needs to be implemented in the inherited class.
rob.meades@u-blox.com 1:ef70a58a6c98 64 \param buf the buffer to store it
rob.meades@u-blox.com 1:ef70a58a6c98 65 \param len size of the buffer
rob.meades@u-blox.com 1:ef70a58a6c98 66 \return type and length if something was found,
rob.meades@u-blox.com 1:ef70a58a6c98 67 WAIT if not enough data is available
rob.meades@u-blox.com 1:ef70a58a6c98 68 NOT_FOUND if nothing was found
rob.meades@u-blox.com 1:ef70a58a6c98 69 */
rob.meades@u-blox.com 1:ef70a58a6c98 70 virtual int getMessage(char* buf, int len) = 0;
rob.meades@u-blox.com 1:ef70a58a6c98 71
rob.meades@u-blox.com 1:ef70a58a6c98 72 /** send a buffer
rob.meades@u-blox.com 1:ef70a58a6c98 73 \param buf the buffer to write
rob.meades@u-blox.com 1:ef70a58a6c98 74 \param len size of the buffer to write
rob.meades@u-blox.com 1:ef70a58a6c98 75 \return bytes written
rob.meades@u-blox.com 1:ef70a58a6c98 76 */
rob.meades@u-blox.com 1:ef70a58a6c98 77 virtual int send(const char* buf, int len);
rob.meades@u-blox.com 1:ef70a58a6c98 78
rob.meades@u-blox.com 1:ef70a58a6c98 79 /** send a NMEA message, this function just takes the
rob.meades@u-blox.com 1:ef70a58a6c98 80 payload and calculates and adds checksum. ($ and *XX\r\n will be added)
rob.meades@u-blox.com 1:ef70a58a6c98 81 \param buf the message payload to write
rob.meades@u-blox.com 1:ef70a58a6c98 82 \param len size of the message payload to write
rob.meades@u-blox.com 1:ef70a58a6c98 83 \return total bytes written
rob.meades@u-blox.com 1:ef70a58a6c98 84 */
rob.meades@u-blox.com 1:ef70a58a6c98 85 virtual int sendNmea(const char* buf, int len);
rob.meades@u-blox.com 1:ef70a58a6c98 86
rob.meades@u-blox.com 1:ef70a58a6c98 87 /** send a UBX message, this function just takes the
rob.meades@u-blox.com 1:ef70a58a6c98 88 payload and calculates and adds checksum.
rob.meades@u-blox.com 1:ef70a58a6c98 89 \param cls the UBX class id
rob.meades@u-blox.com 1:ef70a58a6c98 90 \param id the UBX message id
rob.meades@u-blox.com 1:ef70a58a6c98 91 \param buf the message payload to write
rob.meades@u-blox.com 1:ef70a58a6c98 92 \param len size of the message payload to write
rob.meades@u-blox.com 1:ef70a58a6c98 93 \return total bytes written
rob.meades@u-blox.com 1:ef70a58a6c98 94 */
rob.meades@u-blox.com 1:ef70a58a6c98 95 virtual int sendUbx(unsigned char cls, unsigned char id,
rob.meades@u-blox.com 1:ef70a58a6c98 96 const void* buf = NULL, int len = 0);
rob.meades@u-blox.com 1:ef70a58a6c98 97
rob.meades@u-blox.com 1:ef70a58a6c98 98 /** Power off the GNSS, it can be again woken up by an
rob.meades@u-blox.com 1:ef70a58a6c98 99 edge on the serial port on the external interrupt pin.
rob.meades@u-blox.com 1:ef70a58a6c98 100 */
rob.meades@u-blox.com 1:ef70a58a6c98 101 void powerOff(void);
rob.meades@u-blox.com 1:ef70a58a6c98 102
rob.meades@u-blox.com 1:ef70a58a6c98 103 /** get the first character of a NMEA field
rob.meades@u-blox.com 1:ef70a58a6c98 104 \param ix the index of the field to find
rob.meades@u-blox.com 1:ef70a58a6c98 105 \param start the start of the buffer
rob.meades@u-blox.com 1:ef70a58a6c98 106 \param end the end of the buffer
rob.meades@u-blox.com 1:ef70a58a6c98 107 \return the pointer to the first character of the field.
rob.meades@u-blox.com 1:ef70a58a6c98 108 */
rob.meades@u-blox.com 1:ef70a58a6c98 109 static const char* findNmeaItemPos(int ix, const char* start, const char* end);
rob.meades@u-blox.com 1:ef70a58a6c98 110
rob.meades@u-blox.com 1:ef70a58a6c98 111 /** extract a double value from a buffer containing a NMEA message
rob.meades@u-blox.com 1:ef70a58a6c98 112 \param ix the index of the field to extract
rob.meades@u-blox.com 1:ef70a58a6c98 113 \param buf the NMEA message
rob.meades@u-blox.com 1:ef70a58a6c98 114 \param len the size of the NMEA message
rob.meades@u-blox.com 1:ef70a58a6c98 115 \param val the extracted value
rob.meades@u-blox.com 1:ef70a58a6c98 116 \return true if successful, false otherwise
rob.meades@u-blox.com 1:ef70a58a6c98 117 */
rob.meades@u-blox.com 1:ef70a58a6c98 118 static bool getNmeaItem(int ix, char* buf, int len, double& val);
rob.meades@u-blox.com 1:ef70a58a6c98 119
rob.meades@u-blox.com 1:ef70a58a6c98 120 /** extract a interger value from a buffer containing a NMEA message
rob.meades@u-blox.com 1:ef70a58a6c98 121 \param ix the index of the field to extract
rob.meades@u-blox.com 1:ef70a58a6c98 122 \param buf the NMEA message
rob.meades@u-blox.com 1:ef70a58a6c98 123 \param len the size of the NMEA message
rob.meades@u-blox.com 1:ef70a58a6c98 124 \param val the extracted value
rob.meades@u-blox.com 1:ef70a58a6c98 125 \param base the numeric base to be used (e.g. 8, 10 or 16)
rob.meades@u-blox.com 1:ef70a58a6c98 126 \return true if successful, false otherwise
rob.meades@u-blox.com 1:ef70a58a6c98 127 */
rob.meades@u-blox.com 1:ef70a58a6c98 128 static bool getNmeaItem(int ix, char* buf, int len, int& val, int base/*=10*/);
rob.meades@u-blox.com 1:ef70a58a6c98 129
rob.meades@u-blox.com 1:ef70a58a6c98 130 /** extract a char value from a buffer containing a NMEA message
rob.meades@u-blox.com 1:ef70a58a6c98 131 \param ix the index of the field to extract
rob.meades@u-blox.com 1:ef70a58a6c98 132 \param buf the NMEA message
rob.meades@u-blox.com 1:ef70a58a6c98 133 \param len the size of the NMEA message
rob.meades@u-blox.com 1:ef70a58a6c98 134 \param val the extracted value
rob.meades@u-blox.com 1:ef70a58a6c98 135 \return true if successful, false otherwise
rob.meades@u-blox.com 1:ef70a58a6c98 136 */
rob.meades@u-blox.com 1:ef70a58a6c98 137 static bool getNmeaItem(int ix, char* buf, int len, char& val);
rob.meades@u-blox.com 1:ef70a58a6c98 138
rob.meades@u-blox.com 1:ef70a58a6c98 139 /** extract a latitude/longitude value from a buffer containing a NMEA message
rob.meades@u-blox.com 1:ef70a58a6c98 140 \param ix the index of the field to extract (will extract ix and ix + 1)
rob.meades@u-blox.com 1:ef70a58a6c98 141 \param buf the NMEA message
rob.meades@u-blox.com 1:ef70a58a6c98 142 \param len the size of the NMEA message
rob.meades@u-blox.com 1:ef70a58a6c98 143 \param val the extracted latitude or longitude
rob.meades@u-blox.com 1:ef70a58a6c98 144 \return true if successful, false otherwise
rob.meades@u-blox.com 1:ef70a58a6c98 145 */
rob.meades@u-blox.com 1:ef70a58a6c98 146 static bool getNmeaAngle(int ix, char* buf, int len, double& val);
rob.meades@u-blox.com 1:ef70a58a6c98 147
rob.meades@u-blox.com 1:ef70a58a6c98 148 protected:
rob.meades@u-blox.com 1:ef70a58a6c98 149 /** Power on the GNSS module.
rob.meades@u-blox.com 1:ef70a58a6c98 150 */
rob.meades@u-blox.com 1:ef70a58a6c98 151 void _powerOn(void);
rob.meades@u-blox.com 1:ef70a58a6c98 152
rob.meades@u-blox.com 1:ef70a58a6c98 153 /** Get a line from the physical interface.
rob.meades@u-blox.com 1:ef70a58a6c98 154 \param pipe the receiveing pipe to parse messages
rob.meades@u-blox.com 1:ef70a58a6c98 155 \param buf the buffer to store it
rob.meades@u-blox.com 1:ef70a58a6c98 156 \param len size of the buffer
rob.meades@u-blox.com 1:ef70a58a6c98 157 \return type and length if something was found,
rob.meades@u-blox.com 1:ef70a58a6c98 158 WAIT if not enough data is available
rob.meades@u-blox.com 1:ef70a58a6c98 159 NOT_FOUND if nothing was found
rob.meades@u-blox.com 1:ef70a58a6c98 160 */
rob.meades@u-blox.com 1:ef70a58a6c98 161 static int _getMessage(Pipe<char>* pipe, char* buf, int len);
rob.meades@u-blox.com 1:ef70a58a6c98 162
rob.meades@u-blox.com 1:ef70a58a6c98 163 /** Check if the current offset of the pipe contains a NMEA message.
rob.meades@u-blox.com 1:ef70a58a6c98 164 \param pipe the receiveing pipe to parse messages
rob.meades@u-blox.com 1:ef70a58a6c98 165 \param len numer of bytes to parse at maximum
rob.meades@u-blox.com 1:ef70a58a6c98 166 \return length if something was found (including the NMEA frame)
rob.meades@u-blox.com 1:ef70a58a6c98 167 WAIT if not enough data is available
rob.meades@u-blox.com 1:ef70a58a6c98 168 NOT_FOUND if nothing was found
rob.meades@u-blox.com 1:ef70a58a6c98 169 */
rob.meades@u-blox.com 1:ef70a58a6c98 170 static int _parseNmea(Pipe<char>* pipe, int len);
rob.meades@u-blox.com 1:ef70a58a6c98 171
rob.meades@u-blox.com 1:ef70a58a6c98 172 /** Check if the current offset of the pipe contains a UBX message.
rob.meades@u-blox.com 1:ef70a58a6c98 173 \param pipe the receiveing pipe to parse messages
rob.meades@u-blox.com 1:ef70a58a6c98 174 \param len numer of bytes to parse at maximum
rob.meades@u-blox.com 1:ef70a58a6c98 175 \return length if something was found (including the UBX frame)
rob.meades@u-blox.com 1:ef70a58a6c98 176 WAIT if not enough data is available
rob.meades@u-blox.com 1:ef70a58a6c98 177 NOT_FOUND if nothing was found
rob.meades@u-blox.com 1:ef70a58a6c98 178 */
rob.meades@u-blox.com 1:ef70a58a6c98 179 static int _parseUbx(Pipe<char>* pipe, int len);
rob.meades@u-blox.com 1:ef70a58a6c98 180
rob.meades@u-blox.com 1:ef70a58a6c98 181 /** Write bytes to the physical interface. This function
rob.meades@u-blox.com 1:ef70a58a6c98 182 needs to be implemented by the inherited class.
rob.meades@u-blox.com 1:ef70a58a6c98 183 \param buf the buffer to write
rob.meades@u-blox.com 1:ef70a58a6c98 184 \param len size of the buffer to write
rob.meades@u-blox.com 1:ef70a58a6c98 185 \return bytes written
rob.meades@u-blox.com 1:ef70a58a6c98 186 */
rob.meades@u-blox.com 1:ef70a58a6c98 187 virtual int _send(const void* buf, int len) = 0;
rob.meades@u-blox.com 1:ef70a58a6c98 188
rob.meades@u-blox.com 1:ef70a58a6c98 189 static const char _toHex[16]; //!< num to hex conversion
rob.meades@u-blox.com 1:ef70a58a6c98 190 DigitalInOut *_gnssEnable; //!< IO pin that enables GNSS
rob.meades@u-blox.com 1:ef70a58a6c98 191 DigitalInOut *_gnssPower; //!< IO pin that enables power to GNSS
rob.meades@u-blox.com 1:ef70a58a6c98 192 };
rob.meades@u-blox.com 1:ef70a58a6c98 193
rob.meades@u-blox.com 1:ef70a58a6c98 194 /** GNSS class which uses a serial port
rob.meades@u-blox.com 1:ef70a58a6c98 195 as physical interface.
rob.meades@u-blox.com 1:ef70a58a6c98 196 */
rob.meades@u-blox.com 1:ef70a58a6c98 197 class GnssSerial : public SerialPipe, public GnssParser
rob.meades@u-blox.com 1:ef70a58a6c98 198 {
rob.meades@u-blox.com 1:ef70a58a6c98 199 public:
rob.meades@u-blox.com 1:ef70a58a6c98 200 /** Constructor
rob.meades@u-blox.com 1:ef70a58a6c98 201 \param tx is the serial ports transmit pin (GNSS to CPU)
rob.meades@u-blox.com 1:ef70a58a6c98 202 \param rx is the serial ports receive pin (CPU to GNSS)
rob.meades@u-blox.com 1:ef70a58a6c98 203 \param baudrate the baudrate of the GNSS use 9600
rob.meades@u-blox.com 1:ef70a58a6c98 204 \param rxSize the size of the serial rx buffer
rob.meades@u-blox.com 1:ef70a58a6c98 205 \param txSize the size of the serial tx buffer
rob.meades@u-blox.com 1:ef70a58a6c98 206 */
RobMeades 2:b10ca4aa2e5e 207 GnssSerial(PinName tx GNSS_IF( = GNSSTXD, = D8 /* = D8 */), // resistor on shield not populated
RobMeades 2:b10ca4aa2e5e 208 PinName rx GNSS_IF( = GNSSRXD, = D9 /* = D9 */), // resistor on shield not populated
rob.meades@u-blox.com 1:ef70a58a6c98 209 int baudrate GNSS_IF( = GNSSBAUD, = 9600 ),
rob.meades@u-blox.com 1:ef70a58a6c98 210 int rxSize = 256 ,
rob.meades@u-blox.com 1:ef70a58a6c98 211 int txSize = 128 );
rob.meades@u-blox.com 1:ef70a58a6c98 212
rob.meades@u-blox.com 1:ef70a58a6c98 213 //! Destructor
rob.meades@u-blox.com 1:ef70a58a6c98 214 virtual ~GnssSerial(void);
rob.meades@u-blox.com 1:ef70a58a6c98 215
rob.meades@u-blox.com 1:ef70a58a6c98 216 virtual bool init(PinName pn = NC);
rob.meades@u-blox.com 1:ef70a58a6c98 217
rob.meades@u-blox.com 1:ef70a58a6c98 218 /** Get a line from the physical interface.
rob.meades@u-blox.com 1:ef70a58a6c98 219 \param buf the buffer to store it
rob.meades@u-blox.com 1:ef70a58a6c98 220 \param len size of the buffer
rob.meades@u-blox.com 1:ef70a58a6c98 221 \return type and length if something was found,
rob.meades@u-blox.com 1:ef70a58a6c98 222 WAIT if not enough data is available
rob.meades@u-blox.com 1:ef70a58a6c98 223 NOT_FOUND if nothing was found
rob.meades@u-blox.com 1:ef70a58a6c98 224 */
rob.meades@u-blox.com 1:ef70a58a6c98 225 virtual int getMessage(char* buf, int len);
rob.meades@u-blox.com 1:ef70a58a6c98 226
rob.meades@u-blox.com 1:ef70a58a6c98 227 protected:
rob.meades@u-blox.com 1:ef70a58a6c98 228 /** Write bytes to the physical interface.
rob.meades@u-blox.com 1:ef70a58a6c98 229 \param buf the buffer to write
rob.meades@u-blox.com 1:ef70a58a6c98 230 \param len size of the buffer to write
rob.meades@u-blox.com 1:ef70a58a6c98 231 \return bytes written
rob.meades@u-blox.com 1:ef70a58a6c98 232 */
rob.meades@u-blox.com 1:ef70a58a6c98 233 virtual int _send(const void* buf, int len);
rob.meades@u-blox.com 1:ef70a58a6c98 234 };
rob.meades@u-blox.com 1:ef70a58a6c98 235
rob.meades@u-blox.com 1:ef70a58a6c98 236 /** GNSS class which uses a i2c as physical interface.
rob.meades@u-blox.com 1:ef70a58a6c98 237 */
rob.meades@u-blox.com 1:ef70a58a6c98 238 class GnssI2C : public I2C, public GnssParser
rob.meades@u-blox.com 1:ef70a58a6c98 239 {
rob.meades@u-blox.com 1:ef70a58a6c98 240 public:
rob.meades@u-blox.com 1:ef70a58a6c98 241 /** Constructor
rob.meades@u-blox.com 1:ef70a58a6c98 242 \param sda is the I2C SDA pin (between CPU and GNSS)
rob.meades@u-blox.com 1:ef70a58a6c98 243 \param scl is the I2C SCL pin (CPU to GNSS)
rob.meades@u-blox.com 1:ef70a58a6c98 244 \param adr the I2C address of the GNSS set to (66<<1)
rob.meades@u-blox.com 1:ef70a58a6c98 245 \param rxSize the size of the serial rx buffer
rob.meades@u-blox.com 1:ef70a58a6c98 246 */
RobMeades 2:b10ca4aa2e5e 247 GnssI2C(PinName sda GNSS_IF( = NC, = /* D16 TODO */ NC ),
RobMeades 2:b10ca4aa2e5e 248 PinName scl GNSS_IF( = NC, = /* D17 TODO */ NC ),
RobMeades 2:b10ca4aa2e5e 249 unsigned char i2cAdr GNSS_IF( = (66<<1), = (66<<1) ),
RobMeades 2:b10ca4aa2e5e 250 int rxSize = 256 );
rob.meades@u-blox.com 1:ef70a58a6c98 251 //! Destructor
rob.meades@u-blox.com 1:ef70a58a6c98 252 virtual ~GnssI2C(void);
rob.meades@u-blox.com 1:ef70a58a6c98 253
rob.meades@u-blox.com 1:ef70a58a6c98 254 /** helper function to probe the i2c device
rob.meades@u-blox.com 1:ef70a58a6c98 255 \return true if successfully detected the GNSS chip.
rob.meades@u-blox.com 1:ef70a58a6c98 256 */
rob.meades@u-blox.com 1:ef70a58a6c98 257 virtual bool init(PinName pn = GNSS_IF( NC, NC /* D7 resistor R67 on shield not mounted */));
rob.meades@u-blox.com 1:ef70a58a6c98 258
rob.meades@u-blox.com 1:ef70a58a6c98 259 /** Get a line from the physical interface.
rob.meades@u-blox.com 1:ef70a58a6c98 260 \param buf the buffer to store it
rob.meades@u-blox.com 1:ef70a58a6c98 261 \param len size of the buffer
rob.meades@u-blox.com 1:ef70a58a6c98 262 \return type and length if something was found,
rob.meades@u-blox.com 1:ef70a58a6c98 263 WAIT if not enough data is available
rob.meades@u-blox.com 1:ef70a58a6c98 264 NOT_FOUND if nothing was found
rob.meades@u-blox.com 1:ef70a58a6c98 265 */
rob.meades@u-blox.com 1:ef70a58a6c98 266 virtual int getMessage(char* buf, int len);
rob.meades@u-blox.com 1:ef70a58a6c98 267
rob.meades@u-blox.com 1:ef70a58a6c98 268 /** send a buffer
rob.meades@u-blox.com 1:ef70a58a6c98 269 \param buf the buffer to write
rob.meades@u-blox.com 1:ef70a58a6c98 270 \param len size of the buffer to write
rob.meades@u-blox.com 1:ef70a58a6c98 271 \return bytes written
rob.meades@u-blox.com 1:ef70a58a6c98 272 */
rob.meades@u-blox.com 1:ef70a58a6c98 273 virtual int send(const char* buf, int len);
rob.meades@u-blox.com 1:ef70a58a6c98 274
rob.meades@u-blox.com 1:ef70a58a6c98 275 /** send a NMEA message, this function just takes the
rob.meades@u-blox.com 1:ef70a58a6c98 276 payload and calculates and adds checksum. ($ and *XX\r\n will be added)
rob.meades@u-blox.com 1:ef70a58a6c98 277 \param buf the message payload to write
rob.meades@u-blox.com 1:ef70a58a6c98 278 \param len size of the message payload to write
rob.meades@u-blox.com 1:ef70a58a6c98 279 \return total bytes written
rob.meades@u-blox.com 1:ef70a58a6c98 280 */
rob.meades@u-blox.com 1:ef70a58a6c98 281 virtual int sendNmea(const char* buf, int len);
rob.meades@u-blox.com 1:ef70a58a6c98 282
rob.meades@u-blox.com 1:ef70a58a6c98 283 /** send a UBX message, this function just takes the
rob.meades@u-blox.com 1:ef70a58a6c98 284 payload and calculates and adds checksum.
rob.meades@u-blox.com 1:ef70a58a6c98 285 \param cls the UBX class id
rob.meades@u-blox.com 1:ef70a58a6c98 286 \param id the UBX message id
rob.meades@u-blox.com 1:ef70a58a6c98 287 \param buf the message payload to write
rob.meades@u-blox.com 1:ef70a58a6c98 288 \param len size of the message payload to write
rob.meades@u-blox.com 1:ef70a58a6c98 289 \return total bytes written
rob.meades@u-blox.com 1:ef70a58a6c98 290 */
rob.meades@u-blox.com 1:ef70a58a6c98 291 virtual int sendUbx(unsigned char cls, unsigned char id,
rob.meades@u-blox.com 1:ef70a58a6c98 292 const void* buf = NULL, int len = 0);
rob.meades@u-blox.com 1:ef70a58a6c98 293
rob.meades@u-blox.com 1:ef70a58a6c98 294 protected:
rob.meades@u-blox.com 1:ef70a58a6c98 295 /** check if the port is writeable (like SerialPipe)
rob.meades@u-blox.com 1:ef70a58a6c98 296 \return true if writeable
rob.meades@u-blox.com 1:ef70a58a6c98 297 */
rob.meades@u-blox.com 1:ef70a58a6c98 298 bool writeable(void) { return true; }
rob.meades@u-blox.com 1:ef70a58a6c98 299
rob.meades@u-blox.com 1:ef70a58a6c98 300 /** Write a character (like SerialPipe)
rob.meades@u-blox.com 1:ef70a58a6c98 301 \param c the character to write
rob.meades@u-blox.com 1:ef70a58a6c98 302 \return true if succesffully written
rob.meades@u-blox.com 1:ef70a58a6c98 303 */
rob.meades@u-blox.com 1:ef70a58a6c98 304 bool putc(int c) { char ch = c; return send(&ch, 1); }
rob.meades@u-blox.com 1:ef70a58a6c98 305
rob.meades@u-blox.com 1:ef70a58a6c98 306 /** Write bytes to the physical interface.
rob.meades@u-blox.com 1:ef70a58a6c98 307 \param buf the buffer to write
rob.meades@u-blox.com 1:ef70a58a6c98 308 \param len size of the buffer to write
rob.meades@u-blox.com 1:ef70a58a6c98 309 \return bytes written
rob.meades@u-blox.com 1:ef70a58a6c98 310 */
rob.meades@u-blox.com 1:ef70a58a6c98 311 virtual int _send(const void* buf, int len);
rob.meades@u-blox.com 1:ef70a58a6c98 312
rob.meades@u-blox.com 1:ef70a58a6c98 313 /** read bytes from the physical interface.
rob.meades@u-blox.com 1:ef70a58a6c98 314 \param buf the buffer to read into
rob.meades@u-blox.com 1:ef70a58a6c98 315 \param len size of the read buffer
rob.meades@u-blox.com 1:ef70a58a6c98 316 \return bytes read
rob.meades@u-blox.com 1:ef70a58a6c98 317 */
rob.meades@u-blox.com 1:ef70a58a6c98 318 int _get(char* buf, int len);
rob.meades@u-blox.com 1:ef70a58a6c98 319
rob.meades@u-blox.com 1:ef70a58a6c98 320 Pipe<char> _pipe; //!< the rx pipe
rob.meades@u-blox.com 1:ef70a58a6c98 321 unsigned char _i2cAdr; //!< the i2c address
rob.meades@u-blox.com 1:ef70a58a6c98 322 static const char REGLEN; //!< the length i2c register address
rob.meades@u-blox.com 1:ef70a58a6c98 323 static const char REGSTREAM;//!< the stream i2c register address
rob.meades@u-blox.com 1:ef70a58a6c98 324 };
rob.meades@u-blox.com 1:ef70a58a6c98 325
rob.meades@u-blox.com 1:ef70a58a6c98 326 #endif
rob.meades@u-blox.com 1:ef70a58a6c98 327
rob.meades@u-blox.com 1:ef70a58a6c98 328 // End Of File