Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of C027_Support by
Diff: MDM.cpp
- Revision:
- 44:9d12223b78ff
- Parent:
- 43:a89a7a505991
- Child:
- 45:ebc2fd8dcf21
--- a/MDM.cpp Fri Apr 11 20:10:28 2014 +0000
+++ b/MDM.cpp Thu Apr 17 20:41:30 2014 +0000
@@ -36,8 +36,11 @@
#define WHY(t) COL("37m",t)
#endif
+MDMParser* MDMParser::inst;
+
MDMParser::MDMParser(void)
{
+ inst = this;
memset(&_dev, 0, sizeof(_dev));
memset(&_net, 0, sizeof(_net));
_ip = NOIP;
@@ -635,6 +638,7 @@
// successfull
_sockets[socket].state = SOCK_CREATED;
_sockets[socket].pending = 0;
+ _sockets[socket].timeout_ms = 0; // non blocking
return socket;
}
@@ -653,6 +657,19 @@
return true;
}
+bool MDMParser::socketIsConnected(int socket)
+{
+ return (ISSOCKET(socket) && (_sockets[socket].state == SOCK_CONNECTED));
+}
+
+bool MDMParser::socketSetBlocking(int socket, unsigned int timeout_ms)
+{
+ if (!ISSOCKET(socket))
+ return false;
+ _sockets[socket].timeout_ms = timeout_ms;
+ return true;
+}
+
bool MDMParser::socketClose(int socket)
{
if (!ISSOCKET(socket) || (_sockets[socket].state != SOCK_CONNECTED))
@@ -660,6 +677,7 @@
sendFormated("AT+USOCL=%d\r\n", socket);
if (OK != waitFinalResp())
return false;
+ _sockets[socket].state = SOCK_CREATED;
return true;
}
@@ -729,27 +747,33 @@
if (!ISSOCKET(socket))
return SOCKET_ERROR;
memset(buf, '\0', len);
+ Timer timer;
+ timer.start();
while (len) {
int blk = MAX_SIZE - 64; // still need space for headers and unsolicited commands
- if (_sockets[socket].state != SOCK_CONNECTED)
- return cnt ? cnt : SOCKET_ERROR;
if (_sockets[socket].pending < blk)
blk = _sockets[socket].pending;
if (len < blk) blk = len;
if (blk) {
- sendFormated("AT+USORD=%d,%d\r\n",socket, blk);
+ sendFormated("AT+USORD=%d,%d\r\n",socket, blk);
if (OK != waitFinalResp(_cbUSORD, buf)) {
- return cnt ? cnt : SOCKET_ERROR;
+ return SOCKET_ERROR;
}
len -= blk;
cnt += blk;
buf += blk;
_sockets[socket].pending -= blk;
- } else {
+ } else if ((_sockets[socket].state == SOCK_CONNECTED) && (
+ (_sockets[socket].timeout_ms == (unsigned int)-1 /* blocking */) ||
+ (timer.read_ms() < _sockets[socket].timeout_ms))){
// allow to receive unsolicited commands
waitFinalResp(NULL, NULL, 10);
+ } else {
+ len = 0; // no more data and socket closed or timed-out
}
}
+ timer.stop();
+ timer.reset();
return cnt;
}
@@ -774,10 +798,10 @@
if (!ISSOCKET(socket))
return SOCKET_ERROR;
memset(buf, '\0', len);
+ Timer timer;
+ timer.start();
while (len) {
int blk = MAX_SIZE - 64; // still need space for headers and unsolicited commands
- if (_sockets[socket].state != SOCK_CONNECTED)
- return cnt ? cnt : SOCKET_ERROR;
if (_sockets[socket].pending < blk)
blk = _sockets[socket].pending;
if (len < blk) blk = len;
@@ -786,7 +810,7 @@
USORFparam param;
param.buf = buf;
if (OK != waitFinalResp(_cbUSORF, ¶m)) {
- return cnt ? cnt : SOCKET_ERROR;
+ return SOCKET_ERROR;
}
*ip = param.ip;
//*port = param.port;
@@ -794,11 +818,17 @@
cnt += blk;
buf += blk;
_sockets[socket].pending -= blk;
- } else {
+ } else if ((_sockets[socket].state == SOCK_CONNECTED) && (
+ (_sockets[socket].timeout_ms == (unsigned int)-1 /* blocking */) ||
+ (timer.read_ms() < _sockets[socket].timeout_ms))){
// allow to receive unsolicited commands
waitFinalResp(NULL, NULL, 10);
+ } else {
+ len = 0; // no more data and socket closed or timed-out
}
}
+ timer.stop();
+ timer.reset();
return cnt;
}
