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

Fork of WncControllerLibrary by Fred Kellerman

Files at this revision

API Documentation at this revision

Comitter:
fkellermavnet
Date:
Fri Sep 09 23:07:36 2016 +0000
Parent:
9:76c6dd1434e1
Child:
11:3ff6c1cb5b03
Commit message:
Fixed small buffer reading.

Changed in this revision

WncController.cpp Show annotated file Show diff for this revision Revisions of this file
WncController.h Show annotated file Show diff for this revision Revisions of this file
--- 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) {
--- a/WncController.h	Fri Sep 09 17:47:55 2016 +0000
+++ b/WncController.h	Fri Sep 09 23:07:36 2016 +0000
@@ -349,7 +349,7 @@
     size_t mdmGetline(string * buff, int timeout_ms);
     bool at_at_wnc(void);
     bool at_init_wnc(bool hardReset = false);
-    bool at_sockopen_wnc(const char * const ip, uint16_t port, uint16_t numSock, bool tcp, uint16_t timeOutSec);
+    int16_t at_sockopen_wnc(const char * const ip, uint16_t port, uint16_t numSock, bool tcp, uint16_t timeOutSec);
     bool at_sockclose_wnc(uint16_t numSock);
     bool at_dnsresolve_wnc(const char * s, string * ipStr);
     AtCmdErr_e at_sockwrite_wnc(const char * s, uint32_t n, uint16_t numSock, bool isTcp);
@@ -398,6 +398,7 @@
     static const char * const INVALID_IP_STR;                // Just a string set to an IP address when DNS resolve fails.
         
     struct WncSocketInfo_s {
+        int16_t numWncSock;
         bool open;
         string myIpAddressStr;
         uint16_t myPort;
@@ -408,6 +409,7 @@
     };
 
     static WncSocketInfo_s m_sSock[MAX_NUM_WNC_SOCKETS];
+    static const WncSocketInfo_s defaultSockStruct;
     static WncState_e m_sState;
     static uint16_t m_sCmdTimeoutMs;
     static string m_sApnStr;