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

Dependencies:   mbed-http

Revision:
90:ed0267eca7b5
Parent:
89:45f6db09a76d
Child:
91:d6b6319ad681
--- a/source/ATCmdManager.cpp	Mon Apr 01 08:00:41 2019 +0000
+++ b/source/ATCmdManager.cpp	Sun Apr 07 10:52:37 2019 +0000
@@ -61,21 +61,15 @@
     _parser.oob("AT+UWSC=0,5", callback(this, &ATCmdManager::_oob_setWiFiSecurity));
     //_parser.oob("AT+UWSC=0,5", callback(this, &ATCmdManager::_oob_sendHttpMessage));
  
-//AT+UWSC=0,2,<SSID>
-//AT+UWSC=0,8,<PWD>
-//AT+UWSC=0,5,2 (WPA)
-    //_parser.oob("ATE0", callback(this, &ATCmdManager::_oob_startup_hdlr));
     printf("\n --- ATCmdManager constructor completed ---\n");
     at_resp = AT_RESP_NONE;
     dataMode = AT_CMD_DATA_MODE;
     event_queue.call_every(3600000,&print_memory_info);
-    //AT+UMRS=230400,2,8,1,1,1
-    // AT+UBTLE
 }
 
 
 void ATCmdManager::runMain(){
-    printf("\r\n [ATCMD MAN]  Thread Id = %d\r\n", Thread::gettid());
+    printf("\r\n [ATCMD MAN]  Thread Id = %X\r\n", (uint32_t)ThisThread::get_id());
     while(true){
         _process_oob(UBLOX_ODIN_W2_RECV_TIMEOUT, true);
         wait_ms(MAIN_LOOP_WAIT_TIME_MS); // allow BTLE/WiFi some time 
@@ -93,94 +87,96 @@
                 break;
             case AT_SCAN_RESP:
                 // AT_SCAN_RESP response state
-                //////_smutex.lock();
                 printf("\n [ATCMD MAN] WIFI SCAN RESPONSE RECEIVED!!\n");
+                _smutex.lock();
                 _parser.send("OK\n");
-                //////_smutex.unlock();
+                _smutex.unlock();
                 at_resp = AT_RESP_NONE;
                 break;
             case AT_DETAILED_SCAN_RESP:
                 // AT_DETAILED_SCAN_RESP response state
-                //////_smutex.lock();
                 printf("\n [ATCMD MAN] WIFI DETAILED SCAN RESPONSE RECEIVED!!\n");
+                _smutex.lock();
                 _parser.send("OK\n");
-                //////_smutex.unlock();
+                _smutex.unlock();
                 at_resp = AT_RESP_NONE;
                 break;
             case AT_CONNECT_RESP:  
                 // AT_CONNECT_RESP response state 
-                //////_smutex.lock();
                 printf("\n [ATCMD MAN] WIFI CONNECT RESPONSE RECEIVED!!\n");
+                _smutex.lock();
                 _parser.send("OK\n");
-                //////_smutex.unlock();
+                _smutex.unlock();
                 at_resp = AT_RESP_NONE;
                 break;
             case AT_DISCONNECT_RESP:  
                 // AT_DISCONNECT_RESP response state 
                 //////_smutex.lock();
                 printf("\n [ATCMD MAN] WIFI DISCONNECT RESPONSE RECEIVED!!\n");
+                _smutex.lock();
                 _parser.send("OK\n");
-                //////_smutex.unlock();
+                _smutex.unlock();
                 at_resp = AT_RESP_NONE;
                 break;
             case AT_CONFIG_RESP:  
                 // AT_CONFIG_RESP response state 
                 //////_smutex.lock();
                 printf("\n [ATCMD MAN] WIFI CONFIG RESPONSE RECEIVED!!\n");
+                _smutex.lock();
                 _parser.send("OK\n");
-                //////_smutex.unlock();
+                _smutex.unlock();
                 at_resp = AT_RESP_NONE;
                 break;
             case AT_INTERNET_CONFIG_RESP:  
                 // AT_CONFIG_RESP response state 
-                //////_smutex.lock();
                 printf("\n [ATCMD MAN] WIFI INTERNET_CONFIG RESPONSE RECEIVED!!\n");
+                _smutex.lock();
                 _parser.send("OK\n");
-                //////_smutex.unlock();
+                _smutex.unlock();
                 at_resp = AT_RESP_NONE;
                 break;
             case AT_HTTPS_RESP:  
                 // AT_HTTP_RESP response state 
-                //////_smutex.lock();
                 printf("\n [ATCMD MAN] WIFI HTTPS RESPONSE RECEIVED!!\n");
                 return_response();
+                _smutex.lock();
                 _parser.send("OK\n");
-                //////_smutex.unlock();
+                _smutex.unlock();
                 at_resp = AT_RESP_NONE;
                 break;
             case AT_HTTPS_RESP_DOWNLOAD:  
                 // AT_HTTPS_RESP_DOWNLOAD response state 
-                //////_smutex.lock();
                 printf("\n [ATCMD MAN] WIFI HTTPS DOWNLOAD RESPONSE RECEIVED!!\n");
                 return_response(true); // set download paramter to true
+                _smutex.lock();
                 _parser.send("OK\n");
-                //////_smutex.unlock();
+                _smutex.unlock();
                 at_resp = AT_RESP_NONE;
                 break;
             case AT_HTTP_RESP:  
                 // AT_HTTP_RESP response state 
-                //////_smutex.lock();
                 printf("\n [ATCMD MAN] WIFI HTTP RESPONSE RECEIVED!!\n");
                 return_response(); 
+                _smutex.lock();
                 _parser.send("OK\n");
-                //////_smutex.unlock();
+                _smutex.unlock();
                 at_resp = AT_RESP_NONE;
                 break;
             case AT_HTTP_RESP_DOWNLOAD:  
                 // AT_HTTP_RESP response state 
-                //////_smutex.lock();
                 printf("\n [ATCMD MAN] WIFI HTTP RESPONSE RECEIVED!!\n");
                 return_response(true); // set download paramter to true
+                _smutex.lock();
                 _parser.send("OK\n");
-                //////_smutex.unlock();
+                _smutex.unlock();
                 at_resp = AT_RESP_NONE;
                 break;
             default:
                 // UNKNOWN response state
-                //////_smutex.lock();
+                _smutex.lock();
                 printf("\n [ATCMD MAN] UNKNOWN RESPONSE RECEIVED!!\n");
                 _parser.send("OK\n");
-                //////_smutex.unlock();
+                _smutex.unlock();
                 at_resp = AT_RESP_NONE;
                 break;
         }
@@ -209,6 +205,9 @@
     if(edm_header.payloadLen > MAX_EDM_PAYLOAD_LEN ||
        edm_header.payloadLen < MIN_EDM_PAYLOAD_LEN 
        ) return false; // unexpected length received!
+    if(edm_header.channel_id != WIFI_CHANNEL &&
+       edm_header.channel_id != BLE_CHANNEL 
+       ) return false; // unexpected channel_id received!
     return true;
 }
 
