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

Fork of WncControllerLibrary by Fred Kellerman

Revision:
18:ca2899c353c2
Parent:
17:59b1e9341188
Child:
19:83a52353b97e
--- a/WncController.cpp	Sat Sep 10 02:55:56 2016 +0000
+++ b/WncController.cpp	Tue Sep 13 19:10:34 2016 +0000
@@ -207,10 +207,11 @@
     
     if (sizeRespBuf > 0) {
         AtCmdErr_e r = at_send_wnc_cmd(cmd, &respStr, ms_timeout);
-        if (respStr->size() < sizeRespBuf) {
-            strcpy(resp, respStr->c_str());
-            return (respStr->size());
-        }
+        strncpy(resp, respStr->c_str(), sizeRespBuf);
+        if (respStr->size() > sizeRespBuf)
+            dbgPuts("sendCustomCmd truncated!");
+            
+        return (respStr->size());
     }
     
     dbgPuts("sendCustomCmd: would have overrun!");
@@ -855,6 +856,52 @@
     } while (m_sSock[numSock].open == false);
 }
 
+
+bool WncController::getICCID(string * iccid)
+{
+    string * respStr;
+    
+    iccid->erase();
+    
+    AtCmdErr_e r = at_send_wnc_cmd("AT%CCID", &respStr, m_sCmdTimeoutMs);
+
+    if (r != WNC_AT_CMD_OK || respStr->size() == 0)
+        return (false);
+
+    size_t pos = respStr->find("AT%CCID");
+    if (pos == string::npos)
+        return (false);
+    
+    size_t posOK = respStr->rfind("OK");
+    if (posOK == string::npos)
+        return (false);
+
+    pos += 7; // Advanced to the number
+    *iccid = respStr->substr(pos, posOK - pos);
+    
+    return (true);
+}
+
+bool WncController::convertICCIDtoMSISDN(const string & iccid, string * msisdn)
+{
+    msisdn->erase();
+    
+    if (iccid.size() != 20 && iccid.size() != 19) {
+        dbgPuts("Invalid ICCID length!");
+        return (false);
+    }
+ 
+    *msisdn = "882350";
+    
+    if (iccid.size() == 20)
+        *msisdn += iccid.substr(10,iccid.size() - 11);
+    else
+        *msisdn += iccid.substr(10,iccid.size() - 10);
+    
+    return (true);
+}
+
+
 bool WncController::sendSMSText(const char * const phoneNum, const char * const text)
 {
     if (at_sendSMStext_wnc(phoneNum, text) == true)
@@ -865,15 +912,113 @@
     }
 }
 
