support library for C027 helper functions for Buffer Pipes, Buffered Serial Port (rtos capable) and GPS parsing. It includes modem APIs for USSD, SMS and Sockets.

Dependents:   HTTPClient_Cellular_HelloWorld Cellular_HelloMQTT MbedSmartRestMain Car_Bon_car_module ... more

This library is intended to be used with u-blox products such as the C027 or a shield with u-blox cellular and GPS modules like the cellular and positioning shield from Embedded Artist.

For 2G/GSM and 3G/UMTS you need to:

  • have a SIM card and know its PIN number
  • need to know you network operators APN setting These setting should be passed to the connect or init and join functions. You can also extend the APN database in MDMAPN.h.

For CDMA products you need to make sure that you have provisioned and activated the modem with either Sprint or Verizon.

Committer:
mazgch
Date:
Tue Apr 08 09:15:37 2014 +0000
Revision:
21:c4d64830bf02
Parent:
19:2b5d097ca15d
Child:
24:0e287a85ac9e
improved modem library (network, sockets, sms, ussd)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mazgch 2:b6012cd91657 1 #include "mbed.h"
mazgch 2:b6012cd91657 2 #include <ctype.h>
mazgch 2:b6012cd91657 3 #include "GPS.h"
mazgch 2:b6012cd91657 4
mazgch 2:b6012cd91657 5 int GPSParser::_getMessage(Pipe<char>* pipe, char* buf, int len)
mazgch 2:b6012cd91657 6 {
mazgch 2:b6012cd91657 7 int unkn = 0;
mazgch 2:b6012cd91657 8 int sz = pipe->size();
mazgch 9:e7a5959ffae1 9 int fr = pipe->free();
mazgch 2:b6012cd91657 10 if (len > sz)
mazgch 2:b6012cd91657 11 len = sz;
mazgch 2:b6012cd91657 12 while (len > 0)
mazgch 2:b6012cd91657 13 {
mazgch 2:b6012cd91657 14 // NMEA protocol
mazgch 21:c4d64830bf02 15 pipe->set(unkn);
mazgch 2:b6012cd91657 16 int nmea = _parseNmea(pipe,len);
mazgch 9:e7a5959ffae1 17 if ((nmea != NOT_FOUND) && (unkn > 0))
mazgch 21:c4d64830bf02 18 return pipe->get(buf,unkn);
mazgch 9:e7a5959ffae1 19 if (nmea == WAIT && fr)
mazgch 9:e7a5959ffae1 20 return WAIT;
mazgch 9:e7a5959ffae1 21 if (nmea > 0)
mazgch 9:e7a5959ffae1 22 return NMEA | pipe->get(buf,nmea);
mazgch 2:b6012cd91657 23 // UBX protocol
mazgch 21:c4d64830bf02 24
mazgch 21:c4d64830bf02 25 pipe->set(unkn);
mazgch 2:b6012cd91657 26 int ubx = _parseUbx(pipe,len);
mazgch 9:e7a5959ffae1 27 if ((ubx != NOT_FOUND) && (unkn > 0))
mazgch 21:c4d64830bf02 28 return pipe->get(buf,unkn);
mazgch 9:e7a5959ffae1 29 if (ubx == WAIT && fr)
mazgch 9:e7a5959ffae1 30 return WAIT;
mazgch 9:e7a5959ffae1 31 if (ubx > 0)
mazgch 9:e7a5959ffae1 32 return UBX | pipe->get(buf,ubx);
mazgch 21:c4d64830bf02 33
mazgch 2:b6012cd91657 34 // UNKNOWN
mazgch 2:b6012cd91657 35 unkn ++;
mazgch 2:b6012cd91657 36 len--;
mazgch 2:b6012cd91657 37 }
mazgch 21:c4d64830bf02 38 if (unkn > 0)
mazgch 21:c4d64830bf02 39 return pipe->get(buf,unkn);
mazgch 2:b6012cd91657 40 return WAIT;
mazgch 2:b6012cd91657 41 }
mazgch 2:b6012cd91657 42
mazgch 2:b6012cd91657 43 int GPSParser::_parseNmea(Pipe<char>* pipe, int len)
mazgch 2:b6012cd91657 44 {
mazgch 7:9aa830f5811e 45 int o = 0;
mazgch 7:9aa830f5811e 46 int c = 0;
mazgch 7:9aa830f5811e 47 char ch;
mazgch 7:9aa830f5811e 48 if (++o > len) return WAIT;
mazgch 2:b6012cd91657 49 if ('$' != pipe->next()) return NOT_FOUND;
mazgch 4:c959dd4c5fe8 50 // this needs to be extended by crc checking
mazgch 2:b6012cd91657 51 for (;;)
mazgch 2:b6012cd91657 52 {
mazgch 7:9aa830f5811e 53 if (++o > len) return WAIT;
mazgch 7:9aa830f5811e 54 ch = pipe->next();
mazgch 7:9aa830f5811e 55 if ('*' == ch) break; // crc delimiter
mazgch 7:9aa830f5811e 56 if (!isprint(ch)) return NOT_FOUND;
mazgch 7:9aa830f5811e 57 c ^= ch;
mazgch 2:b6012cd91657 58 }
mazgch 7:9aa830f5811e 59 if (++o > len) return WAIT;
mazgch 7:9aa830f5811e 60 ch = toHex[(c >> 4) & 0xF]; // high nibble
mazgch 7:9aa830f5811e 61 if (ch != pipe->next()) return NOT_FOUND;
mazgch 7:9aa830f5811e 62 if (++o > len) return WAIT;
mazgch 7:9aa830f5811e 63 ch = toHex[(c >> 0) & 0xF]; // low nibble
mazgch 7:9aa830f5811e 64 if (ch != pipe->next()) return NOT_FOUND;
mazgch 7:9aa830f5811e 65 if (++o > len) return WAIT;
mazgch 7:9aa830f5811e 66 if ('\r' != pipe->next()) return NOT_FOUND;
mazgch 7:9aa830f5811e 67 if (++o > len) return WAIT;
mazgch 7:9aa830f5811e 68 if ('\n' != pipe->next()) return NOT_FOUND;
mazgch 7:9aa830f5811e 69 return o;
mazgch 2:b6012cd91657 70 }
mazgch 2:b6012cd91657 71
mazgch 2:b6012cd91657 72 int GPSParser::_parseUbx(Pipe<char>* pipe, int l)
mazgch 2:b6012cd91657 73 {
mazgch 2:b6012cd91657 74 int o = 0;
mazgch 2:b6012cd91657 75 if (++o > l) return WAIT;
mazgch 2:b6012cd91657 76 if ('\xB5' != pipe->next()) return NOT_FOUND;
mazgch 2:b6012cd91657 77 if (++o > l) return WAIT;
mazgch 2:b6012cd91657 78 if ('\x62' != pipe->next()) return NOT_FOUND;
mazgch 2:b6012cd91657 79 o += 4;
mazgch 2:b6012cd91657 80 if (o > l) return WAIT;
mazgch 2:b6012cd91657 81 int i,j,ca,cb;
mazgch 2:b6012cd91657 82 i = pipe->next(); ca = i; cb = ca; // cls
mazgch 2:b6012cd91657 83 i = pipe->next(); ca += i; cb += ca; // id
mazgch 2:b6012cd91657 84 i = pipe->next(); ca += i; cb += ca; // len_lsb
mazgch 2:b6012cd91657 85 j = pipe->next(); ca += j; cb += ca; // len_msb
mazgch 2:b6012cd91657 86 j = i + (j << 8);
mazgch 2:b6012cd91657 87 while (j--)
mazgch 2:b6012cd91657 88 {
mazgch 2:b6012cd91657 89 if (++o > l) return WAIT;
mazgch 2:b6012cd91657 90 i = pipe->next();
mazgch 2:b6012cd91657 91 ca += i;
mazgch 2:b6012cd91657 92 cb += ca;
mazgch 2:b6012cd91657 93 }
mazgch 2:b6012cd91657 94 ca &= 0xFF; cb &= 0xFF;
mazgch 2:b6012cd91657 95 if (++o > l) return WAIT;
mazgch 2:b6012cd91657 96 if (ca != pipe->next()) return NOT_FOUND;
mazgch 2:b6012cd91657 97 if (++o > l) return WAIT;
mazgch 2:b6012cd91657 98 if (cb != pipe->next()) return NOT_FOUND;
mazgch 2:b6012cd91657 99 return o;
mazgch 2:b6012cd91657 100 }
mazgch 2:b6012cd91657 101
mazgch 4:c959dd4c5fe8 102 int GPSParser::send(const char* buf, int len)
mazgch 4:c959dd4c5fe8 103 {
mazgch 4:c959dd4c5fe8 104 return _send(buf, len);
mazgch 4:c959dd4c5fe8 105 }
mazgch 4:c959dd4c5fe8 106
mazgch 3:c7cd4887560d 107 int GPSParser::sendNmea(const char* buf, int len)
mazgch 2:b6012cd91657 108 {
mazgch 3:c7cd4887560d 109 char head[1] = { '$' };
mazgch 3:c7cd4887560d 110 char tail[5] = { '*', 0x00/*crc_high*/, 0x00/*crc_low*/, '\r', '\n' };
mazgch 3:c7cd4887560d 111 int i;
mazgch 3:c7cd4887560d 112 int crc = 0;
mazgch 3:c7cd4887560d 113 for (i = 0; i < len; i ++)
mazgch 3:c7cd4887560d 114 crc ^= *buf++;
mazgch 4:c959dd4c5fe8 115 i = _send(head, sizeof(head));
mazgch 4:c959dd4c5fe8 116 i += _send(buf, len);
mazgch 3:c7cd4887560d 117 tail[1] = toHex[(crc > 4) & 0xF0];
mazgch 3:c7cd4887560d 118 tail[2] = toHex[(crc > 0) & 0x0F];
mazgch 4:c959dd4c5fe8 119 i += _send(tail, sizeof(tail));
mazgch 3:c7cd4887560d 120 return i;
mazgch 2:b6012cd91657 121 }
mazgch 2:b6012cd91657 122
mazgch 11:b084552b03fe 123 int GPSParser::sendUbx(unsigned char cls, unsigned char id, const void* buf /*= NULL*/, int len /*= 0*/)
mazgch 2:b6012cd91657 124 {
mazgch 3:c7cd4887560d 125 char head[6] = { 0xB5, 0x62, cls, id, len >> 0, len >> 8 };
mazgch 3:c7cd4887560d 126 char crc[2];
mazgch 3:c7cd4887560d 127 int i;
mazgch 3:c7cd4887560d 128 int ca = 0;
mazgch 3:c7cd4887560d 129 int cb = 0;
mazgch 3:c7cd4887560d 130 for (i = 2; i < 6; i ++)
mazgch 2:b6012cd91657 131 {
mazgch 3:c7cd4887560d 132 ca += head[i];
mazgch 3:c7cd4887560d 133 cb += ca;
mazgch 2:b6012cd91657 134 }
mazgch 3:c7cd4887560d 135 for (i = 0; i < len; i ++)
mazgch 3:c7cd4887560d 136 {
mazgch 3:c7cd4887560d 137 ca += ((char*)buf)[i];
mazgch 11:b084552b03fe 138 cb += ca;
mazgch 3:c7cd4887560d 139 }
mazgch 4:c959dd4c5fe8 140 i = _send(head, sizeof(head));
mazgch 4:c959dd4c5fe8 141 i += _send(buf, len);
mazgch 3:c7cd4887560d 142 crc[0] = ca & 0xFF;
mazgch 3:c7cd4887560d 143 crc[1] = cb & 0xFF;
mazgch 4:c959dd4c5fe8 144 i += _send(crc, sizeof(crc));
mazgch 3:c7cd4887560d 145 return i;
mazgch 2:b6012cd91657 146 }
mazgch 2:b6012cd91657 147
mazgch 2:b6012cd91657 148 const char* GPSParser::findNmeaItemPos(int ix, const char* start, const char* end)
mazgch 2:b6012cd91657 149 {
mazgch 2:b6012cd91657 150 // find the start
mazgch 2:b6012cd91657 151 for (; (start < end) && (ix > 0); start ++)
mazgch 2:b6012cd91657 152 {
mazgch 2:b6012cd91657 153 if (*start == ',')
mazgch 2:b6012cd91657 154 ix --;
mazgch 2:b6012cd91657 155 }
mazgch 2:b6012cd91657 156 // found and check bounds
mazgch 2:b6012cd91657 157 if ((ix == 0) && (start < end) &&
mazgch 2:b6012cd91657 158 (*start != ',') && (*start != '*') && (*start != '\r') && (*start != '\n'))
mazgch 2:b6012cd91657 159 return start;
mazgch 2:b6012cd91657 160 else
mazgch 2:b6012cd91657 161 return NULL;
mazgch 2:b6012cd91657 162 }
mazgch 2:b6012cd91657 163
mazgch 2:b6012cd91657 164 bool GPSParser::getNmeaItem(int ix, char* buf, int len, double& val)
mazgch 2:b6012cd91657 165 {
mazgch 2:b6012cd91657 166 char* end = &buf[len];
mazgch 2:b6012cd91657 167 const char* pos = findNmeaItemPos(ix, buf, end);
mazgch 2:b6012cd91657 168 // find the start
mazgch 2:b6012cd91657 169 if (!pos)
mazgch 2:b6012cd91657 170 return false;
mazgch 2:b6012cd91657 171 val = strtod(pos, &end);
mazgch 2:b6012cd91657 172 // restore the last character
mazgch 2:b6012cd91657 173 return (end > pos);
mazgch 2:b6012cd91657 174 }
mazgch 2:b6012cd91657 175
mazgch 2:b6012cd91657 176 bool GPSParser::getNmeaItem(int ix, char* buf, int len, int& val, int base /*=10*/)
mazgch 2:b6012cd91657 177 {
mazgch 2:b6012cd91657 178 char* end = &buf[len];
mazgch 2:b6012cd91657 179 const char* pos = findNmeaItemPos(ix, buf, end);
mazgch 2:b6012cd91657 180 // find the start
mazgch 2:b6012cd91657 181 if (!pos)
mazgch 2:b6012cd91657 182 return false;
mazgch 2:b6012cd91657 183 val = (int)strtol(pos, &end, base);
mazgch 2:b6012cd91657 184 return (end > pos);
mazgch 2:b6012cd91657 185 }
mazgch 2:b6012cd91657 186
mazgch 2:b6012cd91657 187 bool GPSParser::getNmeaItem(int ix, char* buf, int len, char& val)
mazgch 2:b6012cd91657 188 {
mazgch 2:b6012cd91657 189 const char* end = &buf[len];
mazgch 2:b6012cd91657 190 const char* pos = findNmeaItemPos(ix, buf, end);
mazgch 2:b6012cd91657 191 // find the start
mazgch 2:b6012cd91657 192 if (!pos)
mazgch 2:b6012cd91657 193 return false;
mazgch 2:b6012cd91657 194 // skip leading spaces
mazgch 2:b6012cd91657 195 while ((pos < end) && isspace(*pos))
mazgch 2:b6012cd91657 196 pos++;
mazgch 2:b6012cd91657 197 // check bound
mazgch 2:b6012cd91657 198 if ((pos < end) &&
mazgch 2:b6012cd91657 199 (*pos != ',') && (*pos != '*') && (*pos != '\r') && (*pos != '\n'))
mazgch 2:b6012cd91657 200 {
mazgch 2:b6012cd91657 201 val = *pos;
mazgch 2:b6012cd91657 202 return true;
mazgch 2:b6012cd91657 203 }
mazgch 2:b6012cd91657 204 return false;
mazgch 2:b6012cd91657 205 }
mazgch 2:b6012cd91657 206
mazgch 18:e5697801df29 207 bool GPSParser::getNmeaAngle(int ix, char* buf, int len, double& d)
mazgch 18:e5697801df29 208 {
mazgch 18:e5697801df29 209 char ch;
mazgch 19:2b5d097ca15d 210 double val;
mazgch 18:e5697801df29 211 if (getNmeaItem(ix,buf,len,val) && getNmeaItem(ix+1,buf,len,ch) &&
mazgch 18:e5697801df29 212 ((ch == 'S') || (ch == 'N') || (ch == 'E') || (ch == 'W')))
mazgch 18:e5697801df29 213 {
mazgch 18:e5697801df29 214 val *= 0.01;
mazgch 19:2b5d097ca15d 215 int i = (int)val;
mazgch 18:e5697801df29 216 val = (val - i) / 0.6 + i;
mazgch 18:e5697801df29 217 if (ch == 'S' || ch == 'W')
mazgch 18:e5697801df29 218 val = -val;
mazgch 18:e5697801df29 219 d = val;
mazgch 18:e5697801df29 220 return true;
mazgch 18:e5697801df29 221 }
mazgch 18:e5697801df29 222 return false;
mazgch 18:e5697801df29 223 }
mazgch 18:e5697801df29 224
mazgch 2:b6012cd91657 225 const char GPSParser::toHex[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
mazgch 2:b6012cd91657 226
mazgch 2:b6012cd91657 227 // ----------------------------------------------------------------
mazgch 2:b6012cd91657 228 // Serial Implementation
mazgch 2:b6012cd91657 229 // ----------------------------------------------------------------
mazgch 2:b6012cd91657 230
mazgch 9:e7a5959ffae1 231 GPSSerial::GPSSerial(PinName tx /*= GPSTXD*/, PinName rx /*= GPSRXD*/, int baudrate /*= GPSBAUD*/,
mazgch 9:e7a5959ffae1 232 int rxSize /*= 256*/, int txSize /*= 128*/) :
mazgch 15:5eda64e5b9d1 233 SerialPipe(tx, rx, rxSize, txSize)
mazgch 2:b6012cd91657 234 {
mazgch 2:b6012cd91657 235 baud(baudrate);
mazgch 2:b6012cd91657 236 }
mazgch 2:b6012cd91657 237
mazgch 2:b6012cd91657 238 int GPSSerial::getMessage(char* buf, int len)
mazgch 2:b6012cd91657 239 {
mazgch 9:e7a5959ffae1 240 return _getMessage(&_pipeRx, buf, len);
mazgch 2:b6012cd91657 241 }
mazgch 2:b6012cd91657 242
mazgch 4:c959dd4c5fe8 243 int GPSSerial::_send(const void* buf, int len)
mazgch 3:c7cd4887560d 244 {
mazgch 9:e7a5959ffae1 245 return put((const char*)buf, len, true/*=blocking*/);
mazgch 3:c7cd4887560d 246 }
mazgch 3:c7cd4887560d 247
mazgch 2:b6012cd91657 248 // ----------------------------------------------------------------
mazgch 2:b6012cd91657 249 // I2C Implementation
mazgch 2:b6012cd91657 250 // ----------------------------------------------------------------
mazgch 2:b6012cd91657 251
mazgch 9:e7a5959ffae1 252 GPSI2C::GPSI2C(PinName sda /*= GPSSDA*/, PinName scl /*= GPSSCL*/,
mazgch 19:2b5d097ca15d 253 unsigned char i2cAdr /*=GPSADR*/, int rxSize /*= 256*/) :
mazgch 2:b6012cd91657 254 I2C(sda,scl),
mazgch 19:2b5d097ca15d 255 _pipe(rxSize),
mazgch 19:2b5d097ca15d 256 _i2cAdr(i2cAdr)
mazgch 2:b6012cd91657 257 {
mazgch 2:b6012cd91657 258 found = false;
mazgch 2:b6012cd91657 259 }
mazgch 2:b6012cd91657 260
mazgch 2:b6012cd91657 261 bool GPSI2C::detect(void)
mazgch 2:b6012cd91657 262 {
mazgch 2:b6012cd91657 263 if (!found)
mazgch 2:b6012cd91657 264 {
mazgch 19:2b5d097ca15d 265 int w = I2C::write(_i2cAdr,&REGSTREAM,sizeof(REGSTREAM));
mazgch 2:b6012cd91657 266 if (w == 0)
mazgch 2:b6012cd91657 267 found = true;
mazgch 2:b6012cd91657 268 }
mazgch 2:b6012cd91657 269 return found;
mazgch 2:b6012cd91657 270 }
mazgch 2:b6012cd91657 271
mazgch 2:b6012cd91657 272 int GPSI2C::getMessage(char* buf, int len)
mazgch 2:b6012cd91657 273 {
mazgch 6:775aef3f1d1f 274 // fill the pipe
mazgch 6:775aef3f1d1f 275 int sz = _pipe.free();
mazgch 6:775aef3f1d1f 276 if (sz)
mazgch 6:775aef3f1d1f 277 sz = _get(buf, sz);
mazgch 2:b6012cd91657 278 if (sz)
mazgch 2:b6012cd91657 279 _pipe.put(buf, sz);
mazgch 6:775aef3f1d1f 280 // now parse it
mazgch 2:b6012cd91657 281 return _getMessage(&_pipe, buf, len);
mazgch 2:b6012cd91657 282 }
mazgch 2:b6012cd91657 283
mazgch 4:c959dd4c5fe8 284 int GPSI2C::send(const char* buf, int len)
mazgch 4:c959dd4c5fe8 285 {
mazgch 4:c959dd4c5fe8 286 int sent = 0;
mazgch 4:c959dd4c5fe8 287 if (len)
mazgch 4:c959dd4c5fe8 288 {
mazgch 19:2b5d097ca15d 289 if (!I2C::write(_i2cAdr,&REGSTREAM,sizeof(REGSTREAM),true))
mazgch 11:b084552b03fe 290 sent = send(buf, len);
mazgch 10:3f1c13a8763d 291 found = (len == sent);
mazgch 4:c959dd4c5fe8 292 stop();
mazgch 4:c959dd4c5fe8 293 }
mazgch 4:c959dd4c5fe8 294 return sent;
mazgch 4:c959dd4c5fe8 295 }
mazgch 4:c959dd4c5fe8 296
mazgch 3:c7cd4887560d 297 int GPSI2C::sendNmea(const char* buf, int len)
mazgch 3:c7cd4887560d 298 {
mazgch 3:c7cd4887560d 299 int sent = 0;
mazgch 19:2b5d097ca15d 300 if (!I2C::write(_i2cAdr,&REGSTREAM,sizeof(REGSTREAM),true))
mazgch 11:b084552b03fe 301 sent = GPSParser::sendNmea(buf, len);
mazgch 11:b084552b03fe 302 found = (len == sent);
mazgch 11:b084552b03fe 303 stop();
mazgch 3:c7cd4887560d 304 return sent;
mazgch 3:c7cd4887560d 305 }
mazgch 3:c7cd4887560d 306
mazgch 3:c7cd4887560d 307 int GPSI2C::sendUbx(unsigned char cls, unsigned char id, const void* buf, int len)
mazgch 3:c7cd4887560d 308 {
mazgch 3:c7cd4887560d 309 int sent = 0;
mazgch 19:2b5d097ca15d 310 if (!I2C::write(_i2cAdr,&REGSTREAM,sizeof(REGSTREAM),true))
mazgch 11:b084552b03fe 311 sent = GPSParser::sendUbx(cls, id, buf, len);
mazgch 11:b084552b03fe 312 found = (len == sent);
mazgch 15:5eda64e5b9d1 313 I2C::stop();
mazgch 3:c7cd4887560d 314 return sent;
mazgch 3:c7cd4887560d 315 }
mazgch 3:c7cd4887560d 316
mazgch 2:b6012cd91657 317 int GPSI2C::_get(char* buf, int len)
mazgch 2:b6012cd91657 318 {
mazgch 3:c7cd4887560d 319 int read = 0;
mazgch 2:b6012cd91657 320 unsigned char sz[2];
mazgch 19:2b5d097ca15d 321 if (!I2C::write(_i2cAdr,&REGLEN,sizeof(REGLEN),true) &&
mazgch 19:2b5d097ca15d 322 !I2C::read(_i2cAdr,(char*)sz,sizeof(sz),true))
mazgch 2:b6012cd91657 323 {
mazgch 2:b6012cd91657 324 int size = 256 * (int)sz[0] + sz[1];
mazgch 2:b6012cd91657 325 if (size > len)
mazgch 2:b6012cd91657 326 size = len;
mazgch 2:b6012cd91657 327 if (size > 0)
mazgch 19:2b5d097ca15d 328 read = !I2C::read(_i2cAdr,buf,size, true) ? size : 0;
mazgch 10:3f1c13a8763d 329 found = (read == size);
mazgch 2:b6012cd91657 330 }
mazgch 2:b6012cd91657 331 else
mazgch 2:b6012cd91657 332 found = false;
mazgch 2:b6012cd91657 333 I2C::stop();
mazgch 3:c7cd4887560d 334 return read;
mazgch 2:b6012cd91657 335 }
mazgch 2:b6012cd91657 336
mazgch 4:c959dd4c5fe8 337 int GPSI2C::_send(const void* buf, int len)
mazgch 3:c7cd4887560d 338 {
mazgch 19:2b5d097ca15d 339 return !I2C::write(_i2cAdr,(const char*)buf,len,true) ? len : 0;
mazgch 2:b6012cd91657 340 }
mazgch 2:b6012cd91657 341
mazgch 2:b6012cd91657 342 const char GPSI2C::REGLEN = 0xFD;
mazgch 2:b6012cd91657 343 const char GPSI2C::REGSTREAM = 0xFF;