this is using the mbed os version 5-13-1
Embed:
(wiki syntax)
Show/hide line numbers
ATCmdManager.cpp
00001 #include "debug.h" 00002 #include "ATCmdManager.h" 00003 #include "common_types.h" 00004 #include "main.h" 00005 #include "http_request.h" 00006 #include "mbed_memory_status.h" 00007 //#include "mbed_memory_status.h" 00008 #define FILE_CODE "atcmd" 00009 00010 ATCmdManager::ATCmdManager(PinName tx, PinName rx, uart_config_t *uart_config, 00011 events::EventQueue &event_queue, WiFiManager *wifi, 00012 MemoryPool<wifi_cmd_message_t, 16> *aT2WiFimPool, 00013 Queue<wifi_cmd_message_t, 16> *aT2WiFiCmdQueue, 00014 MemoryPool<at_resp_message_t, 16> *wiFi2ATmPool, 00015 Queue<at_resp_message_t, 16> *wiFi2ATCmdQueue, 00016 MemoryPool<wifi_data_msg_t, PQDSZ> *aT2WiFiDatamPool, 00017 Queue<wifi_data_msg_t, PQDSZ> *aT2WiFiDataQueue, 00018 MemoryPool<at_data_msg_t, PQDSZ> *wiFi2ATDatamPool, 00019 Queue<at_data_msg_t, PQDSZ> *wiFi2ATDataQueue, 00020 MemoryPool<at_ble_msg_t, PQDSZ_BLE> *aT2BleDatamPool, 00021 Queue<at_ble_msg_t, PQDSZ_BLE> *aT2BleDataQueue, 00022 MemoryPool<ble_at_msg_t, PQDSZ_BLE> *ble2ATDatamPool, 00023 Queue<ble_at_msg_t, PQDSZ_BLE> *ble2ATDataQueue, 00024 startup_config_t *startup_config, bool debug) 00025 : 00026 _serial(tx, rx, DEFAULT_BAUD_RATE), 00027 uart_config(uart_config), 00028 _event_queue(event_queue), 00029 wiFiManager(wiFiManager), 00030 _aT2WiFimPool(aT2WiFimPool), 00031 _aT2WiFiCmdQueue(aT2WiFiCmdQueue), 00032 00033 _wiFi2ATmPool(wiFi2ATmPool), 00034 _wiFi2ATCmdQueue(wiFi2ATCmdQueue), 00035 00036 _aT2WiFiDatamPool(aT2WiFiDatamPool), 00037 _aT2WiFiDataQueue(aT2WiFiDataQueue), 00038 00039 _wiFi2ATDatamPool(wiFi2ATDatamPool), 00040 _wiFi2ATDataQueue(wiFi2ATDataQueue), 00041 _aT2BleDatamPool(aT2BleDatamPool), 00042 _aT2BleDataQueue(aT2BleDataQueue), 00043 _ble2ATDatamPool(ble2ATDatamPool), 00044 _ble2ATDataQueue(ble2ATDataQueue), 00045 startup_config(startup_config), 00046 _parser(&_serial) 00047 00048 00049 { 00050 // constructor 00051 _serial.set_baud(uart_config->baudrate); 00052 //Flow flowCtrl = Flow::Disabled; 00053 //_serial.set_flow_control(mbed::SerialBase::Disabled); 00054 _parser.debug_on(debug); 00055 _parser.set_delimiter("\r\n"); 00056 _parser.send("+STARTUP\r\n\r\n"); 00057 _parser.oob("AT\r", callback(this, &ATCmdManager::_oob_ok_hdlr)); 00058 _parser.oob("ATE0", callback(this, &ATCmdManager::_oob_echo_off)); 00059 _parser.oob("ATE1", callback(this, &ATCmdManager::_oob_echo_on)); 00060 _parser.oob("ATE2", callback(this, &ATCmdManager::_oob_debug_logs_on)); 00061 _parser.oob("ATE3", callback(this, &ATCmdManager::_oob_debug_logs_off)); 00062 _parser.oob("AT+UMRS", callback(this, &ATCmdManager::_oob_uart_setup)); 00063 00064 _parser.oob("ATO", callback(this, &ATCmdManager::_oob_data_mode)); 00065 _parser.oob("AT+UMLA", callback(this, &ATCmdManager::_oob_get_mac_addr)); 00066 _parser.oob("AT+UBTLE?", callback(this, &ATCmdManager::_oob_get_ble_role)); 00067 _parser.oob("AT+UBTLE=2", callback(this, &ATCmdManager::_oob_ena_ble_peri)); 00068 _parser.oob("AT+CPWROFF", callback(this, &ATCmdManager::_oob_reboot)); 00069 _parser.oob("AT+CGMR", callback(this, &ATCmdManager::_oob_get_fw_ver)); 00070 _parser.oob("AT+UWSCAN", callback(this, &ATCmdManager::_oob_scanWiFiNetworks)); 00071 _parser.oob("AT+UWSCA=", callback(this, &ATCmdManager::_oob_WiFiStationConfigAction)); 00072 00073 _parser.oob("AAT+UBTLN?", callback(this, &ATCmdManager::_oob_get_ble_name)); 00074 _parser.oob("AT+UBTLN=", callback(this, &ATCmdManager::_oob_ok_hdlr)); 00075 _parser.oob("AT+UBTSM?", callback(this, &ATCmdManager::_oob_ok_hdlr)); 00076 _parser.oob("AT+UBTPM", callback(this, &ATCmdManager::_oob_ok_hdlr)); 00077 00078 _parser.oob("AT+UDSC=", callback(this, &ATCmdManager::_oob_ok_hdlr)); 00079 _parser.oob("AT&W", callback(this, &ATCmdManager::_oob_saveSettings_hdlr)); 00080 //_parser.oob("AT+UBTPM", callback(this, &ATCmdManager::_oob_ok_hdlr)); 00081 //_parser.oob("AT+UBTPM", callback(this, &ATCmdManager::_oob_ok_hdlr)); 00082 //_parser.oob("AT+UWSCD=", callback(this, &ATCmdManager::_oob_disconnectWiFiNetwork)); 00083 _parser.oob("AT+UDDRP", callback(this, &ATCmdManager::_oob_setupInternetConnection)); 00084 _parser.oob("AT+UWSC=0,0,0", callback(this, &ATCmdManager::_oob_enable_wifi)); 00085 _parser.oob("AT+UWSC=0,2", callback(this, &ATCmdManager::_oob_setWiFiSSID)); 00086 _parser.oob("AT+UWSC=0,8", callback(this, &ATCmdManager::_oob_setWiFiPWD)); 00087 _parser.oob("AT+UWSC=0,5", callback(this, &ATCmdManager::_oob_setWiFiSecurity)); 00088 _parser.oob("AT+UNSTAT=", callback(this, &ATCmdManager::_oob_getNetworkStatus)); 00089 _parser.oob("AT+UWSSTAT", callback(this, &ATCmdManager::_oob_WiFiNetworkStatus)); 00090 00091 _parser.oob("AT+UFACTORY", callback(this, &ATCmdManager::_oob_factoryReset)); 00092 _parser.oob("AT+UDELCFG=", callback(this, &ATCmdManager::_oob_deleteConfiguration)); 00093 _parser.oob("AT+SDBGFLG", callback(this, &ATCmdManager::_oob_set_debug_flag)); 00094 00095 //_parser.oob("AT+UWSC=0,5", callback(this, &ATCmdManager::_oob_sendHttpMessage)); 00096 //sendAtConfirmation("Testing:: +UBTLE:2\r\nOK\r\n"); 00097 dbg_printf(LOG, "\n --- ATCmdManager constructor completed ---\n"); 00098 at_resp = AT_RESP_NONE; 00099 dataMode = AT_CMD_DATA_MODE; 00100 debug_flags_map = 0; 00101 wifiStateControl = AT_RESP_NONE; 00102 //_event_queue.call_in(10, &print_heap_and_isr_stack_info); 00103 //print_heap_and_isr_stack_info(); 00104 //_event_queue.call_every(3600000,&print_memory_info); 00105 lastHttpRespTime = Kernel::get_ms_count(); 00106 lastCloudMsgType = 0x00; 00107 _event_queue.call_every(10000,&blinkLEDs); 00108 #ifdef BOX_UBLOX_DEMO_TESTING 00109 check_for_at_cmd = false; 00110 #endif 00111 } 00112 00113 00114 void ATCmdManager::runMain(){ 00115 dbg_printf(LOG, "\r\n [ATCMD MAN] Thread Id = %X\r\n", (uint32_t)ThisThread::get_id()); 00116 while(true){ 00117 _process_oob(UBLOX_ODIN_W2_RECV_TIMEOUT, true); 00118 wait_ms(MAIN_LOOP_WAIT_TIME_MS); // allow BTLE/WiFi some time 00119 processResponses(); 00120 } 00121 00122 } 00123 00124 void ATCmdManager::processResponses(){ 00125 dequeueATresponse(); 00126 dequeueWiFidataResponse(); 00127 dequeueBleDataResponse(); 00128 updateWiFiMgrStatus(); 00129 char * respStr; 00130 switch(at_resp){ 00131 case AT_RESP_NONE: 00132 // IDLE response state 00133 break; 00134 case AT_SCAN_RESP: 00135 { 00136 // AT_SCAN_RESP response state 00137 dbg_printf(LOG, "\n [ATCMD MAN] WIFI SCAN RESPONSE RECEIVED!!\r\n"); 00138 respStr = (char *) resp_data->buffer; 00139 sendAtConfirmationFreeMpool(respStr); 00140 at_resp = AT_RESP_NONE; 00141 break; 00142 } 00143 case AT_DETAILED_SCAN_RESP: 00144 { 00145 // AT_DETAILED_SCAN_RESP response state 00146 dbg_printf(LOG, "\n [ATCMD MAN] WIFI DETAILED SCAN RESPONSE RECEIVED!!\r\n"); 00147 respStr = (char *) resp_data->buffer; 00148 sendAtConfirmationFreeMpool(respStr); 00149 at_resp = AT_RESP_NONE; 00150 break; 00151 } 00152 case AT_CONNECT_RESP: 00153 case WIFI_RECONNECT_INFO: 00154 { 00155 // AT_CONNECT_RESP response state 00156 dbg_printf(LOG, "\n [ATCMD MAN] WIFI CONNECT RESPONSE RECEIVED!!\r\n"); 00157 sendAtConfirmation(OK_RESP); //_parser.send(OK_RESP); 00158 respStr = (char *) resp_data->buffer; 00159 sendAtConfirmationFreeMpool(respStr); 00160 char * urc = new char[20]; 00161 sprintf(urc, "\r\n%s:%d\r\n", NETWORK_UP_URC, WIFI_INTERFACE_ID); 00162 sendAtEvent(urc); 00163 delete[] urc; 00164 at_resp = AT_RESP_NONE; 00165 break; 00166 } 00167 case AT_DISCONNECT_RESP: 00168 { 00169 // AT_DISCONNECT_RESP response state 00170 dbg_printf(LOG, "\n [ATCMD MAN] WIFI DISCONNECT RESPONSE RECEIVED!!\r\n"); 00171 respStr = (char *) resp_data->buffer; 00172 sendAtConfirmationFreeMpool(respStr); 00173 char * urc = new char[20]; 00174 sprintf(urc, "\r\n%s:%d\r\n", NETWORK_DOWN_URC, WIFI_INTERFACE_ID); 00175 sendAtEvent(urc); 00176 delete[] urc; 00177 at_resp = AT_RESP_NONE; 00178 break; 00179 } 00180 case AT_CONFIG_RESP: 00181 { 00182 // AT_CONFIG_RESP response state 00183 dbg_printf(LOG, "\n [ATCMD MAN] WIFI CONFIG RESPONSE RECEIVED!!\r\n"); 00184 sendAtConfirmation(OK_RESP); //_parser.send(OK_RESP); 00185 at_resp = AT_RESP_NONE; 00186 break; 00187 } 00188 case AT_NETWORK_STATUS_RESP: 00189 { 00190 // AT_CONFIG_RESP response state 00191 dbg_printf(LOG, "\n [ATCMD MAN] NETWORK STATUS RESPONSE RECEIVED!!\r\n"); 00192 respStr = (char *) resp_data->buffer; 00193 sendAtConfirmationFreeMpool(respStr); 00194 at_resp = AT_RESP_NONE; 00195 break; 00196 } 00197 case AT_WIFI_STATUS_RESP: 00198 { 00199 // AT_CONFIG_RESP response state 00200 dbg_printf(LOG, "\n [ATCMD MAN] WIFI RESPONSE RECEIVED!!\r\n"); 00201 respStr = (char *) resp_data->buffer; 00202 sendAtConfirmationFreeMpool(respStr); 00203 at_resp = AT_RESP_NONE; 00204 break; 00205 } 00206 case AT_INTERNET_CONFIG_RESP: 00207 // AT_CONFIG_RESP response state 00208 dbg_printf(LOG, "\n [ATCMD MAN] WIFI INTERNET_CONFIG RESPONSE RECEIVED!!\r\n"); 00209 sendAtConfirmation(OK_RESP); //_parser.send(OK_RESP); 00210 at_resp = AT_RESP_NONE; 00211 break; 00212 case AT_HTTPS_RESP: 00213 // AT_HTTP_RESP response state 00214 dbg_printf(LOG, "\n [ATCMD MAN] WIFI HTTPS RESPONSE RECEIVED!!\r\n"); 00215 return_response(); 00216 sendAtConfirmation(OK_RESP); //_parser.send(OK_RESP); 00217 at_resp = AT_RESP_NONE; 00218 break; 00219 case AT_HTTPS_RESP_DOWNLOAD: 00220 // AT_HTTPS_RESP_DOWNLOAD response state 00221 dbg_printf(LOG, "\n [ATCMD MAN] WIFI HTTPS DOWNLOAD RESPONSE RECEIVED!!\r\n"); 00222 return_response(true); // set download paramter to true 00223 at_resp = AT_RESP_NONE; 00224 break; 00225 case AT_HTTP_RESP: 00226 // AT_HTTP_RESP response state 00227 dbg_printf(LOG, "\n [ATCMD MAN] WIFI HTTP RESPONSE RECEIVED!!\r\n"); 00228 return_response(); 00229 at_resp = AT_RESP_NONE; 00230 break; 00231 case AT_HTTP_RESP_DOWNLOAD: 00232 // AT_HTTP_RESP response state 00233 dbg_printf(LOG, "\n [ATCMD MAN] WIFI HTTP RESPONSE RECEIVED!!\r\n"); 00234 return_response(true); // set download paramter to true 00235 at_resp = AT_RESP_NONE; 00236 break; 00237 case CONNECT_EVENT: 00238 { 00239 // Connect Event state 00240 dbg_printf(LOG, "\n [ATCMD MAN] CONNECT EVENT RECEIVED!!\r\n"); 00241 sendConnectEvent(resp_data->buffer, resp_data->dataLen); 00242 at_resp = AT_RESP_NONE; 00243 break; 00244 } 00245 case AT_EVENT: 00246 { 00247 // AT Event state 00248 dbg_printf(LOG, "\n [ATCMD MAN] AT EVENT RECEIVED!!\r\n"); 00249 respStr = (char *) resp_data->buffer; 00250 sendAtEvent(respStr); 00251 at_resp = AT_RESP_NONE; 00252 break; 00253 } 00254 case WIFI_WATCH_DOG: 00255 { 00256 // AT_HTTP_RESP response state 00257 dbg_printf(LOG, "\n [ATCMD MAN] WIFI Watchdog message!!\r\n"); 00258 respStr = (char *) resp_data->buffer; 00259 sendConnectIndicationFreeMpool(respStr); 00260 at_resp = AT_RESP_NONE; 00261 break; 00262 } 00263 case AT_COMMAND_FAILED: 00264 { 00265 // AT_HTTP_RESP response state 00266 dbg_printf(LOG, "\n [ATCMD MAN] WIFI COMMAND FAILED!!\r\n"); 00267 respStr = (char *) resp_data->buffer; 00268 sendAtConfirmationFreeMpool(respStr); 00269 at_resp = AT_RESP_NONE; 00270 break; 00271 } 00272 case BLE_CONNECT_EVENT: 00273 { 00274 // AT Event state 00275 dbg_printf(LOG, "\n [ATCMD MAN] BLE_CONNECT_EVENT RESPONSE RECEIVED!!\r\n"); 00276 uint8_t * respBytes = ble_resp_data->buffer; 00277 sendBleConnectEvent((const char *)respBytes, ble_resp_data->dataLen); 00278 at_resp = AT_RESP_NONE; 00279 break; 00280 } 00281 case AT_BLE_EVENT: 00282 { 00283 // AT Event state 00284 dbg_printf(LOG, "\n [ATCMD MAN] AT_BLE_EVENT RESPONSE RECEIVED!!\r\n"); 00285 respStr = (char *) ble_resp_data->buffer; 00286 sendBleAtEvent(respStr, ble_resp_data->dataLen); 00287 at_resp = AT_RESP_NONE; 00288 break; 00289 } 00290 case AT_BLE_RESPONSE: 00291 { 00292 // AT Event state 00293 dbg_printf(LOG, "\n [ATCMD MAN] AT_BLE_RESPONSE RECEIVED!!\r\n"); 00294 respStr = (char *) ble_resp_data->buffer; 00295 ble_resp_data->buffer[ble_resp_data->dataLen] = NULL; 00296 sendBleDataEvent(respStr, ble_resp_data->dataLen); 00297 at_resp = AT_RESP_NONE; 00298 break; 00299 } 00300 case AT_SOCKET_KEEP_ALIVE_OK: 00301 { 00302 // AT Event state 00303 dbg_printf(LOG, "\n [ATCMD MAN] AT_SOCKET_KEEP_ALIVE OK RESPONSE RECEIVED!!\r\n"); 00304 #ifdef SEND_CLOUD_OK_MSG 00305 sendAtConfirmation("\r\nCLOUD CONNECTION OK\r\n"); 00306 #endif 00307 at_resp = AT_RESP_NONE; 00308 break; 00309 } 00310 case AT_SOCKET_KEEP_ALIVE_FAILED: 00311 { 00312 // AT Event state 00313 dbg_printf(LOG, "\n [ATCMD MAN] AT_SOCKET_KEEP_ALIVE FAILED RESPONSE RECEIVED!!\r\n"); 00314 #ifdef SEND_CLOUD_OK_MSG 00315 sendAtEvent("\r\nCLOUD CONNECTION FAILED\r\n"); 00316 #endif 00317 at_resp = AT_RESP_NONE; 00318 break; 00319 } 00320 case BLE_DISCONNECT_EVENT: 00321 { 00322 // BLE_DISCONNECT_EVENT state 00323 dbg_printf(LOG, "\n [ATCMD MAN] BLE_DISCONNECT_EVENT RECEIVED!!\r\n"); 00324 sendBleDisconnectEvent(); 00325 at_resp = AT_RESP_NONE; 00326 break; 00327 } 00328 case AT_WIFI_MAC_RESP: 00329 // AT_WIFI_MAC_RESP response state 00330 dbg_printf(LOG, "\n [ATCMD MAN] AT_WIFI_MAC_RESP RESPONSE RECEIVED!!\r\n"); 00331 respStr = (char *) resp_data->buffer; 00332 sendAtConfirmationFreeMpool(respStr); 00333 at_resp = AT_RESP_NONE; 00334 break; 00335 case AT_BLE_MAC_RESP: 00336 { 00337 // AT_BLE_MAC_RESP response state 00338 dbg_printf(LOG, "\n [ATCMD MAN] AT_BLE_MAC_RESP RESPONSE RECEIVED!!\r\n"); 00339 respStr = (char *) ble_resp_data->buffer; 00340 sendAtConfirmation(respStr); 00341 _ble2ATDatamPool->free(ble_resp_data); 00342 ble_resp_data = NULL; 00343 at_resp = AT_RESP_NONE; 00344 break; 00345 } 00346 case AT_BLE_NAME_RESP: 00347 { 00348 // AT_BLE_MAC_RESP response state 00349 dbg_printf(LOG, "\n [ATCMD MAN] AT_BLE_NAME_RESP RESPONSE RECEIVED!!\r\n"); 00350 respStr = (char *) ble_resp_data->buffer; 00351 sendAtConfirmation(respStr); 00352 _ble2ATDatamPool->free(ble_resp_data); 00353 ble_resp_data = NULL; 00354 at_resp = AT_RESP_NONE; 00355 break; 00356 } 00357 case AT_ACCESS_TOKEN_SUCCESS: 00358 { 00359 // AT_ACCESS_TOKEN_SUCCESS response state 00360 dbg_printf(LOG, "\n [ATCMD MAN] AT_ACCESS_TOKEN_SUCCESS RESPONSE RECEIVED!!\r\n"); 00361 sendAtConfirmation("\r\nAWS ACCESS TOKEN ACQUIRED \r\n"); 00362 at_resp = AT_RESP_NONE; 00363 break; 00364 } 00365 case AT_ACCESS_TOKEN_FAILED: 00366 { 00367 // AT_ACCESS_TOKEN_FAILED response state 00368 dbg_printf(LOG, "\n [ATCMD MAN] AT_ACCESS_TOKEN_FAILED!!\r\n"); 00369 sendAtConfirmation("\r\nAWS ACCESS TOKEN ACQUISITION FAILURE!!\r\n"); 00370 at_resp = AT_RESP_NONE; 00371 break; 00372 } 00373 default: 00374 { 00375 //UNKNOWN response state 00376 dbg_printf(LOG, "\n [ATCMD MAN] UNKNOWN RESPONSE RECEIVED!!\r\n"); 00377 sendAtConfirmationFreeMpool(ERROR_RESP); //_parser.send(OK_RESP); 00378 at_resp = AT_RESP_NONE; 00379 break; 00380 } 00381 } 00382 } 00383 00384 // 00385 void ATCmdManager::updateWiFiMgrStatus() 00386 { 00387 static int wifiBusyMonitor = 0; 00388 // if next response is the expected response, 00389 // then last command complete, reset wifi status 00390 // pass or fail!! 00391 if(at_resp == wifiStateControl || at_resp == AT_COMMAND_FAILED) 00392 { 00393 wifiStateControl = AT_RESP_NONE; 00394 } 00395 if(at_resp == WIFI_WATCH_DOG && strstr((char *) resp_data->buffer, "WiFi Main Loop inActive") != NULL) 00396 { 00397 wifiBusyMonitor++; 00398 if(wifiBusyMonitor >= 4) 00399 { 00400 wifiStateControl = AT_RESP_NONE; 00401 wifiBusyMonitor = 0; 00402 } 00403 } 00404 } 00405 void ATCmdManager::sendConnectIndicationFreeMpool(const char *buf) 00406 { 00407 int len = strlen(buf); 00408 outputEDMdata((const uint8_t *) buf, len, AT_MSG_ID, CONFIRMATION_MSG_TYPE, NO_CHANNEL); 00409 _wiFi2ATDatamPool->free(resp_data); 00410 resp_data = NULL; 00411 } 00412 00413 void ATCmdManager::sendAtConfirmationFreeMpool(const char *buf) 00414 { 00415 sendAtConfirmation(buf); 00416 _wiFi2ATDatamPool->free(resp_data); 00417 resp_data = NULL; 00418 } 00419 00420 00421 void ATCmdManager::printBufferInHex(const uint8_t *buf, int pLen) 00422 { 00423 print_debug_hex(buf, pLen); 00424 } 00425 00426 bool ATCmdManager::validate(edm_header_t edm_header) 00427 { 00428 if(edm_header.startByte != EDM_START_BYTE)return false; // unexpected start byte found! 00429 if(edm_header.payloadID != CONNECT_EVENT_ID && 00430 edm_header.payloadID != DISCONNECT_EVENT_ID && 00431 edm_header.payloadID != DATA_EVENT_ID && 00432 edm_header.payloadID != DATA_COMMAND_ID && 00433 edm_header.payloadID != AT_REQUEST_ID && 00434 edm_header.payloadID != AT_CONFIRMATION_ID && 00435 edm_header.payloadID != AT_EVENT_ID 00436 )return false; // unexpected payload ID found! 00437 if(edm_header.payloadLen > MAX_EDM_PAYLOAD_LEN || 00438 edm_header.payloadLen < MIN_EDM_PAYLOAD_LEN 00439 ) return false; // unexpected length received! 00440 if(edm_header.channel_id != WIFI_CHANNEL && 00441 edm_header.channel_id != BLE_CHANNEL 00442 ) return false; // unexpected channel_id received! 00443 return true; 00444 } 00445 00446 http_method ATCmdManager::str2HttpMethod(const char * methodStr) 00447 { 00448 http_method _http_method; 00449 if(strstr(methodStr, "POST")!= NULL){ 00450 _http_method = HTTP_POST; 00451 } 00452 else if(strstr(methodStr, "GET")!= NULL){ 00453 _http_method = HTTP_GET; 00454 } 00455 else{ 00456 _http_method = HTTP_DELETE; // unsupported method - set to HTTP_DELETE 00457 } 00458 return _http_method; 00459 } 00460 bool ATCmdManager::createHttpRequest() 00461 { 00462 #ifdef USE_WIFI_STATE_CONTROL 00463 static int wifiBusyTimeOut = 0; 00464 if(wifiStateControl != AT_RESP_NONE && wifiBusyTimeOut < 10) // wifi busy! 00465 { 00466 wifiBusyTimeOut++; 00467 return false; 00468 } 00469 wifiBusyTimeOut = 0; 00470 #endif 00471 bool full_debug_ena = (debug_flags_map & ATCMD_MGR_FULL_DEBUG_ENA) != 0x00; 00472 http_request_t *http_req; // = new http_request_t; 00473 wifi_data_msg_t data_msg; 00474 http_req = (http_request_t *)data_msg.buffer; 00475 char s1[32]; 00476 char s2[32]; 00477 char s3[32]; 00478 int len = 0; 00479 int n; 00480 char * strPtr = (char *)rx_buf_ptr; 00481 char * p; 00482 char * p2 = strstr(strPtr, "\r\n\r\n"); 00483 char * nxtPtr = strPtr; 00484 char * outPtr; 00485 char * bodyPtr = p2+4; 00486 dbg_printf(LOG, "\nstrPtr address= %x",strPtr); 00487 dbg_printf(LOG, "\np2 address= %x", p2); 00488 for(int i = 0; i < 6; i++){ 00489 if(i == 0)// firstline scan method uri and http_ver 00490 { 00491 n = sscanf(nxtPtr,"%s %s %s", s1, s2, s3); 00492 if(n!=3) return false; // error in input abort 00493 if(full_debug_ena) 00494 { 00495 dbg_printf(LOG, "\nmethod = %s\nuri = %s\nhttp_ver = %s",s1, s2, s3 ); 00496 } 00497 //http_req.method = str2HttpMethod(s1.c_str()); 00498 http_req->method = str2HttpMethod(s1); 00499 http_req->request_URI = (char *) http_req->buffer; // point 1st string to start of buffer 00500 len = strlen(s2)+1; 00501 strncpy(http_req->request_URI, s2, len); 00502 http_req->http_version = http_req->request_URI + len; // point 2nd string to after 1st 00503 len = strlen(s3)+1; 00504 strncpy(http_req->http_version, s3, len); 00505 if(full_debug_ena) 00506 { 00507 dbg_printf(LOG, "\nhttp_request 1st line:\n method = %d\nuri = %s\nhttp_ver = %s",http_req->method, 00508 http_req->request_URI, 00509 http_req->http_version ); 00510 dbg_printf(LOG, "\nhttp_request str ptrs\nuri = %X\nhttp_ver = %X",http_req->request_URI, 00511 http_req->http_version ); 00512 } 00513 outPtr = http_req->http_version + len; // point output buffer ptr to after 2nd string 00514 } 00515 else{ // scan header pairs 00516 n = sscanf(nxtPtr,"%s %s", s1, s2); 00517 if(n!=2) return false; // error in input abort 00518 p = strstr(s1,":"); 00519 *p = NULL; 00520 if(full_debug_ena) 00521 { 00522 dbg_printf(LOG, "\nname = %s value = %s",s1, s2); 00523 } 00524 if(strstr(s1, "Host")!= NULL){ 00525 http_req->hostName = outPtr; 00526 #ifdef BOX_UBLOX_DEMO_TESTING 00527 p = strstr(s2, "//"); 00528 if(p == NULL) 00529 p = s2; 00530 else 00531 p+=2; 00532 len = strlen(p)+1; 00533 strncpy(outPtr, p, len); 00534 #else 00535 len = strlen(s2)+1; 00536 strncpy(outPtr, s2, len); 00537 #endif 00538 if(full_debug_ena) 00539 { 00540 dbg_printf(LOG, "\nname = %s value = %s",s1, outPtr); 00541 } 00542 outPtr += len; // point output buffer ptr to after current string 00543 } 00544 else if(strstr(s1, "Accept")!= NULL){ 00545 http_req->AcceptVal = outPtr; 00546 len = strlen(s2)+1; 00547 strncpy(outPtr, s2, len); 00548 if(full_debug_ena) 00549 { 00550 dbg_printf(LOG, "\nname = %s value = %s",s1, outPtr); 00551 } 00552 outPtr += len; // point output buffer ptr to after current string 00553 } 00554 else if(strstr(s1, "Content-Type")!= NULL){ 00555 http_req->contentType = outPtr; 00556 len = strlen(s2)+1; 00557 strncpy(outPtr, s2, len); 00558 if(full_debug_ena) 00559 { 00560 dbg_printf(LOG, "\nname = %s value = %s",s1, outPtr); 00561 } 00562 outPtr += len; // point output buffer ptr to after current string 00563 } 00564 else if(strstr(s1, "Content-Length")!= NULL){ 00565 http_req->contentLen = outPtr; 00566 len = strlen(s2)+1; 00567 strncpy(outPtr, s2, len); 00568 if(full_debug_ena) 00569 { 00570 dbg_printf(LOG, "\nname = %s value = %s",s1, outPtr); 00571 } 00572 outPtr += len; // point output buffer ptr to after current string 00573 } 00574 else if(strstr(s1, "X-Amz-Target")!= NULL){ 00575 http_req->X_Amz_Target = outPtr; 00576 len = strlen(s2)+1; 00577 strncpy(outPtr, s2, len); 00578 if(full_debug_ena) 00579 { 00580 dbg_printf(LOG, "\nname = %s value = %s",s1, outPtr); 00581 } 00582 outPtr += len; // point output buffer ptr to after current string 00583 } 00584 00585 00586 00587 if(full_debug_ena) 00588 { 00589 dbg_printf(LOG, "\noutPtr = %X len = %d\n", outPtr, len); 00590 } 00591 } 00592 nxtPtr = strstr(nxtPtr, "\r\n")+2; // goto next line 00593 if(nxtPtr >= p2) break; 00594 } 00595 // print header from http_req_struct 00596 if(full_debug_ena) 00597 { 00598 dbg_printf(LOG, "\nhttp request header: \n %s\n", http_req->buffer); 00599 } 00600 int bodyLen = edm_hdr.payloadLen -(p2+7-strPtr); 00601 if(full_debug_ena) 00602 { 00603 dbg_printf(LOG, "\nLen = %d\n", bodyLen); 00604 } 00605 00606 uint32_t msecsSinceLastMsg = Kernel::get_ms_count() - lastHttpRespTime; 00607 if((lastCloudMsgType == BAR_DB_MSGTYPE || lastCloudMsgType == REC_DB_MSGTYPE) && 00608 lastCloudMsgType == (uint8_t) bodyPtr[8] && 00609 (msecsSinceLastMsg < CLOUD_RETRY_TIME_MS )) 00610 { 00611 return false; 00612 } 00613 lastCloudMsgType = (uint8_t) bodyPtr[8]; // pick out the MSGTYPE byte from payload 00614 http_req->body = (uint8_t *) outPtr; 00615 memcpy(outPtr, bodyPtr, bodyLen); 00616 if(bodyLen > 10){ 00617 dbg_printf(LOG, "\n Message Body:\n"); 00618 printBufferInHex(http_req->body, bodyLen); 00619 } 00620 outPtr += bodyLen; // move output pointer to end output (header + body) 00621 // package and send on wifi data queue 00622 data_msg.wifi_cmd = WIFI_CMD_SEND_HTTPS_REQ; 00623 data_msg.dataLen = (uint8_t *)outPtr - http_req->buffer;//sizeof(http_request_t); 00624 if(full_debug_ena) 00625 { 00626 dbg_printf(LOG, "\nsizeof(http_req) on population = %d\n", sizeof(*http_req)); 00627 dbg_printf(LOG, "\ndata_msg.dataLen = %d\n", data_msg.dataLen); 00628 } 00629 // queue next data request 00630 if(queueWiFiDataRequest(data_msg) == true) 00631 { 00632 wifiStateControl = AT_HTTPS_RESP_DOWNLOAD; 00633 return true; 00634 } 00635 return false; 00636 } 00637 00638 int ATCmdManager::readEDMmodeBytes(uint8_t *rx_buf_ptr, int pLen){ 00639 int n, m=0,sz=0; 00640 do{ 00641 sz = (pLen-m); 00642 if(sz > 224) 00643 { 00644 sz = 224; 00645 } 00646 n = _parser.read((char *)rx_buf_ptr, sz); 00647 if(n == -1) 00648 { 00649 dbg_printf(LOG, "Timeout while reading message payload bytes - expected %d but %d read so far!\r\n", pLen, m); 00650 //free(rx_buf_ptr); // make sure to free buffer 00651 //rx_buf_ptr = NULL; 00652 //sendAtConfirmation(UART_TIMEOUT_ERROR); 00653 return n; 00654 } 00655 m+=n; 00656 }while(m < pLen); 00657 return n; 00658 } 00659 00660 // OOB processing 00661 void ATCmdManager::_process_oob(uint32_t timeout, bool all){ 00662 set_timeout(timeout); 00663 int start; 00664 if(dataMode == AT_EXT_DATA_MODE) 00665 { 00666 int n; 00667 uint8_t edm[EDM_HDR_LEN]; 00668 char cmdType[16]; 00669 // Poll for edm packets 00670 do{ 00671 n = _parser.read((char *)edm, EDM_HDR_LEN-1); 00672 edm_hdr.startByte = edm[0]; 00673 edm_hdr.payloadLen = edm[1]*256 + edm[2]; 00674 edm_hdr.payloadID = edm[3]*256 + edm[4]; 00675 edm_hdr.channel_id = (channel_id_t) 0; 00676 start = Kernel::get_ms_count(); 00677 if(n == -1) break; // break if it times out 00678 int pT; 00679 if(edm_hdr.payloadID < AT_REQUEST_ID) // 00680 { 00681 n += _parser.read((char *)edm, 1); 00682 edm_hdr.channel_id = (channel_id_t) edm[0]; 00683 pT = 0; 00684 strcpy(cmdType, "DATA COMMAND"); 00685 } 00686 else 00687 { 00688 pT = 1; 00689 strcpy(cmdType, "AT REQUEST"); 00690 } 00691 dbg_printf(LOG, "%d bytes read! : CMD type = %s\n", n, cmdType); 00692 if(n==(EDM_HDR_LEN-pT)) 00693 dbg_printf(LOG, "Start = %d, payloadID = %d len = %d chan_id = %d\n", edm_hdr.startByte, 00694 edm_hdr.payloadID, 00695 edm_hdr.payloadLen, 00696 edm_hdr.channel_id); 00697 if(n == (EDM_HDR_LEN-pT) && validate(edm_hdr)) // if AT command use process oob to decode 00698 { 00699 if(edm_hdr.payloadID == AT_REQUEST_ID) 00700 { 00701 while (_parser.process_oob() && all) { 00702 } 00703 break; 00704 } 00705 else 00706 { 00707 int pLen = edm_hdr.payloadLen-2-pT; 00708 rx_buf_ptr = (uint8_t *) malloc(pLen); // we already read 2 bytes from payload but expect 1 stop byte 00709 if(rx_buf_ptr == NULL) 00710 { 00711 dbg_printf(LOG, "Memory allocation failed!\r\n"); 00712 free(rx_buf_ptr); // make sure to free buffer 00713 rx_buf_ptr = NULL; 00714 sendAtConfirmation(MEMORY_ALLOCATION_ERROR); 00715 break; // timeout! 00716 } 00717 rx_buf_ptr[pLen-1] = 0x00; // clear last byte so the readback value is as expected 00718 // set timeout to 100 ms for large packet 00719 set_timeout(100); 00720 n = _parser.read((char *)rx_buf_ptr, pLen); 00721 //n = readEDMmodeBytes(rx_buf_ptr, pLen); 00722 // reset timeout 00723 set_timeout(timeout); 00724 if(n == -1) 00725 { 00726 //dbg_printf(LOG, "Timeout while reading message payload bytes - expected %d!\r\n", pLen); 00727 free(rx_buf_ptr); // make sure to free buffer 00728 rx_buf_ptr = NULL; 00729 sendAtConfirmation(UART_TIMEOUT_ERROR); 00730 break; // timeout! 00731 } 00732 dbg_printf(LOG, "%d bytes read - expected %d!\n", n, pLen); 00733 printBufferInHex(rx_buf_ptr, pLen); 00734 dbg_printf(LOG, "rx_buf_ptr[pLen-1] = %0x\n",rx_buf_ptr[pLen-1]); 00735 if(rx_buf_ptr[pLen-1] != EDM_STOP_BYTE) { 00736 sendAtConfirmation("ERR"); 00737 free(rx_buf_ptr); // make sure to free buffer 00738 rx_buf_ptr = NULL; 00739 break; // exit if stop byte not found - possible data corruption! 00740 } 00741 switch(edm_hdr.payloadID) 00742 { 00743 case CONNECT_EVENT_ID: 00744 dbg_printf(LOG, "Connection Event received!\n"); 00745 break; 00746 case DISCONNECT_EVENT_ID: 00747 dbg_printf(LOG, "DISCONNECT_EVENT received!\n"); 00748 break; 00749 case DATA_EVENT_ID: 00750 dbg_printf(LOG, "DATA_EVENT received!\n"); 00751 break; 00752 case DATA_COMMAND_ID: 00753 { 00754 dbg_printf(LOG, "DATA_COMMAND received!\n"); 00755 if(createHttpRequest() == false) 00756 { 00757 #ifdef SEND_DEBUG_MESSAGES 00758 sendAtConfirmation(WIFI_BUSY_RESP); 00759 #endif 00760 } 00761 free(rx_buf_ptr); 00762 rx_buf_ptr = NULL; 00763 int stop = Kernel::get_ms_count(); 00764 dbg_printf(LOG, "\n Time Elapsed = %d\n", stop-start); 00765 break; 00766 } 00767 case AT_REQUEST_ID: 00768 dbg_printf(LOG, "AT_REQUEST received!\n"); 00769 break; 00770 case AT_CONFIRMATION_ID: 00771 dbg_printf(LOG, "AT_CONFIRMATION received!\n"); 00772 break; 00773 case AT_EVENT_ID: 00774 dbg_printf(LOG, "AT_EVENT received!\n"); 00775 break; 00776 default: 00777 dbg_printf(LOG, "UNKNOWN MESSAGE received!\n"); 00778 break; 00779 } 00780 } 00781 } 00782 else // incorrect # of bytes received abort!! 00783 { 00784 break; 00785 } 00786 }while (all); // continue to process until timeout 00787 } 00788 else 00789 { 00790 // Poll for inbound packets 00791 #ifdef BOX_UBLOX_DEMO_TESTING 00792 static char * ATCMD = new char[32]; 00793 int n = 0; 00794 if(check_for_at_cmd) 00795 { 00796 while (n>=0 && all) { 00797 n = readAtCommandString(ATCMD, 32); 00798 if(strstr(ATCMD,"AT\r") != NULL) 00799 { 00800 _oob_ok_hdlr(); 00801 check_for_at_cmd = false; 00802 break; 00803 } 00804 } 00805 } 00806 else 00807 #endif 00808 { 00809 while (_parser.process_oob() && all) { 00810 } 00811 } 00812 } 00813 set_timeout(); 00814 } 00815 00816 00817 int ATCmdManager::readAtCommandString(char *strbuf, size_t bufLen) 00818 { 00819 int n; 00820 bool atstr_found = false; 00821 int i = 0; 00822 while(n != -1) 00823 { 00824 char c; 00825 n = _parser.read(&c, 1); 00826 if(n) 00827 strbuf[i++] = c; 00828 if(c=='\r') 00829 { 00830 strbuf[i++] = NULL; // terminate string and exit 00831 atstr_found = true; 00832 break; 00833 } 00834 } 00835 if(atstr_found) 00836 { 00837 return i; 00838 } 00839 else 00840 { 00841 return -1; 00842 } 00843 } 00844 00845 // OOB message handlers 00846 void ATCmdManager::_oob_startup_hdlr(){ 00847 } 00848 00849 void ATCmdManager::_oob_ok_hdlr(){ 00850 sendAtConfirmation(OK_RESP); //_parser.send(OK_RESP); 00851 } 00852 00853 00854 void ATCmdManager::_oob_bleRole_hdlr(){ 00855 } 00856 00857 00858 void ATCmdManager::_oob_wifiMode_err(){ 00859 } 00860 00861 00862 void ATCmdManager::_oob_conn_already(){ 00863 } 00864 00865 void ATCmdManager::_oob_enable_wifi() 00866 { 00867 trigger_start_WiFi(); 00868 sendAtConfirmation(OK_RESP); 00869 } 00870 00871 void ATCmdManager::_oob_err(){ 00872 } 00873 00874 void ATCmdManager::_oob_get_fw_ver() 00875 { 00876 #ifdef MBED_MAJOR_VERSION 00877 char * fw_ver_str = new char[40]; 00878 sprintf(fw_ver_str, "API version:%d.%d.%d.%d.%d.%dOK\r\n", MBED_MAJOR_VERSION 00879 , MBED_MINOR_VERSION 00880 , MBED_PATCH_VERSION 00881 , API_MAJOR_VERSION 00882 , API_MINOR_VERSION 00883 , API_BUILD_NUMBER); 00884 sendAtConfirmation(fw_ver_str); 00885 delete fw_ver_str; 00886 #endif 00887 } 00888 00889 00890 void ATCmdManager::_oob_set_debug_flag() 00891 { 00892 int rdFlag; 00893 if(_parser.scanf("=%3d", &rdFlag) >0) 00894 { 00895 debug_flags_map = rdFlag; 00896 dbg_printf(LOG, "\n Changing debug_flags_map to %d %d\n", rdFlag, debug_flags_map); 00897 sendAtConfirmation(OK_RESP); 00898 } 00899 } 00900 #define TTP_DEBUGGING 00901 #define TTP_DEBUGGING_UART_NOCHANGE 00902 void ATCmdManager::_oob_uart_setup(){ 00903 int uOpts[NUM_UART_OPTIONS]; 00904 if(_parser.scanf("=%d,%d,%d,%d,%d,%d", &uOpts[0], &uOpts[1], &uOpts[2], &uOpts[3], &uOpts[4], &uOpts[5]) >0) { 00905 dbg_printf(LOG, "\nATCmdParser: Uart Options=%d,%d,%d,%d,%d,%d\n", uOpts[0], uOpts[1], uOpts[2], uOpts[3], uOpts[4], uOpts[5]); 00906 dbg_printf(LOG, "\n Changing Baud Rate to %d\n", uOpts[0]); 00907 #ifdef TTP_DEBUGGING_UART_NOCHANGE 00908 sendAtConfirmation(OK_RESP); 00909 #else 00910 00911 sendAtConfirmation(OK_RESP); //_parser.send(OK_RESP); 00912 _serial.set_baud(uOpts[0]); 00913 wait(0.1); 00914 dbg_printf(LOG, "\n Baud Rate now %d\n", uOpts[0]); 00915 #endif 00916 #ifdef BOX_UBLOX_DEMO_TESTING 00917 check_for_at_cmd = true; 00918 #endif 00919 00920 } else { 00921 dbg_printf(LOG, "\nATCmdParser: Retrieving Uart Options failed"); 00922 } 00923 } 00924 00925 void ATCmdManager::set_timeout(uint32_t timeout_ms) 00926 { 00927 _parser.set_timeout(timeout_ms); 00928 } 00929 00930 00931 void ATCmdManager::_oob_echo_off() 00932 { 00933 dbg_printf(LOG, "\n Received ATEO OOB command!!\n"); 00934 dbg_printf(LOG, "\n turning echo OFF!!\n"); 00935 _parser.debug_on(false); 00936 sendAtConfirmation(OK_RESP); //_parser.send(OK_RESP); 00937 } 00938 00939 00940 void ATCmdManager::_oob_echo_on() 00941 { 00942 dbg_printf(LOG, "\n Received ATE1 OOB command!!\n"); 00943 dbg_printf(LOG, "\n turning echo ON!!\n"); 00944 _parser.debug_on(true); 00945 sendAtConfirmation(OK_RESP); //_parser.send(OK_RESP); 00946 } 00947 00948 00949 00950 void ATCmdManager::_oob_debug_logs_on() 00951 { 00952 initialise_debug(LOG | ERR | TXT | DBG); 00953 dbg_printf(LOG, "\n Received ATE2 OOB command!!\n"); 00954 dbg_printf(LOG, "\n debug logs ON!!\n"); 00955 sendAtConfirmation(OK_RESP); //_parser.send(OK_RESP); 00956 } 00957 00958 void ATCmdManager::_oob_debug_logs_off() 00959 { 00960 dbg_printf(LOG, "\n Received ATE3 OOB command!!\n"); 00961 dbg_printf(LOG, "\n turning debug logs OFF!!\n"); 00962 initialise_debug(NONE); 00963 sendAtConfirmation(OK_RESP); //_parser.send(OK_RESP); 00964 } 00965 00966 void ATCmdManager::_oob_data_mode(){ 00967 dbg_printf(LOG, "\n Received EDM mode command!!\n"); 00968 int dmode; 00969 if(_parser.scanf("%d", &dmode) >0) { 00970 dbg_printf(LOG, "\nATCmdParser: Data mode=%d\r\n", dataMode); 00971 sendAtConfirmation(OK_RESP); //_parser.send(OK_RESP); 00972 switch(dmode) 00973 { 00974 case 0: 00975 dbg_printf(LOG, "\nATCmdParser: Command Mode request received\n"); 00976 dataMode = AT_CMD_DATA_MODE; 00977 break; 00978 case 1: 00979 dbg_printf(LOG, "\nATCmdParser: Data Mode request received\n"); 00980 dataMode = AT_STD_DATA_MODE; 00981 break; 00982 case 2: 00983 dbg_printf(LOG, "\nATCmdParser: Extended data Mode request received\n"); 00984 dataMode = AT_EXT_DATA_MODE; 00985 _event_queue.call_in(10, &print_heap_and_isr_stack_info); 00986 //print_heap_and_isr_stack_info(); 00987 break; 00988 default: 00989 dbg_printf(LOG, "\nATCmdParser: ERROR - UNKNOWN DATA MODE RECEIVED!!! \n"); 00990 break; 00991 } 00992 } else { 00993 dbg_printf(LOG, "\nATCmdParser: Retrieving Uart Options failed\n"); 00994 } 00995 } 00996 00997 void ATCmdManager::_oob_get_mac_addr(){ 00998 int bleOrWifi; 00999 if(_parser.scanf("=%d", &bleOrWifi) >0) { 01000 switch(bleOrWifi) 01001 { 01002 case 1: 01003 { 01004 dbg_printf(LOG, "\nATCmdParser: BLE MAC Address request received"); 01005 at_ble_msg_t data_req; 01006 data_req.ble_cmd = BLE_CMD_MAC_ADDR; 01007 // queue next BLE command 01008 queueBleDataRequest(data_req); 01009 break; 01010 } 01011 case 2: 01012 { 01013 dbg_printf(LOG, "\nATCmdParser: WiFi MAC Address request received"); 01014 wifi_cmd_t cmd = WIFI_CMD_WIFI_MAC_ADDR; 01015 // queue next command 01016 queueWiFiCommand(cmd); 01017 break; 01018 } 01019 default: 01020 { 01021 dbg_printf(LOG, "\nATCmdParser: ERROR - UNKNOWN MAC ADDRESS REQUEST RECEIVED!!! \n"); 01022 break; 01023 } 01024 } 01025 } else { 01026 dbg_printf(LOG, "\nATCmdParser: Retrieving Uart Options failed"); 01027 } 01028 sendAtConfirmation(OK_RESP); //_parser.send(OK_RESP); 01029 } 01030 01031 01032 void ATCmdManager::_oob_get_ble_name() 01033 { 01034 dbg_printf(LOG, "\nATCmdParser: BLE CMD DEVICE_NAME request received"); 01035 at_ble_msg_t data_req; 01036 data_req.ble_cmd = BLE_CMD_DEVICE_NAME; 01037 // queue next BLE command 01038 queueBleDataRequest(data_req); 01039 } 01040 01041 void ATCmdManager::_oob_get_ble_role(){ 01042 trigger_start_BLE(); 01043 dbg_printf(LOG, "\n Received get BLE role command!!\n"); 01044 if(startup_config->ble_enable) 01045 { 01046 sendAtConfirmation("+UBTLE:2\r\nOK\r\n"); //_parser.send(OK_RESP); 01047 } 01048 else // disabled 01049 { 01050 sendAtConfirmation("+UBTLE:0\r\nOK\r\n"); //_parser.send(OK_RESP); 01051 } 01052 } 01053 01054 void ATCmdManager::_oob_ena_ble_peri(){ 01055 dbg_printf(LOG, "\n Received enable BLE Peripheral command!!\n"); 01056 startup_config->ble_enable = true; 01057 sendAtConfirmation(OK_RESP); //_parser.send(OK_RESP); 01058 } 01059 01060 void ATCmdManager::_oob_reboot(){ 01061 dbg_printf(LOG, "\n Received reboot command!!\n"); 01062 sendAtConfirmation(OK_RESP); //_parser.send(OK_RESP); 01063 system_reset(); 01064 } 01065 01066 01067 void ATCmdManager::_oob_factoryReset(){ 01068 dbg_printf(LOG, "\n Received factory reset command!!\n"); 01069 resetConfiguration(); 01070 sendAtConfirmation(OK_RESP); //_parser.send(OK_RESP); 01071 } 01072 01073 01074 void ATCmdManager::_oob_deleteConfiguration(){ 01075 dbg_printf(LOG, "\n Received delete configuration command!!\n"); 01076 int configKey; 01077 bool res = false; 01078 if(_parser.scanf("%d", &configKey) >0) 01079 { 01080 res = deleteConfiguration((nvstore_key_t) configKey); 01081 } 01082 if(res) 01083 sendAtConfirmation(OK_RESP); //_parser.send(OK_RESP); 01084 } 01085 01086 01087 01088 void ATCmdManager::_oob_saveSettings_hdlr() 01089 { 01090 saveConfiguration(APP_CONFIG_0); 01091 sendAtConfirmation(OK_RESP); 01092 } 01093 const char * ATCmdManager::sec2str(nsapi_security_t sec) 01094 { 01095 switch (sec) { 01096 case NSAPI_SECURITY_NONE: 01097 return "None"; 01098 case NSAPI_SECURITY_WEP: 01099 return "WEP"; 01100 case NSAPI_SECURITY_WPA: 01101 return "WPA"; 01102 case NSAPI_SECURITY_WPA2: 01103 return "WPA2"; 01104 case NSAPI_SECURITY_WPA_WPA2: 01105 return "WPA/WPA2"; 01106 case NSAPI_SECURITY_UNKNOWN: 01107 default: 01108 return "Unknown"; 01109 } 01110 } 01111 01112 bool ATCmdManager::setNextResponse(at_cmd_resp_t resp) 01113 { 01114 if(at_resp == AT_RESP_NONE){ 01115 at_resp = resp; 01116 return true; // success 01117 } 01118 return false; // wiFiManager busy 01119 } 01120 01121 01122 void ATCmdManager::_oob_scanWiFiNetworks(){ 01123 dbg_printf(LOG, "\n Received scanWiFiNetworks command!!\n"); 01124 sendAtConfirmation(OK_RESP); //_parser.send(OK_RESP); 01125 wifi_cmd_t cmd = WIFI_CMD_SCAN; 01126 // queue next command 01127 queueWiFiCommand(cmd); 01128 return; 01129 } 01130 01131 01132 01133 void ATCmdManager::_oob_WiFiStationConfigAction() 01134 { 01135 int if_id; // interface id for request 01136 int aId; // interface id for request 01137 _parser.recv("%d,%d", &if_id, &aId); 01138 dbg_printf(LOG, "\n Received WiFi Configuration Action command %d %d!!\r\n", if_id, aId); 01139 if(if_id == WIFI_CONFIG_ID && aId <5){ 01140 wifi_cmd_t cmd; 01141 action_id_t action_id = (action_id_t) aId; 01142 switch(action_id){ 01143 case WIFI_CONFIG_RESET: 01144 break; 01145 case WIFI_CONFIG_STORE: 01146 break; 01147 case WIFI_CONFIG_LOAD: 01148 break; 01149 case WIFI_CONFIG_ACTIVATE: 01150 cmd = WIFI_CMD_CONNECT; 01151 dbg_printf(LOG, "\n About to Queue wifi cmd = %d!!\n", cmd); 01152 queueWiFiCommand(cmd); 01153 break; 01154 case WIFI_CONFIG_DEACTIVATE: 01155 cmd = WIFI_CMD_DISCONNECT; 01156 dbg_printf(LOG, "\n About to Queue wifi cmd = %d!!\n", cmd); 01157 queueWiFiCommand(cmd); 01158 break; 01159 default: 01160 break; 01161 } 01162 } 01163 return; 01164 } 01165 01166 01167 void ATCmdManager::_oob_disconnectWiFiNetwork() 01168 { 01169 dbg_printf(LOG, "\n Received WiFi Disconnect command!!\n"); 01170 sendAtConfirmation(OK_RESP); //_parser.send(OK_RESP); 01171 wifi_cmd_t cmd = WIFI_CMD_DISCONNECT; 01172 queueWiFiCommand(cmd); 01173 return; 01174 } 01175 01176 void ATCmdManager::_oob_setupInternetConnection() 01177 { 01178 char str[MAX_URL_LEN]; 01179 char url[MAX_URL_LEN]; 01180 int n; 01181 internet_config_t internet_config; 01182 dbg_printf(LOG, "sizeof internet_config_t = %d\n", sizeof(internet_config_t)); 01183 n = ReadBytes((uint8_t *)str, MAX_URL_LEN); 01184 str[n]=NULL; 01185 int id; 01186 int scheme; 01187 dbg_printf(LOG, "\n read string = %s , n = %d\n", str, n); 01188 n = sscanf(str, "=%1d,%99[^,],%1d", &id, 01189 url, //internet_config.url, 01190 &scheme); 01191 internet_config.peer_id = (uint8_t) id; 01192 internet_config.connectionScheme = (conn_scheme_t) scheme; 01193 #ifdef BOX_UBLOX_DEMO_TESTING 01194 char *p = strstr(url,"/https:"); 01195 #else 01196 char *p = strstr(url,"\""); 01197 #endif 01198 if(p!=NULL) 01199 { 01200 strncpy(internet_config.url, &p[1], strlen(url)); 01201 p = strstr(internet_config.url,"\""); 01202 *p = NULL; 01203 } 01204 else 01205 { 01206 strncpy(internet_config.url, url, strlen(url)+1); 01207 } 01208 dbg_printf(LOG, "\n read string = %s , n = %d -- strlen(url) = %d\n", internet_config.url, n, strlen(internet_config.url)); 01209 if(n>0) 01210 { 01211 dbg_printf(LOG, "peer_id = %1d, url = %s, connScheme = %1d\n", internet_config.peer_id, 01212 internet_config.url, 01213 internet_config.connectionScheme); 01214 // package and send on wifi data queue 01215 wifi_data_msg_t data_msg; 01216 data_msg.wifi_cmd = WIFI_CMD_INTERNET_CONFIG; 01217 data_msg.dataLen = sizeof(internet_config_t); // + strlen(internet_config.url); 01218 dbg_printf(LOG, "\n url size = %d url str = %s\n",strlen(internet_config.url), internet_config.url ); 01219 memcpy(data_msg.buffer,&internet_config, data_msg.dataLen); 01220 // queue next data request 01221 queueWiFiDataRequest(data_msg); 01222 print_memory_info(); 01223 } else { 01224 dbg_printf(LOG, "\n[ATCMD MAN]: internet configuration failed %d fields parsed \r\n", n); 01225 _parser.send("NAK\n"); 01226 } 01227 } 01228 01229 wifi_config_t ATCmdManager::init_wifi_config() 01230 { 01231 wifi_config_t wifi_cfg; 01232 wifi_cfg.ssid[0] = NULL; 01233 wifi_cfg.pass[0] = NULL; 01234 wifi_cfg.security = NSAPI_SECURITY_UNKNOWN; 01235 return wifi_cfg; 01236 } 01237 01238 /* read ASCII characters into buffer and null terminate */ 01239 int ATCmdManager::readStringBytes(uint8_t *buf, int maxBytes) 01240 { 01241 int c; 01242 int sptr = 0; 01243 int quoteCnt = 0; 01244 for(int i=0;i<maxBytes;i++){ 01245 c = _parser.getc(); 01246 if(c== '"')quoteCnt++; 01247 if(c==-1 || quoteCnt==2){ 01248 buf[sptr] = NULL; // null terminate if string 01249 return i; 01250 } 01251 if(c != ',' && c!= '"'){ 01252 buf[sptr++] = (uint8_t) c; 01253 } 01254 } 01255 return maxBytes; 01256 } 01257 01258 int ATCmdManager::ReadBytes(uint8_t *buf, int maxBytes) 01259 { 01260 int c; 01261 int sptr = 0; 01262 for(int i=0;i<maxBytes;i++){ 01263 c = _parser.getc(); 01264 if(c==-1){ 01265 return i; 01266 } 01267 buf[sptr++] = (uint8_t) c; 01268 } 01269 return maxBytes; 01270 } 01271 01272 void ATCmdManager::_oob_setWiFiSSID() 01273 { 01274 int n; 01275 wifi_config_t wifi_cfg = init_wifi_config(); 01276 n = readStringBytes((uint8_t *)wifi_cfg.ssid, 32); 01277 dbg_printf(LOG, "[ATCMD MAN]: number of bytes read = %d\n", n); 01278 if(n>0) 01279 { 01280 dbg_printf(LOG, "[ATCMD MAN]: wifi_cfg.ssid = %s\n", wifi_cfg.ssid); 01281 // package and send on wifi data queue 01282 wifi_data_msg_t data_msg; 01283 data_msg.wifi_cmd = WIFI_CMD_CONFIG; 01284 data_msg.dataLen = sizeof(wifi_config_t); 01285 memcpy(data_msg.buffer,&wifi_cfg, data_msg.dataLen); 01286 queueWiFiDataRequest(data_msg); 01287 } else { 01288 dbg_printf(LOG, "\n[ATCMD MAN]: wifi configuration failed \n"); 01289 _parser.send("NAK\n"); 01290 } 01291 } 01292 01293 void ATCmdManager::_oob_setWiFiPWD() 01294 { 01295 int n; 01296 wifi_config_t wifi_cfg = init_wifi_config(); 01297 n = readStringBytes((uint8_t *)wifi_cfg.pass, 32); 01298 if(n>0) 01299 { 01300 dbg_printf(LOG, "ATCMD MAN]: wifi_cfg.pass = %s\n", "****************"); 01301 // package and send on wifi data queue 01302 wifi_data_msg_t data_msg; 01303 data_msg.wifi_cmd = WIFI_CMD_CONFIG; 01304 data_msg.dataLen = sizeof(wifi_config_t); 01305 memcpy(data_msg.buffer,&wifi_cfg, data_msg.dataLen); 01306 queueWiFiDataRequest(data_msg); 01307 } else { 01308 dbg_printf(LOG, "\n[ATCMD MAN]: wifi configuration failed \n"); 01309 _parser.send("NAK\n"); 01310 } 01311 } 01312 01313 void ATCmdManager::_oob_setWiFiSecurity() 01314 { 01315 int n; 01316 wifi_config_t wifi_cfg = init_wifi_config(); 01317 int security; 01318 n = _parser.scanf(",%d", &security); 01319 if(n>0) 01320 { 01321 wifi_cfg.security = (nsapi_security_t) security; 01322 dbg_printf(LOG, "ATCMD MAN]: wifi_cfg.security = %s\n", sec2str(wifi_cfg.security)); 01323 // package and send on wifi data queue 01324 wifi_data_msg_t data_msg; 01325 data_msg.wifi_cmd = WIFI_CMD_CONFIG; 01326 data_msg.dataLen = sizeof(wifi_config_t); 01327 memcpy(data_msg.buffer,&wifi_cfg, data_msg.dataLen); 01328 queueWiFiDataRequest(data_msg); 01329 } else { 01330 dbg_printf(LOG, "\n[ATCMD MAN]: wifi configuration failed \n"); 01331 _smutex.lock(); 01332 _parser.send("NAK\n"); 01333 _smutex.unlock(); 01334 } 01335 } 01336 01337 01338 01339 void ATCmdManager::_oob_getNetworkStatus() 01340 { 01341 int if_id; // interface id for request 01342 _parser.scanf(",%d", &if_id); 01343 dbg_printf(LOG, "\n Received Get Network Status command!!\n"); 01344 if(if_id == WIFI_INTERFACE_ID){ 01345 wifi_cmd_t cmd = WIFI_CMD_NETWORK_STATUS; 01346 dbg_printf(LOG, "\n About to Queue wifi cmd = %d!!\n", cmd); 01347 queueWiFiCommand(cmd); 01348 } 01349 return; 01350 } 01351 01352 01353 void ATCmdManager::_oob_WiFiNetworkStatus() 01354 { 01355 dbg_printf(LOG, "\n Received Get WiFi Network Status command!!\n"); 01356 wifi_cmd_t cmd = WIFI_CMD_WIFI_STATUS; 01357 dbg_printf(LOG, "\n About to Queue wifi cmd = %d!!\n", cmd); 01358 // queue next command 01359 queueWiFiCommand(cmd); 01360 return; 01361 } 01362 01363 void ATCmdManager::_oob_sendHttpMessage() 01364 { 01365 } 01366 01367 bool ATCmdManager::queueWiFiCommand(wifi_cmd_t cmd){ 01368 dbg_printf(LOG, "[ATCMD MAN] about to be queued with wifi_cmd = %d\n", cmd); 01369 #ifndef USE_MALLOC_FOR_COMMAND_MEMORY_POOL 01370 wifi_cmd_message_t *wifiCmd = _aT2WiFimPool->alloc(); 01371 if(wifiCmd == NULL){ 01372 dbg_printf(LOG, "[ATCMD MAN] queued memory allocation failed\n"); 01373 return false; 01374 } 01375 #else 01376 wifi_cmd_message_t *wifiCmd = (wifi_cmd_message_t *) malloc(sizeof(wifi_cmd_message_t)); 01377 if(wifiCmd == NULL){ 01378 dbg_printf(LOG, "[ATCMD MAN] try malloc() : queued memory allocation failed\n"); 01379 return false; 01380 } 01381 #endif 01382 wifiCmd->wifi_cmd = cmd; 01383 _aT2WiFiCmdQueue->put(wifiCmd); 01384 dbg_printf(LOG, "[ATCMD MAN] queued wifi_cmd = %d\n", wifiCmd->wifi_cmd); 01385 return true; 01386 } 01387 01388 bool ATCmdManager::dequeueATresponse(){ 01389 if(at_resp != AT_RESP_NONE) return false; // busy 01390 osEvent evt = _wiFi2ATCmdQueue->get(0); 01391 if(evt.status == osEventMessage){ 01392 at_resp_message_t *resp = (at_resp_message_t*)evt.value.p; 01393 setNextResponse(resp->at_resp); 01394 dbg_printf(LOG, "[ATCMD MAN] dequeued AT CMD : at_resp = %d\n", resp->at_resp); 01395 #ifndef USE_MALLOC_FOR_COMMAND_MEMORY_POOL 01396 _wiFi2ATmPool->free(resp); 01397 resp = NULL; 01398 #else 01399 free(resp); 01400 resp = NULL; 01401 #endif 01402 } 01403 return true; 01404 } 01405 01406 bool ATCmdManager::queueWiFiDataRequest(wifi_data_msg_t data_req){ 01407 static bool memFull = false; 01408 wifi_data_msg_t *wifiData = _aT2WiFiDatamPool->alloc(); 01409 if(wifiData == NULL) 01410 { 01411 #ifdef SEND_DEBUG_MESSAGES 01412 sendAtConfirmation("\r\nQUEUE MEMORY FULL\r\n"); 01413 #endif 01414 memFull = true; 01415 return false; 01416 } 01417 if(memFull) 01418 { 01419 memFull = false; 01420 #ifdef SEND_DEBUG_MESSAGES 01421 sendAtConfirmation("\r\n[ATCMD-MAN] memory released...\r\n"); 01422 #endif 01423 } 01424 wifiData->wifi_cmd = data_req.wifi_cmd; 01425 wifiData->dataLen = data_req.dataLen; 01426 memcpy(wifiData->buffer, data_req.buffer, data_req.dataLen); 01427 _aT2WiFiDataQueue->put(wifiData); 01428 dbg_printf(LOG, "[ATCMD MAN] queued data size = %d : wifi_cmd = %d\n", data_req.dataLen, data_req.wifi_cmd); 01429 return true; 01430 } 01431 01432 bool ATCmdManager::dequeueWiFidataResponse(){ 01433 if(at_resp != AT_RESP_NONE) return false; // busy 01434 osEvent evt = _wiFi2ATDataQueue->get(0); 01435 if(evt.status == osEventMessage){ 01436 resp_data = (at_data_msg_t*)evt.value.p; 01437 setNextResponse(resp_data->at_resp); 01438 dbg_printf(LOG, "[ATCMD MAN] dequeued data size = %d : at_resp = %d\n", resp_data->dataLen, resp_data->at_resp); 01439 } 01440 return true; 01441 } 01442 01443 bool ATCmdManager::queueBleDataRequest(at_ble_msg_t data_req){ 01444 at_ble_msg_t *bleData = _aT2BleDatamPool->alloc(); 01445 if(bleData == NULL) 01446 { 01447 #ifdef SEND_DEBUG_MESSAGES 01448 sendAtConfirmation("\r\nBLE QUEUE MEMORY FULL\r\n"); 01449 #endif 01450 return false; 01451 } 01452 bleData->ble_cmd = data_req.ble_cmd; 01453 bleData->dataLen = data_req.dataLen; 01454 memcpy(bleData->buffer, data_req.buffer, data_req.dataLen); 01455 _aT2BleDataQueue->put(bleData); 01456 dbg_printf(LOG, "[ATCMD MAN] queued BLE data size = %d : ble_cmd = %d\n", data_req.dataLen, data_req.ble_cmd); 01457 return true; 01458 } 01459 01460 bool ATCmdManager::dequeueBleDataResponse(){ 01461 if(at_resp != AT_RESP_NONE) return false; // busy 01462 osEvent evt = _ble2ATDataQueue->get(0); 01463 if(evt.status == osEventMessage){ 01464 ble_resp_data = (ble_at_msg_t*)evt.value.p; 01465 setNextResponse(ble_resp_data->at_resp); 01466 dbg_printf(LOG, "[ATCMD MAN] dequeued data size = %d : at_resp = %d\n", ble_resp_data->dataLen, ble_resp_data->at_resp); 01467 } 01468 return true; 01469 } 01470 01471 01472 void ATCmdManager::sendAtConfirmation(const char *buf) 01473 { 01474 _smutex.lock(); 01475 switch(dataMode){ 01476 case AT_CMD_DATA_MODE: 01477 _parser.send("%s", buf); 01478 break; 01479 case AT_STD_DATA_MODE: 01480 _parser.send("%s", buf); 01481 break; 01482 case AT_EXT_DATA_MODE: 01483 { 01484 int len = strlen(buf); 01485 outputEDMdata((const uint8_t *) buf, len, AT_MSG_ID, CONFIRMATION_MSG_TYPE, NO_CHANNEL); 01486 break; 01487 } 01488 default: 01489 _parser.send("%s", buf); 01490 break; 01491 } 01492 _smutex.unlock(); 01493 } 01494 void ATCmdManager::sendAtEvent(const char *buf) 01495 { 01496 _smutex.lock(); 01497 switch(dataMode){ 01498 case AT_CMD_DATA_MODE: 01499 _parser.send(buf); 01500 break; 01501 case AT_STD_DATA_MODE: 01502 _parser.send(buf); 01503 break; 01504 case AT_EXT_DATA_MODE: 01505 { 01506 int len = strlen(buf); 01507 outputEDMdata((const uint8_t *) buf, len, AT_MSG_ID, EVENT_MSG_TYPE, NO_CHANNEL); 01508 break; 01509 } 01510 default: 01511 _parser.send(buf); 01512 break; 01513 } 01514 _smutex.unlock(); 01515 _wiFi2ATDatamPool->free(resp_data); 01516 resp_data = NULL; 01517 } 01518 01519 01520 void ATCmdManager::sendBleDataEvent(const char *buf, int len) 01521 { 01522 _smutex.lock(); 01523 switch(dataMode){ 01524 case AT_CMD_DATA_MODE: 01525 _parser.send(buf); 01526 break; 01527 case AT_STD_DATA_MODE: 01528 _parser.send(buf); 01529 break; 01530 case AT_EXT_DATA_MODE: 01531 { 01532 outputEDMdata((const uint8_t *) buf, len, DATA_MSG_ID, EVENT_MSG_TYPE, BLE_CHANNEL); 01533 break; 01534 } 01535 default: 01536 _parser.send(buf); 01537 break; 01538 } 01539 _smutex.unlock(); 01540 _ble2ATDatamPool->free(ble_resp_data); 01541 ble_resp_data = NULL; 01542 } 01543 01544 01545 01546 void ATCmdManager::sendBleAtEvent(const char *buf, int len) 01547 { 01548 _smutex.lock(); 01549 switch(dataMode){ 01550 case AT_CMD_DATA_MODE: 01551 _parser.send(buf); 01552 break; 01553 case AT_STD_DATA_MODE: 01554 _parser.send(buf); 01555 break; 01556 case AT_EXT_DATA_MODE: 01557 { 01558 outputEDMdata((const uint8_t *) buf, len, AT_MSG_ID, EVENT_MSG_TYPE, NO_CHANNEL); 01559 break; 01560 } 01561 default: 01562 _parser.send(buf); 01563 break; 01564 } 01565 _smutex.unlock(); 01566 _ble2ATDatamPool->free(ble_resp_data); 01567 ble_resp_data = NULL; 01568 } 01569 01570 void ATCmdManager::sendBleConnectEvent(const char *buf, int len) 01571 { 01572 _smutex.lock(); 01573 switch(dataMode){ 01574 case AT_CMD_DATA_MODE: 01575 _parser.send(buf); 01576 break; 01577 case AT_STD_DATA_MODE: 01578 _parser.send(buf); 01579 break; 01580 case AT_EXT_DATA_MODE: 01581 { 01582 outputEDMdata((const uint8_t *) buf, len, CONNECT_MSG_ID, EVENT_MSG_TYPE, BLE_CHANNEL); 01583 break; 01584 } 01585 default: 01586 _parser.send(buf); 01587 break; 01588 } 01589 _smutex.unlock(); 01590 _ble2ATDatamPool->free(ble_resp_data); 01591 ble_resp_data = NULL; 01592 } 01593 01594 void ATCmdManager::sendBleDisconnectEvent() 01595 { 01596 _smutex.lock(); 01597 outputEDMdata(NULL, 0, DISCONNECT_MSG_ID, EVENT_MSG_TYPE, BLE_CHANNEL); 01598 _smutex.unlock(); 01599 _ble2ATDatamPool->free(ble_resp_data); 01600 ble_resp_data = NULL; 01601 } 01602 01603 01604 void ATCmdManager::sendConnectEvent(const uint8_t *buf, int len) 01605 { 01606 switch(dataMode){ 01607 case AT_CMD_DATA_MODE: 01608 _parser.send((const char*) buf); 01609 break; 01610 case AT_STD_DATA_MODE: 01611 _parser.send((const char*)buf); 01612 break; 01613 case AT_EXT_DATA_MODE: 01614 outputEDMdata((const uint8_t *) buf, len, CONNECT_MSG_ID, EVENT_MSG_TYPE, WIFI_CHANNEL); 01615 break; 01616 } 01617 _wiFi2ATDatamPool->free(resp_data); 01618 resp_data = NULL; 01619 01620 } 01621 01622 01623 void ATCmdManager::outputEDMdata(const uint8_t *buf, int pLen, 01624 edm_msg_id_t identifier, edm_msg_type_t type, 01625 channel_id_t channel_id) 01626 { 01627 int epLen = pLen + 2; // edm payload length = data length + 2 01628 if(channel_id != NO_CHANNEL) 01629 epLen += 1; 01630 _smutex.lock(); 01631 // send EDM Message start byte 01632 _parser.putc(EDM_START_BYTE); 01633 // send EDM Message length 01634 _parser.putc(epLen>>8); 01635 _parser.putc(epLen%256); 01636 // send EDM Identifier + Type 01637 _parser.putc(identifier>>8); 01638 _parser.putc(identifier%256 | type); 01639 // send channel id if valid 01640 if(channel_id != NO_CHANNEL) 01641 _parser.putc(channel_id); 01642 // send the data 01643 if(pLen > 0) 01644 { 01645 _parser.write((const char *)buf, pLen); 01646 } 01647 // send EDM Message stop byte 01648 _parser.putc(EDM_STOP_BYTE); 01649 _smutex.unlock(); 01650 int msWait = (pLen + 5+20)/20; 01651 wait_ms(msWait); 01652 } 01653 void ATCmdManager::filterHttpResponse() 01654 { 01655 char * respbuf = (char *) resp_data->buffer; 01656 char * strPtr; 01657 char * strPtr2; 01658 dbg_printf(LOG, "Header before trim:\r\n%s\r\n", respbuf); 01659 strPtr = strstr(respbuf, "Date:"); // find start of the last required entry 01660 if(strPtr == NULL) return; 01661 strPtr2 = strstr(respbuf, "Connection:"); // find start of the last required entry 01662 if(strPtr == NULL) return; 01663 if(strPtr2 > strPtr) 01664 { 01665 strPtr = strPtr2; 01666 } 01667 strPtr2 = strstr(strPtr, "\r\n"); // find end of the last required entry 01668 if(strPtr2 == NULL) return; 01669 strPtr = strstr(strPtr2, "\r\n\r\n"); // find start of body 01670 if(strPtr == NULL) return; 01671 int hdrLen = (strPtr - respbuf); 01672 int bytes2trim = (strPtr - strPtr2); 01673 memmove(strPtr2, strPtr, (resp_data->dataLen-(hdrLen-bytes2trim))); 01674 resp_data->dataLen -= bytes2trim; // reduce the length by bytes to trim 01675 dbg_printf(LOG, "Header after trim:\r\n%s\r\n", respbuf); 01676 } 01677 void ATCmdManager::return_response(bool download) { 01678 char * resp = (char *) resp_data->buffer; 01679 dbg_printf(LOG, "\n[ATCMD MAN] received response:\n"); 01680 if(download == false) // not download must be ascii header 01681 { 01682 dbg_printf(LOG, "%.*s\r\n", resp_data->dataLen, resp); 01683 } 01684 else // dump payload as hex 01685 { 01686 printBufferInHex((uint8_t *)resp, resp_data->dataLen); 01687 } 01688 #ifdef TRIM_AWS_HEADER_ENTRIES 01689 int offset = resp - strstr(resp,"HTTP/1.1"); 01690 if(offset >=0 && offset < 2) // must be at start of header 01691 { 01692 filterHttpResponse(); 01693 } 01694 #endif 01695 outputEDMdata((const uint8_t *)resp, resp_data->dataLen, DATA_MSG_ID, 01696 EVENT_MSG_TYPE, WIFI_CHANNEL); 01697 _wiFi2ATDatamPool->free(resp_data); 01698 resp_data = NULL; 01699 lastHttpRespTime = Kernel::get_ms_count(); 01700 }
Generated on Wed Jul 13 2022 05:40:26 by
1.7.2