C027_Support library plus AT Comand for dialing.

Fork of C027_Support_Plus_Dialing by irsan julfikar

Committer:
irsanjul
Date:
Tue Aug 01 08:09:16 2017 +0000
Revision:
122:1360902e8632
Parent:
121:3e1d84b2d34c
my editing. sorry for developper if it ilegal. call me if you want i delete it. thanks

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mazgch 18:e5697801df29 1 #include "mbed.h"
mazgch 18:e5697801df29 2 #include "MDM.h"
mazgch 74:208e3e32d263 3 #ifdef TARGET_UBLOX_C027
mazgch 74:208e3e32d263 4 #include "C027_api.h"
mazgch 74:208e3e32d263 5 #endif
mazgch 85:dd8f4f0d0ca9 6 #include "MDMAPN.h"
irsanjul 120:353754a2bcd9 7 #include <sstream>
mazgch 84:a05edb010176 8
mazgch 74:208e3e32d263 9 #define PROFILE "0" //!< this is the psd profile used
mazgch 74:208e3e32d263 10 #define MAX_SIZE 128 //!< max expected messages
mazgch 103:197fa7920ad8 11 // num sockets
mazgch 104:c64ba749a422 12 #define NUMSOCKETS (sizeof(_sockets)/sizeof(*_sockets))
mazgch 104:c64ba749a422 13 //! test if it is a socket is ok to use
mazgch 104:c64ba749a422 14 #define ISSOCKET(s) (((s) >= 0) && ((s) < NUMSOCKETS) && (_sockets[s].handle != SOCKET_ERROR))
mazgch 75:ce6e12067d0c 15 //! check for timeout
mazgch 75:ce6e12067d0c 16 #define TIMEOUT(t, ms) ((ms != TIMEOUT_BLOCKING) && (ms < t.read_ms()))
mazgch 80:34985b4d821e 17 //! registration ok check helper
mazgch 79:291df065e345 18 #define REG_OK(r) ((r == REG_HOME) || (r == REG_ROAMING))
mazgch 80:34985b4d821e 19 //! registration done check helper (no need to poll further)
mazgch 79:291df065e345 20 #define REG_DONE(r) ((r == REG_HOME) || (r == REG_ROAMING) || (r == REG_DENIED))
mazgch 95:8282dbbe1492 21 //! helper to make sure that lock unlock pair is always balaced
mazgch 95:8282dbbe1492 22 #define LOCK() { lock()
mazgch 95:8282dbbe1492 23 //! helper to make sure that lock unlock pair is always balaced
mazgch 95:8282dbbe1492 24 #define UNLOCK() } unlock()
mazgch 79:291df065e345 25
mazgch 74:208e3e32d263 26 #ifdef MDM_DEBUG
mazgch 95:8282dbbe1492 27 #if 1 // colored terminal output using ANSI escape sequences
mazgch 95:8282dbbe1492 28 #define COL(c) "\033[" c
mazgch 95:8282dbbe1492 29 #else
mazgch 95:8282dbbe1492 30 #define COL(c)
mazgch 95:8282dbbe1492 31 #endif
mazgch 95:8282dbbe1492 32 #define DEF COL("39m")
mazgch 95:8282dbbe1492 33 #define BLA COL("30m")
mazgch 95:8282dbbe1492 34 #define RED COL("31m")
mazgch 95:8282dbbe1492 35 #define GRE COL("32m")
mazgch 95:8282dbbe1492 36 #define YEL COL("33m")
mazgch 95:8282dbbe1492 37 #define BLU COL("34m")
mazgch 95:8282dbbe1492 38 #define MAG COL("35m")
mazgch 95:8282dbbe1492 39 #define CYA COL("36m")
mazgch 95:8282dbbe1492 40 #define WHY COL("37m")
mazgch 95:8282dbbe1492 41
mazgch 74:208e3e32d263 42 void dumpAtCmd(const char* buf, int len)
mazgch 21:c4d64830bf02 43 {
mazgch 75:ce6e12067d0c 44 ::printf(" %3d \"", len);
mazgch 21:c4d64830bf02 45 while (len --) {
mazgch 21:c4d64830bf02 46 char ch = *buf++;
mazgch 75:ce6e12067d0c 47 if ((ch > 0x1F) && (ch != 0x7F)) { // is printable
mazgch 75:ce6e12067d0c 48 if (ch == '%') ::printf("%%");
mazgch 75:ce6e12067d0c 49 else if (ch == '"') ::printf("\\\"");
mazgch 75:ce6e12067d0c 50 else if (ch == '\\') ::printf("\\\\");
mazgch 75:ce6e12067d0c 51 else putchar(ch);
mazgch 75:ce6e12067d0c 52 } else {
mazgch 75:ce6e12067d0c 53 if (ch == '\a') ::printf("\\a"); // BEL (0x07)
mazgch 75:ce6e12067d0c 54 else if (ch == '\b') ::printf("\\b"); // Backspace (0x08)
mazgch 75:ce6e12067d0c 55 else if (ch == '\t') ::printf("\\t"); // Horizontal Tab (0x09)
mazgch 75:ce6e12067d0c 56 else if (ch == '\n') ::printf("\\n"); // Linefeed (0x0A)
mazgch 75:ce6e12067d0c 57 else if (ch == '\v') ::printf("\\v"); // Vertical Tab (0x0B)
mazgch 75:ce6e12067d0c 58 else if (ch == '\f') ::printf("\\f"); // Formfeed (0x0C)
mazgch 75:ce6e12067d0c 59 else if (ch == '\r') ::printf("\\r"); // Carriage Return (0x0D)
mazgch 76:f7c3dd568dae 60 else ::printf("\\x%02x", (unsigned char)ch);
mazgch 75:ce6e12067d0c 61 }
mazgch 21:c4d64830bf02 62 }
mazgch 75:ce6e12067d0c 63 ::printf("\"\r\n");
mazgch 21:c4d64830bf02 64 }
mazgch 74:208e3e32d263 65
mazgch 117:74e4e0109a9e 66 void MDMParser::_debugPrint(int level, const char* color, const char* format, ...)
mazgch 117:74e4e0109a9e 67 {
mazgch 117:74e4e0109a9e 68 if (_debugLevel >= level)
mazgch 117:74e4e0109a9e 69 {
mazgch 117:74e4e0109a9e 70 va_list args;
mazgch 117:74e4e0109a9e 71 va_start (args, format);
mazgch 117:74e4e0109a9e 72 if (color) ::printf(color);
mazgch 117:74e4e0109a9e 73 ::vprintf(format, args);
mazgch 117:74e4e0109a9e 74 if (color) ::printf(DEF);
mazgch 117:74e4e0109a9e 75 va_end (args);
mazgch 117:74e4e0109a9e 76 }
mazgch 117:74e4e0109a9e 77 }
mazgch 117:74e4e0109a9e 78
mazgch 117:74e4e0109a9e 79 #define ERROR(...) _debugPrint(0, RED, __VA_ARGS__)
mazgch 117:74e4e0109a9e 80 #define INFO(...) _debugPrint(1, GRE, __VA_ARGS__)
mazgch 117:74e4e0109a9e 81 #define TRACE(...) _debugPrint(2, DEF, __VA_ARGS__)
mazgch 117:74e4e0109a9e 82 #define TEST(...) _debugPrint(3, CYA, __VA_ARGS__)
mazgch 74:208e3e32d263 83
mazgch 74:208e3e32d263 84 #else
mazgch 74:208e3e32d263 85
mazgch 75:ce6e12067d0c 86 #define ERROR(...) (void)0 // no tracing
mazgch 95:8282dbbe1492 87 #define TEST(...) (void)0 // no tracing
mazgch 74:208e3e32d263 88 #define INFO(...) (void)0 // no tracing
mazgch 74:208e3e32d263 89 #define TRACE(...) (void)0 // no tracing
mazgch 74:208e3e32d263 90
mazgch 31:a0bed6c1e05d 91 #endif
mazgch 21:c4d64830bf02 92
mazgch 44:9d12223b78ff 93 MDMParser* MDMParser::inst;
mazgch 44:9d12223b78ff 94
mazgch 21:c4d64830bf02 95 MDMParser::MDMParser(void)
mazgch 21:c4d64830bf02 96 {
mazgch 44:9d12223b78ff 97 inst = this;
mazgch 31:a0bed6c1e05d 98 memset(&_dev, 0, sizeof(_dev));
mazgch 31:a0bed6c1e05d 99 memset(&_net, 0, sizeof(_net));
mazgch 54:7ba8e4c218e2 100 _net.lac = 0xFFFF;
mazgch 54:7ba8e4c218e2 101 _net.ci = 0xFFFFFFFF;
mazgch 35:9275215a3a5b 102 _ip = NOIP;
mazgch 76:f7c3dd568dae 103 _init = false;
mazgch 31:a0bed6c1e05d 104 memset(_sockets, 0, sizeof(_sockets));
mazgch 104:c64ba749a422 105 for (int socket = 0; socket < NUMSOCKETS; socket ++)
mazgch 103:197fa7920ad8 106 _sockets[socket].handle = SOCKET_ERROR;
mazgch 74:208e3e32d263 107 #ifdef MDM_DEBUG
mazgch 76:f7c3dd568dae 108 _debugLevel = 1;
mazgch 74:208e3e32d263 109 _debugTime.start();
mazgch 74:208e3e32d263 110 #endif
mazgch 74:208e3e32d263 111 }
mazgch 74:208e3e32d263 112
mazgch 18:e5697801df29 113 int MDMParser::send(const char* buf, int len)
mazgch 18:e5697801df29 114 {
mazgch 74:208e3e32d263 115 #ifdef MDM_DEBUG
mazgch 74:208e3e32d263 116 if (_debugLevel >= 3) {
mazgch 75:ce6e12067d0c 117 ::printf("%10.3f AT send ", _debugTime.read_ms()*0.001);
mazgch 74:208e3e32d263 118 dumpAtCmd(buf,len);
mazgch 74:208e3e32d263 119 }
mazgch 21:c4d64830bf02 120 #endif
mazgch 18:e5697801df29 121 return _send(buf, len);
mazgch 18:e5697801df29 122 }
mazgch 18:e5697801df29 123
mazgch 21:c4d64830bf02 124 int MDMParser::sendFormated(const char* format, ...) {
mazgch 21:c4d64830bf02 125 char buf[MAX_SIZE];
mazgch 21:c4d64830bf02 126 va_list args;
mazgch 21:c4d64830bf02 127 va_start(args, format);
mazgch 21:c4d64830bf02 128 int len = vsnprintf(buf,sizeof(buf), format, args);
mazgch 21:c4d64830bf02 129 va_end(args);
mazgch 21:c4d64830bf02 130 return send(buf, len);
mazgch 21:c4d64830bf02 131 }
mazgch 21:c4d64830bf02 132
mazgch 26:07be5faf8925 133 int MDMParser::waitFinalResp(_CALLBACKPTR cb /* = NULL*/,
mazgch 26:07be5faf8925 134 void* param /* = NULL*/,
mazgch 26:07be5faf8925 135 int timeout_ms /*= 5000*/)
mazgch 26:07be5faf8925 136 {
mazgch 69:4d6fa520dfca 137 char buf[MAX_SIZE + 64 /* add some more space for framing */];
mazgch 21:c4d64830bf02 138 Timer timer;
mazgch 21:c4d64830bf02 139 timer.start();
mazgch 21:c4d64830bf02 140 do {
mazgch 21:c4d64830bf02 141 int ret = getLine(buf, sizeof(buf));
mazgch 74:208e3e32d263 142 #ifdef MDM_DEBUG
mazgch 74:208e3e32d263 143 if ((_debugLevel >= 3) && (ret != WAIT) && (ret != NOT_FOUND))
mazgch 21:c4d64830bf02 144 {
mazgch 31:a0bed6c1e05d 145 int len = LENGTH(ret);
mazgch 31:a0bed6c1e05d 146 int type = TYPE(ret);
mazgch 95:8282dbbe1492 147 const char* s = (type == TYPE_UNKNOWN)? YEL "UNK" DEF :
mazgch 95:8282dbbe1492 148 (type == TYPE_TEXT) ? MAG "TXT" DEF :
mazgch 95:8282dbbe1492 149 (type == TYPE_OK ) ? GRE "OK " DEF :
mazgch 95:8282dbbe1492 150 (type == TYPE_ERROR) ? RED "ERR" DEF :
mazgch 95:8282dbbe1492 151 (type == TYPE_PLUS) ? CYA " + " DEF :
irsanjul 120:353754a2bcd9 152 (type == TYPE_PROMPT) ? BLU " > " DEF :
irsanjul 120:353754a2bcd9 153 (type == TYPE_NOCARRIER)? CYA "NO" DEF :
irsanjul 120:353754a2bcd9 154 (type == TYPE_RING) ? CYA "RING" DEF :
mazgch 95:8282dbbe1492 155 "..." ;
mazgch 75:ce6e12067d0c 156 ::printf("%10.3f AT read %s", _debugTime.read_ms()*0.001, s);
mazgch 74:208e3e32d263 157 dumpAtCmd(buf, len);
mazgch 21:c4d64830bf02 158 }
mazgch 21:c4d64830bf02 159 #endif
mazgch 21:c4d64830bf02 160 if ((ret != WAIT) && (ret != NOT_FOUND))
mazgch 18:e5697801df29 161 {
mazgch 21:c4d64830bf02 162 int type = TYPE(ret);
mazgch 21:c4d64830bf02 163 // handle unsolicited commands here
mazgch 21:c4d64830bf02 164 if (type == TYPE_PLUS) {
mazgch 21:c4d64830bf02 165 const char* cmd = buf+3;
mazgch 54:7ba8e4c218e2 166 int a, b, c, d, r;
mazgch 23:05a1aeeb5fd9 167 char s[32];
mazgch 21:c4d64830bf02 168
mazgch 31:a0bed6c1e05d 169 // SMS Command ---------------------------------
mazgch 31:a0bed6c1e05d 170 // +CNMI: <mem>,<index>
mazgch 31:a0bed6c1e05d 171 if (sscanf(cmd, "CMTI: \"%*[^\"]\",%d", &a) == 1) {
mazgch 31:a0bed6c1e05d 172 TRACE("New SMS at index %d\r\n", a);
mazgch 21:c4d64830bf02 173 // Socket Specific Command ---------------------------------
mazgch 21:c4d64830bf02 174 // +UUSORD: <socket>,<length>
mazgch 103:197fa7920ad8 175 } else if ((sscanf(cmd, "UUSORD: %d,%d", &a, &b) == 2)) {
mazgch 103:197fa7920ad8 176 int socket = _findSocket(a);
mazgch 103:197fa7920ad8 177 TRACE("Socket %d: handle %d has %d bytes pending\r\n", socket, a, b);
mazgch 103:197fa7920ad8 178 if (socket != SOCKET_ERROR)
mazgch 103:197fa7920ad8 179 _sockets[socket].pending = b;
mazgch 69:4d6fa520dfca 180 // +UUSORF: <socket>,<length>
mazgch 103:197fa7920ad8 181 } else if ((sscanf(cmd, "UUSORF: %d,%d", &a, &b) == 2)) {
mazgch 103:197fa7920ad8 182 int socket = _findSocket(a);
mazgch 103:197fa7920ad8 183 TRACE("Socket %d: handle %d has %d bytes pending\r\n", socket, a, b);
mazgch 103:197fa7920ad8 184 if (socket != SOCKET_ERROR)
mazgch 103:197fa7920ad8 185 _sockets[socket].pending = b;
mazgch 21:c4d64830bf02 186 // +UUSOCL: <socket>
mazgch 103:197fa7920ad8 187 } else if ((sscanf(cmd, "UUSOCL: %d", &a) == 1)) {
mazgch 103:197fa7920ad8 188 int socket = _findSocket(a);
mazgch 103:197fa7920ad8 189 TRACE("Socket %d: handle %d closed by remote host\r\n", socket, a);
mazgch 103:197fa7920ad8 190 if ((socket != SOCKET_ERROR) && _sockets[socket].connected)
mazgch 103:197fa7920ad8 191 _sockets[socket].connected = false;
mazgch 103:197fa7920ad8 192 }
mazgch 32:8f12ac182bbb 193 if (_dev.dev == DEV_LISA_C200) {
mazgch 21:c4d64830bf02 194 // CDMA Specific -------------------------------------------
mazgch 21:c4d64830bf02 195 // +CREG: <n><SID>,<NID>,<stat>
mazgch 54:7ba8e4c218e2 196 if (sscanf(cmd, "CREG: %*d,%d,%d,%d",&a,&b,&c) == 3) {
mazgch 54:7ba8e4c218e2 197 // _net.sid = a;
mazgch 54:7ba8e4c218e2 198 // _net.nid = b;
mazgch 79:291df065e345 199 if (c == 0) _net.csd = REG_NONE; // not registered, home network
mazgch 79:291df065e345 200 else if (c == 1) _net.csd = REG_HOME; // registered, home network
mazgch 79:291df065e345 201 else if (c == 2) _net.csd = REG_NONE; // not registered, but MT is currently searching a new operator to register to
mazgch 79:291df065e345 202 else if (c == 3) _net.csd = REG_DENIED; // registration denied
mazgch 79:291df065e345 203 else if (c == 5) _net.csd = REG_ROAMING; // registered, roaming
mazgch 79:291df065e345 204 _net.psd = _net.csd; // fake PSD registration (CDMA is always registered)
mazgch 31:a0bed6c1e05d 205 _net.act = ACT_CDMA;
mazgch 84:a05edb010176 206 // +CSS: <mode>[,<format>,<oper>[,<AcT>]]
mazgch 21:c4d64830bf02 207 } else if (sscanf(cmd, "CSS %*c,%2s,%*d",s) == 1) {
mazgch 31:a0bed6c1e05d 208 //_net.reg = (strcmp("Z", s) == 0) ? REG_UNKNOWN : REG_HOME;
mazgch 21:c4d64830bf02 209 }
mazgch 21:c4d64830bf02 210 } else {
mazgch 21:c4d64830bf02 211 // GSM/UMTS Specific -------------------------------------------
mazgch 79:291df065e345 212 // +UUPSDD: <profile_id>
mazgch 79:291df065e345 213 if (sscanf(cmd, "UUPSDD: %d",&a) == 1) {
mazgch 79:291df065e345 214 if (*PROFILE == a) _ip = NOIP;
mazgch 79:291df065e345 215 } else {
mazgch 79:291df065e345 216 // +CREG|CGREG: <n>,<stat>[,<lac>,<ci>[,AcT[,<rac>]]] // reply to AT+CREG|AT+CGREG
mazgch 79:291df065e345 217 // +CREG|CGREG: <stat>[,<lac>,<ci>[,AcT[,<rac>]]] // URC
mazgch 79:291df065e345 218 b = 0xFFFF; c = 0xFFFFFFFF; d = -1;
mazgch 79:291df065e345 219 r = sscanf(cmd, "%s %*d,%d,\"%X\",\"%X\",%d",s,&a,&b,&c,&d);
mazgch 79:291df065e345 220 if (r <= 1)
mazgch 79:291df065e345 221 r = sscanf(cmd, "%s %d,\"%X\",\"%X\",%d",s,&a,&b,&c,&d);
mazgch 79:291df065e345 222 if (r >= 2) {
mazgch 79:291df065e345 223 Reg *reg = !strcmp(s, "CREG:") ? &_net.csd :
mazgch 79:291df065e345 224 !strcmp(s, "CGREG:") ? &_net.psd : NULL;
mazgch 79:291df065e345 225 if (reg) {
mazgch 79:291df065e345 226 // network status
mazgch 79:291df065e345 227 if (a == 0) *reg = REG_NONE; // 0: not registered, home network
mazgch 79:291df065e345 228 else if (a == 1) *reg = REG_HOME; // 1: registered, home network
mazgch 79:291df065e345 229 else if (a == 2) *reg = REG_NONE; // 2: not registered, but MT is currently searching a new operator to register to
mazgch 79:291df065e345 230 else if (a == 3) *reg = REG_DENIED; // 3: registration denied
mazgch 79:291df065e345 231 else if (a == 4) *reg = REG_UNKNOWN; // 4: unknown
mazgch 79:291df065e345 232 else if (a == 5) *reg = REG_ROAMING; // 5: registered, roaming
mazgch 79:291df065e345 233 if ((r >= 3) && (b != 0xFFFF)) _net.lac = b; // location area code
mazgch 79:291df065e345 234 if ((r >= 4) && (c != 0xFFFFFFFF)) _net.ci = c; // cell ID
mazgch 79:291df065e345 235 // access technology
mazgch 79:291df065e345 236 if (r >= 5) {
mazgch 79:291df065e345 237 if (d == 0) _net.act = ACT_GSM; // 0: GSM
mazgch 79:291df065e345 238 else if (d == 1) _net.act = ACT_GSM; // 1: GSM COMPACT
mazgch 79:291df065e345 239 else if (d == 2) _net.act = ACT_UTRAN; // 2: UTRAN
mazgch 79:291df065e345 240 else if (d == 3) _net.act = ACT_EDGE; // 3: GSM with EDGE availability
mazgch 79:291df065e345 241 else if (d == 4) _net.act = ACT_UTRAN; // 4: UTRAN with HSDPA availability
mazgch 79:291df065e345 242 else if (d == 5) _net.act = ACT_UTRAN; // 5: UTRAN with HSUPA availability
mazgch 79:291df065e345 243 else if (d == 6) _net.act = ACT_UTRAN; // 6: UTRAN with HSDPA and HSUPA availability
mazgch 79:291df065e345 244 }
mazgch 79:291df065e345 245 }
mazgch 54:7ba8e4c218e2 246 }
mazgch 21:c4d64830bf02 247 }
mazgch 21:c4d64830bf02 248 }
mazgch 21:c4d64830bf02 249 }
mazgch 21:c4d64830bf02 250 if (cb) {
mazgch 21:c4d64830bf02 251 int len = LENGTH(ret);
mazgch 21:c4d64830bf02 252 int ret = cb(type, buf, len, param);
mazgch 21:c4d64830bf02 253 if (WAIT != ret)
mazgch 21:c4d64830bf02 254 return ret;
mazgch 21:c4d64830bf02 255 }
mazgch 95:8282dbbe1492 256 if (type == TYPE_OK)
mazgch 95:8282dbbe1492 257 return RESP_OK;
mazgch 95:8282dbbe1492 258 if (type == TYPE_ERROR)
mazgch 95:8282dbbe1492 259 return RESP_ERROR;
mazgch 95:8282dbbe1492 260 if (type == TYPE_PROMPT)
mazgch 95:8282dbbe1492 261 return RESP_PROMPT;
mazgch 21:c4d64830bf02 262 }
mazgch 21:c4d64830bf02 263 // relax a bit
mazgch 95:8282dbbe1492 264 wait_ms(10);
mazgch 21:c4d64830bf02 265 }
mazgch 75:ce6e12067d0c 266 while (!TIMEOUT(timer, timeout_ms));
mazgch 21:c4d64830bf02 267 return WAIT;
mazgch 21:c4d64830bf02 268 }
mazgch 21:c4d64830bf02 269
mazgch 31:a0bed6c1e05d 270 int MDMParser::_cbString(int type, const char* buf, int len, char* str)
mazgch 21:c4d64830bf02 271 {
mazgch 37:cc3433329d66 272 if (str && (type == TYPE_UNKNOWN)) {
mazgch 31:a0bed6c1e05d 273 if (sscanf(buf, "\r\n%s\r\n", str) == 1)
mazgch 31:a0bed6c1e05d 274 /*nothing*/;
mazgch 21:c4d64830bf02 275 }
mazgch 21:c4d64830bf02 276 return WAIT;
mazgch 21:c4d64830bf02 277 }
mazgch 21:c4d64830bf02 278
mazgch 31:a0bed6c1e05d 279 int MDMParser::_cbInt(int type, const char* buf, int len, int* val)
mazgch 31:a0bed6c1e05d 280 {
mazgch 37:cc3433329d66 281 if (val && (type == TYPE_UNKNOWN)) {
mazgch 31:a0bed6c1e05d 282 if (sscanf(buf, "\r\n%d\r\n", val) == 1)
mazgch 31:a0bed6c1e05d 283 /*nothing*/;
mazgch 31:a0bed6c1e05d 284 }
mazgch 31:a0bed6c1e05d 285 return WAIT;
mazgch 31:a0bed6c1e05d 286 }
mazgch 31:a0bed6c1e05d 287
mazgch 31:a0bed6c1e05d 288 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 289
mazgch 57:869bd35f44cc 290 bool MDMParser::connect(
mazgch 57:869bd35f44cc 291 const char* simpin,
mazgch 80:34985b4d821e 292 const char* apn, const char* username,
mazgch 80:34985b4d821e 293 const char* password, Auth auth,
mazgch 74:208e3e32d263 294 PinName pn)
mazgch 57:869bd35f44cc 295 {
mazgch 75:ce6e12067d0c 296 bool ok = init(simpin, NULL, pn);
mazgch 74:208e3e32d263 297 #ifdef MDM_DEBUG
mazgch 75:ce6e12067d0c 298 if (_debugLevel >= 1) dumpDevStatus(&_dev);
mazgch 74:208e3e32d263 299 #endif
mazgch 75:ce6e12067d0c 300 if (!ok)
mazgch 57:869bd35f44cc 301 return false;
mazgch 75:ce6e12067d0c 302 ok = registerNet();
mazgch 74:208e3e32d263 303 #ifdef MDM_DEBUG
mazgch 75:ce6e12067d0c 304 if (_debugLevel >= 1) dumpNetStatus(&_net);
mazgch 74:208e3e32d263 305 #endif
mazgch 75:ce6e12067d0c 306 if (!ok)
mazgch 57:869bd35f44cc 307 return false;
mazgch 80:34985b4d821e 308 IP ip = join(apn,username,password,auth);
mazgch 74:208e3e32d263 309 #ifdef MDM_DEBUG
mazgch 74:208e3e32d263 310 if (_debugLevel >= 1) dumpIp(ip);
mazgch 74:208e3e32d263 311 #endif
mazgch 57:869bd35f44cc 312 if (ip == NOIP)
mazgch 57:869bd35f44cc 313 return false;
mazgch 57:869bd35f44cc 314 return true;
mazgch 57:869bd35f44cc 315 }
mazgch 57:869bd35f44cc 316
mazgch 74:208e3e32d263 317 bool MDMParser::init(const char* simpin, DevStatus* status, PinName pn)
mazgch 21:c4d64830bf02 318 {
mazgch 74:208e3e32d263 319 int i = 10;
mazgch 95:8282dbbe1492 320 LOCK();
mazgch 76:f7c3dd568dae 321 memset(&_dev, 0, sizeof(_dev));
mazgch 74:208e3e32d263 322 if (pn != NC) {
mazgch 74:208e3e32d263 323 INFO("Modem::wakeup\r\n");
mazgch 74:208e3e32d263 324 DigitalOut pin(pn, 1);
mazgch 74:208e3e32d263 325 while (i--) {
mazgch 79:291df065e345 326 // SARA-U2/LISA-U2 50..80us
irsanjul 120:353754a2bcd9 327 /*pin = 0; ::wait_us(50);
mazgch 95:8282dbbe1492 328 pin = 1; ::wait_ms(10);
irsanjul 120:353754a2bcd9 329 */
mazgch 98:c786461edd40 330 // SARA-G35 >5ms, LISA-C2 > 150ms, LEON-G2 >5ms
mazgch 95:8282dbbe1492 331 pin = 0; ::wait_ms(150);
mazgch 95:8282dbbe1492 332 pin = 1; ::wait_ms(100);
mazgch 79:291df065e345 333
mazgch 79:291df065e345 334 // purge any messages
mazgch 101:edfeb8af206e 335 purge();
mazgch 95:8282dbbe1492 336
mazgch 101:edfeb8af206e 337 // check interface
mazgch 74:208e3e32d263 338 sendFormated("AT\r\n");
mazgch 101:edfeb8af206e 339 int r = waitFinalResp(NULL,NULL,1000);
mazgch 95:8282dbbe1492 340 if(RESP_OK == r) break;
mazgch 74:208e3e32d263 341 }
mazgch 75:ce6e12067d0c 342 if (i < 0) {
mazgch 95:8282dbbe1492 343 ERROR("No Reply from Modem\r\n");
mazgch 95:8282dbbe1492 344 goto failure;
mazgch 75:ce6e12067d0c 345 }
mazgch 21:c4d64830bf02 346 }
mazgch 76:f7c3dd568dae 347 _init = true;
mazgch 75:ce6e12067d0c 348
mazgch 74:208e3e32d263 349 INFO("Modem::init\r\n");
mazgch 21:c4d64830bf02 350 // echo off
mazgch 21:c4d64830bf02 351 sendFormated("AT E0\r\n");
mazgch 52:8071747a7cb3 352 if(RESP_OK != waitFinalResp())
mazgch 95:8282dbbe1492 353 goto failure;
mazgch 21:c4d64830bf02 354 // enable verbose error messages
mazgch 21:c4d64830bf02 355 sendFormated("AT+CMEE=2\r\n");
mazgch 52:8071747a7cb3 356 if(RESP_OK != waitFinalResp())
mazgch 95:8282dbbe1492 357 goto failure;
mazgch 21:c4d64830bf02 358 // set baud rate
mazgch 21:c4d64830bf02 359 sendFormated("AT+IPR=115200\r\n");
mazgch 52:8071747a7cb3 360 if (RESP_OK != waitFinalResp())
mazgch 95:8282dbbe1492 361 goto failure;
mazgch 112:89b5b21db71e 362 // wait some time until baudrate is applied
mazgch 112:89b5b21db71e 363 wait_ms(200); // SARA-G > 40ms
mazgch 21:c4d64830bf02 364 // identify the module
mazgch 21:c4d64830bf02 365 sendFormated("ATI\r\n");
mazgch 52:8071747a7cb3 366 if (RESP_OK != waitFinalResp(_cbATI, &_dev.dev))
mazgch 95:8282dbbe1492 367 goto failure;
mazgch 32:8f12ac182bbb 368 if (_dev.dev == DEV_UNKNOWN)
mazgch 95:8282dbbe1492 369 goto failure;
mazgch 32:8f12ac182bbb 370 // device specific init
mazgch 32:8f12ac182bbb 371 if (_dev.dev == DEV_LISA_C200) {
mazgch 32:8f12ac182bbb 372 // get the manufacturer
mazgch 32:8f12ac182bbb 373 sendFormated("AT+GMI\r\n");
mazgch 52:8071747a7cb3 374 if (RESP_OK != waitFinalResp(_cbString, _dev.manu))
mazgch 95:8282dbbe1492 375 goto failure;
mazgch 32:8f12ac182bbb 376 // get the model identification
mazgch 32:8f12ac182bbb 377 sendFormated("AT+GMM\r\n");
mazgch 52:8071747a7cb3 378 if (RESP_OK != waitFinalResp(_cbString, _dev.model))
mazgch 95:8282dbbe1492 379 goto failure;
mazgch 32:8f12ac182bbb 380 // get the sw version
mazgch 32:8f12ac182bbb 381 sendFormated("AT+GMR\r\n");
mazgch 52:8071747a7cb3 382 if (RESP_OK != waitFinalResp(_cbString, _dev.ver))
mazgch 95:8282dbbe1492 383 goto failure;
mazgch 95:8282dbbe1492 384 // get the pseudo ESN or MEID
mazgch 21:c4d64830bf02 385 sendFormated("AT+GSN\r\n");
mazgch 52:8071747a7cb3 386 if (RESP_OK != waitFinalResp(_cbString, _dev.meid))
mazgch 95:8282dbbe1492 387 goto failure;
mazgch 50:d76aece8038f 388 #if 0
mazgch 50:d76aece8038f 389 // enable power saving
mazgch 50:d76aece8038f 390 if (_dev.lpm != LPM_DISABLED) {
mazgch 50:d76aece8038f 391 // enable power saving (requires flow control, cts at least)
mazgch 50:d76aece8038f 392 sendFormated("AT+UPSV=1,1280\r\n");
mazgch 52:8071747a7cb3 393 if (RESP_OK != waitFinalResp())
mazgch 95:8282dbbe1492 394 goto failure;
mazgch 50:d76aece8038f 395 _dev.lpm = LPM_ACTIVE;
mazgch 50:d76aece8038f 396 }
mazgch 50:d76aece8038f 397 #endif
mazgch 26:07be5faf8925 398 } else {
mazgch 98:c786461edd40 399 if ((_dev.dev == DEV_LISA_U200) || (_dev.dev == DEV_LEON_G200)) {
mazgch 35:9275215a3a5b 400 // enable the network identification feature
mazgch 21:c4d64830bf02 401 sendFormated("AT+UGPIOC=20,2\r\n");
mazgch 52:8071747a7cb3 402 if (RESP_OK != waitFinalResp())
mazgch 95:8282dbbe1492 403 goto failure;
mazgch 98:c786461edd40 404 } else if ((_dev.dev == DEV_SARA_U260) || (_dev.dev == DEV_SARA_U270) ||
mazgch 98:c786461edd40 405 (_dev.dev == DEV_SARA_G350)) {
mazgch 35:9275215a3a5b 406 // enable the network identification feature
mazgch 21:c4d64830bf02 407 sendFormated("AT+UGPIOC=16,2\r\n");
mazgch 52:8071747a7cb3 408 if (RESP_OK != waitFinalResp())
mazgch 95:8282dbbe1492 409 goto failure;
mazgch 21:c4d64830bf02 410 }
mazgch 21:c4d64830bf02 411 // check the sim card
mazgch 31:a0bed6c1e05d 412 for (int i = 0; (i < 5) && (_dev.sim != SIM_READY); i++) {
mazgch 21:c4d64830bf02 413 sendFormated("AT+CPIN?\r\n");
mazgch 31:a0bed6c1e05d 414 int ret = waitFinalResp(_cbCPIN, &_dev.sim);
mazgch 62:a02f026bdd7c 415 // having an error here is ok (sim may still be initializing)
mazgch 52:8071747a7cb3 416 if ((RESP_OK != ret) && (RESP_ERROR != ret))
mazgch 95:8282dbbe1492 417 goto failure;
mazgch 31:a0bed6c1e05d 418 // Enter PIN if needed
mazgch 77:55788e619858 419 if (_dev.sim == SIM_PIN) {
mazgch 57:869bd35f44cc 420 if (!simpin) {
mazgch 75:ce6e12067d0c 421 ERROR("SIM PIN not available\r\n");
mazgch 95:8282dbbe1492 422 goto failure;
mazgch 31:a0bed6c1e05d 423 }
mazgch 57:869bd35f44cc 424 sendFormated("AT+CPIN=%s\r\n", simpin);
mazgch 52:8071747a7cb3 425 if (RESP_OK != waitFinalResp(_cbCPIN, &_dev.sim))
mazgch 95:8282dbbe1492 426 goto failure;
mazgch 62:a02f026bdd7c 427 } else if (_dev.sim != SIM_READY) {
mazgch 95:8282dbbe1492 428 wait_ms(1000);
mazgch 62:a02f026bdd7c 429 }
mazgch 21:c4d64830bf02 430 }
mazgch 77:55788e619858 431 if (_dev.sim != SIM_READY) {
mazgch 77:55788e619858 432 if (_dev.sim == SIM_MISSING)
mazgch 77:55788e619858 433 ERROR("SIM not inserted\r\n");
mazgch 95:8282dbbe1492 434 goto failure;
mazgch 77:55788e619858 435 }
irsanjul 122:1360902e8632 436 // stop message waaiting indication
irsanjul 122:1360902e8632 437 sendFormated("AT+UMWI=0\r\n");
irsanjul 122:1360902e8632 438 waitFinalResp();
mazgch 32:8f12ac182bbb 439 // get the manufacturer
mazgch 32:8f12ac182bbb 440 sendFormated("AT+CGMI\r\n");
mazgch 52:8071747a7cb3 441 if (RESP_OK != waitFinalResp(_cbString, _dev.manu))
mazgch 95:8282dbbe1492 442 goto failure;
mazgch 32:8f12ac182bbb 443 // get the model identification
mazgch 32:8f12ac182bbb 444 sendFormated("AT+CGMM\r\n");
mazgch 52:8071747a7cb3 445 if (RESP_OK != waitFinalResp(_cbString, _dev.model))
mazgch 95:8282dbbe1492 446 goto failure;
mazgch 32:8f12ac182bbb 447 // get the
mazgch 32:8f12ac182bbb 448 sendFormated("AT+CGMR\r\n");
mazgch 52:8071747a7cb3 449 if (RESP_OK != waitFinalResp(_cbString, _dev.ver))
irsanjul 120:353754a2bcd9 450 goto failure;
mazgch 21:c4d64830bf02 451 // Returns the ICCID (Integrated Circuit Card ID) of the SIM-card.
mazgch 21:c4d64830bf02 452 // ICCID is a serial number identifying the SIM.
mazgch 21:c4d64830bf02 453 sendFormated("AT+CCID\r\n");
mazgch 52:8071747a7cb3 454 if (RESP_OK != waitFinalResp(_cbCCID, _dev.ccid))
mazgch 95:8282dbbe1492 455 goto failure;
mazgch 21:c4d64830bf02 456 // Returns the product serial number, IMEI (International Mobile Equipment Identity)
mazgch 21:c4d64830bf02 457 sendFormated("AT+CGSN\r\n");
mazgch 52:8071747a7cb3 458 if (RESP_OK != waitFinalResp(_cbString, _dev.imei))
mazgch 95:8282dbbe1492 459 goto failure;
mazgch 50:d76aece8038f 460 // enable power saving
mazgch 50:d76aece8038f 461 if (_dev.lpm != LPM_DISABLED) {
mazgch 50:d76aece8038f 462 // enable power saving (requires flow control, cts at least)
mazgch 50:d76aece8038f 463 sendFormated("AT+UPSV=1\r\n");
mazgch 52:8071747a7cb3 464 if (RESP_OK != waitFinalResp())
mazgch 95:8282dbbe1492 465 goto failure;
mazgch 50:d76aece8038f 466 _dev.lpm = LPM_ACTIVE;
mazgch 50:d76aece8038f 467 }
mazgch 79:291df065e345 468 // enable the psd registration unsolicited result code
mazgch 79:291df065e345 469 sendFormated("AT+CGREG=2\r\n");
mazgch 79:291df065e345 470 if (RESP_OK != waitFinalResp())
mazgch 95:8282dbbe1492 471 goto failure;
mazgch 21:c4d64830bf02 472 }
mazgch 79:291df065e345 473 // enable the network registration unsolicited result code
mazgch 79:291df065e345 474 sendFormated("AT+CREG=%d\r\n", (_dev.dev == DEV_LISA_C200) ? 1 : 2);
mazgch 79:291df065e345 475 if (RESP_OK != waitFinalResp())
mazgch 95:8282dbbe1492 476 goto failure;
mazgch 31:a0bed6c1e05d 477 // Setup SMS in text mode
mazgch 31:a0bed6c1e05d 478 sendFormated("AT+CMGF=1\r\n");
mazgch 52:8071747a7cb3 479 if (RESP_OK != waitFinalResp())
mazgch 95:8282dbbe1492 480 goto failure;
mazgch 31:a0bed6c1e05d 481 // setup new message indication
mazgch 75:ce6e12067d0c 482 sendFormated("AT+CNMI=2,1\r\n");
mazgch 52:8071747a7cb3 483 if (RESP_OK != waitFinalResp())
mazgch 95:8282dbbe1492 484 goto failure;
irsanjul 120:353754a2bcd9 485 // setup report
irsanjul 120:353754a2bcd9 486 sendFormated("AT+CMER=1,0,0,2,1\r\n");
irsanjul 120:353754a2bcd9 487 if (RESP_OK != waitFinalResp())
irsanjul 120:353754a2bcd9 488 goto failure;
mazgch 21:c4d64830bf02 489 // Request IMSI (International Mobile Subscriber Identification)
mazgch 21:c4d64830bf02 490 sendFormated("AT+CIMI\r\n");
mazgch 52:8071747a7cb3 491 if (RESP_OK != waitFinalResp(_cbString, _dev.imsi))
mazgch 95:8282dbbe1492 492 goto failure;
irsanjul 120:353754a2bcd9 493
mazgch 28:4d9509e3b1cf 494 if (status)
mazgch 31:a0bed6c1e05d 495 memcpy(status, &_dev, sizeof(DevStatus));
mazgch 95:8282dbbe1492 496 UNLOCK();
mazgch 31:a0bed6c1e05d 497 return true;
mazgch 95:8282dbbe1492 498 failure:
mazgch 95:8282dbbe1492 499 unlock();
mazgch 95:8282dbbe1492 500 return false;
mazgch 31:a0bed6c1e05d 501 }
mazgch 31:a0bed6c1e05d 502
mazgch 74:208e3e32d263 503 bool MDMParser::powerOff(void)
mazgch 74:208e3e32d263 504 {
mazgch 95:8282dbbe1492 505 bool ok = false;
mazgch 76:f7c3dd568dae 506 if (_init) {
mazgch 95:8282dbbe1492 507 LOCK();
mazgch 76:f7c3dd568dae 508 INFO("Modem::powerOff\r\n");
mazgch 76:f7c3dd568dae 509 sendFormated("AT+CPWROFF\r\n");
mazgch 95:8282dbbe1492 510 if (RESP_OK == waitFinalResp(NULL,NULL,120*1000)) {
mazgch 95:8282dbbe1492 511 _init = false;
mazgch 95:8282dbbe1492 512 ok = true;
mazgch 95:8282dbbe1492 513 }
mazgch 95:8282dbbe1492 514 UNLOCK();
mazgch 76:f7c3dd568dae 515 }
mazgch 95:8282dbbe1492 516 return ok;
mazgch 74:208e3e32d263 517 }
mazgch 74:208e3e32d263 518
mazgch 32:8f12ac182bbb 519 int MDMParser::_cbATI(int type, const char* buf, int len, Dev* dev)
mazgch 31:a0bed6c1e05d 520 {
mazgch 37:cc3433329d66 521 if ((type == TYPE_UNKNOWN) && dev) {
mazgch 98:c786461edd40 522 if (strstr(buf, "SARA-G350")) *dev = DEV_SARA_G350;
mazgch 98:c786461edd40 523 else if (strstr(buf, "LISA-U200")) *dev = DEV_LISA_U200;
mazgch 98:c786461edd40 524 else if (strstr(buf, "LISA-C200")) *dev = DEV_LISA_C200;
mazgch 98:c786461edd40 525 else if (strstr(buf, "SARA-U260")) *dev = DEV_SARA_U260;
mazgch 98:c786461edd40 526 else if (strstr(buf, "SARA-U270")) *dev = DEV_SARA_U270;
mazgch 98:c786461edd40 527 else if (strstr(buf, "LEON-G200")) *dev = DEV_LEON_G200;
mazgch 28:4d9509e3b1cf 528 }
mazgch 31:a0bed6c1e05d 529 return WAIT;
mazgch 31:a0bed6c1e05d 530 }
mazgch 31:a0bed6c1e05d 531
mazgch 31:a0bed6c1e05d 532 int MDMParser::_cbCPIN(int type, const char* buf, int len, Sim* sim)
mazgch 31:a0bed6c1e05d 533 {
mazgch 75:ce6e12067d0c 534 if (sim) {
mazgch 75:ce6e12067d0c 535 if (type == TYPE_PLUS){
mazgch 75:ce6e12067d0c 536 char s[16];
mazgch 75:ce6e12067d0c 537 if (sscanf(buf, "\r\n+CPIN: %[^\r]\r\n", s) >= 1)
mazgch 75:ce6e12067d0c 538 *sim = (0 == strcmp("READY", s)) ? SIM_READY : SIM_PIN;
mazgch 75:ce6e12067d0c 539 } else if (type == TYPE_ERROR) {
mazgch 75:ce6e12067d0c 540 if (strstr(buf, "+CME ERROR: SIM not inserted"))
mazgch 75:ce6e12067d0c 541 *sim = SIM_MISSING;
mazgch 31:a0bed6c1e05d 542 }
mazgch 31:a0bed6c1e05d 543 }
mazgch 31:a0bed6c1e05d 544 return WAIT;
mazgch 21:c4d64830bf02 545 }
mazgch 21:c4d64830bf02 546
mazgch 26:07be5faf8925 547 int MDMParser::_cbCCID(int type, const char* buf, int len, char* ccid)
mazgch 26:07be5faf8925 548 {
mazgch 26:07be5faf8925 549 if ((type == TYPE_PLUS) && ccid){
mazgch 26:07be5faf8925 550 if (sscanf(buf, "\r\n+CCID: %[^\r]\r\n", ccid) == 1)
mazgch 31:a0bed6c1e05d 551 /*TRACE("Got CCID: %s\r\n", ccid)*/;
mazgch 26:07be5faf8925 552 }
mazgch 26:07be5faf8925 553 return WAIT;
mazgch 26:07be5faf8925 554 }
mazgch 26:07be5faf8925 555
mazgch 75:ce6e12067d0c 556 bool MDMParser::registerNet(NetStatus* status /*= NULL*/, int timeout_ms /*= 180000*/)
mazgch 75:ce6e12067d0c 557 {
mazgch 75:ce6e12067d0c 558 Timer timer;
mazgch 75:ce6e12067d0c 559 timer.start();
mazgch 75:ce6e12067d0c 560 INFO("Modem::register\r\n");
mazgch 75:ce6e12067d0c 561 while (!checkNetStatus(status) && !TIMEOUT(timer, timeout_ms))
mazgch 95:8282dbbe1492 562 wait_ms(1000);
mazgch 79:291df065e345 563 if (_net.csd == REG_DENIED) ERROR("CSD Registration Denied\r\n");
mazgch 79:291df065e345 564 if (_net.psd == REG_DENIED) ERROR("PSD Registration Denied\r\n");
mazgch 79:291df065e345 565 return REG_OK(_net.csd) || REG_OK(_net.psd);
mazgch 75:ce6e12067d0c 566 }
mazgch 75:ce6e12067d0c 567
mazgch 28:4d9509e3b1cf 568 bool MDMParser::checkNetStatus(NetStatus* status /*= NULL*/)
mazgch 21:c4d64830bf02 569 {
mazgch 95:8282dbbe1492 570 bool ok = false;
mazgch 95:8282dbbe1492 571 LOCK();
mazgch 75:ce6e12067d0c 572 memset(&_net, 0, sizeof(_net));
mazgch 75:ce6e12067d0c 573 _net.lac = 0xFFFF;
mazgch 75:ce6e12067d0c 574 _net.ci = 0xFFFFFFFF;
mazgch 21:c4d64830bf02 575 // check registration
mazgch 21:c4d64830bf02 576 sendFormated("AT+CREG?\r\n");
mazgch 88:135fb4bb7aac 577 waitFinalResp(); // don't fail as service could be not subscribed
mazgch 79:291df065e345 578 if (_dev.dev != DEV_LISA_C200) {
mazgch 79:291df065e345 579 // check PSD registration
mazgch 79:291df065e345 580 sendFormated("AT+CGREG?\r\n");
mazgch 88:135fb4bb7aac 581 waitFinalResp(); // don't fail as service could be not subscribed
mazgch 79:291df065e345 582 }
mazgch 79:291df065e345 583 if (REG_OK(_net.csd) || REG_OK(_net.psd))
mazgch 75:ce6e12067d0c 584 {
mazgch 75:ce6e12067d0c 585 // check modem specific status messages
mazgch 75:ce6e12067d0c 586 if (_dev.dev == DEV_LISA_C200) {
mazgch 75:ce6e12067d0c 587 sendFormated("AT+CSS?\r\n");
mazgch 75:ce6e12067d0c 588 if (RESP_OK != waitFinalResp())
mazgch 95:8282dbbe1492 589 goto failure;
mazgch 81:3966a5c17037 590 while (1) {
mazgch 81:3966a5c17037 591 // get the Telephone number
mazgch 81:3966a5c17037 592 sendFormated("AT$MDN?\r\n");
mazgch 81:3966a5c17037 593 if (RESP_OK != waitFinalResp(_cbString, _net.num))
mazgch 95:8282dbbe1492 594 goto failure;
mazgch 81:3966a5c17037 595 // check if we have a Mobile Directory Number
mazgch 81:3966a5c17037 596 if (*_net.num && (memcmp(_net.num, "000000", 6) != 0))
mazgch 81:3966a5c17037 597 break;
mazgch 81:3966a5c17037 598
mazgch 81:3966a5c17037 599 INFO("Device not yet activated\r\n");
mazgch 81:3966a5c17037 600 INFO("Make sure you have a valid contract with the network operator for this device.\r\n");
mazgch 81:3966a5c17037 601 // Check if the the version contains a V for Verizon
mazgch 81:3966a5c17037 602 // Verizon: E0.V.xx.00.xxR,
mazgch 81:3966a5c17037 603 // Sprint E0.S.xx.00.xxR
mazgch 81:3966a5c17037 604 if (_dev.ver[3] == 'V') {
mazgch 81:3966a5c17037 605 int i;
mazgch 81:3966a5c17037 606 INFO("Start device over-the-air activation (this can take a few minutes)\r\n");
mazgch 81:3966a5c17037 607 sendFormated("AT+CDV=*22899\r\n");
mazgch 81:3966a5c17037 608 i = 1;
mazgch 82:055dcfcf9dcc 609 if ((RESP_OK != waitFinalResp(_cbUACTIND, &i, 120*1000)) || (i == 1)) {
mazgch 81:3966a5c17037 610 ERROR("Device over-the-air activation failed\r\n");
mazgch 95:8282dbbe1492 611 goto failure;
mazgch 81:3966a5c17037 612 }
mazgch 81:3966a5c17037 613 INFO("Device over-the-air activation successful\r\n");
mazgch 81:3966a5c17037 614
mazgch 81:3966a5c17037 615 INFO("Start PRL over-the-air update (this can take a few minutes)\r\n");
mazgch 81:3966a5c17037 616 sendFormated("AT+CDV=*22891\r\n");
mazgch 81:3966a5c17037 617 i = 1;
mazgch 82:055dcfcf9dcc 618 if ((RESP_OK != waitFinalResp(_cbUACTIND, &i, 120*1000)) || (i == 1)) {
mazgch 81:3966a5c17037 619 ERROR("PRL over-the-air update failed\r\n");
mazgch 95:8282dbbe1492 620 goto failure;
mazgch 81:3966a5c17037 621 }
mazgch 81:3966a5c17037 622 INFO("PRL over-the-air update successful\r\n");
mazgch 81:3966a5c17037 623
mazgch 81:3966a5c17037 624 } else {
mazgch 81:3966a5c17037 625 // Sprint or Aeris
mazgch 81:3966a5c17037 626 INFO("Wait for OMA-DM over-the-air activation (this can take a few minutes)\r\n");
mazgch 95:8282dbbe1492 627 wait_ms(120*1000);
mazgch 81:3966a5c17037 628 }
mazgch 81:3966a5c17037 629 }
mazgch 75:ce6e12067d0c 630 // get the the Network access identifier string
mazgch 75:ce6e12067d0c 631 char nai[64];
mazgch 75:ce6e12067d0c 632 sendFormated("AT$QCMIPNAI?\r\n");
mazgch 75:ce6e12067d0c 633 if (RESP_OK != waitFinalResp(_cbString, nai))
mazgch 95:8282dbbe1492 634 goto failure;
mazgch 75:ce6e12067d0c 635 } else {
mazgch 75:ce6e12067d0c 636 sendFormated("AT+COPS?\r\n");
mazgch 75:ce6e12067d0c 637 if (RESP_OK != waitFinalResp(_cbCOPS, &_net))
mazgch 95:8282dbbe1492 638 goto failure;
mazgch 95:8282dbbe1492 639 // get the MSISDNs related to this subscriber
mazgch 75:ce6e12067d0c 640 sendFormated("AT+CNUM\r\n");
mazgch 75:ce6e12067d0c 641 if (RESP_OK != waitFinalResp(_cbCNUM, _net.num))
mazgch 95:8282dbbe1492 642 goto failure;
mazgch 75:ce6e12067d0c 643 }
mazgch 95:8282dbbe1492 644 // get the signal strength indication
mazgch 75:ce6e12067d0c 645 sendFormated("AT+CSQ\r\n");
mazgch 75:ce6e12067d0c 646 if (RESP_OK != waitFinalResp(_cbCSQ, &_net))
mazgch 95:8282dbbe1492 647 goto failure;
mazgch 75:ce6e12067d0c 648 }
mazgch 28:4d9509e3b1cf 649 if (status) {
mazgch 31:a0bed6c1e05d 650 memcpy(status, &_net, sizeof(NetStatus));
mazgch 25:4045d02e44f1 651 }
mazgch 95:8282dbbe1492 652 ok = REG_DONE(_net.csd) && REG_DONE(_net.psd);
mazgch 95:8282dbbe1492 653 UNLOCK();
mazgch 95:8282dbbe1492 654 return ok;
mazgch 95:8282dbbe1492 655 failure:
mazgch 95:8282dbbe1492 656 unlock();
mazgch 95:8282dbbe1492 657 return false;
mazgch 31:a0bed6c1e05d 658 }
mazgch 31:a0bed6c1e05d 659
mazgch 31:a0bed6c1e05d 660 int MDMParser::_cbCOPS(int type, const char* buf, int len, NetStatus* status)
mazgch 31:a0bed6c1e05d 661 {
mazgch 31:a0bed6c1e05d 662 if ((type == TYPE_PLUS) && status){
mazgch 31:a0bed6c1e05d 663 int act = 99;
mazgch 31:a0bed6c1e05d 664 // +COPS: <mode>[,<format>,<oper>[,<AcT>]]
mazgch 31:a0bed6c1e05d 665 if (sscanf(buf, "\r\n+COPS: %*d,%*d,\"%[^\"]\",%d",status->opr,&act) >= 1) {
mazgch 31:a0bed6c1e05d 666 if (act == 0) status->act = ACT_GSM; // 0: GSM,
mazgch 31:a0bed6c1e05d 667 else if (act == 2) status->act = ACT_UTRAN; // 2: UTRAN
mazgch 31:a0bed6c1e05d 668 }
mazgch 31:a0bed6c1e05d 669 }
mazgch 31:a0bed6c1e05d 670 return WAIT;
mazgch 31:a0bed6c1e05d 671 }
mazgch 31:a0bed6c1e05d 672
mazgch 31:a0bed6c1e05d 673 int MDMParser::_cbCNUM(int type, const char* buf, int len, char* num)
mazgch 31:a0bed6c1e05d 674 {
mazgch 31:a0bed6c1e05d 675 if ((type == TYPE_PLUS) && num){
mazgch 31:a0bed6c1e05d 676 int a;
mazgch 31:a0bed6c1e05d 677 if ((sscanf(buf, "\r\n+CNUM: \"My Number\",\"%31[^\"]\",%d", num, &a) == 2) &&
mazgch 31:a0bed6c1e05d 678 ((a == 129) || (a == 145))) {
mazgch 31:a0bed6c1e05d 679 }
mazgch 31:a0bed6c1e05d 680 }
mazgch 31:a0bed6c1e05d 681 return WAIT;
mazgch 31:a0bed6c1e05d 682 }
mazgch 31:a0bed6c1e05d 683
mazgch 54:7ba8e4c218e2 684 int MDMParser::_cbCSQ(int type, const char* buf, int len, NetStatus* status)
mazgch 31:a0bed6c1e05d 685 {
mazgch 54:7ba8e4c218e2 686 if ((type == TYPE_PLUS) && status){
mazgch 54:7ba8e4c218e2 687 int a,b;
mazgch 54:7ba8e4c218e2 688 char _ber[] = { 49, 43, 37, 25, 19, 13, 7, 0 }; // see 3GPP TS 45.008 [20] subclause 8.2.4
mazgch 31:a0bed6c1e05d 689 // +CSQ: <rssi>,<qual>
mazgch 54:7ba8e4c218e2 690 if (sscanf(buf, "\r\n+CSQ: %d,%d",&a,&b) == 2) {
mazgch 54:7ba8e4c218e2 691 if (a != 99) status->rssi = -113 + 2*a; // 0: -113 1: -111 ... 30: -53 dBm with 2 dBm steps
mazgch 54:7ba8e4c218e2 692 if ((b != 99) && (b < sizeof(_ber))) status->ber = _ber[b]; //
mazgch 31:a0bed6c1e05d 693 }
mazgch 31:a0bed6c1e05d 694 }
mazgch 31:a0bed6c1e05d 695 return WAIT;
mazgch 31:a0bed6c1e05d 696 }
mazgch 21:c4d64830bf02 697
mazgch 81:3966a5c17037 698 int MDMParser::_cbUACTIND(int type, const char* buf, int len, int* i)
mazgch 81:3966a5c17037 699 {
mazgch 81:3966a5c17037 700 if ((type == TYPE_PLUS) && i){
mazgch 82:055dcfcf9dcc 701 int a;
mazgch 82:055dcfcf9dcc 702 if (sscanf(buf, "\r\n+UACTIND: %d", &a) == 1) {
mazgch 82:055dcfcf9dcc 703 *i = a;
mazgch 81:3966a5c17037 704 }
mazgch 81:3966a5c17037 705 }
mazgch 81:3966a5c17037 706 return WAIT;
mazgch 81:3966a5c17037 707 }
mazgch 81:3966a5c17037 708
mazgch 21:c4d64830bf02 709 // ----------------------------------------------------------------
mazgch 21:c4d64830bf02 710 // internet connection
mazgch 21:c4d64830bf02 711
mazgch 79:291df065e345 712 MDMParser::IP MDMParser::join(const char* apn /*= NULL*/, const char* username /*= NULL*/,
mazgch 79:291df065e345 713 const char* password /*= NULL*/, Auth auth /*= AUTH_DETECT*/)
mazgch 21:c4d64830bf02 714 {
mazgch 95:8282dbbe1492 715 LOCK();
mazgch 78:caf0014375cb 716 INFO("Modem::join\r\n");
mazgch 32:8f12ac182bbb 717 _ip = NOIP;
mazgch 32:8f12ac182bbb 718 if (_dev.dev == DEV_LISA_C200) {
mazgch 76:f7c3dd568dae 719 // make a dumy dns lookup (which will fail, so ignore the result)
mazgch 76:f7c3dd568dae 720 sendFormated("AT+UDNSRN=0,\"u-blox.com\"\r\n");
mazgch 76:f7c3dd568dae 721 waitFinalResp();
mazgch 76:f7c3dd568dae 722 // This fake lookup will enable the IP connection and we
mazgch 76:f7c3dd568dae 723 // should have an IP after this, so we check it
mazgch 76:f7c3dd568dae 724
mazgch 21:c4d64830bf02 725 //Get local IP address
mazgch 21:c4d64830bf02 726 sendFormated("AT+CMIP?\r\n");
mazgch 52:8071747a7cb3 727 if (RESP_OK != waitFinalResp(_cbCMIP, &_ip))
mazgch 95:8282dbbe1492 728 goto failure;
mazgch 21:c4d64830bf02 729 } else {
mazgch 21:c4d64830bf02 730 // check gprs attach status
mazgch 72:d1e943ad6558 731 sendFormated("AT+CGATT=1\r\n");
mazgch 74:208e3e32d263 732 if (RESP_OK != waitFinalResp(NULL,NULL,3*60*1000))
mazgch 95:8282dbbe1492 733 goto failure;
mazgch 31:a0bed6c1e05d 734
mazgch 31:a0bed6c1e05d 735 // Check the profile
mazgch 31:a0bed6c1e05d 736 int a = 0;
mazgch 79:291df065e345 737 bool force = true;
mazgch 31:a0bed6c1e05d 738 sendFormated("AT+UPSND=" PROFILE ",8\r\n");
mazgch 52:8071747a7cb3 739 if (RESP_OK != waitFinalResp(_cbUPSND, &a))
mazgch 95:8282dbbe1492 740 goto failure;
mazgch 79:291df065e345 741 if (a == 1 && force) {
mazgch 31:a0bed6c1e05d 742 // disconnect the profile already if it is connected
mazgch 31:a0bed6c1e05d 743 sendFormated("AT+UPSDA=" PROFILE ",4\r\n");
mazgch 58:e38a2e942fbb 744 if (RESP_OK != waitFinalResp(NULL,NULL,40*1000))
mazgch 95:8282dbbe1492 745 goto failure;
mazgch 79:291df065e345 746 a = 0;
mazgch 31:a0bed6c1e05d 747 }
mazgch 79:291df065e345 748 if (a == 0) {
mazgch 84:a05edb010176 749 bool ok = false;
mazgch 84:a05edb010176 750 // try to lookup the apn settings from our local database by mccmnc
mazgch 84:a05edb010176 751 const char* config = NULL;
mazgch 88:135fb4bb7aac 752 if (!apn && !username && !password)
mazgch 88:135fb4bb7aac 753 config = apnconfig(_dev.imsi);
mazgch 84:a05edb010176 754
mazgch 79:291df065e345 755 // Set up the dynamic IP address assignment.
mazgch 79:291df065e345 756 sendFormated("AT+UPSD=" PROFILE ",7,\"0.0.0.0\"\r\n");
mazgch 52:8071747a7cb3 757 if (RESP_OK != waitFinalResp())
mazgch 95:8282dbbe1492 758 goto failure;
mazgch 84:a05edb010176 759
mazgch 84:a05edb010176 760 do {
mazgch 84:a05edb010176 761 if (config) {
mazgch 85:dd8f4f0d0ca9 762 apn = _APN_GET(config);
mazgch 85:dd8f4f0d0ca9 763 username = _APN_GET(config);
mazgch 85:dd8f4f0d0ca9 764 password = _APN_GET(config);
mazgch 84:a05edb010176 765 TRACE("Testing APN Settings(\"%s\",\"%s\",\"%s\")\r\n", apn, username, password);
mazgch 79:291df065e345 766 }
mazgch 84:a05edb010176 767 // Set up the APN
mazgch 90:3915192f6d7e 768 if (apn && *apn) {
mazgch 90:3915192f6d7e 769 sendFormated("AT+UPSD=" PROFILE ",1,\"%s\"\r\n", apn);
mazgch 90:3915192f6d7e 770 if (RESP_OK != waitFinalResp())
mazgch 95:8282dbbe1492 771 goto failure;
mazgch 90:3915192f6d7e 772 }
mazgch 90:3915192f6d7e 773 if (username && *username) {
mazgch 90:3915192f6d7e 774 sendFormated("AT+UPSD=" PROFILE ",2,\"%s\"\r\n", username);
mazgch 90:3915192f6d7e 775 if (RESP_OK != waitFinalResp())
mazgch 95:8282dbbe1492 776 goto failure;
mazgch 90:3915192f6d7e 777 }
mazgch 90:3915192f6d7e 778 if (password && *password) {
mazgch 90:3915192f6d7e 779 sendFormated("AT+UPSD=" PROFILE ",3,\"%s\"\r\n", password);
mazgch 90:3915192f6d7e 780 if (RESP_OK != waitFinalResp())
mazgch 95:8282dbbe1492 781 goto failure;
mazgch 90:3915192f6d7e 782 }
mazgch 84:a05edb010176 783 // try different Authentication Protocols
mazgch 84:a05edb010176 784 // 0 = none
mazgch 84:a05edb010176 785 // 1 = PAP (Password Authentication Protocol)
mazgch 84:a05edb010176 786 // 2 = CHAP (Challenge Handshake Authentication Protocol)
mazgch 84:a05edb010176 787 for (int i = AUTH_NONE; i <= AUTH_CHAP && !ok; i ++) {
mazgch 84:a05edb010176 788 if ((auth == AUTH_DETECT) || (auth == i)) {
mazgch 84:a05edb010176 789 // Set up the Authentication Protocol
mazgch 84:a05edb010176 790 sendFormated("AT+UPSD=" PROFILE ",6,%d\r\n", i);
mazgch 84:a05edb010176 791 if (RESP_OK != waitFinalResp())
mazgch 95:8282dbbe1492 792 goto failure;
mazgch 84:a05edb010176 793 // Activate the profile and make connection
mazgch 84:a05edb010176 794 sendFormated("AT+UPSDA=" PROFILE ",3\r\n");
mazgch 84:a05edb010176 795 if (RESP_OK == waitFinalResp(NULL,NULL,150*1000))
mazgch 84:a05edb010176 796 ok = true;
mazgch 84:a05edb010176 797 }
mazgch 84:a05edb010176 798 }
mazgch 99:3116d3e900ed 799 } while (!ok && config && *config); // maybe use next setting ?
mazgch 84:a05edb010176 800 if (!ok) {
mazgch 79:291df065e345 801 ERROR("Your modem APN/password/username may be wrong\r\n");
mazgch 95:8282dbbe1492 802 goto failure;
mazgch 79:291df065e345 803 }
mazgch 74:208e3e32d263 804 }
mazgch 21:c4d64830bf02 805 //Get local IP address
mazgch 21:c4d64830bf02 806 sendFormated("AT+UPSND=" PROFILE ",0\r\n");
mazgch 52:8071747a7cb3 807 if (RESP_OK != waitFinalResp(_cbUPSND, &_ip))
mazgch 95:8282dbbe1492 808 goto failure;
mazgch 31:a0bed6c1e05d 809 }
mazgch 95:8282dbbe1492 810 UNLOCK();
mazgch 32:8f12ac182bbb 811 return _ip;
mazgch 95:8282dbbe1492 812 failure:
mazgch 95:8282dbbe1492 813 unlock();
mazgch 95:8282dbbe1492 814 return NOIP;
mazgch 31:a0bed6c1e05d 815 }
mazgch 31:a0bed6c1e05d 816
mazgch 84:a05edb010176 817 int MDMParser::_cbUDOPN(int type, const char* buf, int len, char* mccmnc)
mazgch 84:a05edb010176 818 {
mazgch 84:a05edb010176 819 if ((type == TYPE_PLUS) && mccmnc) {
mazgch 84:a05edb010176 820 if (sscanf(buf, "\r\n+UDOPN: 0,\"%[^\"]\"", mccmnc) == 1)
mazgch 84:a05edb010176 821 ;
mazgch 84:a05edb010176 822 }
mazgch 84:a05edb010176 823 return WAIT;
mazgch 84:a05edb010176 824 }
mazgch 84:a05edb010176 825
mazgch 32:8f12ac182bbb 826 int MDMParser::_cbCMIP(int type, const char* buf, int len, IP* ip)
mazgch 32:8f12ac182bbb 827 {
mazgch 102:fb982ff9da82 828 if ((type == TYPE_UNKNOWN) && ip) {
mazgch 32:8f12ac182bbb 829 int a,b,c,d;
mazgch 102:fb982ff9da82 830 if (sscanf(buf, "\r\n" IPSTR, &a,&b,&c,&d) == 4)
mazgch 32:8f12ac182bbb 831 *ip = IPADR(a,b,c,d);
mazgch 32:8f12ac182bbb 832 }
mazgch 32:8f12ac182bbb 833 return WAIT;
mazgch 32:8f12ac182bbb 834 }
mazgch 32:8f12ac182bbb 835
mazgch 31:a0bed6c1e05d 836 int MDMParser::_cbUPSND(int type, const char* buf, int len, int* act)
mazgch 31:a0bed6c1e05d 837 {
mazgch 31:a0bed6c1e05d 838 if ((type == TYPE_PLUS) && act) {
mazgch 31:a0bed6c1e05d 839 if (sscanf(buf, "\r\n+UPSND: %*d,%*d,%d", act) == 1)
mazgch 31:a0bed6c1e05d 840 /*nothing*/;
mazgch 21:c4d64830bf02 841 }
mazgch 31:a0bed6c1e05d 842 return WAIT;
mazgch 31:a0bed6c1e05d 843 }
mazgch 31:a0bed6c1e05d 844
mazgch 31:a0bed6c1e05d 845 int MDMParser::_cbUPSND(int type, const char* buf, int len, IP* ip)
mazgch 31:a0bed6c1e05d 846 {
mazgch 31:a0bed6c1e05d 847 if ((type == TYPE_PLUS) && ip) {
mazgch 31:a0bed6c1e05d 848 int a,b,c,d;
mazgch 31:a0bed6c1e05d 849 // +UPSND=<profile_id>,<param_tag>[,<dynamic_param_val>]
mazgch 31:a0bed6c1e05d 850 if (sscanf(buf, "\r\n+UPSND: " PROFILE ",0,\"" IPSTR "\"", &a,&b,&c,&d) == 4)
mazgch 31:a0bed6c1e05d 851 *ip = IPADR(a,b,c,d);
mazgch 31:a0bed6c1e05d 852 }
mazgch 31:a0bed6c1e05d 853 return WAIT;
mazgch 31:a0bed6c1e05d 854 }
mazgch 31:a0bed6c1e05d 855
mazgch 31:a0bed6c1e05d 856 int MDMParser::_cbUDNSRN(int type, const char* buf, int len, IP* ip)
mazgch 31:a0bed6c1e05d 857 {
mazgch 31:a0bed6c1e05d 858 if ((type == TYPE_PLUS) && ip) {
mazgch 31:a0bed6c1e05d 859 int a,b,c,d;
mazgch 95:8282dbbe1492 860 if (sscanf(buf, "\r\n+UDNSRN: \"" IPSTR "\"", &a,&b,&c,&d) == 4)
mazgch 31:a0bed6c1e05d 861 *ip = IPADR(a,b,c,d);
mazgch 31:a0bed6c1e05d 862 }
mazgch 31:a0bed6c1e05d 863 return WAIT;
mazgch 21:c4d64830bf02 864 }
mazgch 21:c4d64830bf02 865
mazgch 21:c4d64830bf02 866 bool MDMParser::disconnect(void)
mazgch 21:c4d64830bf02 867 {
mazgch 95:8282dbbe1492 868 bool ok = false;
mazgch 95:8282dbbe1492 869 LOCK();
mazgch 74:208e3e32d263 870 INFO("Modem::disconnect\r\n");
mazgch 95:8282dbbe1492 871 if (_ip != NOIP) {
mazgch 95:8282dbbe1492 872 if (_dev.dev == DEV_LISA_C200) {
mazgch 95:8282dbbe1492 873 // There something to do here
mazgch 95:8282dbbe1492 874 _ip = NOIP;
mazgch 95:8282dbbe1492 875 ok = true;
mazgch 95:8282dbbe1492 876 } else {
mazgch 95:8282dbbe1492 877 sendFormated("AT+UPSDA=" PROFILE ",4\r\n");
mazgch 95:8282dbbe1492 878 if (RESP_OK != waitFinalResp()) {
mazgch 95:8282dbbe1492 879 _ip = NOIP;
mazgch 95:8282dbbe1492 880 ok = true;
mazgch 95:8282dbbe1492 881 }
mazgch 95:8282dbbe1492 882 }
mazgch 21:c4d64830bf02 883 }
mazgch 95:8282dbbe1492 884 UNLOCK();
mazgch 95:8282dbbe1492 885 return ok;
mazgch 21:c4d64830bf02 886 }
mazgch 21:c4d64830bf02 887
mazgch 31:a0bed6c1e05d 888 MDMParser::IP MDMParser::gethostbyname(const char* host)
mazgch 21:c4d64830bf02 889 {
mazgch 31:a0bed6c1e05d 890 IP ip = NOIP;
mazgch 31:a0bed6c1e05d 891 int a,b,c,d;
mazgch 31:a0bed6c1e05d 892 if (sscanf(host, IPSTR, &a,&b,&c,&d) == 4)
mazgch 31:a0bed6c1e05d 893 ip = IPADR(a,b,c,d);
mazgch 31:a0bed6c1e05d 894 else {
mazgch 95:8282dbbe1492 895 LOCK();
mazgch 31:a0bed6c1e05d 896 sendFormated("AT+UDNSRN=0,\"%s\"\r\n", host);
mazgch 52:8071747a7cb3 897 if (RESP_OK != waitFinalResp(_cbUDNSRN, &ip))
mazgch 95:8282dbbe1492 898 ip = NOIP;
mazgch 95:8282dbbe1492 899 UNLOCK();
mazgch 21:c4d64830bf02 900 }
mazgch 31:a0bed6c1e05d 901 return ip;
mazgch 21:c4d64830bf02 902 }
mazgch 21:c4d64830bf02 903
mazgch 21:c4d64830bf02 904 // ----------------------------------------------------------------
mazgch 21:c4d64830bf02 905 // sockets
mazgch 21:c4d64830bf02 906
mazgch 103:197fa7920ad8 907 int MDMParser::_cbUSOCR(int type, const char* buf, int len, int* handle)
mazgch 21:c4d64830bf02 908 {
mazgch 103:197fa7920ad8 909 if ((type == TYPE_PLUS) && handle) {
mazgch 108:254bf037f83f 910 // +USOCR: socket
mazgch 108:254bf037f83f 911 if (sscanf(buf, "\r\n+USOCR: %d", handle) == 1)
mazgch 108:254bf037f83f 912 /*nothing*/;
mazgch 21:c4d64830bf02 913 }
mazgch 21:c4d64830bf02 914 return WAIT;
mazgch 21:c4d64830bf02 915 }
mazgch 21:c4d64830bf02 916
mazgch 63:42cb563a25bc 917 int MDMParser::socketSocket(IpProtocol ipproto, int port)
mazgch 21:c4d64830bf02 918 {
mazgch 103:197fa7920ad8 919 int socket;
mazgch 95:8282dbbe1492 920 LOCK();
mazgch 103:197fa7920ad8 921 // find an free socket
mazgch 103:197fa7920ad8 922 socket = _findSocket();
mazgch 47:9a89e5195721 923 TRACE("socketSocket(%d)\r\n", ipproto);
mazgch 95:8282dbbe1492 924 if (socket != SOCKET_ERROR) {
mazgch 106:18aeacdae391 925 if (ipproto == IPPROTO_UDP) {
mazgch 106:18aeacdae391 926 // sending port can only be set on 2G/3G modules
mazgch 106:18aeacdae391 927 if ((port != -1) && (_dev.dev != DEV_LISA_C200)) {
mazgch 106:18aeacdae391 928 sendFormated("AT+USOCR=17,%d\r\n", port);
mazgch 106:18aeacdae391 929 } else {
mazgch 106:18aeacdae391 930 sendFormated("AT+USOCR=17\r\n");
mazgch 106:18aeacdae391 931 }
mazgch 103:197fa7920ad8 932 } else /*(ipproto == IPPROTO_TCP)*/ {
mazgch 103:197fa7920ad8 933 sendFormated("AT+USOCR=6\r\n");
mazgch 103:197fa7920ad8 934 }
mazgch 103:197fa7920ad8 935 int handle = SOCKET_ERROR;
mazgch 103:197fa7920ad8 936 if ((RESP_OK == waitFinalResp(_cbUSOCR, &handle)) &&
mazgch 103:197fa7920ad8 937 (handle != SOCKET_ERROR)) {
mazgch 103:197fa7920ad8 938 TRACE("Socket %d: handle %d was created\r\n", socket, handle);
mazgch 103:197fa7920ad8 939 _sockets[socket].handle = handle;
mazgch 103:197fa7920ad8 940 _sockets[socket].timeout_ms = TIMEOUT_BLOCKING;
mazgch 103:197fa7920ad8 941 _sockets[socket].connected = false;
mazgch 103:197fa7920ad8 942 _sockets[socket].pending = 0;
mazgch 103:197fa7920ad8 943 }
mazgch 103:197fa7920ad8 944 else
mazgch 103:197fa7920ad8 945 socket = SOCKET_ERROR;
mazgch 95:8282dbbe1492 946 }
mazgch 95:8282dbbe1492 947 UNLOCK();
mazgch 21:c4d64830bf02 948 return socket;
mazgch 21:c4d64830bf02 949 }
mazgch 21:c4d64830bf02 950
mazgch 21:c4d64830bf02 951 bool MDMParser::socketConnect(int socket, const char * host, int port)
mazgch 21:c4d64830bf02 952 {
mazgch 31:a0bed6c1e05d 953 IP ip = gethostbyname(host);
mazgch 31:a0bed6c1e05d 954 if (ip == NOIP)
mazgch 21:c4d64830bf02 955 return false;
mazgch 21:c4d64830bf02 956 // connect to socket
mazgch 95:8282dbbe1492 957 bool ok = false;
mazgch 95:8282dbbe1492 958 LOCK();
mazgch 103:197fa7920ad8 959 if (ISSOCKET(socket) && (!_sockets[socket].connected)) {
mazgch 95:8282dbbe1492 960 TRACE("socketConnect(%d,%s,%d)\r\n", socket,host,port);
mazgch 103:197fa7920ad8 961 sendFormated("AT+USOCO=%d,\"" IPSTR "\",%d\r\n", _sockets[socket].handle, IPNUM(ip), port);
mazgch 95:8282dbbe1492 962 if (RESP_OK == waitFinalResp())
mazgch 103:197fa7920ad8 963 ok = _sockets[socket].connected = true;
mazgch 95:8282dbbe1492 964 }
mazgch 95:8282dbbe1492 965 UNLOCK();
mazgch 95:8282dbbe1492 966 return ok;
mazgch 21:c4d64830bf02 967 }
mazgch 21:c4d64830bf02 968
mazgch 44:9d12223b78ff 969 bool MDMParser::socketIsConnected(int socket)
mazgch 44:9d12223b78ff 970 {
mazgch 95:8282dbbe1492 971 bool ok = false;
mazgch 95:8282dbbe1492 972 LOCK();
mazgch 103:197fa7920ad8 973 ok = ISSOCKET(socket) && _sockets[socket].connected;
mazgch 107:436ee320efd6 974 TRACE("socketIsConnected(%d) %s\r\n", socket, ok?"yes":"no");
mazgch 95:8282dbbe1492 975 UNLOCK();
mazgch 95:8282dbbe1492 976 return ok;
mazgch 44:9d12223b78ff 977 }
mazgch 44:9d12223b78ff 978
mazgch 66:69072b3c5bca 979 bool MDMParser::socketSetBlocking(int socket, int timeout_ms)
mazgch 44:9d12223b78ff 980 {
mazgch 95:8282dbbe1492 981 bool ok = false;
mazgch 95:8282dbbe1492 982 LOCK();
mazgch 103:197fa7920ad8 983 TRACE("socketSetBlocking(%d,%d)\r\n", socket,timeout_ms);
mazgch 95:8282dbbe1492 984 if (ISSOCKET(socket)) {
mazgch 95:8282dbbe1492 985 _sockets[socket].timeout_ms = timeout_ms;
mazgch 95:8282dbbe1492 986 ok = true;
mazgch 95:8282dbbe1492 987 }
mazgch 95:8282dbbe1492 988 UNLOCK();
mazgch 95:8282dbbe1492 989 return ok;
mazgch 44:9d12223b78ff 990 }
mazgch 44:9d12223b78ff 991
mazgch 21:c4d64830bf02 992 bool MDMParser::socketClose(int socket)
mazgch 21:c4d64830bf02 993 {
mazgch 95:8282dbbe1492 994 bool ok = false;
mazgch 95:8282dbbe1492 995 LOCK();
mazgch 103:197fa7920ad8 996 if (ISSOCKET(socket) && _sockets[socket].connected) {
mazgch 95:8282dbbe1492 997 TRACE("socketClose(%d)\r\n", socket);
mazgch 103:197fa7920ad8 998 sendFormated("AT+USOCL=%d\r\n", _sockets[socket].handle);
mazgch 95:8282dbbe1492 999 if (RESP_OK == waitFinalResp()) {
mazgch 103:197fa7920ad8 1000 _sockets[socket].connected = false;
mazgch 95:8282dbbe1492 1001 ok = true;
mazgch 95:8282dbbe1492 1002 }
mazgch 95:8282dbbe1492 1003 }
mazgch 95:8282dbbe1492 1004 UNLOCK();
mazgch 95:8282dbbe1492 1005 return ok;
mazgch 21:c4d64830bf02 1006 }
mazgch 21:c4d64830bf02 1007
mazgch 21:c4d64830bf02 1008 bool MDMParser::socketFree(int socket)
mazgch 21:c4d64830bf02 1009 {
mazgch 95:8282dbbe1492 1010 // make sure it is closed
mazgch 21:c4d64830bf02 1011 socketClose(socket);
mazgch 95:8282dbbe1492 1012 bool ok = true;
mazgch 95:8282dbbe1492 1013 LOCK();
mazgch 103:197fa7920ad8 1014 if (ISSOCKET(socket)) {
mazgch 103:197fa7920ad8 1015 TRACE("socketFree(%d)\r\n", socket);
mazgch 103:197fa7920ad8 1016 _sockets[socket].handle = SOCKET_ERROR;
mazgch 103:197fa7920ad8 1017 _sockets[socket].timeout_ms = TIMEOUT_BLOCKING;
mazgch 103:197fa7920ad8 1018 _sockets[socket].connected = false;
mazgch 103:197fa7920ad8 1019 _sockets[socket].pending = 0;
mazgch 95:8282dbbe1492 1020 ok = true;
mazgch 95:8282dbbe1492 1021 }
mazgch 95:8282dbbe1492 1022 UNLOCK();
mazgch 95:8282dbbe1492 1023 return ok;
mazgch 21:c4d64830bf02 1024 }
mazgch 21:c4d64830bf02 1025
mazgch 69:4d6fa520dfca 1026 #define USO_MAX_WRITE 1024 //!< maximum number of bytes to write to socket
mazgch 69:4d6fa520dfca 1027
mazgch 21:c4d64830bf02 1028 int MDMParser::socketSend(int socket, const char * buf, int len)
mazgch 21:c4d64830bf02 1029 {
mazgch 47:9a89e5195721 1030 TRACE("socketSend(%d,,%d)\r\n", socket,len);
mazgch 68:33a96cf64986 1031 int cnt = len;
mazgch 68:33a96cf64986 1032 while (cnt > 0) {
mazgch 69:4d6fa520dfca 1033 int blk = USO_MAX_WRITE;
mazgch 68:33a96cf64986 1034 if (cnt < blk)
mazgch 68:33a96cf64986 1035 blk = cnt;
mazgch 95:8282dbbe1492 1036 bool ok = false;
mazgch 95:8282dbbe1492 1037 LOCK();
mazgch 103:197fa7920ad8 1038 if (ISSOCKET(socket)) {
mazgch 103:197fa7920ad8 1039 sendFormated("AT+USOWR=%d,%d\r\n",_sockets[socket].handle,blk);
mazgch 103:197fa7920ad8 1040 if (RESP_PROMPT == waitFinalResp()) {
mazgch 103:197fa7920ad8 1041 wait_ms(50);
mazgch 103:197fa7920ad8 1042 send(buf, blk);
mazgch 103:197fa7920ad8 1043 if (RESP_OK == waitFinalResp())
mazgch 103:197fa7920ad8 1044 ok = true;
mazgch 103:197fa7920ad8 1045 }
mazgch 95:8282dbbe1492 1046 }
mazgch 95:8282dbbe1492 1047 UNLOCK();
mazgch 95:8282dbbe1492 1048 if (!ok)
mazgch 21:c4d64830bf02 1049 return SOCKET_ERROR;
mazgch 68:33a96cf64986 1050 buf += blk;
mazgch 68:33a96cf64986 1051 cnt -= blk;
mazgch 21:c4d64830bf02 1052 }
mazgch 68:33a96cf64986 1053 return (len - cnt);
mazgch 21:c4d64830bf02 1054 }
mazgch 21:c4d64830bf02 1055
mazgch 21:c4d64830bf02 1056 int MDMParser::socketSendTo(int socket, IP ip, int port, const char * buf, int len)
mazgch 21:c4d64830bf02 1057 {
mazgch 103:197fa7920ad8 1058 TRACE("socketSendTo(%d," IPSTR ",%d,,%d)\r\n", socket,IPNUM(ip),port,len);
mazgch 68:33a96cf64986 1059 int cnt = len;
mazgch 68:33a96cf64986 1060 while (cnt > 0) {
mazgch 69:4d6fa520dfca 1061 int blk = USO_MAX_WRITE;
mazgch 68:33a96cf64986 1062 if (cnt < blk)
mazgch 68:33a96cf64986 1063 blk = cnt;
mazgch 95:8282dbbe1492 1064 bool ok = false;
mazgch 95:8282dbbe1492 1065 LOCK();
mazgch 103:197fa7920ad8 1066 if (ISSOCKET(socket)) {
mazgch 103:197fa7920ad8 1067 sendFormated("AT+USOST=%d,\"" IPSTR "\",%d,%d\r\n",_sockets[socket].handle,IPNUM(ip),port,blk);
mazgch 103:197fa7920ad8 1068 if (RESP_PROMPT == waitFinalResp()) {
mazgch 103:197fa7920ad8 1069 wait_ms(50);
mazgch 103:197fa7920ad8 1070 send(buf, blk);
mazgch 103:197fa7920ad8 1071 if (RESP_OK == waitFinalResp())
mazgch 103:197fa7920ad8 1072 ok = true;
mazgch 103:197fa7920ad8 1073 }
mazgch 95:8282dbbe1492 1074 }
mazgch 95:8282dbbe1492 1075 UNLOCK();
mazgch 95:8282dbbe1492 1076 if (!ok)
mazgch 21:c4d64830bf02 1077 return SOCKET_ERROR;
mazgch 68:33a96cf64986 1078 buf += blk;
mazgch 68:33a96cf64986 1079 cnt -= blk;
mazgch 21:c4d64830bf02 1080 }
mazgch 68:33a96cf64986 1081 return (len - cnt);
mazgch 21:c4d64830bf02 1082 }
mazgch 21:c4d64830bf02 1083
mazgch 21:c4d64830bf02 1084 int MDMParser::socketReadable(int socket)
mazgch 21:c4d64830bf02 1085 {
mazgch 95:8282dbbe1492 1086 int pending = SOCKET_ERROR;
mazgch 95:8282dbbe1492 1087 LOCK();
mazgch 103:197fa7920ad8 1088 if (ISSOCKET(socket) && _sockets[socket].connected) {
mazgch 95:8282dbbe1492 1089 TRACE("socketReadable(%d)\r\n", socket);
mazgch 95:8282dbbe1492 1090 // allow to receive unsolicited commands
mazgch 95:8282dbbe1492 1091 waitFinalResp(NULL, NULL, 0);
mazgch 103:197fa7920ad8 1092 if (_sockets[socket].connected)
mazgch 95:8282dbbe1492 1093 pending = _sockets[socket].pending;
mazgch 95:8282dbbe1492 1094 }
mazgch 95:8282dbbe1492 1095 UNLOCK();
mazgch 95:8282dbbe1492 1096 return pending;
mazgch 21:c4d64830bf02 1097 }
mazgch 21:c4d64830bf02 1098
mazgch 21:c4d64830bf02 1099 int MDMParser::_cbUSORD(int type, const char* buf, int len, char* out)
mazgch 21:c4d64830bf02 1100 {
mazgch 21:c4d64830bf02 1101 if ((type == TYPE_PLUS) && out) {
mazgch 21:c4d64830bf02 1102 int sz, sk;
mazgch 21:c4d64830bf02 1103 if ((sscanf(buf, "\r\n+USORD: %d,%d,", &sk, &sz) == 2) &&
mazgch 21:c4d64830bf02 1104 (buf[len-sz-2] == '\"') && (buf[len-1] == '\"')) {
mazgch 21:c4d64830bf02 1105 memcpy(out, &buf[len-1-sz], sz);
mazgch 21:c4d64830bf02 1106 }
mazgch 21:c4d64830bf02 1107 }
mazgch 21:c4d64830bf02 1108 return WAIT;
mazgch 21:c4d64830bf02 1109 }
mazgch 21:c4d64830bf02 1110
mazgch 21:c4d64830bf02 1111 int MDMParser::socketRecv(int socket, char* buf, int len)
mazgch 21:c4d64830bf02 1112 {
mazgch 21:c4d64830bf02 1113 int cnt = 0;
mazgch 47:9a89e5195721 1114 TRACE("socketRecv(%d,,%d)\r\n", socket, len);
mazgch 95:8282dbbe1492 1115 #ifdef MDM_DEBUG
mazgch 21:c4d64830bf02 1116 memset(buf, '\0', len);
mazgch 95:8282dbbe1492 1117 #endif
mazgch 44:9d12223b78ff 1118 Timer timer;
mazgch 44:9d12223b78ff 1119 timer.start();
mazgch 21:c4d64830bf02 1120 while (len) {
mazgch 69:4d6fa520dfca 1121 int blk = MAX_SIZE; // still need space for headers and unsolicited commands
mazgch 21:c4d64830bf02 1122 if (len < blk) blk = len;
mazgch 95:8282dbbe1492 1123 bool ok = false;
mazgch 95:8282dbbe1492 1124 LOCK();
mazgch 95:8282dbbe1492 1125 if (ISSOCKET(socket)) {
mazgch 103:197fa7920ad8 1126 if (_sockets[socket].connected) {
mazgch 95:8282dbbe1492 1127 if (_sockets[socket].pending < blk)
mazgch 95:8282dbbe1492 1128 blk = _sockets[socket].pending;
mazgch 95:8282dbbe1492 1129 if (blk > 0) {
mazgch 103:197fa7920ad8 1130 sendFormated("AT+USORD=%d,%d\r\n",_sockets[socket].handle, blk);
mazgch 95:8282dbbe1492 1131 if (RESP_OK == waitFinalResp(_cbUSORD, buf)) {
mazgch 95:8282dbbe1492 1132 _sockets[socket].pending -= blk;
mazgch 95:8282dbbe1492 1133 len -= blk;
mazgch 95:8282dbbe1492 1134 cnt += blk;
mazgch 95:8282dbbe1492 1135 buf += blk;
mazgch 95:8282dbbe1492 1136 ok = true;
mazgch 95:8282dbbe1492 1137 }
mazgch 95:8282dbbe1492 1138 } else if (!TIMEOUT(timer, _sockets[socket].timeout_ms)) {
mazgch 95:8282dbbe1492 1139 ok = (WAIT == waitFinalResp(NULL,NULL,0)); // wait for URCs
mazgch 95:8282dbbe1492 1140 } else {
mazgch 95:8282dbbe1492 1141 len = 0;
mazgch 95:8282dbbe1492 1142 ok = true;
mazgch 95:8282dbbe1492 1143 }
mazgch 103:197fa7920ad8 1144 } else {
mazgch 95:8282dbbe1492 1145 len = 0;
mazgch 95:8282dbbe1492 1146 ok = true;
mazgch 21:c4d64830bf02 1147 }
mazgch 21:c4d64830bf02 1148 }
mazgch 95:8282dbbe1492 1149 UNLOCK();
mazgch 107:436ee320efd6 1150 if (!ok) {
mazgch 107:436ee320efd6 1151 TRACE("socketRecv: ERROR\r\n");
mazgch 95:8282dbbe1492 1152 return SOCKET_ERROR;
mazgch 107:436ee320efd6 1153 }
mazgch 21:c4d64830bf02 1154 }
mazgch 107:436ee320efd6 1155 TRACE("socketRecv: %d \"%*s\"\r\n", cnt, cnt, buf-cnt);
mazgch 21:c4d64830bf02 1156 return cnt;
mazgch 21:c4d64830bf02 1157 }
mazgch 21:c4d64830bf02 1158
mazgch 21:c4d64830bf02 1159 int MDMParser::_cbUSORF(int type, const char* buf, int len, USORFparam* param)
mazgch 21:c4d64830bf02 1160 {
mazgch 21:c4d64830bf02 1161 if ((type == TYPE_PLUS) && param) {
mazgch 21:c4d64830bf02 1162 int sz, sk, p, a,b,c,d;
mazgch 95:8282dbbe1492 1163 int r = sscanf(buf, "\r\n+USORF: %d,\"" IPSTR "\",%d,%d,",
mazgch 95:8282dbbe1492 1164 &sk,&a,&b,&c,&d,&p,&sz);
mazgch 95:8282dbbe1492 1165 if ((r == 7) && (buf[len-sz-2] == '\"') && (buf[len-1] == '\"')) {
mazgch 21:c4d64830bf02 1166 memcpy(param->buf, &buf[len-1-sz], sz);
mazgch 21:c4d64830bf02 1167 param->ip = IPADR(a,b,c,d);
mazgch 21:c4d64830bf02 1168 param->port = p;
mazgch 21:c4d64830bf02 1169 }
mazgch 21:c4d64830bf02 1170 }
mazgch 21:c4d64830bf02 1171 return WAIT;
mazgch 21:c4d64830bf02 1172 }
mazgch 21:c4d64830bf02 1173
mazgch 63:42cb563a25bc 1174 int MDMParser::socketRecvFrom(int socket, IP* ip, int* port, char* buf, int len)
mazgch 21:c4d64830bf02 1175 {
mazgch 21:c4d64830bf02 1176 int cnt = 0;
mazgch 63:42cb563a25bc 1177 TRACE("socketRecvFrom(%d,,%d)\r\n", socket, len);
mazgch 95:8282dbbe1492 1178 #ifdef MDM_DEBUG
mazgch 21:c4d64830bf02 1179 memset(buf, '\0', len);
mazgch 95:8282dbbe1492 1180 #endif
mazgch 44:9d12223b78ff 1181 Timer timer;
mazgch 44:9d12223b78ff 1182 timer.start();
mazgch 21:c4d64830bf02 1183 while (len) {
mazgch 69:4d6fa520dfca 1184 int blk = MAX_SIZE; // still need space for headers and unsolicited commands
mazgch 21:c4d64830bf02 1185 if (len < blk) blk = len;
mazgch 95:8282dbbe1492 1186 bool ok = false;
mazgch 95:8282dbbe1492 1187 LOCK();
mazgch 95:8282dbbe1492 1188 if (ISSOCKET(socket)) {
mazgch 95:8282dbbe1492 1189 if (_sockets[socket].pending < blk)
mazgch 95:8282dbbe1492 1190 blk = _sockets[socket].pending;
mazgch 95:8282dbbe1492 1191 if (blk > 0) {
mazgch 103:197fa7920ad8 1192 sendFormated("AT+USORF=%d,%d\r\n",_sockets[socket].handle, blk);
mazgch 95:8282dbbe1492 1193 USORFparam param;
mazgch 95:8282dbbe1492 1194 param.buf = buf;
mazgch 95:8282dbbe1492 1195 if (RESP_OK == waitFinalResp(_cbUSORF, &param)) {
mazgch 95:8282dbbe1492 1196 _sockets[socket].pending -= blk;
mazgch 95:8282dbbe1492 1197 *ip = param.ip;
mazgch 95:8282dbbe1492 1198 *port = param.port;
mazgch 95:8282dbbe1492 1199 len -= blk;
mazgch 95:8282dbbe1492 1200 cnt += blk;
mazgch 95:8282dbbe1492 1201 buf += blk;
mazgch 95:8282dbbe1492 1202 len = 0; // done
mazgch 95:8282dbbe1492 1203 ok = true;
mazgch 95:8282dbbe1492 1204 }
mazgch 95:8282dbbe1492 1205 } else if (!TIMEOUT(timer, _sockets[socket].timeout_ms)) {
mazgch 95:8282dbbe1492 1206 ok = (WAIT == waitFinalResp(NULL,NULL,0)); // wait for URCs
mazgch 95:8282dbbe1492 1207 } else {
mazgch 95:8282dbbe1492 1208 len = 0; // no more data and socket closed or timed-out
mazgch 95:8282dbbe1492 1209 ok = true;
mazgch 21:c4d64830bf02 1210 }
mazgch 95:8282dbbe1492 1211 }
mazgch 95:8282dbbe1492 1212 UNLOCK();
mazgch 107:436ee320efd6 1213 if (!ok) {
mazgch 107:436ee320efd6 1214 TRACE("socketRecv: ERROR\r\n");
mazgch 95:8282dbbe1492 1215 return SOCKET_ERROR;
mazgch 107:436ee320efd6 1216 }
mazgch 21:c4d64830bf02 1217 }
mazgch 44:9d12223b78ff 1218 timer.stop();
mazgch 44:9d12223b78ff 1219 timer.reset();
mazgch 107:436ee320efd6 1220 TRACE("socketRecv: %d \"%*s\"\r\n", cnt, cnt, buf-cnt);
mazgch 21:c4d64830bf02 1221 return cnt;
mazgch 21:c4d64830bf02 1222 }
mazgch 21:c4d64830bf02 1223
mazgch 103:197fa7920ad8 1224 int MDMParser::_findSocket(int handle) {
mazgch 104:c64ba749a422 1225 for (int socket = 0; socket < NUMSOCKETS; socket ++) {
mazgch 103:197fa7920ad8 1226 if (_sockets[socket].handle == handle)
mazgch 103:197fa7920ad8 1227 return socket;
mazgch 103:197fa7920ad8 1228 }
mazgch 103:197fa7920ad8 1229 return SOCKET_ERROR;
mazgch 103:197fa7920ad8 1230 }
mazgch 103:197fa7920ad8 1231
mazgch 21:c4d64830bf02 1232 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 1233
mazgch 31:a0bed6c1e05d 1234 int MDMParser::_cbCMGL(int type, const char* buf, int len, CMGLparam* param)
mazgch 21:c4d64830bf02 1235 {
mazgch 31:a0bed6c1e05d 1236 if ((type == TYPE_PLUS) && param && param->num) {
mazgch 31:a0bed6c1e05d 1237 // +CMGL: <ix>,...
mazgch 31:a0bed6c1e05d 1238 int ix;
mazgch 31:a0bed6c1e05d 1239 if (sscanf(buf, "\r\n+CMGL: %d,", &ix) == 1)
mazgch 31:a0bed6c1e05d 1240 {
mazgch 31:a0bed6c1e05d 1241 *param->ix++ = ix;
mazgch 31:a0bed6c1e05d 1242 param->num--;
mazgch 31:a0bed6c1e05d 1243 }
mazgch 29:53d346010624 1244 }
mazgch 29:53d346010624 1245 return WAIT;
mazgch 21:c4d64830bf02 1246 }
mazgch 21:c4d64830bf02 1247
mazgch 31:a0bed6c1e05d 1248 int MDMParser::smsList(const char* stat /*= "ALL"*/, int* ix /*=NULL*/, int num /*= 0*/) {
mazgch 95:8282dbbe1492 1249 int ret = -1;
mazgch 95:8282dbbe1492 1250 LOCK();
mazgch 31:a0bed6c1e05d 1251 sendFormated("AT+CMGL=\"%s\"\r\n", stat);
mazgch 31:a0bed6c1e05d 1252 CMGLparam param;
mazgch 31:a0bed6c1e05d 1253 param.ix = ix;
mazgch 31:a0bed6c1e05d 1254 param.num = num;
irsanjul 122:1360902e8632 1255 if (RESP_OK == waitFinalResp(_cbCMGL, &param,60*1000))
mazgch 95:8282dbbe1492 1256 ret = num - param.num;
mazgch 95:8282dbbe1492 1257 UNLOCK();
mazgch 95:8282dbbe1492 1258 return ret;
mazgch 21:c4d64830bf02 1259 }
mazgch 21:c4d64830bf02 1260
mazgch 21:c4d64830bf02 1261 bool MDMParser::smsSend(const char* num, const char* buf)
mazgch 21:c4d64830bf02 1262 {
irsanjul 122:1360902e8632 1263 purge();
mazgch 95:8282dbbe1492 1264 bool ok = false;
mazgch 95:8282dbbe1492 1265 LOCK();
mazgch 80:34985b4d821e 1266 sendFormated("AT+CMGS=\"%s\"\r\n",num);
mazgch 95:8282dbbe1492 1267 if (RESP_PROMPT == waitFinalResp(NULL,NULL,150*1000)) {
mazgch 95:8282dbbe1492 1268 send(buf, strlen(buf));
mazgch 95:8282dbbe1492 1269 const char ctrlZ = 0x1A;
mazgch 95:8282dbbe1492 1270 send(&ctrlZ, sizeof(ctrlZ));
mazgch 95:8282dbbe1492 1271 ok = (RESP_OK == waitFinalResp());
mazgch 21:c4d64830bf02 1272 }
mazgch 95:8282dbbe1492 1273 UNLOCK();
mazgch 95:8282dbbe1492 1274 return ok;
mazgch 21:c4d64830bf02 1275 }
mazgch 21:c4d64830bf02 1276
mazgch 21:c4d64830bf02 1277 bool MDMParser::smsDelete(int ix)
mazgch 21:c4d64830bf02 1278 {
mazgch 95:8282dbbe1492 1279 bool ok = false;
mazgch 95:8282dbbe1492 1280 LOCK();
mazgch 21:c4d64830bf02 1281 sendFormated("AT+CMGD=%d\r\n",ix);
mazgch 95:8282dbbe1492 1282 ok = (RESP_OK == waitFinalResp());
mazgch 95:8282dbbe1492 1283 UNLOCK();
mazgch 95:8282dbbe1492 1284 return ok;
mazgch 21:c4d64830bf02 1285 }
mazgch 21:c4d64830bf02 1286
mazgch 21:c4d64830bf02 1287 int MDMParser::_cbCMGR(int type, const char* buf, int len, CMGRparam* param)
mazgch 21:c4d64830bf02 1288 {
mazgch 21:c4d64830bf02 1289 if (param) {
mazgch 21:c4d64830bf02 1290 if (type == TYPE_PLUS) {
mazgch 21:c4d64830bf02 1291 if (sscanf(buf, "\r\n+CMGR: \"%*[^\"]\",\"%[^\"]", param->num) == 1) {
mazgch 21:c4d64830bf02 1292 }
mazgch 37:cc3433329d66 1293 } else if ((type == TYPE_UNKNOWN) && (buf[len-2] == '\r') && (buf[len-1] == '\n')) {
mazgch 21:c4d64830bf02 1294 memcpy(param->buf, buf, len-2);
mazgch 21:c4d64830bf02 1295 param->buf[len-2] = '\0';
mazgch 21:c4d64830bf02 1296 }
mazgch 21:c4d64830bf02 1297 }
mazgch 21:c4d64830bf02 1298 return WAIT;
mazgch 21:c4d64830bf02 1299 }
mazgch 21:c4d64830bf02 1300
mazgch 21:c4d64830bf02 1301 bool MDMParser::smsRead(int ix, char* num, char* buf, int len)
mazgch 21:c4d64830bf02 1302 {
mazgch 95:8282dbbe1492 1303 bool ok = false;
mazgch 95:8282dbbe1492 1304 LOCK();
mazgch 21:c4d64830bf02 1305 CMGRparam param;
mazgch 21:c4d64830bf02 1306 param.num = num;
mazgch 21:c4d64830bf02 1307 param.buf = buf;
mazgch 21:c4d64830bf02 1308 sendFormated("AT+CMGR=%d\r\n",ix);
mazgch 95:8282dbbe1492 1309 ok = (RESP_OK == waitFinalResp(_cbCMGR, &param));
mazgch 95:8282dbbe1492 1310 UNLOCK();
mazgch 95:8282dbbe1492 1311 return ok;
mazgch 21:c4d64830bf02 1312 }
irsanjul 120:353754a2bcd9 1313
irsanjul 120:353754a2bcd9 1314 //-----------------------------------------------------------------
irsanjul 120:353754a2bcd9 1315 bool MDMParser::dialStart(const char* num)
irsanjul 120:353754a2bcd9 1316 {
irsanjul 120:353754a2bcd9 1317 bool ok = false;
irsanjul 120:353754a2bcd9 1318 LOCK();
irsanjul 120:353754a2bcd9 1319 //sendFormated("AT\r\n");
irsanjul 120:353754a2bcd9 1320 //wait(0.5);
irsanjul 120:353754a2bcd9 1321 sendFormated("ATD%s;\r\n",num);
irsanjul 120:353754a2bcd9 1322 ok = (RESP_OK == waitFinalResp());
irsanjul 120:353754a2bcd9 1323 UNLOCK();
irsanjul 120:353754a2bcd9 1324 return ok;
irsanjul 120:353754a2bcd9 1325 }
irsanjul 120:353754a2bcd9 1326
irsanjul 120:353754a2bcd9 1327 bool MDMParser::dialStop()
irsanjul 120:353754a2bcd9 1328 {
irsanjul 120:353754a2bcd9 1329 bool ok = false;
irsanjul 120:353754a2bcd9 1330 LOCK();
irsanjul 120:353754a2bcd9 1331 sendFormated("ATH\r\n");
irsanjul 120:353754a2bcd9 1332 ok = (RESP_OK == waitFinalResp());
irsanjul 120:353754a2bcd9 1333 UNLOCK();
irsanjul 120:353754a2bcd9 1334 return ok;
irsanjul 120:353754a2bcd9 1335 }
irsanjul 120:353754a2bcd9 1336
irsanjul 120:353754a2bcd9 1337 bool MDMParser::dialAns()
irsanjul 120:353754a2bcd9 1338 {
irsanjul 120:353754a2bcd9 1339 bool ok = false;
irsanjul 120:353754a2bcd9 1340 LOCK();
irsanjul 121:3e1d84b2d34c 1341 sendFormated("ATA\r\n");
irsanjul 121:3e1d84b2d34c 1342 ok = (RESP_OK == waitFinalResp());
irsanjul 120:353754a2bcd9 1343 UNLOCK();
irsanjul 120:353754a2bcd9 1344 return ok;
irsanjul 120:353754a2bcd9 1345 }
irsanjul 120:353754a2bcd9 1346
irsanjul 120:353754a2bcd9 1347 int MDMParser::_cbATA(int type, const char* buf, int len, ATAparam* param)
irsanjul 120:353754a2bcd9 1348 {
irsanjul 120:353754a2bcd9 1349 if (param)
irsanjul 120:353754a2bcd9 1350 {
irsanjul 120:353754a2bcd9 1351 if (type == TYPE_PLUS)
irsanjul 120:353754a2bcd9 1352 {
irsanjul 120:353754a2bcd9 1353 if (sscanf(buf, "\r\n+CLIP: %31[^\"]\",%d,,,,%*d", param->num, param->stat) == 2) {
irsanjul 122:1360902e8632 1354 ;
irsanjul 120:353754a2bcd9 1355 }
irsanjul 120:353754a2bcd9 1356 }
irsanjul 120:353754a2bcd9 1357 }
irsanjul 120:353754a2bcd9 1358 return WAIT;
irsanjul 120:353754a2bcd9 1359 }
irsanjul 120:353754a2bcd9 1360
irsanjul 120:353754a2bcd9 1361 bool MDMParser::dialStatus(const char* number)
irsanjul 120:353754a2bcd9 1362 {
irsanjul 120:353754a2bcd9 1363 bool ok = false;
irsanjul 120:353754a2bcd9 1364 LOCK();
irsanjul 120:353754a2bcd9 1365 ATAparam param;
irsanjul 120:353754a2bcd9 1366 //ok = (RESP_OK == waitFinalResp(_cbATA, &param));
irsanjul 120:353754a2bcd9 1367 waitFinalResp(_cbATA, &param);
irsanjul 120:353754a2bcd9 1368 ok = (number == param.num);
irsanjul 120:353754a2bcd9 1369 UNLOCK();
irsanjul 120:353754a2bcd9 1370 return ok;
irsanjul 120:353754a2bcd9 1371 }
irsanjul 120:353754a2bcd9 1372
irsanjul 120:353754a2bcd9 1373 // ----------------------------------------------------------------
irsanjul 120:353754a2bcd9 1374 int MDMParser::_cbDBG(int type, const char* buf, int len, DBGparam* param)
irsanjul 120:353754a2bcd9 1375 {
irsanjul 120:353754a2bcd9 1376 if(type == TYPE_PLUS)
irsanjul 120:353754a2bcd9 1377 {
irsanjul 120:353754a2bcd9 1378 int a, b;
irsanjul 120:353754a2bcd9 1379 if(sscanf(buf, "\r\n+CLIP: \"%[^\"],%*d",param->num) == 1)
irsanjul 120:353754a2bcd9 1380 {
irsanjul 120:353754a2bcd9 1381 return RESP_OK;
irsanjul 120:353754a2bcd9 1382 }
irsanjul 120:353754a2bcd9 1383 else if(sscanf(buf, "\r\n+UCALLSTAT: %*d,%d",&a) == 1)
irsanjul 120:353754a2bcd9 1384 {
irsanjul 120:353754a2bcd9 1385 /*
irsanjul 120:353754a2bcd9 1386 get call status format:
irsanjul 120:353754a2bcd9 1387 +UCALLSTAT: <id>,<status>
irsanjul 120:353754a2bcd9 1388 <id> : id call;
irsanjul 120:353754a2bcd9 1389 <status> : 0 = active (saat terhubung)
irsanjul 120:353754a2bcd9 1390 1 = hold
irsanjul 120:353754a2bcd9 1391 2 = dialling (melakukan panggilan namun blm terhubung)
irsanjul 120:353754a2bcd9 1392 3 = alerting (melakukan panggilan dan dalam kedalam menunggu)
irsanjul 120:353754a2bcd9 1393 4 = ringing (saat ada panggilan)
irsanjul 120:353754a2bcd9 1394 5 = waiting
irsanjul 120:353754a2bcd9 1395 6 = disconected (dialling dihentikan)
irsanjul 120:353754a2bcd9 1396 7 = connected
irsanjul 120:353754a2bcd9 1397 */
irsanjul 120:353754a2bcd9 1398 *param->status = a;
irsanjul 120:353754a2bcd9 1399 return RESP_OK;
irsanjul 120:353754a2bcd9 1400 }
irsanjul 120:353754a2bcd9 1401 else if(sscanf(buf, "\r\n+CIEV: %d,%d", &a, &b) == 2)
irsanjul 120:353754a2bcd9 1402 {
irsanjul 120:353754a2bcd9 1403 if(a == 2)
irsanjul 120:353754a2bcd9 1404 {
irsanjul 120:353754a2bcd9 1405 *param->signal = b;
irsanjul 120:353754a2bcd9 1406 return RESP_OK;
irsanjul 120:353754a2bcd9 1407 }
irsanjul 120:353754a2bcd9 1408 else return WAIT;
irsanjul 120:353754a2bcd9 1409 }
irsanjul 120:353754a2bcd9 1410 else if(sscanf(buf, "\r\n+CMTI: \"%*[^\"]\",%d", &a) == 1)
irsanjul 120:353754a2bcd9 1411 {
irsanjul 120:353754a2bcd9 1412 // a is indeks for sms
irsanjul 120:353754a2bcd9 1413 if(a == 0)
irsanjul 120:353754a2bcd9 1414 return WAIT;
irsanjul 120:353754a2bcd9 1415
irsanjul 120:353754a2bcd9 1416 *param->indeks = a;
irsanjul 120:353754a2bcd9 1417 return RESP_OK;
irsanjul 120:353754a2bcd9 1418 }
irsanjul 120:353754a2bcd9 1419 else return WAIT;
irsanjul 120:353754a2bcd9 1420 }
irsanjul 120:353754a2bcd9 1421 else return WAIT;
irsanjul 120:353754a2bcd9 1422 }
irsanjul 120:353754a2bcd9 1423
irsanjul 120:353754a2bcd9 1424 bool MDMParser::readDbg(int* status, char* num, int *signal, int* idx)
irsanjul 120:353754a2bcd9 1425 {
irsanjul 120:353754a2bcd9 1426 bool ok = 0;
irsanjul 120:353754a2bcd9 1427 LOCK();
irsanjul 120:353754a2bcd9 1428 DBGparam param;
irsanjul 120:353754a2bcd9 1429 param.status = status;
irsanjul 120:353754a2bcd9 1430 param.num = num;
irsanjul 120:353754a2bcd9 1431 param.signal = signal;
irsanjul 120:353754a2bcd9 1432 param.indeks = idx;
irsanjul 120:353754a2bcd9 1433 ok = (RESP_OK == waitFinalResp(_cbDBG, &param, 1000));
irsanjul 120:353754a2bcd9 1434 UNLOCK();
irsanjul 120:353754a2bcd9 1435 return ok;
irsanjul 120:353754a2bcd9 1436 }
irsanjul 120:353754a2bcd9 1437
irsanjul 122:1360902e8632 1438 int MDMParser::signal()
irsanjul 122:1360902e8632 1439 {
irsanjul 122:1360902e8632 1440 int sig = 0;
irsanjul 122:1360902e8632 1441 LOCK();
irsanjul 122:1360902e8632 1442 NetStatus _status;
irsanjul 122:1360902e8632 1443 sendFormated("AT+CSQ\r\n");
irsanjul 122:1360902e8632 1444 if (RESP_OK != waitFinalResp(_cbCSQ, &_status))
irsanjul 122:1360902e8632 1445 goto failure;
irsanjul 122:1360902e8632 1446
irsanjul 122:1360902e8632 1447 // konversi dihilangkan untuk mempermudah kerja. kirim dalam satuan dbm
irsanjul 122:1360902e8632 1448
irsanjul 122:1360902e8632 1449 if(_status.rssi <= -105)
irsanjul 122:1360902e8632 1450 sig = 0;
irsanjul 122:1360902e8632 1451 if((_status.rssi < -93) && (_status.rssi > -105))
irsanjul 122:1360902e8632 1452 sig = 1;
irsanjul 122:1360902e8632 1453 if((_status.rssi < -81) && (_status.rssi >= -93))
irsanjul 122:1360902e8632 1454 sig = 2;
irsanjul 122:1360902e8632 1455 if((_status.rssi < -69) && (_status.rssi >= -81))
irsanjul 122:1360902e8632 1456 sig = 3;
irsanjul 122:1360902e8632 1457 if((_status.rssi < -57) && (_status.rssi >= -69))
irsanjul 122:1360902e8632 1458 sig = 4;
irsanjul 122:1360902e8632 1459 if(_status.rssi >= -57)
irsanjul 122:1360902e8632 1460 sig = 5;
irsanjul 122:1360902e8632 1461 UNLOCK();
irsanjul 122:1360902e8632 1462 failure:
irsanjul 122:1360902e8632 1463 return sig;
irsanjul 122:1360902e8632 1464 }
irsanjul 122:1360902e8632 1465
irsanjul 120:353754a2bcd9 1466 bool MDMParser::mute(bool act)
irsanjul 120:353754a2bcd9 1467 {
irsanjul 120:353754a2bcd9 1468 if(act)
irsanjul 120:353754a2bcd9 1469 {
irsanjul 120:353754a2bcd9 1470 LOCK();
irsanjul 120:353754a2bcd9 1471 //sendFormated("AT+CALM=1\r\n");
irsanjul 120:353754a2bcd9 1472 sendFormated("AT+CRSL=2\r\n");
irsanjul 120:353754a2bcd9 1473 UNLOCK();
irsanjul 120:353754a2bcd9 1474 return true;
irsanjul 120:353754a2bcd9 1475 }
irsanjul 120:353754a2bcd9 1476 else
irsanjul 120:353754a2bcd9 1477 {
irsanjul 120:353754a2bcd9 1478 LOCK();
irsanjul 120:353754a2bcd9 1479 //sendFormated("AT+CALM=0\r\n");
irsanjul 120:353754a2bcd9 1480 sendFormated("AT+CRSL=5\r\n");
irsanjul 120:353754a2bcd9 1481 UNLOCK();
irsanjul 120:353754a2bcd9 1482 return false;
irsanjul 120:353754a2bcd9 1483 }
irsanjul 120:353754a2bcd9 1484 }
irsanjul 122:1360902e8632 1485
irsanjul 122:1360902e8632 1486 bool MDMParser::sendAT()
irsanjul 122:1360902e8632 1487 {
irsanjul 122:1360902e8632 1488 bool ok = 0;
irsanjul 122:1360902e8632 1489 purge();
irsanjul 122:1360902e8632 1490 LOCK();
irsanjul 122:1360902e8632 1491 sendFormated("AT\r\n");
irsanjul 122:1360902e8632 1492 ok = (RESP_OK == waitFinalResp());
irsanjul 122:1360902e8632 1493 UNLOCK();
irsanjul 122:1360902e8632 1494 return ok;
irsanjul 122:1360902e8632 1495 }
irsanjul 121:3e1d84b2d34c 1496 //-----------------------------------------------------------------
irsanjul 121:3e1d84b2d34c 1497
irsanjul 121:3e1d84b2d34c 1498 bool MDMParser::CopsCtzu()
irsanjul 121:3e1d84b2d34c 1499 {
irsanjul 121:3e1d84b2d34c 1500 bool ok = 0;
irsanjul 121:3e1d84b2d34c 1501 LOCK();
irsanjul 121:3e1d84b2d34c 1502 sendFormated("AT+COPS=2\r\n");
irsanjul 121:3e1d84b2d34c 1503 ok = (RESP_OK == waitFinalResp());
irsanjul 121:3e1d84b2d34c 1504 sendFormated("AT+CTZU=1\r\n");
irsanjul 121:3e1d84b2d34c 1505 ok = (RESP_OK == waitFinalResp());
irsanjul 121:3e1d84b2d34c 1506 sendFormated("AT+COPS=0\r\n");
irsanjul 121:3e1d84b2d34c 1507 ok = (RESP_OK == waitFinalResp());
irsanjul 121:3e1d84b2d34c 1508 UNLOCK();
irsanjul 121:3e1d84b2d34c 1509 return ok;
irsanjul 121:3e1d84b2d34c 1510 }
irsanjul 121:3e1d84b2d34c 1511
irsanjul 121:3e1d84b2d34c 1512 int MDMParser::_cbCCLK(int type, const char* buf, int len, CCLKparam* param)
irsanjul 121:3e1d84b2d34c 1513 {
irsanjul 121:3e1d84b2d34c 1514 if(type == TYPE_PLUS)
irsanjul 121:3e1d84b2d34c 1515 {
irsanjul 121:3e1d84b2d34c 1516 if(sscanf(buf, "\r\n+CCLK: \"%[^\"]", param->buf) == 1)
irsanjul 121:3e1d84b2d34c 1517 {
irsanjul 121:3e1d84b2d34c 1518 return RESP_OK;
irsanjul 121:3e1d84b2d34c 1519 }
irsanjul 121:3e1d84b2d34c 1520 else return WAIT;
irsanjul 121:3e1d84b2d34c 1521 }
irsanjul 121:3e1d84b2d34c 1522 else return WAIT;
irsanjul 121:3e1d84b2d34c 1523 }
irsanjul 121:3e1d84b2d34c 1524
irsanjul 121:3e1d84b2d34c 1525 bool MDMParser::clk(char *buf)
irsanjul 121:3e1d84b2d34c 1526 {
irsanjul 121:3e1d84b2d34c 1527 bool ok = 0;
irsanjul 121:3e1d84b2d34c 1528 LOCK();
irsanjul 121:3e1d84b2d34c 1529 CCLKparam param;
irsanjul 121:3e1d84b2d34c 1530 param.buf = buf;
irsanjul 121:3e1d84b2d34c 1531 sendFormated("AT+CCLK?\r\n");
irsanjul 121:3e1d84b2d34c 1532 ok = (RESP_OK == waitFinalResp(_cbCCLK, &param, 1000));
irsanjul 121:3e1d84b2d34c 1533 UNLOCK();
irsanjul 121:3e1d84b2d34c 1534 return ok;
irsanjul 121:3e1d84b2d34c 1535 }
irsanjul 121:3e1d84b2d34c 1536
mazgch 54:7ba8e4c218e2 1537 // ----------------------------------------------------------------
mazgch 70:0a87d256cd24 1538
mazgch 70:0a87d256cd24 1539 int MDMParser::_cbCUSD(int type, const char* buf, int len, char* resp)
mazgch 70:0a87d256cd24 1540 {
mazgch 70:0a87d256cd24 1541 if ((type == TYPE_PLUS) && resp) {
mazgch 70:0a87d256cd24 1542 // +USD: \"%*[^\"]\",\"%[^\"]\",,\"%*[^\"]\",%d,%d,%d,%d,\"*[^\"]\",%d,%d"..);
mazgch 70:0a87d256cd24 1543 if (sscanf(buf, "\r\n+CUSD: %*d,\"%[^\"]\",%*d", resp) == 1) {
mazgch 70:0a87d256cd24 1544 /*nothing*/
mazgch 70:0a87d256cd24 1545 }
mazgch 70:0a87d256cd24 1546 }
mazgch 70:0a87d256cd24 1547 return WAIT;
mazgch 70:0a87d256cd24 1548 }
mazgch 70:0a87d256cd24 1549
mazgch 70:0a87d256cd24 1550 bool MDMParser::ussdCommand(const char* cmd, char* buf)
mazgch 70:0a87d256cd24 1551 {
mazgch 95:8282dbbe1492 1552 bool ok = false;
mazgch 95:8282dbbe1492 1553 LOCK();
mazgch 70:0a87d256cd24 1554 *buf = '\0';
mazgch 95:8282dbbe1492 1555 if (_dev.dev != DEV_LISA_C200) {
mazgch 95:8282dbbe1492 1556 sendFormated("AT+CUSD=1,\"%s\"\r\n",cmd);
mazgch 95:8282dbbe1492 1557 ok = (RESP_OK == waitFinalResp(_cbCUSD, buf));
mazgch 70:0a87d256cd24 1558 }
mazgch 95:8282dbbe1492 1559 UNLOCK();
mazgch 95:8282dbbe1492 1560 return ok;
mazgch 70:0a87d256cd24 1561 }
mazgch 80:34985b4d821e 1562
mazgch 80:34985b4d821e 1563 // ----------------------------------------------------------------
mazgch 70:0a87d256cd24 1564
mazgch 115:d8d94b73c725 1565 int MDMParser::_cbUDELFILE(int type, const char* buf, int len, void*)
mazgch 115:d8d94b73c725 1566 {
mazgch 115:d8d94b73c725 1567 if ((type == TYPE_ERROR) && strstr(buf, "+CME ERROR: FILE NOT FOUND"))
mazgch 115:d8d94b73c725 1568 return RESP_OK; // file does not exist, so all ok...
mazgch 115:d8d94b73c725 1569 return WAIT;
mazgch 115:d8d94b73c725 1570 }
mazgch 115:d8d94b73c725 1571
mazgch 80:34985b4d821e 1572 bool MDMParser::delFile(const char* filename)
mazgch 80:34985b4d821e 1573 {
mazgch 95:8282dbbe1492 1574 bool ok = false;
mazgch 95:8282dbbe1492 1575 LOCK();
mazgch 80:34985b4d821e 1576 sendFormated("AT+UDELFILE=\"%s\"\r\n", filename);
mazgch 115:d8d94b73c725 1577 ok = (RESP_OK == waitFinalResp(_cbUDELFILE));
mazgch 95:8282dbbe1492 1578 UNLOCK();
mazgch 95:8282dbbe1492 1579 return ok;
mazgch 80:34985b4d821e 1580 }
mazgch 80:34985b4d821e 1581
mazgch 80:34985b4d821e 1582 int MDMParser::writeFile(const char* filename, const char* buf, int len)
mazgch 80:34985b4d821e 1583 {
mazgch 95:8282dbbe1492 1584 bool ok = false;
mazgch 95:8282dbbe1492 1585 LOCK();
mazgch 80:34985b4d821e 1586 sendFormated("AT+UDWNFILE=\"%s\",%d\r\n", filename, len);
mazgch 95:8282dbbe1492 1587 if (RESP_PROMPT == waitFinalResp()) {
mazgch 95:8282dbbe1492 1588 send(buf, len);
mazgch 95:8282dbbe1492 1589 ok = (RESP_OK == waitFinalResp());
mazgch 95:8282dbbe1492 1590 }
mazgch 95:8282dbbe1492 1591 UNLOCK();
mazgch 95:8282dbbe1492 1592 return ok ? len : -1;
mazgch 80:34985b4d821e 1593 }
mazgch 80:34985b4d821e 1594
mazgch 80:34985b4d821e 1595 int MDMParser::readFile(const char* filename, char* buf, int len)
mazgch 80:34985b4d821e 1596 {
mazgch 80:34985b4d821e 1597 URDFILEparam param;
mazgch 80:34985b4d821e 1598 param.filename = filename;
mazgch 80:34985b4d821e 1599 param.buf = buf;
mazgch 80:34985b4d821e 1600 param.sz = len;
mazgch 80:34985b4d821e 1601 param.len = 0;
mazgch 95:8282dbbe1492 1602 LOCK();
mazgch 95:8282dbbe1492 1603 sendFormated("AT+URDFILE=\"%s\"\r\n", filename, len);
mazgch 105:f6bb2a20de70 1604 if (RESP_OK != waitFinalResp(_cbURDFILE, &param))
mazgch 95:8282dbbe1492 1605 param.len = -1;
mazgch 95:8282dbbe1492 1606 UNLOCK();
mazgch 80:34985b4d821e 1607 return param.len;
mazgch 80:34985b4d821e 1608 }
mazgch 80:34985b4d821e 1609
mazgch 80:34985b4d821e 1610 int MDMParser::_cbURDFILE(int type, const char* buf, int len, URDFILEparam* param)
mazgch 80:34985b4d821e 1611 {
mazgch 80:34985b4d821e 1612 if ((type == TYPE_PLUS) && param && param->filename && param->buf) {
mazgch 80:34985b4d821e 1613 char filename[48];
mazgch 80:34985b4d821e 1614 int sz;
mazgch 80:34985b4d821e 1615 if ((sscanf(buf, "\r\n+URDFILE: \"%[^\"]\",%d,", filename, &sz) == 2) &&
mazgch 80:34985b4d821e 1616 (0 == strcmp(param->filename, filename)) &&
mazgch 80:34985b4d821e 1617 (buf[len-sz-2] == '\"') && (buf[len-1] == '\"')) {
mazgch 80:34985b4d821e 1618 param->len = (sz < param->sz) ? sz : param->sz;
mazgch 80:34985b4d821e 1619 memcpy(param->buf, &buf[len-1-sz], param->len);
mazgch 80:34985b4d821e 1620 }
mazgch 80:34985b4d821e 1621 }
mazgch 80:34985b4d821e 1622 return WAIT;
mazgch 80:34985b4d821e 1623 }
mazgch 80:34985b4d821e 1624
mazgch 70:0a87d256cd24 1625 // ----------------------------------------------------------------
mazgch 74:208e3e32d263 1626 bool MDMParser::setDebug(int level)
mazgch 74:208e3e32d263 1627 {
mazgch 74:208e3e32d263 1628 #ifdef MDM_DEBUG
mazgch 117:74e4e0109a9e 1629 if ((_debugLevel >= -1) && (level >= -1) &&
mazgch 117:74e4e0109a9e 1630 (_debugLevel <= 3) && (level <= 3)) {
mazgch 74:208e3e32d263 1631 _debugLevel = level;
mazgch 74:208e3e32d263 1632 return true;
mazgch 74:208e3e32d263 1633 }
mazgch 74:208e3e32d263 1634 #endif
mazgch 74:208e3e32d263 1635 return false;
mazgch 74:208e3e32d263 1636 }
mazgch 74:208e3e32d263 1637
mazgch 73:2b32e0a21df2 1638 void MDMParser::dumpDevStatus(MDMParser::DevStatus* status,
mazgch 73:2b32e0a21df2 1639 _DPRINT dprint, void* param)
mazgch 54:7ba8e4c218e2 1640 {
mazgch 75:ce6e12067d0c 1641 dprint(param, "Modem::devStatus\r\n");
mazgch 98:c786461edd40 1642 const char* txtDev[] = { "Unknown", "SARA-G350", "LISA-U200", "LISA-C200", "SARA-U260", "SARA-U270", "LEON-G200" };
mazgch 98:c786461edd40 1643 if (status->dev < sizeof(txtDev)/sizeof(*txtDev) && (status->dev != DEV_UNKNOWN))
mazgch 73:2b32e0a21df2 1644 dprint(param, " Device: %s\r\n", txtDev[status->dev]);
mazgch 54:7ba8e4c218e2 1645 const char* txtLpm[] = { "Disabled", "Enabled", "Active" };
mazgch 54:7ba8e4c218e2 1646 if (status->lpm < sizeof(txtLpm)/sizeof(*txtLpm))
mazgch 73:2b32e0a21df2 1647 dprint(param, " Power Save: %s\r\n", txtLpm[status->lpm]);
mazgch 75:ce6e12067d0c 1648 const char* txtSim[] = { "Unknown", "Missing", "Pin", "Ready" };
mazgch 98:c786461edd40 1649 if (status->sim < sizeof(txtSim)/sizeof(*txtSim) && (status->sim != SIM_UNKNOWN))
mazgch 73:2b32e0a21df2 1650 dprint(param, " SIM: %s\r\n", txtSim[status->sim]);
mazgch 54:7ba8e4c218e2 1651 if (*status->ccid)
mazgch 73:2b32e0a21df2 1652 dprint(param, " CCID: %s\r\n", status->ccid);
mazgch 54:7ba8e4c218e2 1653 if (*status->imei)
mazgch 73:2b32e0a21df2 1654 dprint(param, " IMEI: %s\r\n", status->imei);
mazgch 54:7ba8e4c218e2 1655 if (*status->imsi)
mazgch 73:2b32e0a21df2 1656 dprint(param, " IMSI: %s\r\n", status->imsi);
mazgch 54:7ba8e4c218e2 1657 if (*status->meid)
mazgch 73:2b32e0a21df2 1658 dprint(param, " MEID: %s\r\n", status->meid); // LISA-C
mazgch 54:7ba8e4c218e2 1659 if (*status->manu)
mazgch 73:2b32e0a21df2 1660 dprint(param, " Manufacturer: %s\r\n", status->manu);
mazgch 54:7ba8e4c218e2 1661 if (*status->model)
mazgch 73:2b32e0a21df2 1662 dprint(param, " Model: %s\r\n", status->model);
mazgch 54:7ba8e4c218e2 1663 if (*status->ver)
mazgch 73:2b32e0a21df2 1664 dprint(param, " Version: %s\r\n", status->ver);
mazgch 54:7ba8e4c218e2 1665 }
mazgch 54:7ba8e4c218e2 1666
mazgch 73:2b32e0a21df2 1667 void MDMParser::dumpNetStatus(MDMParser::NetStatus *status,
mazgch 73:2b32e0a21df2 1668 _DPRINT dprint, void* param)
mazgch 54:7ba8e4c218e2 1669 {
mazgch 75:ce6e12067d0c 1670 dprint(param, "Modem::netStatus\r\n");
mazgch 54:7ba8e4c218e2 1671 const char* txtReg[] = { "Unknown", "Denied", "None", "Home", "Roaming" };
mazgch 98:c786461edd40 1672 if (status->csd < sizeof(txtReg)/sizeof(*txtReg) && (status->csd != REG_UNKNOWN))
mazgch 79:291df065e345 1673 dprint(param, " CSD Registration: %s\r\n", txtReg[status->csd]);
mazgch 98:c786461edd40 1674 if (status->psd < sizeof(txtReg)/sizeof(*txtReg) && (status->psd != REG_UNKNOWN))
mazgch 79:291df065e345 1675 dprint(param, " PSD Registration: %s\r\n", txtReg[status->psd]);
mazgch 54:7ba8e4c218e2 1676 const char* txtAct[] = { "Unknown", "GSM", "Edge", "3G", "CDMA" };
mazgch 98:c786461edd40 1677 if (status->act < sizeof(txtAct)/sizeof(*txtAct) && (status->act != ACT_UNKNOWN))
mazgch 73:2b32e0a21df2 1678 dprint(param, " Access Technology: %s\r\n", txtAct[status->act]);
mazgch 54:7ba8e4c218e2 1679 if (status->rssi)
mazgch 73:2b32e0a21df2 1680 dprint(param, " Signal Strength: %d dBm\r\n", status->rssi);
mazgch 54:7ba8e4c218e2 1681 if (status->ber)
mazgch 73:2b32e0a21df2 1682 dprint(param, " Bit Error Rate: %d\r\n", status->ber);
mazgch 54:7ba8e4c218e2 1683 if (*status->opr)
mazgch 73:2b32e0a21df2 1684 dprint(param, " Operator: %s\r\n", status->opr);
mazgch 54:7ba8e4c218e2 1685 if (status->lac != 0xFFFF)
mazgch 73:2b32e0a21df2 1686 dprint(param, " Location Area Code: %04X\r\n", status->lac);
mazgch 54:7ba8e4c218e2 1687 if (status->ci != 0xFFFFFFFF)
mazgch 73:2b32e0a21df2 1688 dprint(param, " Cell ID: %08X\r\n", status->ci);
mazgch 54:7ba8e4c218e2 1689 if (*status->num)
mazgch 73:2b32e0a21df2 1690 dprint(param, " Phone Number: %s\r\n", status->num);
mazgch 54:7ba8e4c218e2 1691 }
mazgch 54:7ba8e4c218e2 1692
mazgch 73:2b32e0a21df2 1693 void MDMParser::dumpIp(MDMParser::IP ip,
mazgch 73:2b32e0a21df2 1694 _DPRINT dprint, void* param)
mazgch 54:7ba8e4c218e2 1695 {
mazgch 57:869bd35f44cc 1696 if (ip != NOIP)
mazgch 75:ce6e12067d0c 1697 dprint(param, "Modem:IP " IPSTR "\r\n", IPNUM(ip));
mazgch 54:7ba8e4c218e2 1698 }
mazgch 70:0a87d256cd24 1699
mazgch 21:c4d64830bf02 1700 // ----------------------------------------------------------------
mazgch 21:c4d64830bf02 1701 int MDMParser::_parseMatch(Pipe<char>* pipe, int len, const char* sta, const char* end)
mazgch 18:e5697801df29 1702 {
mazgch 18:e5697801df29 1703 int o = 0;
mazgch 21:c4d64830bf02 1704 if (sta) {
mazgch 21:c4d64830bf02 1705 while (*sta) {
mazgch 21:c4d64830bf02 1706 if (++o > len) return WAIT;
mazgch 21:c4d64830bf02 1707 char ch = pipe->next();
mazgch 21:c4d64830bf02 1708 if (*sta++ != ch) return NOT_FOUND;
mazgch 21:c4d64830bf02 1709 }
mazgch 21:c4d64830bf02 1710 }
mazgch 21:c4d64830bf02 1711 if (!end) return o; // no termination
mazgch 35:9275215a3a5b 1712 // at least any char
mazgch 35:9275215a3a5b 1713 if (++o > len) return WAIT;
mazgch 35:9275215a3a5b 1714 pipe->next();
mazgch 35:9275215a3a5b 1715 // check the end
mazgch 21:c4d64830bf02 1716 int x = 0;
mazgch 21:c4d64830bf02 1717 while (end[x]) {
mazgch 21:c4d64830bf02 1718 if (++o > len) return WAIT;
mazgch 21:c4d64830bf02 1719 char ch = pipe->next();
mazgch 21:c4d64830bf02 1720 x = (end[x] == ch) ? x + 1 :
mazgch 21:c4d64830bf02 1721 (end[0] == ch) ? 1 :
mazgch 21:c4d64830bf02 1722 0;
mazgch 21:c4d64830bf02 1723 }
mazgch 21:c4d64830bf02 1724 return o;
mazgch 21:c4d64830bf02 1725 }
mazgch 21:c4d64830bf02 1726
mazgch 21:c4d64830bf02 1727 int MDMParser::_parseFormated(Pipe<char>* pipe, int len, const char* fmt)
mazgch 21:c4d64830bf02 1728 {
mazgch 21:c4d64830bf02 1729 int o = 0;
mazgch 21:c4d64830bf02 1730 int num = 0;
mazgch 21:c4d64830bf02 1731 if (fmt) {
mazgch 21:c4d64830bf02 1732 while (*fmt) {
mazgch 21:c4d64830bf02 1733 if (++o > len) return WAIT;
mazgch 21:c4d64830bf02 1734 char ch = pipe->next();
mazgch 21:c4d64830bf02 1735 if (*fmt == '%') {
mazgch 21:c4d64830bf02 1736 fmt++;
mazgch 21:c4d64830bf02 1737 if (*fmt == 'd') { // numeric
mazgch 21:c4d64830bf02 1738 fmt ++;
mazgch 21:c4d64830bf02 1739 num = 0;
mazgch 21:c4d64830bf02 1740 while (ch >= '0' && ch <= '9') {
mazgch 21:c4d64830bf02 1741 num = num * 10 + (ch - '0');
mazgch 21:c4d64830bf02 1742 if (++o > len) return WAIT;
mazgch 21:c4d64830bf02 1743 ch = pipe->next();
mazgch 21:c4d64830bf02 1744 }
mazgch 21:c4d64830bf02 1745 }
mazgch 21:c4d64830bf02 1746 else if (*fmt == 'c') { // char buffer (takes last numeric as length)
mazgch 21:c4d64830bf02 1747 fmt ++;
mazgch 21:c4d64830bf02 1748 while (num --) {
mazgch 21:c4d64830bf02 1749 if (++o > len) return WAIT;
mazgch 21:c4d64830bf02 1750 ch = pipe->next();
mazgch 21:c4d64830bf02 1751 }
mazgch 21:c4d64830bf02 1752 }
mazgch 80:34985b4d821e 1753 else if (*fmt == 's') {
mazgch 80:34985b4d821e 1754 fmt ++;
mazgch 80:34985b4d821e 1755 if (ch != '\"') return NOT_FOUND;
mazgch 80:34985b4d821e 1756 do {
mazgch 80:34985b4d821e 1757 if (++o > len) return WAIT;
mazgch 80:34985b4d821e 1758 ch = pipe->next();
mazgch 80:34985b4d821e 1759 } while (ch != '\"');
mazgch 80:34985b4d821e 1760 if (++o > len) return WAIT;
mazgch 80:34985b4d821e 1761 ch = pipe->next();
mazgch 80:34985b4d821e 1762 }
mazgch 21:c4d64830bf02 1763 }
mazgch 21:c4d64830bf02 1764 if (*fmt++ != ch) return NOT_FOUND;
mazgch 18:e5697801df29 1765 }
mazgch 18:e5697801df29 1766 }
mazgch 21:c4d64830bf02 1767 return o;
mazgch 21:c4d64830bf02 1768 }
mazgch 21:c4d64830bf02 1769
mazgch 21:c4d64830bf02 1770 int MDMParser::_getLine(Pipe<char>* pipe, char* buf, int len)
mazgch 21:c4d64830bf02 1771 {
mazgch 21:c4d64830bf02 1772 int unkn = 0;
mazgch 21:c4d64830bf02 1773 int sz = pipe->size();
mazgch 21:c4d64830bf02 1774 int fr = pipe->free();
mazgch 21:c4d64830bf02 1775 if (len > sz)
mazgch 21:c4d64830bf02 1776 len = sz;
mazgch 21:c4d64830bf02 1777 while (len > 0)
mazgch 21:c4d64830bf02 1778 {
mazgch 21:c4d64830bf02 1779 static struct {
mazgch 21:c4d64830bf02 1780 const char* fmt; int type;
mazgch 21:c4d64830bf02 1781 } lutF[] = {
mazgch 21:c4d64830bf02 1782 { "\r\n+USORD: %d,%d,\"%c\"", TYPE_PLUS },
mazgch 95:8282dbbe1492 1783 { "\r\n+USORF: %d,\"" IPSTR "\",%d,%d,\"%c\"", TYPE_PLUS },
mazgch 80:34985b4d821e 1784 { "\r\n+URDFILE: %s,%d,\"%c\"", TYPE_PLUS },
mazgch 21:c4d64830bf02 1785 };
mazgch 21:c4d64830bf02 1786 static struct {
mazgch 21:c4d64830bf02 1787 const char* sta; const char* end; int type;
mazgch 21:c4d64830bf02 1788 } lut[] = {
mazgch 21:c4d64830bf02 1789 { "\r\nOK\r\n", NULL, TYPE_OK },
mazgch 21:c4d64830bf02 1790 { "\r\nERROR\r\n", NULL, TYPE_ERROR },
mazgch 31:a0bed6c1e05d 1791 { "\r\n+CME ERROR:", "\r\n", TYPE_ERROR },
mazgch 21:c4d64830bf02 1792 { "\r\n+CMS ERROR:", "\r\n", TYPE_ERROR },
mazgch 21:c4d64830bf02 1793 { "\r\nRING\r\n", NULL, TYPE_RING },
mazgch 21:c4d64830bf02 1794 { "\r\nCONNECT\r\n", NULL, TYPE_CONNECT },
mazgch 21:c4d64830bf02 1795 { "\r\nNO CARRIER\r\n", NULL, TYPE_NOCARRIER },
mazgch 21:c4d64830bf02 1796 { "\r\nNO DIALTONE\r\n", NULL, TYPE_NODIALTONE },
mazgch 21:c4d64830bf02 1797 { "\r\nBUSY\r\n", NULL, TYPE_BUSY },
mazgch 21:c4d64830bf02 1798 { "\r\nNO ANSWER\r\n", NULL, TYPE_NOANSWER },
mazgch 21:c4d64830bf02 1799 { "\r\n+", "\r\n", TYPE_PLUS },
mazgch 21:c4d64830bf02 1800 { "\r\n@", NULL, TYPE_PROMPT }, // Sockets
mazgch 21:c4d64830bf02 1801 { "\r\n>", NULL, TYPE_PROMPT }, // SMS
mazgch 80:34985b4d821e 1802 { "\n>", NULL, TYPE_PROMPT }, // File
mazgch 21:c4d64830bf02 1803 };
mazgch 21:c4d64830bf02 1804 for (int i = 0; i < sizeof(lutF)/sizeof(*lutF); i ++) {
mazgch 21:c4d64830bf02 1805 pipe->set(unkn);
mazgch 21:c4d64830bf02 1806 int ln = _parseFormated(pipe, len, lutF[i].fmt);
mazgch 21:c4d64830bf02 1807 if (ln == WAIT && fr)
mazgch 21:c4d64830bf02 1808 return WAIT;
mazgch 21:c4d64830bf02 1809 if ((ln != NOT_FOUND) && (unkn > 0))
mazgch 31:a0bed6c1e05d 1810 return TYPE_UNKNOWN | pipe->get(buf, unkn);
mazgch 21:c4d64830bf02 1811 if (ln > 0)
mazgch 21:c4d64830bf02 1812 return lutF[i].type | pipe->get(buf, ln);
mazgch 21:c4d64830bf02 1813 }
mazgch 21:c4d64830bf02 1814 for (int i = 0; i < sizeof(lut)/sizeof(*lut); i ++) {
mazgch 21:c4d64830bf02 1815 pipe->set(unkn);
mazgch 21:c4d64830bf02 1816 int ln = _parseMatch(pipe, len, lut[i].sta, lut[i].end);
mazgch 21:c4d64830bf02 1817 if (ln == WAIT && fr)
mazgch 21:c4d64830bf02 1818 return WAIT;
mazgch 21:c4d64830bf02 1819 if ((ln != NOT_FOUND) && (unkn > 0))
mazgch 31:a0bed6c1e05d 1820 return TYPE_UNKNOWN | pipe->get(buf, unkn);
mazgch 21:c4d64830bf02 1821 if (ln > 0)
mazgch 21:c4d64830bf02 1822 return lut[i].type | pipe->get(buf, ln);
mazgch 21:c4d64830bf02 1823 }
mazgch 21:c4d64830bf02 1824 // UNKNOWN
mazgch 21:c4d64830bf02 1825 unkn ++;
mazgch 21:c4d64830bf02 1826 len--;
mazgch 21:c4d64830bf02 1827 }
mazgch 18:e5697801df29 1828 return WAIT;
mazgch 18:e5697801df29 1829 }
mazgch 18:e5697801df29 1830
mazgch 18:e5697801df29 1831 // ----------------------------------------------------------------
mazgch 18:e5697801df29 1832 // Serial Implementation
mazgch 18:e5697801df29 1833 // ----------------------------------------------------------------
mazgch 18:e5697801df29 1834
mazgch 76:f7c3dd568dae 1835 /*! Helper Dev Null Device
mazgch 76:f7c3dd568dae 1836 Small helper class used to shut off stderr/stdout. Sometimes stdin/stdout
mazgch 76:f7c3dd568dae 1837 is shared with the serial port of the modem. Having printfs inbetween the
mazgch 76:f7c3dd568dae 1838 AT commands you cause a failure of the modem.
mazgch 76:f7c3dd568dae 1839 */
mazgch 76:f7c3dd568dae 1840 class DevNull : public Stream {
mazgch 76:f7c3dd568dae 1841 public:
mazgch 76:f7c3dd568dae 1842 DevNull() : Stream(_name+1) { } //!< Constructor
mazgch 76:f7c3dd568dae 1843 void claim(const char* mode, FILE* file)
mazgch 76:f7c3dd568dae 1844 { freopen(_name, mode, file); } //!< claim a stream
mazgch 76:f7c3dd568dae 1845 protected:
mazgch 76:f7c3dd568dae 1846 virtual int _getc() { return EOF; } //!< Nothing
mazgch 76:f7c3dd568dae 1847 virtual int _putc(int c) { return c; } //!< Discard
mazgch 76:f7c3dd568dae 1848 static const char* _name; //!< File name
mazgch 76:f7c3dd568dae 1849 };
mazgch 76:f7c3dd568dae 1850 const char* DevNull::_name = "/null"; //!< the null device name
mazgch 76:f7c3dd568dae 1851 static DevNull null; //!< the null device
mazgch 76:f7c3dd568dae 1852
mazgch 19:2b5d097ca15d 1853 MDMSerial::MDMSerial(PinName tx /*= MDMTXD*/, PinName rx /*= MDMRXD*/,
mazgch 19:2b5d097ca15d 1854 int baudrate /*= MDMBAUD*/,
mazgch 43:a89a7a505991 1855 #if DEVICE_SERIAL_FC
mazgch 19:2b5d097ca15d 1856 PinName rts /*= MDMRTS*/, PinName cts /*= MDMCTS*/,
mazgch 43:a89a7a505991 1857 #endif
mazgch 18:e5697801df29 1858 int rxSize /*= 256*/, int txSize /*= 128*/) :
mazgch 35:9275215a3a5b 1859 SerialPipe(tx, rx, rxSize, txSize)
mazgch 18:e5697801df29 1860 {
mazgch 76:f7c3dd568dae 1861 if (rx == USBRX)
mazgch 76:f7c3dd568dae 1862 null.claim("r", stdin);
mazgch 76:f7c3dd568dae 1863 if (tx == USBTX) {
mazgch 76:f7c3dd568dae 1864 null.claim("w", stdout);
mazgch 76:f7c3dd568dae 1865 null.claim("w", stderr);
mazgch 74:208e3e32d263 1866 #ifdef MDM_DEBUG
mazgch 76:f7c3dd568dae 1867 _debugLevel = -1;
mazgch 76:f7c3dd568dae 1868 #endif
mazgch 76:f7c3dd568dae 1869 }
mazgch 74:208e3e32d263 1870 #ifdef TARGET_UBLOX_C027
mazgch 74:208e3e32d263 1871 _onboard = (tx == MDMTXD) && (rx == MDMRXD);
mazgch 74:208e3e32d263 1872 if (_onboard)
mazgch 74:208e3e32d263 1873 c027_mdm_powerOn(false);
mazgch 74:208e3e32d263 1874 #endif
mazgch 18:e5697801df29 1875 baud(baudrate);
mazgch 35:9275215a3a5b 1876 #if DEVICE_SERIAL_FC
mazgch 35:9275215a3a5b 1877 if ((rts != NC) || (cts != NC))
mazgch 35:9275215a3a5b 1878 {
mazgch 35:9275215a3a5b 1879 Flow flow = (cts == NC) ? RTS :
mazgch 35:9275215a3a5b 1880 (rts == NC) ? CTS : RTSCTS ;
mazgch 35:9275215a3a5b 1881 set_flow_control(flow, rts, cts);
mazgch 35:9275215a3a5b 1882 if (cts != NC) _dev.lpm = LPM_ENABLED;
mazgch 35:9275215a3a5b 1883 }
mazgch 35:9275215a3a5b 1884 #endif
mazgch 18:e5697801df29 1885 }
mazgch 18:e5697801df29 1886
mazgch 76:f7c3dd568dae 1887 MDMSerial::~MDMSerial(void)
mazgch 76:f7c3dd568dae 1888 {
irsanjul 120:353754a2bcd9 1889 /*powerOff();
mazgch 76:f7c3dd568dae 1890 #ifdef TARGET_UBLOX_C027
mazgch 76:f7c3dd568dae 1891 if (_onboard)
mazgch 76:f7c3dd568dae 1892 c027_mdm_powerOff();
irsanjul 120:353754a2bcd9 1893 #endif*/
mazgch 76:f7c3dd568dae 1894 }
mazgch 76:f7c3dd568dae 1895
mazgch 18:e5697801df29 1896 int MDMSerial::_send(const void* buf, int len)
mazgch 18:e5697801df29 1897 {
mazgch 35:9275215a3a5b 1898 return put((const char*)buf, len, true/*=blocking*/);
mazgch 18:e5697801df29 1899 }
mazgch 18:e5697801df29 1900
mazgch 18:e5697801df29 1901 int MDMSerial::getLine(char* buffer, int length)
mazgch 18:e5697801df29 1902 {
mazgch 18:e5697801df29 1903 return _getLine(&_pipeRx, buffer, length);
mazgch 18:e5697801df29 1904 }
mazgch 18:e5697801df29 1905
mazgch 18:e5697801df29 1906 // ----------------------------------------------------------------
mazgch 18:e5697801df29 1907 // USB Implementation
mazgch 18:e5697801df29 1908 // ----------------------------------------------------------------
mazgch 18:e5697801df29 1909
mazgch 18:e5697801df29 1910 #ifdef HAVE_MDMUSB
mazgch 76:f7c3dd568dae 1911 MDMUsb::MDMUsb(void)
mazgch 74:208e3e32d263 1912 {
mazgch 74:208e3e32d263 1913 #ifdef MDM_DEBUG
mazgch 74:208e3e32d263 1914 _debugLevel = 1;
mazgch 74:208e3e32d263 1915 #endif
mazgch 74:208e3e32d263 1916 #ifdef TARGET_UBLOX_C027
mazgch 74:208e3e32d263 1917 _onboard = true;
mazgch 74:208e3e32d263 1918 c027_mdm_powerOn(true);
mazgch 74:208e3e32d263 1919 #endif
mazgch 74:208e3e32d263 1920 }
mazgch 76:f7c3dd568dae 1921
mazgch 76:f7c3dd568dae 1922 MDMUsb::~MDMUsb(void)
mazgch 76:f7c3dd568dae 1923 {
irsanjul 120:353754a2bcd9 1924 /*powerOff();
mazgch 76:f7c3dd568dae 1925 #ifdef TARGET_UBLOX_C027
mazgch 76:f7c3dd568dae 1926 if (_onboard)
mazgch 76:f7c3dd568dae 1927 c027_mdm_powerOff();
irsanjul 120:353754a2bcd9 1928 #endif*/
mazgch 76:f7c3dd568dae 1929 }
mazgch 76:f7c3dd568dae 1930
mazgch 76:f7c3dd568dae 1931 int MDMUsb::_send(const void* buf, int len) { return 0; }
mazgch 76:f7c3dd568dae 1932
mazgch 18:e5697801df29 1933 int MDMUsb::getLine(char* buffer, int length) { return NOT_FOUND; }
mazgch 76:f7c3dd568dae 1934
mazgch 35:9275215a3a5b 1935 #endif