@@ -228,88 +227,101 @@
 }
 bool ATCmdManager::createHttpRequest()
 {
-    http_request_t http_req;
-    printf("\nsizeof(http_req) on creation = %d\n", sizeof(http_req));
-
+    http_request_t *http_req; // = new http_request_t;
+    wifi_data_msg_t data_msg;
+    http_req = (http_request_t *)data_msg.buffer;
     char s1[32];
     char s2[32];
     char s3[32];
-    int n = 0;
-    int pos = 0;
-    char * strPtr = (char *)&rx_buf_ptr[1];
+    int len = 0;
+    int n;
+    char * strPtr = (char *)rx_buf_ptr;
     char * p;
     char * p2 = strstr(strPtr, "\r\n\r\n");
     char * nxtPtr = strPtr;
+    char * outPtr;
     char * bodyPtr = p2+4;
     printf("\nstrPtr address= %x",strPtr);
     printf("\np2 address= %x", p2);
     for(int i = 0; i < 5; i++){
         if(i == 0)// firstline scan method uri and http_ver
         {
-            //n = sscanf(nxtPtr,"%s %s %s", &s1[0], &s2[0], &s3[0]);
             n = sscanf(nxtPtr,"%s %s %s", s1, s2, s3);
+            if(n!=3) return false; // error in input abort
             printf("\nmethod = %s\nuri = %s\nhttp_ver = %s",s1, s2, s3 );
             //http_req.method = str2HttpMethod(s1.c_str());
-            http_req.method = str2HttpMethod(s1);
-            http_req.request_URI.assign(s2);
-            http_req.http_version.assign(s3);
-            printf("\nhttp_req.method = %d \n", http_req.method);
+            http_req->method = str2HttpMethod(s1);
+            http_req->request_URI = (char *) http_req->buffer; // point 1st string to start of buffer
+            len = strlen(s2)+1;
+            strncpy(http_req->request_URI, s2, len);
+            http_req->http_version = http_req->request_URI + len; // point 2nd string to after 1st
+            len = strlen(s3)+1;
+            strncpy(http_req->http_version, s3, len);
+            printf("\nhttp_request 1st line:\n method = %d\nuri = %s\nhttp_ver = %s",http_req->method, 
+                                                                      http_req->request_URI, 
+                                                                      http_req->http_version );
+            printf("\nhttp_request str ptrs\nuri = %X\nhttp_ver = %X",http_req->request_URI, 
+                                                                      http_req->http_version );
+            outPtr = http_req->http_version + len; // point output buffer ptr to after 2nd string
         }
         else{ // scan header pairs
             //n = sscanf(nxtPtr,"%s %s", &s1[0], &s2[0]);
             n = sscanf(nxtPtr,"%s %s", s1, s2);
+            if(n!=2) return false; // error in input abort
             p = strstr(s1,":");
             *p = NULL;
-            //pos = s1.find(":");
-            //s1.replace(pos,1,"");
             printf("\nname = %s value = %s",s1, s2);
-            //if(s1.find("Host")!= string::npos){
             if(strstr(s1, "Host")!= NULL){
-                http_req.hostName.assign(s2);
+                http_req->hostName = outPtr;
+                len = strlen(s2)+1;                
+                strncpy(outPtr, s2, len);
+                printf("\nname = %s value = %s",s1, outPtr);
+                outPtr += len; // point output buffer ptr to after current string
             }
             else if(strstr(s1, "Accept")!= NULL){
-                http_req.AcceptVal.assign(s2);
+                http_req->AcceptVal = outPtr;
+                len = strlen(s2)+1;                
+                strncpy(outPtr, s2, len);
+                printf("\nname = %s value = %s",s1, outPtr);
+                outPtr += len; // point output buffer ptr to after current string
             }
             else if(strstr(s1, "Content-Type")!= NULL){
-                http_req.contentType.assign(s2);
+                http_req->contentType = outPtr;
+                len = strlen(s2)+1;                
+                strncpy(outPtr, s2, len);
+                printf("\nname = %s value = %s",s1, outPtr);
+                outPtr += len; // point output buffer ptr to after current string
             }
             else if(strstr(s1, "Content-Length")!= NULL){
-                http_req.contentLen.assign(s2);
+                //http_req.contentLen.assign(s2);
+                http_req->contentLen = outPtr;
+                len = strlen(s2)+1;                
+                strncpy(outPtr, s2, len);
+                printf("\nname = %s value = %s",s1, outPtr);
+                outPtr += len; // point output buffer ptr to after current string
             }
             
-            
+            printf("\noutPtr = %X len = %d\n", outPtr, len);
         }
         nxtPtr = strstr(nxtPtr, "\r\n")+2; // goto next line
         if(nxtPtr >= p2) break;
     }
+    // print header from http_req_struct
+    printf("\nhttp request header: \n %s\n", http_req->buffer);
     int bodyLen = edm_hdr.payloadLen -(p2+7-strPtr);
     printf("\nLen = %d\n", bodyLen);
-    memcpy(http_req.body, bodyPtr, bodyLen);
+    http_req->body = (uint8_t *) outPtr;
+    memcpy(outPtr, bodyPtr, bodyLen);
+    if(bodyLen > 10){
+        printf("\n Message Body:\n");
+        printBufferInHex(http_req->body, bodyLen);
+    }
+    outPtr += bodyLen; // move output pointer to end output (header + body)
     // package and send on wifi data queue
-    wifi_data_msg_t data_msg;
     data_msg.wifi_cmd = WIFI_CMD_SEND_HTTPS_REQ;
-    printf("\nsizeof(http_req) on population = %d\n", sizeof(http_req));
-
-    data_msg.dataLen = sizeof(http_req.method) + 
-                       sizeof(http_req.body) + 
-                       http_req.request_URI.capacity() +
-                       http_req.http_version.capacity() + 
-                       http_req.hostName.capacity() +
-                       http_req.AcceptVal.capacity() +
-                       http_req.contentType.capacity() +
-                       http_req.contentLen.capacity();
-
-/*
-    data_msg.dataLen = sizeof(http_req.method) + 
-                       sizeof(http_req.body) + 
-                       http_req.request_URI.size() +
-                       http_req.http_version.size() + 
-                       http_req.hostName.size() +
-                       http_req.AcceptVal.size() +
-                       http_req.contentType.size() +
-                       http_req.contentLen.size();
-*/
-    memcpy(data_msg.buffer,&http_req, data_msg.dataLen);
+    printf("\nsizeof(http_req) on population = %d\n", sizeof(*http_req));
+    data_msg.dataLen = (uint8_t *)outPtr - http_req->buffer;//sizeof(http_request_t);
+    printf("\ndata_msg.dataLen = %d\n", data_msg.dataLen);
     // queue next data request
     queueWiFiDataRequest(data_msg);
     return true;
@@ -319,6 +331,7 @@
     set_timeout(timeout);
     static int cnt = 0;
     int start;
+    //channel_id_t chan_id;
     if(dataMode == AT_EXT_DATA_MODE)
     {
         int n;
@@ -331,13 +344,15 @@
             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];
             start = Kernel::get_ms_count();
             if(n == -1) break; // break if it times out
             printf("%d bytes read!\n", n);
-            if(n==5)
-            printf("Start = %d, payloadID = %d len = %d\n", edm_hdr.startByte, 
-                                                            edm_hdr.payloadID, 
-                                                            edm_hdr.payloadLen);
+            if(n==EDM_HDR_LEN)
+            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(edm_hdr.payloadID == AT_REQUEST)
@@ -347,7 +362,7 @@
                 }
                 else
                 {
-                    int pLen = edm_hdr.payloadLen-1;
+                    int pLen = edm_hdr.payloadLen-2;
                     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);
