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

Fork of WncControllerLibrary by Fred Kellerman

Revision:
20:ca2db38d6802
Parent:
19:83a52353b97e
Child:
21:086841abc3aa
--- a/WncController.cpp	Wed Sep 14 02:31:35 2016 +0000
+++ b/WncController.cpp	Wed Sep 14 23:15:39 2016 +0000
@@ -480,7 +480,7 @@
  *  \details DO NOT use the same string as is passed to the auto poll setup method!
  */
  
-size_t WncController::read(uint16_t numSock, const uint8_t ** readBuf)
+int WncController::read(uint16_t numSock, const uint8_t ** readBuf)
 {
     static string theBuf;
     string readStr;
@@ -489,7 +489,7 @@
 
     if (numSock < MAX_NUM_WNC_SOCKETS) {
         if (m_sSock[numSock].open == true) {
-            uint8_t   i = m_sSock[numSock].readRetries;
+            int16_t   i = m_sSock[numSock].readRetries;
             uint16_t to = m_sSock[numSock].readRetryWaitMs;
             bool foundData = false;
             do {
@@ -512,13 +512,17 @@
                 else {
                     theBuf += readStr; // Append what if any we got before it errored.
                     dbgPuts("Sockread failed!");
-                    if (cmdRes == WNC_AT_CMD_ERREXT || cmdRes == WNC_AT_CMD_TIMEOUT)
+                    if ((cmdRes == WNC_AT_CMD_ERREXT) || (cmdRes == WNC_AT_CMD_TIMEOUT) || (cmdRes == WNC_AT_CMD_ERRCME))
                     {
                         // This may throw away any data that hasn't been read out of the WNC
                         //  but at this point with the way the WNC currently works we have
                         //  no choice.
                         closeOpenSocket(numSock);
-                        i = 0;
+                        // Free the memory that was used
+                        theBuf.erase();
+                        *readBuf = (const uint8_t *)theBuf.c_str();
+                        // Game over no more data left to pull out!
+                        return (-1);
                     }
                     else
                         waitMs(to);
@@ -538,7 +542,7 @@
     return (theBuf.size());
 }
 
-size_t WncController::read(uint16_t numSock, uint8_t * readBuf, uint32_t maxReadBufLen)
+int WncController::read(uint16_t numSock, uint8_t * readBuf, uint32_t maxReadBufLen)
 {
     uint32_t numCopied = 0;
     
@@ -579,13 +583,14 @@
                 }
                 else {
                     dbgPuts("Sockread failed!");
-                    if (cmdRes == WNC_AT_CMD_ERREXT || cmdRes == WNC_AT_CMD_TIMEOUT)
+                    if ((cmdRes == WNC_AT_CMD_ERREXT) || (cmdRes == WNC_AT_CMD_TIMEOUT) || (cmdRes == WNC_AT_CMD_ERRCME))
                     {
                         // This may throw away any data that hasn't been read out of the WNC
                         //  but at this point with the way the WNC currently works we have
                         //  no choice.
                         closeOpenSocket(numSock);
-                        i = 0;
+                        // Game over
+                        return (-1);
                     }
                     else
                         waitMs(to);
@@ -971,7 +976,10 @@
             log->e[i].unsent = true;
             
         // Tele number
-        pos2 += 3;  // Advance to next field
+        pos2 = logStr->find(",\"", pos2);
+        if (pos2 == string::npos)
+            return (false);  
+        pos2 += 2;  // Advance to next field
         pos = logStr->find("\",", pos2);
         if ((pos == string::npos) || (pos2 > pos))
             return (false);
@@ -982,7 +990,10 @@
         
 
         // Date
-        pos += 4; // Beginning of date field
+        pos = logStr->find(",\"", pos);
+        if (pos == string::npos)
+            return (false);
+        pos += 2; // Beginning of date field
         pos2 = logStr->find(",", pos); // End of timestamp field
         if ((pos2 == string::npos) || (pos > pos2))
             return (false);
@@ -992,7 +1003,10 @@
             log->e[i].date = logStr->substr(pos, pos2 - pos);
 
         // Timestamp
-        pos2 += 1; // Beginning of time field
+        pos2 = logStr->find(",\"");
+        if (pos2 == string::npos)
+            return (false);
+        pos2 += 2; // Beginning of time field
         pos = logStr->find("\",", pos2); // End of timestamp field
         if ((pos == string::npos) || (pos2 > pos))
             return (false);
@@ -1005,6 +1019,9 @@
         
         // We don't know how many messages we have so the next search
         // could end with +CMGL or OK.
+        pos = logStr->find(",\"", pos);
+        if (pos == string::npos)
+            return (false);
         pos += 2;  // Advanced to message text
         pos2 = logStr->find("+CMGL", pos);
         if (pos2 == string::npos) {
@@ -1406,7 +1423,7 @@
     string * pRespStr;
     size_t l = strlen(text);
     
-    if (l <= MAX_WNC_SMS_MSG_SLOTS)
+    if (l <= MAX_WNC_SMS_LENGTH)
     {
         // Check to see if the SMS service is available
         checkCellLink();