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:
Wed Sep 21 02:31:23 2016 +0000
Parent:
26:f726d56a8141
Child:
28:eece2151e1e5
Commit message:
Patched up SMS message parsing, the WNC though makes it really really hard to handle all cases.

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	Mon Sep 19 18:04:07 2016 +0000
+++ b/WncController.cpp	Wed Sep 21 02:31:23 2016 +0000
@@ -941,33 +941,57 @@
         return (false);
     }
     
-    dbgPuts(logStr->c_str());
-
     // Clean slate    
     log->msgCount = 0;
 
+    if (logStr->size() == 0)
+        return (false);
+
     // Pick out the stuff from the string and convert to struct
     string s;
     size_t pos2;
     size_t pos = logStr->find("+CMGL:");
+        
+    for(i=0; i<MAX_WNC_SMS_MSG_SLOTS; i++) {
+        // Start with a clean slate, let parsing fill out later.
+        log->e[i].unread = false;
+        log->e[i].incoming = false;
+        log->e[i].unsent = false;
+        log->e[i].pduMode = false;
+        log->e[i].msgReceipt = false;
 
-    for(i=0; i<MAX_WNC_SMS_MSG_SLOTS; i++) {
         log->e[i].idx = logStr->at(pos + 7);
         if (pos == string::npos)
             return (false);
-        pos = logStr->find(",\"", pos);
-        if (pos == string::npos)
-            return (false);
+        pos2 = logStr->find(",\"", pos);
+        if (pos2 == string::npos) {
+            // If the WNC acts wrong and receives a PDU mode
+            //  SMS there will not be any quotes in the response,
+            //  just take the whole reply and make it the message body for
+            //  now, mark it as an unread message, set the pdu flag!
+            log->e[log->msgCount].unread = true;
+            log->e[log->msgCount].pduMode = true;
+            log->msgCount++;
+
+            pos2 = logStr->find("+CMGL", pos + 5);
+            if (pos2 == string::npos) {
+                pos2 = logStr->find("OK", pos + 5);
+                if (pos2 == string::npos) {
+                    dbgPuts("Strange SMS Log Ending!");
+                    return (false);
+                }
+                i = MAX_WNC_SMS_MSG_SLOTS;
+            }
+            log->e[log->msgCount].msg = logStr->substr(0, pos2 - pos);
+            pos = pos2;  // for loop starts off expecting pos to point to next log msg
+            continue;
+        }
         pos += 2;  // 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("REC READ") != string::npos)
             log->e[i].incoming = true;
@@ -977,6 +1001,8 @@
         }
         if (s.find("STO UNSENT") != string::npos)
             log->e[i].unsent = true;
+        if (logStr->find(",,") == string::npos)
+            log->e[i].msgReceipt = true;
             
         // Tele number
         pos2 = logStr->find(",\"", pos2);
@@ -991,7 +1017,6 @@
         else    
             log->e[i].number = logStr->substr(pos2, pos - pos2);
         
-
         // Date
         pos = logStr->find(",\"", pos);
         if (pos == string::npos)
@@ -1006,12 +1031,11 @@
             log->e[i].date = logStr->substr(pos, pos2 - pos);
 
         // Timestamp
-        pos2 = logStr->find(",\"");
-        if (pos2 == string::npos)
+        pos = logStr->find("\",", pos2); // End of timestamp
+        if (pos == string::npos)
             return (false);
-        pos2 += 2; // Beginning of time field
-        pos = logStr->find("\",", pos2); // End of timestamp field
-        if ((pos == string::npos) || (pos2 > pos))
+        pos2 += 1; // Beginning of time field
+        if (pos < pos2)
             return (false);
         if (pos == pos2)
             log->e[i].time.erase();
@@ -1022,9 +1046,6 @@
         
         // 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) {
--- a/WncController.h	Mon Sep 19 18:04:07 2016 +0000
+++ b/WncController.h	Wed Sep 21 02:31:23 2016 +0000
@@ -278,6 +278,8 @@
         bool incoming;
         bool unsent;
         bool unread;
+        bool pduMode;
+        bool msgReceipt;
     };
 
     struct WncSmsList