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

Dependencies:   mbed-http

Revision:
92:ec9550034276
Parent:
91:d6b6319ad681
Child:
93:06e755a80187
--- a/source/ATCmdManager.cpp	Sun Apr 07 17:31:56 2019 +0000
+++ b/source/ATCmdManager.cpp	Sat Apr 13 14:17:29 2019 +0000
@@ -2,6 +2,7 @@
 #include "common_config.h"
 #include "common_types.h"
 #include "http_request.h"
+#include "mbed_memory_status.h"
 //#include "mbed_memory_status.h"
 
 ATCmdManager::ATCmdManager(PinName tx, PinName rx, SMDevicePeripheral *blePeripheral, 
@@ -64,6 +65,7 @@
     printf("\n --- ATCmdManager constructor completed ---\n");
     at_resp = AT_RESP_NONE;
     dataMode = AT_CMD_DATA_MODE;
+    print_heap_and_isr_stack_info();
     event_queue.call_every(3600000,&print_memory_info);
 }
 
@@ -89,7 +91,7 @@
                 // AT_SCAN_RESP response state
                 printf("\n [ATCMD MAN] WIFI SCAN RESPONSE RECEIVED!!\n");
                 _smutex.lock();
-                _parser.send("OK\n");
+                _parser.send(OK_RESP);
                 _smutex.unlock();
                 at_resp = AT_RESP_NONE;
                 break;
@@ -97,7 +99,7 @@
                 // AT_DETAILED_SCAN_RESP response state
                 printf("\n [ATCMD MAN] WIFI DETAILED SCAN RESPONSE RECEIVED!!\n");
                 _smutex.lock();
-                _parser.send("OK\n");
+                _parser.send(OK_RESP);
                 _smutex.unlock();
                 at_resp = AT_RESP_NONE;
                 break;
@@ -105,7 +107,7 @@
                 // AT_CONNECT_RESP response state 
                 printf("\n [ATCMD MAN] WIFI CONNECT RESPONSE RECEIVED!!\n");
                 _smutex.lock();
-                _parser.send("OK\n");
+                _parser.send(OK_RESP);
                 _smutex.unlock();
                 at_resp = AT_RESP_NONE;
                 break;
@@ -114,7 +116,7 @@
                 //////_smutex.lock();
                 printf("\n [ATCMD MAN] WIFI DISCONNECT RESPONSE RECEIVED!!\n");
                 _smutex.lock();
-                _parser.send("OK\n");
+                _parser.send(OK_RESP);
                 _smutex.unlock();
                 at_resp = AT_RESP_NONE;
                 break;
@@ -123,7 +125,7 @@
                 //////_smutex.lock();
                 printf("\n [ATCMD MAN] WIFI CONFIG RESPONSE RECEIVED!!\n");
                 _smutex.lock();
-                _parser.send("OK\n");
+                _parser.send(OK_RESP);
                 _smutex.unlock();
                 at_resp = AT_RESP_NONE;
                 break;
@@ -131,7 +133,7 @@
                 // AT_CONFIG_RESP response state 
                 printf("\n [ATCMD MAN] WIFI INTERNET_CONFIG RESPONSE RECEIVED!!\n");
                 _smutex.lock();
-                _parser.send("OK\n");
+                _parser.send(OK_RESP);
                 _smutex.unlock();
                 at_resp = AT_RESP_NONE;
                 break;
@@ -140,7 +142,7 @@
                 printf("\n [ATCMD MAN] WIFI HTTPS RESPONSE RECEIVED!!\n");
                 return_response();
                 _smutex.lock();
-                _parser.send("OK\n");
+                _parser.send(OK_RESP);
                 _smutex.unlock();
                 at_resp = AT_RESP_NONE;
                 break;
@@ -149,7 +151,7 @@
                 printf("\n [ATCMD MAN] WIFI HTTPS DOWNLOAD RESPONSE RECEIVED!!\n");
                 return_response(true); // set download paramter to true
                 _smutex.lock();
-                _parser.send("OK\n");
+                _parser.send(OK_RESP);
                 _smutex.unlock();
                 at_resp = AT_RESP_NONE;
                 break;
@@ -158,7 +160,7 @@
                 printf("\n [ATCMD MAN] WIFI HTTP RESPONSE RECEIVED!!\n");
                 return_response(); 
                 _smutex.lock();
-                _parser.send("OK\n");
+                _parser.send(OK_RESP);
                 _smutex.unlock();
                 at_resp = AT_RESP_NONE;
                 break;
