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:
Fri Mar 14 13:07:48 2014 +0000
Revision:
18:e5697801df29
Child:
19:2b5d097ca15d
Child:
20:535ef78655df
extend Api for GPS and GNSS

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mazgch 18:e5697801df29 1 #include "mbed.h"
mazgch 18:e5697801df29 2 #include <ctype.h>
mazgch 18:e5697801df29 3 #include "MDM.h"
mazgch 18:e5697801df29 4
mazgch 18:e5697801df29 5
mazgch 18:e5697801df29 6 int MDMParser::send(const char* buf, int len)
mazgch 18:e5697801df29 7 {
mazgch 18:e5697801df29 8 return _send(buf, len);
mazgch 18:e5697801df29 9 }
mazgch 18:e5697801df29 10
mazgch 18:e5697801df29 11 int MDMParser::_getLine(Pipe<char>* pipe, char* buffer, int length)
mazgch 18:e5697801df29 12 {
mazgch 18:e5697801df29 13 int o = 0;
mazgch 18:e5697801df29 14 int i = 0;
mazgch 18:e5697801df29 15 int l = pipe->start();
mazgch 18:e5697801df29 16 while ((i < l) && (o < length))
mazgch 18:e5697801df29 17 {
mazgch 18:e5697801df29 18 int t = pipe->next();
mazgch 18:e5697801df29 19 i ++;
mazgch 18:e5697801df29 20 if (t == '\r') // terminate commands with carriage return
mazgch 18:e5697801df29 21 {
mazgch 18:e5697801df29 22 pipe->done();
mazgch 18:e5697801df29 23 if (length > o)
mazgch 18:e5697801df29 24 buffer[o] = '\0';
mazgch 18:e5697801df29 25 return o; // if enter send the zero char
mazgch 18:e5697801df29 26 }
mazgch 18:e5697801df29 27 else if (t == '\n') // skip/filter new line
mazgch 18:e5697801df29 28 /* skip */;
mazgch 18:e5697801df29 29 else if (t != '\b') // normal char (no backspace)
mazgch 18:e5697801df29 30 buffer[o++] = t;
mazgch 18:e5697801df29 31 else if (o > 0) // backspace
mazgch 18:e5697801df29 32 o --; // remove it
mazgch 18:e5697801df29 33 }
mazgch 18:e5697801df29 34 o = 0;
mazgch 18:e5697801df29 35 if (length > 0)
mazgch 18:e5697801df29 36 buffer[0] = '\0';
mazgch 18:e5697801df29 37 return WAIT;
mazgch 18:e5697801df29 38 }
mazgch 18:e5697801df29 39
mazgch 18:e5697801df29 40 int MDMParser::_getResp(Pipe<char>* pipe, char* buffer, int length)
mazgch 18:e5697801df29 41 {
mazgch 18:e5697801df29 42 int o = 0;
mazgch 18:e5697801df29 43 int i = 0;
mazgch 18:e5697801df29 44 int l = pipe->start();
mazgch 18:e5697801df29 45 static const char erTxt[] = "ERROR\r\n";
mazgch 18:e5697801df29 46 static const char okTxt[] = "OK\r\n";
mazgch 18:e5697801df29 47 int er = 0;
mazgch 18:e5697801df29 48 int ok = 0;
mazgch 18:e5697801df29 49 while ((i < pipe->size()) && (o < length))
mazgch 18:e5697801df29 50 {
mazgch 18:e5697801df29 51 int t = pipe->next();
mazgch 18:e5697801df29 52 i ++;
mazgch 18:e5697801df29 53 buffer[o++] = t;
mazgch 18:e5697801df29 54 ok = (t == okTxt[ok]) ? ok + 1 : 0;
mazgch 18:e5697801df29 55 er = (t == erTxt[er]) ? er + 1 : 0;
mazgch 18:e5697801df29 56 if ((okTxt[ok] == '\0') || (erTxt[er] == '\0'))
mazgch 18:e5697801df29 57 {
mazgch 18:e5697801df29 58 pipe->done();
mazgch 18:e5697801df29 59 if (length > o)
mazgch 18:e5697801df29 60 buffer[o] = '\0';
mazgch 18:e5697801df29 61 return o;
mazgch 18:e5697801df29 62 }
mazgch 18:e5697801df29 63 }
mazgch 18:e5697801df29 64 o = 0;
mazgch 18:e5697801df29 65 if (length > 0)
mazgch 18:e5697801df29 66 buffer[0] = '\0';
mazgch 18:e5697801df29 67 return WAIT;
mazgch 18:e5697801df29 68 }
mazgch 18:e5697801df29 69
mazgch 18:e5697801df29 70 // ----------------------------------------------------------------
mazgch 18:e5697801df29 71 // Serial Implementation
mazgch 18:e5697801df29 72 // ----------------------------------------------------------------
mazgch 18:e5697801df29 73
mazgch 18:e5697801df29 74 MDMSerial::MDMSerial(PinName tx /*= MDMTXD*/, PinName rx /*= MDMRXD*/, int baudrate /*= MDMBAUD*/,
mazgch 18:e5697801df29 75 int rxSize /*= 256*/, int txSize /*= 128*/) :
mazgch 18:e5697801df29 76 SerialPipe(tx, rx, rxSize, txSize)
mazgch 18:e5697801df29 77 {
mazgch 18:e5697801df29 78 baud(baudrate);
mazgch 18:e5697801df29 79 }
mazgch 18:e5697801df29 80
mazgch 18:e5697801df29 81 MDMSerial::MDMSerial(PinName tx /*= MDMTXD*/, PinName rx /*= MDMRXD*/, int baudrate /*= MDMBAUD*/,
mazgch 18:e5697801df29 82 PinName rts /*= MDMRTS*/, PinName cts /*= MDMCTS*/, int rxSize /*= 256*/, int txSize /*= 128*/) :
mazgch 18:e5697801df29 83 SerialPipe(tx, rx, rts, cts, rxSize, txSize)
mazgch 18:e5697801df29 84 {
mazgch 18:e5697801df29 85 baud(baudrate);
mazgch 18:e5697801df29 86 }
mazgch 18:e5697801df29 87
mazgch 18:e5697801df29 88 int MDMSerial::_send(const void* buf, int len)
mazgch 18:e5697801df29 89 {
mazgch 18:e5697801df29 90 return put((const char*)buf, len, true/*=blocking*/);
mazgch 18:e5697801df29 91 }
mazgch 18:e5697801df29 92
mazgch 18:e5697801df29 93 int MDMSerial::getLine(char* buffer, int length)
mazgch 18:e5697801df29 94 {
mazgch 18:e5697801df29 95 return _getLine(&_pipeRx, buffer, length);
mazgch 18:e5697801df29 96 }
mazgch 18:e5697801df29 97
mazgch 18:e5697801df29 98 int MDMSerial::getResp(char* buffer, int length)
mazgch 18:e5697801df29 99 {
mazgch 18:e5697801df29 100 return _getResp(&_pipeRx, buffer, length);
mazgch 18:e5697801df29 101 }
mazgch 18:e5697801df29 102
mazgch 18:e5697801df29 103 // ----------------------------------------------------------------
mazgch 18:e5697801df29 104 // USB Implementation
mazgch 18:e5697801df29 105 // ----------------------------------------------------------------
mazgch 18:e5697801df29 106
mazgch 18:e5697801df29 107 #ifdef HAVE_MDMUSB
mazgch 18:e5697801df29 108 // TODO properly implement with USB
mazgch 18:e5697801df29 109 MDMUsb::MDMUsb(void) { }
mazgch 18:e5697801df29 110 int MDMUsb::_send(const void* buf, int len) { return len; }
mazgch 18:e5697801df29 111 int MDMUsb::getLine(char* buffer, int length) { return NOT_FOUND; }
mazgch 18:e5697801df29 112 int MDMUsb::getResp(char* buffer, int length) { return NOT_FOUND; }
mazgch 18:e5697801df29 113 #endif