this is using the mbed os version 5-13-1
Diff: source/ATCmdManager.cpp
- 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);