@@ -356,7 +371,10 @@
                     printBufferInHex(rx_buf_ptr, pLen);
                     printf("rx_buf_ptr[pLen-1] = %0x\n",rx_buf_ptr[pLen-1]);
                     if(rx_buf_ptr[pLen-1] != EDM_STOP_BYTE) {
-                        break; // exit if stop byte now found - possible data corruption!
+                        _smutex.lock();
+                        _parser.send("ERR");
+                        _smutex.unlock();
+                        break; // exit if stop byte not found - possible data corruption!
                     }
                     switch(edm_hdr.payloadID)
                     {
@@ -372,10 +390,14 @@
                         case DATA_COMMAND:
                             printf("DATA_COMMAND received!\n");
                             if(createHttpRequest() == true){
+                                _smutex.lock();
                                 _parser.send("OK");
+                                _smutex.unlock();
                             }
                             else{
+                                _smutex.lock();
                                 _parser.send("NACK");
+                                _smutex.unlock();
                             }
                             int stop = Kernel::get_ms_count();
                             printf("\n Time Elapsed = %d\n", stop-start);
@@ -417,9 +439,9 @@
 }
 
 void ATCmdManager::_oob_ok_hdlr(){
-    //_smutex.lock();
+    _smutex.lock();
     _parser.send("OK\n");
-    //_smutex.unlock();
+    _smutex.unlock();
 }
 
 
