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:
Thu May 15 22:20:42 2014 +0000
Revision:
74:208e3e32d263
Parent:
46:8ce9169e0747
Child:
75:ce6e12067d0c
initial version of restructured u-blox library

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