this is using the mbed os version 5-13-1

Dependencies:   mbed-http

Revision:
104:11e9605093c9
Parent:
103:7b566b522427
Child:
105:e5ce023eee93
--- a/source/ATCmdManager.cpp	Thu May 02 21:50:17 2019 +0000
+++ b/source/ATCmdManager.cpp	Sun May 05 08:24:46 2019 +0000
@@ -84,6 +84,7 @@
     at_resp = AT_RESP_NONE;
     dataMode = AT_CMD_DATA_MODE;
     debug_flag = 0;
+    wifiStateControl = AT_RESP_NONE;
     _event_queue.call_in(10, &print_heap_and_isr_stack_info);
     //print_heap_and_isr_stack_info();
     _event_queue.call_every(3600000,&print_memory_info);
@@ -106,6 +107,7 @@
 void ATCmdManager::processResponses(){
         dequeueATresponse();
         dequeueWiFidataResponse();
+        updateWiFiMgrStatus();
         if(debug_flag>0){
             //debug_flag--;
             dbg_printf(LOG, " back to ProcessResponses in Main loop... at_resp = %d\r\n", at_resp);
@@ -150,7 +152,7 @@
                 respStr = (char *) resp_data->buffer;
                 sendAtConfirmationFreeMpool(respStr);
                 char * urc = new char[20];
-                sprintf(urc, "\r\n%s=%d\r\n", NETWORK_UP_URC, WIFI_INTERFACE_ID);
+                sprintf(urc, "\r\n%s:%d\r\n", NETWORK_UP_URC, WIFI_INTERFACE_ID);
                 sendAtEvent(urc);
                 delete urc;
                 //_smutex.unlock();
@@ -256,6 +258,18 @@
                 at_resp = AT_RESP_NONE;
                 break;
             }
+            case WIFI_WATCH_DOG:  
+            {
+                // AT_HTTP_RESP response state 
+                dbg_printf(LOG, "\n [ATCMD MAN] WIFI Watchdog message!!\r\n");
+                //_smutex.lock();
+                //_parser.send("\r\nNACK\r\n");
+                //_smutex.unlock();
+                respStr = (char *) resp_data->buffer;
+                sendConnectIndicationFreeMpool(respStr);
+                at_resp = AT_RESP_NONE;
+                break;
+            }
             case AT_COMMAND_FAILED:  
             {
                 // AT_HTTP_RESP response state 
@@ -280,6 +294,34 @@
 }
 
 
+void ATCmdManager::updateWiFiMgrStatus()
+{
+    static int wifiBusyMonitor = 0;
+    // if next response is the expected response, 
+    // then last command complete, reset wifi status
+    // pass or fail!!
+    if(at_resp == wifiStateControl || at_resp == AT_COMMAND_FAILED)
+    {
+        wifiStateControl = AT_RESP_NONE;
+    }
+    if(at_resp == WIFI_WATCH_DOG && strstr((char *) resp_data->buffer, "WiFi Main Loop inActive") != NULL)
+    {
+        wifiBusyMonitor++;
+        if(wifiBusyMonitor >= 4)
+        {
+            wifiStateControl = AT_RESP_NONE;
+            wifiBusyMonitor = 0;
+        }
+    }
+}
+void ATCmdManager::sendConnectIndicationFreeMpool(const char *buf)
+{
+    int len =  strlen(buf);
+    outputEDMdata((const uint8_t *) buf, len, AT_MSG_ID, INDICATION_MSG_TYPE, NO_CHANNEL);
+    _wiFi2ATDatamPool->free(resp_data);
+    resp_data = NULL;
+}
+
 void ATCmdManager::sendAtConfirmationFreeMpool(const char *buf)
 {
     sendAtConfirmation(buf);
@@ -288,13 +330,14 @@
 }
 
 
-void ATCmdManager::printBufferInHex(uint8_t *buf, int pLen)
+void ATCmdManager::printBufferInHex(const uint8_t *buf, int pLen)
 {
-    for(int i =0;i<pLen;i++){
-        if(i%8==0) dbg_printf(LOG, "\n[%3d]",i);
-        dbg_printf(LOG, "%02x ", buf[i]);
-    }
-    dbg_printf(LOG, "\n");
+    //for(int i =0;i<pLen;i++){
+    //    if(i%8==0) dbg_printf(LOG, "\n[%3d]",i);
+    //    dbg_printf(LOG, "%02x ", buf[i]);
+    //}
+    print_debug_hex(buf, pLen);
+    //dbg_printf(LOG, "\n");
 }
 
 bool ATCmdManager::validate(edm_header_t edm_header)
@@ -333,6 +376,15 @@
 }
 bool ATCmdManager::createHttpRequest()
 {
+    static int busyResponseJitter = 0;
+    if(wifiStateControl != AT_RESP_NONE) // wifi busy!
+    {
+        busyResponseJitter++;
+        if(busyResponseJitter%7==5 || busyResponseJitter%11==6)
+            return false;
+        else
+            return true;
+    }
     http_request_t *http_req; // = new http_request_t;
     wifi_data_msg_t data_msg;
     http_req = (http_request_t *)data_msg.buffer;
@@ -379,8 +431,18 @@
             dbg_printf(LOG, "\nname = %s value = %s",s1, s2);
             if(strstr(s1, "Host")!= NULL){
                 http_req->hostName = outPtr;
+#ifdef BOX_UBLOX_DEMO_TESTING
+                p = strstr(s2, "//");
+                if(p == NULL)
+                 p = s2;
+                else
+                 p+=2;
+                len = strlen(p)+1;                
+                strncpy(outPtr, p, len);
+#else
                 len = strlen(s2)+1;                
                 strncpy(outPtr, s2, len);
+#endif
                 dbg_printf(LOG, "\nname = %s value = %s",s1, outPtr);
                 outPtr += len; // point output buffer ptr to after current string
             }
@@ -429,7 +491,10 @@
     data_msg.dataLen = (uint8_t *)outPtr - http_req->buffer;//sizeof(http_request_t);
     dbg_printf(LOG, "\ndata_msg.dataLen = %d\n", data_msg.dataLen);
     // queue next data request
-    queueWiFiDataRequest(data_msg);
+    if(queueWiFiDataRequest(data_msg) == true)
+    {
+        wifiStateControl = AT_HTTPS_RESP_DOWNLOAD;
+    }
     return true;
 }
 // OOB processing
