FRDM-K64F, Avnet M14A2A, Grove Shield, to create smart home system. In use with AT&Ts M2x & Flow.

Dependencies:   mbed FXOS8700CQ MODSERIAL

Files at this revision

API Documentation at this revision

Comitter:
fkellermavnet
Date:
Fri Aug 12 19:47:29 2016 +0000
Parent:
71:45a5e426df81
Child:
75:8cc98a3b9c62
Commit message:
Merged in WNC suggestions for: Check for EXTERR and close and reopen the socket if it occurs. If sockopen fails send command to close the socket. Don't use find() on empty strings.

Changed in this revision

cell_modem.cpp Show annotated file Show diff for this revision Revisions of this file
wnc_control.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/cell_modem.cpp	Thu Aug 11 17:04:09 2016 +0000
+++ b/cell_modem.cpp	Fri Aug 12 19:47:29 2016 +0000
@@ -217,9 +217,12 @@
             }
 
             int rsp_idx = 0;
+            // TODO: Test if @EXTERR:<code>
             while (rsp_list[rsp_idx]) {
                 if (strcasecmp(cmd_buf, rsp_list[rsp_idx]) == 0) {
                     return rsp_idx;
+                } else if (strncmp(cmd_buf, "@EXTERR", 7) == 0){
+                    return rsp_idx;    
                 }
                 rsp_idx++;
             }
--- a/wnc_control.cpp	Thu Aug 11 17:04:09 2016 +0000
+++ b/wnc_control.cpp	Fri Aug 12 19:47:29 2016 +0000
@@ -37,7 +37,8 @@
     WNC_OK =0,
     WNC_CMD_ERR = -1,
     WNC_NO_RESPONSE = -2,
-    WNC_CELL_LINK_DOWN = -3
+    WNC_CELL_LINK_DOWN = -3,
+    WNC_EXTERR = -4
 };
 
 // Contains result of last call to send_wnc_cmd(..)
@@ -58,12 +59,12 @@
     cmd_str += MY_APN_STR;
     cmd_str += ",IP";
     at_send_wnc_cmd(cmd_str.c_str(), &pRespStr, 4*WNC_TIMEOUT_MS); // Set APN, cmd seems to take a little longer sometimes
-    PUTS(cmd_str.c_str());
  }   
 
   static bool reportStatus = true;
   do
   {
+      PUTS("------------ software_init_mdm! --------->\r\n");
       if (check_wnc_ready() == 0)
       {
           if (reportStatus == false)
@@ -157,6 +158,13 @@
         PUTS("Socket Write fail!!!\r\n");
         software_init_mdm();
       }
+      else if (WNC_MDM_ERR == WNC_EXTERR)
+      {
+        pc.puts("Socket Disconnected (broken) !!!\r\n");
+        sockclose_mdm();
+        sockopen_mdm();
+        //software_init_mdm();
+      }
     } while (WNC_MDM_ERR != WNC_OK);
     }
     else
@@ -283,6 +291,8 @@
   
     // SIM card OK, now check for signal and cellular network registration
     cmdRes1 = at_send_wnc_cmd("AT+CREG?", &pRespStr, WNC_TIMEOUT_MS);      // Check if registered on network
+    if (pRespStr->size() > 0)
+    {
     pos = pRespStr->find("CREG: ");
     if (pos != string::npos)
     {
@@ -295,6 +305,7 @@
 #ifdef WNC_CMD_DEBUG_ON_VERBOSE
             PUTS("------------ WNC Cell Link Down! ------>\r\n");
 #endif
+            wait_ms(3000);
             return (-2);
         }
     }
@@ -302,7 +313,15 @@
 #ifdef WNC_CMD_DEBUG_ON_VERBOSE
     PUTS("------------ WNC Ready ---------------->\r\n");
 #endif
-  
+    }
+    else
+    {
+#ifdef WNC_CMD_DEBUG_ON_VERBOSE
+        PUTS("------------ CREG No Reply !----------->\r\n");
+#endif
+        return (-2);
+    }
+
     return (0);
 }
 
