This library controls the WNC. There is a derived class for usage from the K64F board.

Fork of WncControllerLibrary by Fred Kellerman

Revision:
10:2ec59906a24e
Parent:
9:76c6dd1434e1
Child:
11:3ff6c1cb5b03
diff -r 76c6dd1434e1 -r 2ec59906a24e WncController.cpp
--- a/WncController.cpp	Fri Sep 09 17:47:55 2016 +0000
+++ b/WncController.cpp	Fri Sep 09 23:07:36 2016 +0000
@@ -36,10 +36,9 @@
 /////////////////////////////////////////////////////
 // Static initializers
 /////////////////////////////////////////////////////
-WncController::WncSocketInfo_s WncController::m_sSock[MAX_NUM_WNC_SOCKETS] = {
-    { false, "192.168.0.1", 80, 0, 25, true, 30 } // ,
-//    { false, "192.168.0.1", 80, 0, 25, true, 30 }
-};
+WncController::WncSocketInfo_s WncController::m_sSock[MAX_NUM_WNC_SOCKETS];
+const WncController::WncSocketInfo_s WncController::defaultSockStruct = { 0, false, "192.168.0.1", 80, 0, 25, true, 30 };
+
 WncController::WncState_e WncController::m_sState = WNC_OFF;
 uint16_t WncController::m_sCmdTimeoutMs = WNC_CMD_TIMEOUT_MS;
 string WncController::m_sApnStr = "NULL";
@@ -118,6 +117,8 @@
  */
 WncController::WncController(void)
 {
+    for(unsigned i; i<MAX_NUM_WNC_SOCKETS; i++)
+        m_sSock[i] = defaultSockStruct;
 }
 
 void WncController::enableDebug(bool on, bool moreDebugOn)
@@ -348,20 +349,27 @@
         // Already open ? Must close if want to re-open with new settings.
         if (m_sSock[numSock].open == true) {
             dbgPuts("Socket already open, close then re-open!");
-            at_sockclose_wnc(numSock);
+            at_sockclose_wnc(m_sSock[numSock].numWncSock);
             m_sSock[numSock].open = false;
         }
         
         m_sSock[numSock].myPort = port;
         m_sSock[numSock].isTcp = tcp;
         m_sSock[numSock].timeOutSec = timeOutSec;