@@ -167,7 +169,7 @@
                 printf("\n [ATCMD MAN] WIFI HTTP RESPONSE RECEIVED!!\n");
                 return_response(true); // set download paramter to true
                 _smutex.lock();
-                _parser.send("OK\n");
+                _parser.send(OK_RESP);
                 _smutex.unlock();
                 at_resp = AT_RESP_NONE;
                 break;
@@ -175,7 +177,7 @@
                 // UNKNOWN response state
                 _smutex.lock();
                 printf("\n [ATCMD MAN] UNKNOWN RESPONSE RECEIVED!!\n");
-                _parser.send("OK\n");
+                _parser.send(OK_RESP);
                 _smutex.unlock();
                 at_resp = AT_RESP_NONE;
                 break;
@@ -329,7 +331,7 @@
 // OOB processing
 void ATCmdManager::_process_oob(uint32_t timeout, bool all){
     set_timeout(timeout);
-    static int cnt = 0;
+    int cnt = 0;
     int start;
     //channel_id_t chan_id;
     if(dataMode == AT_EXT_DATA_MODE)
@@ -337,32 +339,48 @@
         int n;
         //if(cnt++ % 10 == 0)printf("In EDM mode\n");
         uint8_t edm[EDM_HDR_LEN];
-        
+        char cmdType[16];
         // Poll for edm packets
         do{
-            n = _parser.read((char *)edm, EDM_HDR_LEN);
+            n = _parser.read((char *)edm, EDM_HDR_LEN-1);
             edm_hdr.startByte = edm[0];
             edm_hdr.payloadLen = edm[1]*256 + edm[2];
             edm_hdr.payloadID = edm[3]*256 + edm[4];
-            edm_hdr.channel_id = (channel_id_t) edm[5];
+            edm_hdr.channel_id = (channel_id_t) 0;
             start = Kernel::get_ms_count();
             if(n == -1) break; // break if it times out
-            printf("%d bytes read!\n", n);
-            if(n==EDM_HDR_LEN)
+            int pT;
+            if(edm_hdr.payloadID < AT_REQUEST) //
+            {
+                n += _parser.read((char *)edm, 1);
+                edm_hdr.channel_id = (channel_id_t) edm[0];
+                pT = 0;
+                strcpy(cmdType, "DATA COMMAND");
+            }
+            else
+            {
+                pT = 1;
+                strcpy(cmdType, "AT REQUEST");
+            }
+            //printf("%d bytes read! : type = %s\n", n, cmdType2str(edm_hdr.payloadID));
+            printf("%d bytes read! : CMD type = %s\n", n, cmdType);
+            if(n==(EDM_HDR_LEN-pT))
             printf("Start = %d, payloadID = %d len = %d chan_id = %d\n", edm_hdr.startByte, 
                                                                          edm_hdr.payloadID, 
                                                                          edm_hdr.payloadLen,
                                                                          edm_hdr.channel_id);
-            if(n == EDM_HDR_LEN && validate(edm_hdr)) // if AT command use process oob to decode
+            if(n == (EDM_HDR_LEN-pT) && validate(edm_hdr)) // if AT command use process oob to decode
             {
                 if(edm_hdr.payloadID == AT_REQUEST)
                 {
-                    _parser.process_oob();
+                    //_parser.process_oob();
+                    while (_parser.process_oob() && all) {
+                    }
                     break;
                 }
                 else
                 {
-                    int pLen = edm_hdr.payloadLen-2;
+                    int pLen = edm_hdr.payloadLen-2-pT;
                     rx_buf_ptr = (uint8_t *) malloc (pLen); // we already read 2 bytes from payload but expect 1 stop byte
                     rx_buf_ptr[pLen-1] = 0x00; // clear last byte so the readback value is as expected
                     n = _parser.read((char *)rx_buf_ptr, pLen);
@@ -391,7 +409,7 @@
                             printf("DATA_COMMAND received!\n");
                             if(createHttpRequest() == true){
                                 _smutex.lock();
-                                _parser.send("OK");
+                                _parser.send(OK_RESP);
                                 _smutex.unlock();
                             }
                             else{
@@ -399,6 +417,7 @@
                                 _parser.send("NACK");
                                 _smutex.unlock();
                             }
+                            free(rx_buf_ptr);
                             int stop = Kernel::get_ms_count();
                             printf("\n Time Elapsed = %d\n", stop-start);
                             break;
@@ -440,7 +459,7 @@
 
 void ATCmdManager::_oob_ok_hdlr(){
     _smutex.lock();
-    _parser.send("OK\n");
+    _parser.send(OK_RESP);
     _smutex.unlock();
 }
 
@@ -473,7 +492,10 @@
        //AT+UMRS=230400,2,8,1,1,1
         printf("\n Changing Baud Rate to %d\n", uOpts[0]);
 
+        _parser.send(OK_RESP);
+        wait(0.1);
         _serial.set_baud(uOpts[0]);
+        wait(0.1);
         printf("\n Baud Rate now %d\n", uOpts[0]);
 
     } else {
@@ -493,7 +515,7 @@
     printf("\n Received ATEO OOB command!!\n");
     printf("\n turning echo OFF!!\n");
     _parser.debug_on(false);
-    _parser.send("OK\n");
+    _parser.send(OK_RESP);
     _smutex.unlock();
 }
 
@@ -504,7 +526,7 @@
     printf("\n Received ATE1 OOB command!!\n");
     printf("\n turning echo ON!!\n");
     _parser.debug_on(true);
-    _parser.send("OK\n");
+    _parser.send(OK_RESP);
     _smutex.unlock();
 }
 
@@ -527,6 +549,7 @@
             case 2:
                 printf("\nATCmdParser: Extended data Mode request received\n");
                 dataMode = AT_EXT_DATA_MODE;
+                print_heap_and_isr_stack_info();
                 break;
             default:
                 printf("\nATCmdParser: ERROR - UNKNOWN DATA MODE RECEIVED!!! \n");
@@ -535,7 +558,7 @@
     } else {
         printf("\nATCmdParser: Retrieving Uart Options failed\n");
     }
-    _parser.send("OK\n");
+    _parser.send(OK_RESP);
     _smutex.unlock();
 }
 
