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:
rob.meades@u-blox.com
Date:
Mon Apr 10 11:28:24 2017 +0100
Revision:
1:ef70a58a6c98
Child:
2:b10ca4aa2e5e
Add files to repo, removing temp.txt placeholder.

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
rob.meades@u-blox.com 1:ef70a58a6c98 30 #define GNSS_IF(onboard, shield) onboard
rob.meades@u-blox.com 1:ef70a58a6c98 31 #else
rob.meades@u-blox.com 1:ef70a58a6c98 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 */
rob.meades@u-blox.com 1:ef70a58a6c98 207 GnssSerial(PinName tx GNSS_IF( = GNSSTXD, /* = D8 */), // resistor on shield not populated
rob.meades@u-blox.com 1:ef70a58a6c98 208 PinName rx GNSS_IF( = GNSSRXD, /* = 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 */
rob.meades@u-blox.com 1:ef70a58a6c98 247 GnssI2C(PinName sda GNSS_IF( = NC, = D16 ),
rob.meades@u-blox.com 1:ef70a58a6c98 248 PinName scl GNSS_IF( = NC, = D17 ),
rob.meades@u-blox.com 1:ef70a58a6c98 249 unsigned char i2cAdr GNSS_IF( = (66<<1), = (66<<1) ),
rob.meades@u-blox.com 1:ef70a58a6c98 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