-        m_sSock[numSock].open = at_sockopen_wnc(m_sSock[numSock].myIpAddressStr.c_str(), port, numSock, tcp, timeOutSec);
+        
+        int numWncSock = at_sockopen_wnc(m_sSock[numSock].myIpAddressStr.c_str(), port, numSock, tcp, timeOutSec);
+        m_sSock[numSock].numWncSock = numWncSock;
+        if (numWncSock > 0 && numWncSock <= MAX_NUM_WNC_SOCKETS)
+            m_sSock[numSock].open = true;
+        else
+            m_sSock[numSock].open = false;
+            
         if (m_sSock[numSock].open == false) {
             dbgPuts("Socket open fail!!!!");
             // Work-around.  If the sock open fails it needs to be told
             // to close.  If 6 sock opens happen with a fail, it further
             // crashes the WNC.  Not sure why the sock won't open.
-            at_sockclose_wnc(numSock);
+            at_sockclose_wnc(m_sSock[numSock].numWncSock);
         }
     }
     else {
@@ -386,9 +394,9 @@
  
 bool WncController::sockWrite(const char * const s, uint32_t n, uint16_t numSock, bool isTcp)
 {
-    bool result = true;;
+    bool result = true;
     
-    AtCmdErr_e cmdRes = at_sockwrite_wnc(s, n, numSock, isTcp);
+    AtCmdErr_e cmdRes = at_sockwrite_wnc(s, n, m_sSock[numSock].numWncSock, isTcp);
     if (cmdRes != WNC_AT_CMD_OK) {
         if ((cmdRes == WNC_AT_CMD_ERREXT) || (cmdRes == WNC_AT_CMD_TIMEOUT) || (cmdRes == WNC_AT_CMD_ERRCME))
         {
@@ -468,7 +476,7 @@
             bool foundData = false;
             do {
                 AtCmdErr_e cmdRes;
-                cmdRes = at_sockread_wnc(&readStr, numSock, m_sSock[numSock].isTcp);
+                cmdRes = at_sockread_wnc(&readStr, m_sSock[numSock].numWncSock, m_sSock[numSock].isTcp);
                 if (WNC_AT_CMD_OK == cmdRes) {
                     // This will let this loop read until the socket data is
                     //  empty.  If no data, then wait the retry amount of time.
@@ -524,12 +532,10 @@
             size_t numRead;
             do {
                 AtCmdErr_e cmdRes;
-                if (maxReadBufLen < MAX_WNC_READ_BYTES) {
-                    cmdRes = at_sockread_wnc(readBuf, &numRead, maxReadBufLen, numSock, m_sSock[numSock].isTcp);
-                    dbgPutsNoTime("Warning: read back buffer to small?");
-                }
+                if (maxReadBufLen < MAX_WNC_READ_BYTES)
+                    cmdRes = at_sockread_wnc(readBuf, &numRead, maxReadBufLen, m_sSock[numSock].numWncSock, m_sSock[numSock].isTcp);
                 else
-                    cmdRes = at_sockread_wnc(readBuf, &numRead, MAX_WNC_READ_BYTES, numSock, m_sSock[numSock].isTcp);
+                    cmdRes = at_sockread_wnc(readBuf, &numRead, MAX_WNC_READ_BYTES, m_sSock[numSock].numWncSock, m_sSock[numSock].isTcp);
 
                 if (WNC_AT_CMD_OK == cmdRes) {
                     // This will let this loop read until the socket data is
@@ -537,7 +543,7 @@
                     if (numRead > 0) {
                         foundData = true;
                         i = 1;
-                        if (numRead < maxReadBufLen) {
+                        if (numRead <= maxReadBufLen) {
                             maxReadBufLen -= numRead;
                             numCopied     += numRead;
                             readBuf       += numRead;
@@ -566,7 +572,7 @@
                     else
                         waitMs(to);
                 }
-            } while (i-- > 0);
+            } while ((i-- > 0) && (maxReadBufLen > 0));
         }
         else {
             dbgPuts("Socket is closed for read");
@@ -628,7 +634,7 @@
 {
     if (numSock < MAX_NUM_WNC_SOCKETS) {
 
-        if (false == at_sockclose_wnc(numSock))
+        if (false == at_sockclose_wnc(m_sSock[numSock].numWncSock))
             dbgPuts("Sock close may not have closed!");
                 
         // Even with an error the socket could have closed,
@@ -818,8 +824,15 @@
     // Try to open and close the socket
     do {
         dbgPuts("Try to close and re-open socket");
-        at_sockclose_wnc(numSock);
-        m_sSock[numSock].open = at_sockopen_wnc(m_sSock[numSock].myIpAddressStr.c_str(), m_sSock[numSock].myPort, numSock, m_sSock[numSock].isTcp, m_sSock[numSock].timeOutSec);
+        at_sockclose_wnc(m_sSock[numSock].numWncSock);
+
+        int numWncSock = at_sockopen_wnc(m_sSock[numSock].myIpAddressStr.c_str(), m_sSock[numSock].myPort, numSock, m_sSock[numSock].isTcp, m_sSock[numSock].timeOutSec);
+        m_sSock[numSock].numWncSock = numWncSock;
+        if (numWncSock > 0 && numWncSock <= MAX_NUM_WNC_SOCKETS)
+            m_sSock[numSock].open = true;
+        else
+            m_sSock[numSock].open = false;
+
         if (m_sSock[numSock].open == false)
             dbgPuts("Failed to re-open socket!");
     } while (m_sSock[numSock].open == false);
@@ -1303,7 +1316,7 @@
 }
 
 
-bool WncController::at_sockopen_wnc(const char * const ip, uint16_t port, uint16_t numSock, bool tcp, uint16_t timeOutSec)
+int16_t WncController::at_sockopen_wnc(const char * const ip, uint16_t port, uint16_t numSock, bool tcp, uint16_t timeOutSec)
 {
     string * pRespStr;
     string cmd_str("AT@SOCKCREAT=");
@@ -1316,27 +1329,37 @@
     res = sendWncCmd(cmd_str.c_str(), &pRespStr, m_sCmdTimeoutMs);
     if (res == WNC_AT_CMD_OK)
     {
-        cmd_str = "AT@SOCKCONN=";
-        cmd_str += _to_string(numSock + 1);
-        cmd_str += ",\"";
-        cmd_str += ip;
-        cmd_str += "\",";
-        cmd_str += _to_string(port);
-        cmd_str += ",";
-        if (timeOutSec < 30)
-            timeOutSec = 30;
-        else if (timeOutSec > 360)
-            timeOutSec = 360;
-        cmd_str += _to_string(timeOutSec);
-        res = sendWncCmd(cmd_str.c_str(), &pRespStr, 1000 * timeOutSec + 1000);
-        if (m_sMoreDebugEnabled) {
-            at_send_wnc_cmd("AT@SOCKCREAT?", &pRespStr, m_sCmdTimeoutMs);
-            at_send_wnc_cmd("AT@SOCKCONN?", &pRespStr, m_sCmdTimeoutMs);
+        size_t pos1 = pRespStr->find("T:");
+        size_t pos2 = pRespStr->rfind("OK");
+        if ((pos1 != string::npos) && (pos2 != string::npos)) {
+            size_t numLen = pos2 - (pos1 + 2);
+            string sockStr = pRespStr->substr(pos1 + 2, numLen);
+            cmd_str = "AT@SOCKCONN=";
+            cmd_str += sockStr;
+            cmd_str += ",\"";
+            cmd_str += ip;
+            cmd_str += "\",";
+            cmd_str += _to_string(port);
+            cmd_str += ",";
+            if (timeOutSec < 30)
+                timeOutSec = 30;
+            else if (timeOutSec > 360)
+                timeOutSec = 360;
+            cmd_str += _to_string(timeOutSec);
+            res = sendWncCmd(cmd_str.c_str(), &pRespStr, 1000 * timeOutSec + 1000);
+            if (m_sMoreDebugEnabled) {
+                at_send_wnc_cmd("AT@SOCKCREAT?", &pRespStr, m_sCmdTimeoutMs);
+                at_send_wnc_cmd("AT@SOCKCONN?", &pRespStr, m_sCmdTimeoutMs);
+            }
+            return (strtol(sockStr.c_str(), NULL, 10));
         }
-        return (res == WNC_AT_CMD_OK);
+        else {
+            dbgPuts("Invalid sockcreat response!");
+            return (0);
+        }
     }
     else
-        return (false);
+        return (0);
 }
 
 bool WncController::at_sockclose_wnc(uint16_t numSock)
@@ -1344,7 +1367,7 @@
     string * pRespStr;
     string cmd_str("AT@SOCKCLOSE=");
 
-    cmd_str += _to_string(numSock + 1);
+    cmd_str += _to_string(numSock);
     // Don't check the cell status to close the socket
     return (WNC_AT_CMD_OK == at_send_wnc_cmd(cmd_str.c_str(), &pRespStr, m_sCmdTimeoutMs));
 }
@@ -1413,7 +1436,7 @@
         else
             cmd_str="AT@SOCKWRITE="; // "AT@SOCKSEND=";
 
-        cmd_str += _to_string(numSock + 1);
+        cmd_str += _to_string(numSock);
         cmd_str += ",";
         cmd_str += _to_string(n);
         cmd_str += ",\"";
@@ -1452,7 +1475,7 @@
     else
         cmd_str="AT@SOCKREAD="; // "AT@SOCKRECV=";
 
-    cmd_str += _to_string(numSock + 1);
+    cmd_str += _to_string(numSock);
     cmd_str += ",";
     cmd_str += _to_string(MAX_WNC_READ_BYTES);
             
@@ -1507,7 +1530,7 @@
         else
             cmd_str="AT@SOCKREAD="; // "AT@SOCKRECV=";
 
-        cmd_str += _to_string(numSock + 1);
+        cmd_str += _to_string(numSock);
         cmd_str += ",";
         cmd_str += _to_string(n);
             
@@ -1522,7 +1545,7 @@
                 i = (pos_end - pos_start + 1);  // Num hex chars, 2 per byte
             else
                 i = 0;
-            
+                
             if (i < 0)
                 dbgPuts("Invalid READ string!");
             else if (i > 2*n) {