FRDM-K64F, Avnet M14A2A, Grove Shield, to create smart home system. In use with AT&Ts M2x & Flow.
Dependencies: mbed FXOS8700CQ MODSERIAL
Revision 73:da723fedfdd2, committed 2016-08-12
- Comitter:
- fkellermavnet
- Date:
- Fri Aug 12 19:47:29 2016 +0000
- Parent:
- 71:45a5e426df81
- Child:
- 75:8cc98a3b9c62
- Commit message:
- Merged in WNC suggestions for: Check for EXTERR and close and reopen the socket if it occurs. If sockopen fails send command to close the socket. Don't use find() on empty strings.
Changed in this revision
cell_modem.cpp | Show annotated file Show diff for this revision Revisions of this file |
wnc_control.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/cell_modem.cpp Thu Aug 11 17:04:09 2016 +0000 +++ b/cell_modem.cpp Fri Aug 12 19:47:29 2016 +0000 @@ -217,9 +217,12 @@ } int rsp_idx = 0; + // TODO: Test if @EXTERR:<code> while (rsp_list[rsp_idx]) { if (strcasecmp(cmd_buf, rsp_list[rsp_idx]) == 0) { return rsp_idx; + } else if (strncmp(cmd_buf, "@EXTERR", 7) == 0){ + return rsp_idx; } rsp_idx++; }
--- 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); } } }