@@ -319,6 +338,7 @@
      PUTS("FAIL send cmd: ");
      #ifdef WNC_CMD_DEBUG_ON_VERBOSE
      PUTS(s);
+
      #else
      string truncStr(s, 50);
      truncStr += "\r\n";
@@ -354,7 +374,10 @@
   if (cmdRes == -2)
      WNC_MDM_ERR = WNC_NO_RESPONSE;
 
-  if (cmdRes == 0)
+  if (cmdRes == -3)
+     WNC_MDM_ERR = WNC_EXTERR;
+
+ if (cmdRes == 0)
      WNC_MDM_ERR = WNC_OK;
   
   return (cmdRes);
@@ -362,7 +385,7 @@
 
 int at_send_wnc_cmd(const char * s, string ** r, int ms_timeout)
 {
-  static const char * rsp_lst[] = { "OK", "ERROR", NULL };
+  static const char * rsp_lst[] = { "OK", "ERROR", "@EXTERR", NULL };
   int len;
 
 #ifdef WNC_CMD_DEBUG_ON
@@ -403,10 +426,14 @@
       #endif
 #endif
 
-      if (res > 0)
+      if (res == 0) {
+          /* OK */
+          return 0;
+      } else if (res == 2) {
+          /* @EXTERR */
+          return -3;
+      } else
           return -1;
-      else
-          return 0;
   }
   else
   {
@@ -496,7 +523,11 @@
   cmd_str += "\",";
   cmd_str += port;
   cmd_str += ",30";
-  send_wnc_cmd(cmd_str.c_str(), &pRespStr, 31000);
+  int cmd = send_wnc_cmd(cmd_str.c_str(), &pRespStr, 31000);
+  if (cmd != WNC_OK) {
+      // Per WNC: re-close even if open fails!
+      at_sockclose_wnc();
+  }
 }
 
 void at_sockclose_wnc(void)
@@ -541,6 +572,7 @@
   string * pRespStr;
   char num2str[6];
   size_t sLen = strlen(s);
+  int res;
   if (sLen <= 1500)
   {
     string cmd_str("AT@SOCKWRITE=1,");
@@ -560,7 +592,9 @@
       cmd_str += num2str;
     }
     cmd_str += "\"";
-    send_wnc_cmd(cmd_str.c_str(), &pRespStr, 120000);
+    res = send_wnc_cmd(cmd_str.c_str(), &pRespStr, 120000);
+    if (res == -3)
+        PUTS("sockwrite is disconnect \r\n");
   }
   else
     PUTS("sockwrite Err, string to long\r\n");
@@ -589,29 +623,35 @@
       // between each retry.
       wait_ms(10);
       
-      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;
+      if (send_wnc_cmd(cmd_str.c_str(), &pRespStr, WNC_TIMEOUT_MS) == 0)
+      {
+        size_t pos_start = pRespStr->find("\"")  + 1;
+        size_t pos_end   = pRespStr->rfind("\"") - 1;
       
-      // Make sure search finds what it's looking for!
-      if (pos_start != string::npos && pos_end != string::npos)
+        // Make sure search finds what it's looking for!
+        if (pos_start != string::npos && pos_end != string::npos)
           i = (pos_end - pos_start + 1);  // Num hex chars, 2 per byte
-      else
+        else
           i = 0;
           
-      if (i > 0)
+        if (i > 0)
+        {
+            retries = 1;  // If any data found retry 1 more time to catch data that might be in another
+                          //  WNC payload
+            string byte;
+            while (pos_start < pos_end)
+            {
+              byte = pRespStr->substr(pos_start, 2);
+              *pS += (char)strtol(byte.c_str(), NULL, 16);
+              pos_start += 2;
+            }
+            numBytes += i/2;
+        }
+      }
+      else
       {
-        retries = 1;  // If any data found retry 1 more time to catch data that might be in another
-                      //  WNC payload
-        string byte;
-        while (pos_start < pos_end)
-        {
-          byte = pRespStr->substr(pos_start, 2);
-          *pS += (char)strtol(byte.c_str(), NULL, 16);
-          pos_start += 2;
-        }
-        numBytes += i/2;
+          PUTS("no readsock reply!\r\n");
+          return (0);
       }
     }
   }