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