@@ -467,28 +489,28 @@
 
 void ATCmdManager::_oob_echo_off()
 {
-    //_smutex.lock();
+    _smutex.lock();
     printf("\n Received ATEO OOB command!!\n");
     printf("\n turning echo OFF!!\n");
     _parser.debug_on(false);
     _parser.send("OK\n");
-    //_smutex.unlock();
+    _smutex.unlock();
 }
 
 
 void ATCmdManager::_oob_echo_on()
 {
-    //_smutex.lock();
+    _smutex.lock();
     printf("\n Received ATE1 OOB command!!\n");
     printf("\n turning echo ON!!\n");
     _parser.debug_on(true);
     _parser.send("OK\n");
-    //_smutex.unlock();
+    _smutex.unlock();
 }
 
 
 void ATCmdManager::_oob_data_mode(){
-    //_smutex.lock();
+    _smutex.lock();
     printf("\n Received EDM mode command!!\n");
     if(_parser.scanf("%d", &dataMode) >0) {
         printf("\nATCmdParser: Data mode=%d\n", dataMode);
@@ -514,12 +536,12 @@
         printf("\nATCmdParser: Retrieving Uart Options failed\n");
     }
     _parser.send("OK\n");
-    //_smutex.unlock();
+    _smutex.unlock();
 }
 
 void ATCmdManager::_oob_get_mac_addr(){
     int bleOrWifi;
-    //_smutex.lock();
+    _smutex.lock();
     if(_parser.scanf("=%d", &bleOrWifi) >0) {
         switch(bleOrWifi)
         {
@@ -537,30 +559,30 @@
         printf("\nATCmdParser: Retrieving Uart Options failed");
     }
     _parser.send("OK\n");
-    //_smutex.unlock();
+    _smutex.unlock();
 }
 
 void ATCmdManager::_oob_get_ble_role(){
-    //_smutex.lock();
+    _smutex.lock();
     printf("\n Received get BLE role command!!\n");
     _parser.send("OK\n");
-    //_smutex.unlock();
+    _smutex.unlock();
 }
 
 void ATCmdManager::_oob_ena_ble_peri(){
-    //_smutex.lock();
+    _smutex.lock();
     printf("\n Received enable BLE Peripheral command!!\n");
     _parser.send("OK\n");
-    //_smutex.unlock();
+    _smutex.unlock();
 }
 
 void ATCmdManager::_oob_reboot(){
-    //_smutex.lock();
+    _smutex.lock();
     printf("\n Received reboot command!!\n");
     _parser.send("OK\n");
     _parser.send("System Resetting....\n");
     system_reset();
-    //_smutex.unlock();
+    _smutex.unlock();
 }
 
 const char * ATCmdManager::sec2str(nsapi_security_t sec)
@@ -593,10 +615,10 @@
 
 
 void ATCmdManager::_oob_scanWiFiNetworks(){
-    //_smutex.lock();
+    _smutex.lock();
     printf("\n Received scanWiFiNetworks command!!\n");
     _parser.send("OK\n");
-    //_smutex.unlock();
+    _smutex.unlock();
     wifi_cmd_t cmd = WIFI_CMD_SCAN;
     // queue next command
     queueWiFiCommand(cmd);
@@ -622,27 +644,28 @@
 
 void ATCmdManager::_oob_setupInternetConnection()
 {
-    char str[200];
-    char url[60];
+    char str[MAX_URL_LEN];
+    char url[MAX_URL_LEN];
     int n;
     internet_config_t internet_config;
-    //_smutex.lock();
+    _smutex.lock();
     printf("sizeof internet_config_t = %d\n", sizeof(internet_config_t));
-    n = ReadBytes((uint8_t *)str, 199);
+    n = ReadBytes((uint8_t *)str, MAX_URL_LEN);
     str[n]=NULL;
     printf("\n read string = %s , n = %d\n", str, n);
-    n = sscanf(str, "=%1d,%199[^,],%1d", &internet_config.peer_id, 
-                                      url,
-                                     &internet_config.connectionScheme);
+    //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);
-    printf("\n read string = %s , n = %d -- strlen(url) = %d\n", internet_config.url, n, strlen(url));
+    printf("\n read string = %s , n = %d -- strlen(url) = %d\n", internet_config.url, n, strlen(internet_config.url));
     if(n>0) 
     {
         printf("peer_id = %1d, url = %s, connScheme = %1d\n", internet_config.peer_id, 
-                                                          internet_config.url, ///->c_str(), 
-                                                          internet_config.connectionScheme);
+                                                              internet_config.url, 
+                                                              internet_config.connectionScheme);
         // package and send on wifi data queue
-        wifi_data_msg_t data_msg; // = (wifi_data_msg_t *) malloc(sizeof(wifi_data_msg_t));
+        wifi_data_msg_t data_msg; 
         data_msg.wifi_cmd = WIFI_CMD_INTERNET_CONFIG;
         data_msg.dataLen = sizeof(internet_config_t); // + strlen(internet_config.url);
         printf("\n url size = %d url str = %s\n",strlen(internet_config.url), internet_config.url );
@@ -655,7 +678,7 @@
         printf("\n[ATCMD MAN]: internet configuration failed %d fields parsed \n", n);
         _parser.send("NAK\n");
     }
-    //_smutex.unlock();
+    _smutex.unlock();
 }
 
 wifi_config_t ATCmdManager::init_wifi_config()
@@ -702,7 +725,7 @@
 {
     int n;
     wifi_config_t wifi_cfg = init_wifi_config();
-    //_smutex.lock();
+    _smutex.lock();
     n = readStringBytes((uint8_t *)wifi_cfg.ssid, 32);
     printf("[ATCMD MAN]: number of bytes read = %d\n", n);
     if(n>0) 
@@ -719,14 +742,14 @@
         printf("\n[ATCMD MAN]: wifi configuration failed  \n");
         _parser.send("NAK\n");
     }
-    //_smutex.unlock();
+    _smutex.unlock();
 }
 
 void ATCmdManager::_oob_setWiFiPWD()
 {
     int n;
     wifi_config_t wifi_cfg = init_wifi_config();
-    //_smutex.lock();
+    _smutex.lock();
     //n = _parser.scanf("%31[^\r\n]", wifi_cfg.pass);
     n = readStringBytes((uint8_t *)wifi_cfg.pass, 32);
     if(n>0) 
@@ -743,15 +766,16 @@
         printf("\n[ATCMD MAN]: wifi configuration failed  \n");
         _parser.send("NAK\n");
     }
