![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
FRDM-K64F, Avnet M14A2A, Grove Shield, to create smart home system. In use with AT&Ts M2x & Flow.
Dependencies: mbed FXOS8700CQ MODSERIAL
Diff: wnc_control.cpp
- Revision:
- 73:da723fedfdd2
- Parent:
- 68:6e311c747045
- Child:
- 75:8cc98a3b9c62
--- a/wnc_control.cpp Thu Aug 11 17:04:09 2016 +0000 +++ b/wnc_control.cpp Fri Aug 12 19:47:29 2016 +0000 @@ -37,7 +37,8 @@ WNC_OK =0, WNC_CMD_ERR = -1, WNC_NO_RESPONSE = -2, - WNC_CELL_LINK_DOWN = -3 + WNC_CELL_LINK_DOWN = -3, + WNC_EXTERR = -4 }; // Contains result of last call to send_wnc_cmd(..) @@ -58,12 +59,12 @@ cmd_str += MY_APN_STR; cmd_str += ",IP"; at_send_wnc_cmd(cmd_str.c_str(), &pRespStr, 4*WNC_TIMEOUT_MS); // Set APN, cmd seems to take a little longer sometimes - PUTS(cmd_str.c_str()); } static bool reportStatus = true; do { + PUTS("------------ software_init_mdm! --------->\r\n"); if (check_wnc_ready() == 0) { if (reportStatus == false) @@ -157,6 +158,13 @@ PUTS("Socket Write fail!!!\r\n"); software_init_mdm(); } + else if (WNC_MDM_ERR == WNC_EXTERR) + { + pc.puts("Socket Disconnected (broken) !!!\r\n"); + sockclose_mdm(); + sockopen_mdm(); + //software_init_mdm(); + } } while (WNC_MDM_ERR != WNC_OK); } else @@ -283,6 +291,8 @@ // SIM card OK, now check for signal and cellular network registration cmdRes1 = at_send_wnc_cmd("AT+CREG?", &pRespStr, WNC_TIMEOUT_MS); // Check if registered on network + if (pRespStr->size() > 0) + { pos = pRespStr->find("CREG: "); if (pos != string::npos) { @@ -295,6 +305,7 @@ #ifdef WNC_CMD_DEBUG_ON_VERBOSE PUTS("------------ WNC Cell Link Down! ------>\r\n"); #endif + wait_ms(3000); return (-2); } } @@ -302,7 +313,15 @@ #ifdef WNC_CMD_DEBUG_ON_VERBOSE PUTS("------------ WNC Ready ---------------->\r\n"); #endif - + } + else + { +#ifdef WNC_CMD_DEBUG_ON_VERBOSE + PUTS("------------ CREG No Reply !----------->\r\n"); +#endif + return (-2); + } + return (0); } @@ -319,6 +338,7 @@ PUTS("FAIL send cmd: "); #ifdef WNC_CMD_DEBUG_ON_VERBOSE PUTS(s); + #else string truncStr(s, 50); truncStr += "\r\n"; @@ -354,7 +374,10 @@ if (cmdRes == -2) WNC_MDM_ERR = WNC_NO_RESPONSE; - if (cmdRes == 0) + if (cmdRes == -3) + WNC_MDM_ERR = WNC_EXTERR; + + if (cmdRes == 0) WNC_MDM_ERR = WNC_OK; return (cmdRes); @@ -362,7 +385,7 @@ int at_send_wnc_cmd(const char * s, string ** r, int ms_timeout) { - static const char * rsp_lst[] = { "OK", "ERROR", NULL }; + static const char * rsp_lst[] = { "OK", "ERROR", "@EXTERR", NULL }; int len; #ifdef WNC_CMD_DEBUG_ON @@ -403,10 +426,14 @@ #endif #endif - if (res > 0) + if (res == 0) { + /* OK */ + return 0; + } else if (res == 2) { + /* @EXTERR */ + return -3; + } else return -1; - else - return 0; } else { @@ -496,7 +523,11 @@ cmd_str += "\","; cmd_str += port; cmd_str += ",30"; - send_wnc_cmd(cmd_str.c_str(), &pRespStr, 31000); + int cmd = send_wnc_cmd(cmd_str.c_str(), &pRespStr, 31000); + if (cmd != WNC_OK) { + // Per WNC: re-close even if open fails! + at_sockclose_wnc(); + } } void at_sockclose_wnc(void) @@ -541,6 +572,7 @@ string * pRespStr; char num2str[6]; size_t sLen = strlen(s); + int res; if (sLen <= 1500) { string cmd_str("AT@SOCKWRITE=1,"); @@ -560,7 +592,9 @@ cmd_str += num2str; } cmd_str += "\""; - send_wnc_cmd(cmd_str.c_str(), &pRespStr, 120000); + res = send_wnc_cmd(cmd_str.c_str(), &pRespStr, 120000); + if (res == -3) + PUTS("sockwrite is disconnect \r\n"); } else PUTS("sockwrite Err, string to long\r\n"); @@ -589,29 +623,35 @@ // between each retry. wait_ms(10); - send_wnc_cmd(cmd_str.c_str(), &pRespStr, WNC_TIMEOUT_MS); - - size_t pos_start = pRespStr->find("\"") + 1; - size_t pos_end = pRespStr->rfind("\"") - 1; + if (send_wnc_cmd(cmd_str.c_str(), &pRespStr, WNC_TIMEOUT_MS) == 0) + { + size_t pos_start = pRespStr->find("\"") + 1; + size_t pos_end = pRespStr->rfind("\"") - 1; - // Make sure search finds what it's looking for! - if (pos_start != string::npos && pos_end != string::npos) + // Make sure search finds what it's looking for! + if (pos_start != string::npos && pos_end != string::npos) i = (pos_end - pos_start + 1); // Num hex chars, 2 per byte - else + else i = 0; - if (i > 0) + if (i > 0) + { + retries = 1; // If any data found retry 1 more time to catch data that might be in another + // WNC payload + string byte; + while (pos_start < pos_end) + { + byte = pRespStr->substr(pos_start, 2); + *pS += (char)strtol(byte.c_str(), NULL, 16); + pos_start += 2; + } + numBytes += i/2; + } + } + else { - retries = 1; // If any data found retry 1 more time to catch data that might be in another - // WNC payload - string byte; - while (pos_start < pos_end) - { - byte = pRespStr->substr(pos_start, 2); - *pS += (char)strtol(byte.c_str(), NULL, 16); - pos_start += 2; - } - numBytes += i/2; + PUTS("no readsock reply!\r\n"); + return (0); } } }