Remote I/O Sensor bus with AT&T flow and M2X cloud

Dependencies:   DHT11 FXOS8700CQ MODSERIAL mbed

Fork of Avnet_ATT_Cellular_IOT by Avnet

Revision:
30:33be8e2992f3
Parent:
22:41e6c417ace1
Child:
32:1e052a3e73fe
--- a/wnc_control.cpp	Fri Jul 22 00:35:37 2016 +0000
+++ b/wnc_control.cpp	Fri Jul 22 15:06:52 2016 +0000
@@ -31,7 +31,7 @@
   {
     WNC_MDM_ERR = WNC_OK;
     at_init_wnc();
-    if (WNC_MDM_ERR != WNC_OK)
+    if (WNC_MDM_ERR == WNC_NO_RESPONSE)
       reinitialize_mdm();
   } while (WNC_MDM_ERR != WNC_OK); 
 }
@@ -55,7 +55,7 @@
       }
     } while (WNC_MDM_ERR != WNC_OK);
     
-    pc.printf("My Server IP: %s\r\n", MyServerIpAddress.data());
+    pc.printf("My Server IP: %s\r\n", MyServerIpAddress.c_str());
 }
 
 void sockopen_mdm(void)
@@ -104,25 +104,37 @@
       puts("Socket is closed for write!\r\n");
 }
 
-void sockread_mdm(string * sockData, int len, int retries)
+unsigned sockread_mdm(string * sockData, int len, int retries)
 {
+    unsigned n = 0;
+    
+    // Clean slate:
+    sockData->erase();
+    
     if (socketOpen == 1)
     {
     do
     {
       WNC_MDM_ERR = WNC_OK;
-      at_sockread_wnc(sockData, len, retries);
+      n = at_sockread_wnc(sockData, len, retries);
       if (WNC_MDM_ERR == WNC_NO_RESPONSE)
       {
-        reinitialize_mdm();
-        software_init_mdm();
+        if (n == 0)
+        {
+            reinitialize_mdm();
+            software_init_mdm();
+        }
+        else
+            puts("Sock read partial data!!!\r\n");
       }
       else if (WNC_MDM_ERR == WNC_CMD_ERR)
         puts("Sock read fail!!!!\r\n");
-    } while (WNC_MDM_ERR != WNC_OK);
+    } while (WNC_MDM_ERR == WNC_NO_RESPONSE);
     }
     else
       puts("Socket is closed for read\r\n");
+      
+    return (n);
 }
 
 void sockclose_mdm(void)
@@ -190,6 +202,9 @@
   static const char * rsp_lst[] = { "OK", "ERROR", NULL };
   int len;
   
+  // Per WNC between every AT cmd:
+  wait_ms(20);
+  
   pc.printf("Send: %s\r\n",s);
   int res = mdm_sendAtCmdRsp(s, rsp_lst, ms_timeout, &wncStr, &len);
   *r = &wncStr;   // Return a pointer to the static string
@@ -197,7 +212,7 @@
   if (res >= 0)
   {
       pc.puts("[");
-      pc.puts(wncStr.data());
+      pc.puts(wncStr.c_str());
       pc.puts("]\n\r");
       if (res > 0)
       {
@@ -230,7 +245,7 @@
   string cmd_str("AT%PDNSET=1,");
   cmd_str += MY_APN_STR;
   cmd_str += ",IP";
-  send_wnc_cmd(cmd_str.data(), &pRespStr, 2*WNC_TIMEOUT_MS); // Set APN, cmd seems to take a little longer sometimes
+  send_wnc_cmd(cmd_str.c_str(), &pRespStr, 2*WNC_TIMEOUT_MS); // Set APN, cmd seems to take a little longer sometimes
   send_wnc_cmd("AT@INTERNET=1", &pRespStr, WNC_TIMEOUT_MS);  // Internet services enabled
   send_wnc_cmd("AT@SOCKDIAL=1", &pRespStr, WNC_TIMEOUT_MS);
 }
@@ -243,7 +258,7 @@
   cmd_str += ipStr;
   cmd_str += "\",";
   cmd_str += port;
-  send_wnc_cmd(cmd_str.data(), &pRespStr, WNC_TIMEOUT_MS);
+  send_wnc_cmd(cmd_str.c_str(), &pRespStr, WNC_TIMEOUT_MS);
 }
 
 void at_sockclose_wnc(void)
@@ -258,7 +273,7 @@
   string str(s);
   str = "AT@DNSRESVDON=\"" + str;
   str += "\"\r\n";
-  if (send_wnc_cmd(str.data(), &pRespStr, WNC_TIMEOUT_MS) == 0)
+  if (send_wnc_cmd(str.c_str(), &pRespStr, WNC_TIMEOUT_MS) == 0)
   {
     size_t pos_start = pRespStr->find(":\"") + 2;
     if (pos_start !=  string::npos)
@@ -311,7 +326,7 @@
       cmd_str += num2str;
     }
     cmd_str += "\"";
-    send_wnc_cmd(cmd_str.data(), &pRespStr, WNC_TIMEOUT_MS);
+    send_wnc_cmd(cmd_str.c_str(), &pRespStr, WNC_TIMEOUT_MS);
   }
   else
     pc.puts("sockwrite Err, string to long\r\n");
@@ -322,6 +337,10 @@
   unsigned i;
   string * pRespStr;
   string cmd_str("AT@SOCKREAD=1,");
+
+  // Clean slate
+  pS->erase();
+
   if (n <= 1500)
   {
     char num2str[6];
@@ -336,7 +355,7 @@
       // between each retry.
       wait_ms(10);
       
-      send_wnc_cmd(cmd_str.data(), &pRespStr, WNC_TIMEOUT_MS);
+      send_wnc_cmd(cmd_str.c_str(), &pRespStr, WNC_TIMEOUT_MS);
       size_t pos_start = pRespStr->find("\"")  + 1;
       size_t pos_end   = pRespStr->rfind("\"") - 1;
       i = pos_end - pos_start + 1;
@@ -344,11 +363,10 @@
       {
         retries = 0;  // If any data found stop retrying
         string byte;
-        pS->erase();
         while (pos_start < pos_end)
         {
           byte = pRespStr->substr(pos_start, 2);
-          *pS += (char)strtol(byte.data(), NULL, 16);
+          *pS += (char)strtol(byte.c_str(), NULL, 16);
           pos_start += 2;
         }
         return i;