@@ -524,9 +589,9 @@
                                 //_smutex.unlock();
                             }
                             else{
-                                _smutex.lock();
-                                _parser.send("NACK");
-                                _smutex.unlock();
+                                //_smutex.lock();
+                                sendAtConfirmation(WIFI_BUSY_RESP);
+                                //_smutex.unlock();
                             }
                             free(rx_buf_ptr);
                             rx_buf_ptr = NULL;
@@ -1166,10 +1231,23 @@
 }
 
 bool  ATCmdManager::queueWiFiDataRequest(wifi_data_msg_t data_req){
+    static bool memFull = false;
     //print_memory_info();
     _event_queue.call_in(10, &print_heap_and_isr_stack_info);
     //print_heap_and_isr_stack_info();
     wifi_data_msg_t *wifiData = _aT2WiFiDatamPool->alloc();
+    if(wifiData == NULL)
+    {
+        //_parser.send("\r\nQUEUE MEMORY FULL\r\n");
+        sendAtConfirmation("\r\nQUEUE MEMORY FULL\r\n");
+        memFull = true;
+        return false;
+    }
+    if(memFull)
+    {
+        memFull = false;
+        sendAtConfirmation("\r\n[ATCMD-MAN] memory released...\r\n");
+    }
     wifiData->wifi_cmd        = data_req.wifi_cmd;
     wifiData->dataLen        = data_req.dataLen;
     memcpy(wifiData->buffer, data_req.buffer, data_req.dataLen);