@@ -558,28 +581,28 @@
     } else {
         printf("\nATCmdParser: Retrieving Uart Options failed");
     }
-    _parser.send("OK\n");
+    _parser.send(OK_RESP);
     _smutex.unlock();
 }
 
 void ATCmdManager::_oob_get_ble_role(){
     _smutex.lock();
     printf("\n Received get BLE role command!!\n");
-    _parser.send("OK\n");
+    _parser.send(OK_RESP);
     _smutex.unlock();
 }
 
 void ATCmdManager::_oob_ena_ble_peri(){
     _smutex.lock();
     printf("\n Received enable BLE Peripheral command!!\n");
-    _parser.send("OK\n");
+    _parser.send(OK_RESP);
     _smutex.unlock();
 }
 
 void ATCmdManager::_oob_reboot(){
     _smutex.lock();
     printf("\n Received reboot command!!\n");
-    _parser.send("OK\n");
+    _parser.send(OK_RESP);
     _parser.send("System Resetting....\n");
     system_reset();
     _smutex.unlock();
@@ -617,7 +640,7 @@
 void ATCmdManager::_oob_scanWiFiNetworks(){
     _smutex.lock();
     printf("\n Received scanWiFiNetworks command!!\n");
-    _parser.send("OK\n");
+    _parser.send(OK_RESP);
     _smutex.unlock();
     wifi_cmd_t cmd = WIFI_CMD_SCAN;
     // queue next command
@@ -627,7 +650,12 @@
 
 void ATCmdManager::_oob_connect2WiFiNetwork()
 {
+    //_smutex.lock();
+    printf("\n Received WiFi Connect command!!\n");
+    _parser.send(OK_RESP);
     wifi_cmd_t cmd = WIFI_CMD_CONNECT;
+    printf("\n About to Queue wifi cmd = %d!!\n", cmd);
+    //_smutex.unlock();
     // queue next command
     queueWiFiCommand(cmd);
     return;
@@ -636,7 +664,11 @@
 
 void ATCmdManager::_oob_disconnectWiFiNetwork()
 {
+    _smutex.lock();
+    printf("\n Received WiFi Disconnect command!!\n");
+    _parser.send(OK_RESP);
     wifi_cmd_t cmd = WIFI_CMD_DISCONNECT;
+    _smutex.unlock();
     // queue next command
     queueWiFiCommand(cmd);
     return;
@@ -655,9 +687,19 @@
     printf("\n read string = %s , n = %d\n", str, n);
     //n = sscanf(str, "=%1d,%199[^,],%1d", &(uint8_t)internet_config.peer_id, 
     n = sscanf(str, "=%1d,%99[^,],%1d", &internet_config.peer_id, 
-                                         url, //internet_config.url,
-                                         &internet_config.connectionScheme);
-    strncpy(internet_config.url, url, strlen(url)+1);
+                                         url, //internet_config.url,    
+                                        &internet_config.connectionScheme);
+    char *p = strstr(url,"\""); 
+    if(p!=NULL)
+    {
+        strncpy(internet_config.url, &p[1], strlen(url));
+        p = strstr(internet_config.url,"\"");
+        *p = NULL;
+    }
+    else
+    {
+        strncpy(internet_config.url, url, strlen(url)+1);
+    }
     printf("\n read string = %s , n = %d -- strlen(url) = %d\n", internet_config.url, n, strlen(internet_config.url));
     if(n>0) 
     {
@@ -673,7 +715,7 @@
         // queue next data request
         queueWiFiDataRequest(data_msg);
         print_memory_info();
-        _parser.send("OK\n");
+        _parser.send(OK_RESP);
     } else {
         printf("\n[ATCMD MAN]: internet configuration failed %d fields parsed \n", n);
         _parser.send("NAK\n");
@@ -737,7 +779,7 @@
         data_msg.dataLen = sizeof(wifi_config_t);
         memcpy(data_msg.buffer,&wifi_cfg, data_msg.dataLen);
         queueWiFiDataRequest(data_msg);
-        _parser.send("OK\n");
+        _parser.send(OK_RESP);
     } else {
         printf("\n[ATCMD MAN]: wifi configuration failed  \n");
         _parser.send("NAK\n");
@@ -754,14 +796,14 @@
     n = readStringBytes((uint8_t *)wifi_cfg.pass, 32);
     if(n>0) 
     {
-        printf("ATCMD MAN]: wifi_cfg.pass = %s\n", wifi_cfg.pass);
+        printf("ATCMD MAN]: wifi_cfg.pass = %s\n", "****************");
         // package and send on wifi data queue
         wifi_data_msg_t data_msg;
         data_msg.wifi_cmd = WIFI_CMD_CONFIG;
         data_msg.dataLen = sizeof(wifi_config_t);
         memcpy(data_msg.buffer,&wifi_cfg, data_msg.dataLen);
         queueWiFiDataRequest(data_msg);
-        _parser.send("OK\n");
+        _parser.send(OK_RESP);
     } else {
         printf("\n[ATCMD MAN]: wifi configuration failed  \n");
         _parser.send("NAK\n");
@@ -785,7 +827,7 @@
         data_msg.dataLen = sizeof(wifi_config_t);
         memcpy(data_msg.buffer,&wifi_cfg, data_msg.dataLen);
         queueWiFiDataRequest(data_msg);
-        _parser.send("OK\n");
+        _parser.send(OK_RESP);
     } else {
         printf("\n[ATCMD MAN]: wifi configuration failed  \n");
         _smutex.lock();
@@ -812,7 +854,7 @@
         data_msg.dataLen = sizeof(wifi_config_t);
         memcpy(data_msg.buffer,&wifi_cfg, data_msg.dataLen);
         queueWiFiDataRequest(data_msg);
-        _parser.send("OK\n");
+        _parser.send(OK_RESP);
     } else {
         printf("\n[ATCMD MAN]: wifi configuration failed  \n");
         _parser.send("NAK\n");
@@ -823,9 +865,27 @@
 }
 
 bool  ATCmdManager::queueWiFiCommand(wifi_cmd_t cmd){
+    printf("[ATCMD MAN] about to be queued with wifi_cmd = %d\n", cmd);
+#ifndef USE_MALLOC_FOR_COMMAND_MEMORY_POOL
     wifi_cmd_message_t *wifiCmd = _aT2WiFimPool->alloc();
+    if(wifiCmd == NULL){
+        printf("[ATCMD MAN] queued memory allocation failed\n");
+        print_memory_info();
+        print_heap_and_isr_stack_info();
+        return false;
+    }
+#else
+    wifi_cmd_message_t *wifiCmd = (wifi_cmd_message_t *) malloc(sizeof(wifi_cmd_message_t));
+    if(wifiCmd == NULL){
+        printf("[ATCMD MAN] tr malloc() : queued memory allocation failed\n");
+        print_memory_info();
+        print_heap_and_isr_stack_info();
+        return false;
+    }
+#endif
     wifiCmd->wifi_cmd            = cmd;
     _aT2WiFiCmdQueue->put(wifiCmd);
+    printf("[ATCMD MAN] queued wifi_cmd = %d\n", wifiCmd->wifi_cmd);
     return true;
 }
 
@@ -835,7 +895,11 @@
     if(evt.status == osEventMessage){
         at_resp_message_t *resp = (at_resp_message_t*)evt.value.p;
         setNextResponse(resp->at_resp);
+#ifndef USE_MALLOC_FOR_COMMAND_MEMORY_POOL
         _wiFi2ATmPool->free(resp);
+#else
+        free(resp);
+#endif
     }
     return true;
 }