* add C027_Support fork

Fork of C027_Support by u-blox

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, &param)) {
-                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;
 }