-size_t WncController::readSMSLog(const char ** log)
+bool WncController::readSMSLog(struct WncSmsList * log)
 {
-    size_t n;
+    string * logStr;
+    uint16_t i;
+    
+    if (at_readSMSlog_wnc(&logStr) == false) {
+        dbgPuts("readSMSLog: Failed!");
+        return (false);
+    }
+    
+    dbgPuts(logStr->c_str());
+
+    // Clean slate    
+    log->msgCount = 0;
+
+    // Pick out the stuff from the string and convert to struct
+    string s;
+    size_t pos2;
+    size_t pos = logStr->find("+CMGL:");
 
-    n = at_readSMSlog_wnc(log);
-    if (n == 0)
-        dbgPuts("readSMSLog: Failed!");
+    for(i=0; i<MAX_WNC_SMS_MSG_SLOTS; i++) {
+        if (pos == string::npos)
+            return (false);
+        pos = logStr->find(",\"");
+        if (pos == string::npos)
+            return (false);
+        pos += 3;  // Advance to the text we want
+        pos2 = logStr->find("\",", pos);
+        if ((pos2 == string::npos) || (pos >= pos2))
+            return (false);
+            
+        // Setup attributes
+        log->e[i].unread = false;
+        log->e[i].incoming = false;
+        log->e[i].unsent = false;
+        
+        s = logStr->substr(pos, pos2 - pos);
+        if (s.find("READ") != string::npos)
+            log->e[i].incoming = true;
+        if (s.find("REC UNREAD") != string::npos)
+            log->e[i].unread = true;
+        if (s.find("STO UNSENT") != string::npos)
+            log->e[i].unsent = true;
+            
+        // Tele number
+        pos2 += 3;  // Advance to next field
+        pos = logStr->find("\",", pos2);
+        if ((pos == string::npos) || (pos2 > pos))
+            return (false);
+        if (pos == pos2)
+            log->e[i].number.erase();
+        else    
+            log->e[i].number = logStr->substr(pos2, pos - pos2);
+        
+        // Timestamp
+        pos = pos2 + 4; // Beginning of timestamp field
+        pos2 = logStr->find("\",", pos); // End of timestamp field
+        if ((pos2 == string::npos) || (pos > pos2))
+            return (false);
+        if (pos == pos2)
+            log->e[i].timestamp.erase();
+        else
+            log->e[i].timestamp = logStr->substr(pos, pos2 - pos);
         
-    return (n);
+        // Message field
+        
+        // We don't know how many messages we have so the next search
+        // could end with +CMGL or OK.
+        pos2 += 2;  // Advanced to message text
+        pos = logStr->find("+CMGL", pos2);
+        if (pos == string::npos) {
+            pos = logStr->find("OK", pos2);
+            if (pos == string::npos) {
+                dbgPuts("Strange SMS Log Ending!");
+                return (false);
+            }
+            i = MAX_WNC_SMS_MSG_SLOTS; // break
+        }
+        if (pos2 > pos)
+            return (false);
+        if (pos2 == pos)
+            log->e[log->msgCount].msg.erase();
+        else
+            log->e[log->msgCount].msg = logStr->substr(pos2, pos - pos2);
+
+        log->msgCount++;  // Message complete
+    }    
+    
+    return (true);
+}
+
+bool WncController::readUnreadSMSText(struct WncSmsList * w)
+{
+    struct WncController::WncSmsList tmp;
+    
+    if (readSMSLog(&tmp) == false)
+        return (false);
+    
+    w->msgCount = 0;
+    for(uint16_t i = 0; i < tmp.msgCount; i++) {
+        if (tmp.e[i].unread == true) {
+            w->e[w->msgCount] = tmp.e[i];
+            w->msgCount++;
+        }
+    }
+    
+    return (true);
 }
 
 size_t WncController::getSignalQuality(const char ** log)
@@ -998,17 +1143,6 @@
     return (false);
 }
 
-size_t WncController::readSMSText(const char n, const char ** msg)
-{
-    size_t i;
-
-    i = at_readSMStext_wnc(n,msg);
-    if (i == 0)
-        dbgPuts("readSMSText: Failed!");
-        
-    return (n);
-}
-
 bool WncController::at_get_wnc_net_stats(WncIpStats * s)
 {
     string * pRespStr;
@@ -1243,7 +1377,7 @@
     string * pRespStr;
     size_t l = strlen(text);
     
-    if (l <= MAX_WNC_SMS_LENGTH)
+    if (l <= MAX_WNC_SMS_MSG_SLOTS)
     {
         // Check to see if the SMS service is available
         checkCellLink();
@@ -1331,20 +1465,9 @@
     return (false);
 }
 
-
-size_t WncController::at_readSMSlog_wnc(const char ** log)
+bool WncController::at_readSMSlog_wnc(string ** log)
 {
-    string * pRespStr;
-    static string smsLogStr;
-    
-    smsLogStr.erase();
-
-    if (at_send_wnc_cmd("AT+CMGL", &pRespStr, m_sCmdTimeoutMs) == WNC_AT_CMD_OK)
-        smsLogStr = *pRespStr;
-        
-    *log = smsLogStr.c_str();
-    
-    return (pRespStr->size());
+    return (at_send_wnc_cmd("AT+CMGL", log, m_sCmdTimeoutMs) == WNC_AT_CMD_OK);
 }
 
 size_t WncController::at_readSMStext_wnc(const char n, const char ** log)