-    //_smutex.unlock();
+    _smutex.unlock();
 }
 
 void ATCmdManager::_oob_setWiFiSecurity()
 {
     int n;
     wifi_config_t wifi_cfg = init_wifi_config();
-    //_smutex.lock();
+    _smutex.lock();
     n = _parser.scanf(",%d", &wifi_cfg.security);
+    _smutex.unlock();
     if(n>0) 
     {
         printf("ATCMD MAN]: wifi_cfg.security = %s\n", sec2str(wifi_cfg.security));
@@ -764,7 +788,9 @@
         _parser.send("OK\n");
     } else {
         printf("\n[ATCMD MAN]: wifi configuration failed  \n");
+        _smutex.lock();
         _parser.send("NAK\n");
+        _smutex.unlock();
     }
     //_smutex.unlock();
 }
@@ -836,9 +862,29 @@
     return true;
 }
 
+void ATCmdManager::outputEDMdata(const uint8_t *buf, int pLen, 
+                                 edm_msg_id_t identifier, edm_msg_type_t type)
+{
+    int epLen = pLen + 2; // edm payload length = data length + 2
+    _smutex.lock();
+    // send EDM Message start byte
+    _parser.putc(EDM_START_BYTE);
+    // send EDM Message length
+    _parser.putc(epLen>>8);
+    _parser.putc(epLen%256);
+    // send EDM Identifier + Type
+    _parser.putc(identifier>>8);
+    _parser.putc(identifier%256 | type);
+    // send the data
+    _parser.write((const char *)buf, pLen);
+    // send EDM Message stop byte
+    _parser.putc(EDM_STOP_BYTE);
+    _smutex.unlock();
+}
 
 void ATCmdManager::return_response(bool download) {
     char * resp = (char *) resp_data->buffer;
+    _smutex.lock();
     printf("\n[ATCMD MAN] received response:\n");
     if(download == false) // not download must be ascii header
     {
@@ -848,7 +894,9 @@
     {
         printBufferInHex((uint8_t *)resp, resp_data->dataLen);
     }
-    _parser.write(resp, resp_data->dataLen);
+    //_parser.write(resp, resp_data->dataLen);
+    outputEDMdata((const uint8_t *)resp, resp_data->dataLen, DATA_MSG_ID, EVENT_MSG_TYPE);
+    _smutex.unlock();
     _wiFi2ATDatamPool->free(resp_data);