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:
- 42:be4b9ee3a615
- Parent:
- 40:aec4d09fde23
- Child:
- 43:6821a9c78c4b
--- a/wnc_control.cpp Sat Jul 23 20:13:01 2016 +0000 +++ b/wnc_control.cpp Sun Jul 24 03:10:21 2016 +0000 @@ -27,13 +27,46 @@ void software_init_mdm(void) { + static bool reportStatus = true; do { - WNC_MDM_ERR = WNC_OK; - at_init_wnc(); - if (WNC_MDM_ERR == WNC_NO_RESPONSE) - reinitialize_mdm(); - } while (WNC_MDM_ERR != WNC_OK); + if (check_wnc_ready() == 0) + { + if (reportStatus == false) + { + puts("Re-connected to cellular network!\n\r"); + reportStatus = true; + } + + // WNC has SIM and registered on network + do + { + WNC_MDM_ERR = WNC_OK; + at_init_wnc(); + if (WNC_MDM_ERR == WNC_NO_RESPONSE) + { + reinitialize_mdm(); + at_init_wnc(true); // Hard reset occurred so make it go through the software init(); + } + } while (WNC_MDM_ERR != WNC_OK); + } + else + { + if (reportStatus == true) + { + puts("Not connected to cellular network!\n\r"); + reportStatus = false; + } + // Atempt to re-register +// string * pRespStr; +// pc.puts("Force re-register!\r\n"); +// at_send_wnc_cmd("AT+CFUN=0,0", &pRespStr, WNC_TIMEOUT_MS); +// wait_ms(31000); +// at_send_wnc_cmd("AT+CFUN=1,0", &pRespStr, WNC_TIMEOUT_MS); +// wait_ms(31000); + WNC_MDM_ERR = WNC_NO_RESPONSE; + } + } while (WNC_MDM_ERR != WNC_OK); } void resolve_mdm(void) @@ -44,7 +77,6 @@ at_dnsresolve_wnc(MY_SERVER_URL, &MyServerIpAddress); if (WNC_MDM_ERR == WNC_NO_RESPONSE) { - reinitialize_mdm(); software_init_mdm(); } else if (WNC_MDM_ERR == WNC_CMD_ERR) @@ -62,13 +94,10 @@ { do { - at_at_wnc(); - at_at_wnc(); WNC_MDM_ERR = WNC_OK; at_sockopen_wnc(MyServerIpAddress, MY_PORT_STR); if (WNC_MDM_ERR == WNC_NO_RESPONSE) { - reinitialize_mdm(); software_init_mdm(); } else if (WNC_MDM_ERR == WNC_CMD_ERR) @@ -88,14 +117,12 @@ at_sockwrite_wnc(s); if (WNC_MDM_ERR == WNC_NO_RESPONSE) { - reinitialize_mdm(); + pc.puts("Sock write no response!\r\n"); software_init_mdm(); } else if (WNC_MDM_ERR == WNC_CMD_ERR) { pc.puts("Socket Write fail!!!\r\n"); - // Have seen when write fails modem gets stuck in bad state, try to recover - reinitialize_mdm(); software_init_mdm(); } } while (WNC_MDM_ERR != WNC_OK); @@ -120,10 +147,7 @@ if (WNC_MDM_ERR == WNC_NO_RESPONSE) { if (n == 0) - { - reinitialize_mdm(); software_init_mdm(); - } else puts("Sock read partial data!!!\r\n"); } @@ -149,7 +173,6 @@ socketOpen = 0; if (WNC_MDM_ERR == WNC_NO_RESPONSE) { - reinitialize_mdm(); software_init_mdm(); } else if (WNC_MDM_ERR == WNC_CMD_ERR) @@ -196,21 +219,92 @@ extern int mdm_sendAtCmdRsp(const char *cmd, const char **rsp_list, int timeout_ms, string * rsp, int * len); +int check_wnc_ready(void) +{ + string * pRespStr; + size_t pos; + int regSts; + + pc.puts("<-------- Begin Cell Status ------------\r\n"); + + at_send_wnc_cmd("AT+CSQ", &pRespStr, WNC_TIMEOUT_MS); // Check RSSI,BER + at_send_wnc_cmd("AT+CPIN?", &pRespStr, WNC_TIMEOUT_MS); // Check if SIM locked + + // If SIM Card not ready don't bother with commands! + if (pRespStr->find("CPIN: READY") == string::npos) + { + pc.puts("------------ WNC SIM Problem! --------->\r\n"); + return (-1); + } + + // SIM card OK, now check for signal and cellular network registration +// do +// { + at_send_wnc_cmd("AT+CREG?", &pRespStr, WNC_TIMEOUT_MS); // Check if registered on network + pos = pRespStr->find("CREG: "); + if (pos != string::npos) + { + // The registration is the 2nd arg in the comma separated list + *pRespStr = pRespStr->substr(pos+8, 1); + regSts = atoi(pRespStr->c_str()); + // 1 - registered home, 5 - registered roaming + if ((regSts != 1) && (regSts != 5)) + { + pc.puts("------------ WNC Cell Link Down! ------>\r\n"); + return (-2); + } + } +// } while ((regSts != 1) && (regSts !=5)); + pc.puts("------------ WNC Ready ---------------->\r\n"); + + return (0); +} + // Sets a global with failure or success, assumes 1 thread all the time int send_wnc_cmd(const char * s, string ** r, int ms_timeout) { + if (check_wnc_ready() < 0) + { + string truncStr(s, 50); + pc.puts("FAIL send cmd: "); + pc.puts(truncStr.c_str()); + pc.puts("\r\n"); + WNC_MDM_ERR = WNC_NO_RESPONSE; + return (-2); + } + + // If WNC ready, send user command + return (at_send_wnc_cmd(s, r, ms_timeout)); +} + +int at_send_wnc_cmd(const char * s, string ** r, int ms_timeout) +{ static const char * rsp_lst[] = { "OK", "ERROR", NULL }; int len; - - pc.printf("Send: %s\r\n",s); + if (strlen(s) > 60) + { + string truncStr(s,57); + truncStr += "..."; + pc.printf("Send: <<%s>>\r\n",truncStr.c_str()); + } + else + pc.printf("Send: <<%s>>\r\n",s); + int res = mdm_sendAtCmdRsp(s, rsp_lst, ms_timeout, &wncStr, &len); *r = &wncStr; // Return a pointer to the static string if (res >= 0) - { + { pc.puts("["); - pc.puts(wncStr.c_str()); + if (wncStr.size() < 51) + pc.puts(wncStr.c_str()); + else + { + string truncStr = wncStr.substr(0,50) + "..."; + pc.puts(truncStr.c_str()); + } pc.puts("]\n\r"); + if (res > 0) { if (WNC_MDM_ERR != WNC_NO_RESPONSE) @@ -228,50 +322,62 @@ } } + void at_at_wnc(void) { string * pRespStr; send_wnc_cmd("AT", &pRespStr, WNC_TIMEOUT_MS); // Heartbeat? } -void at_init_wnc(void) +void at_init_wnc(bool hardReset) { static bool pdnSet = false; + static bool intSet = false; + static bool sockDialSet = false; + string * pRespStr; - string * pRespStr; + if (hardReset == true) + { + pdnSet = false; + intSet = false; + sockDialSet = false; + } + pc.puts("Start AT init of WNC:\r\n"); send_wnc_cmd("AT", &pRespStr, WNC_TIMEOUT_MS); // Heartbeat? - send_wnc_cmd("ATE0", &pRespStr, WNC_TIMEOUT_MS); // Echo ON - send_wnc_cmd("AT", &pRespStr, WNC_TIMEOUT_MS); // Heartbeat? + send_wnc_cmd("ATE0", &pRespStr, WNC_TIMEOUT_MS); // Echo Off send_wnc_cmd("AT+CMEE=2", &pRespStr, WNC_TIMEOUT_MS); // 2 - verbose error, 1 - numeric error, 0 - just ERROR - do { + + if ((WNC_MDM_ERR == WNC_OK) && (intSet == false)) + send_wnc_cmd("AT@INTERNET=1", &pRespStr, WNC_TIMEOUT_MS); + + if (WNC_MDM_ERR == WNC_OK) + intSet = true; + else + return ; + if (pdnSet == false) { - send_wnc_cmd("AT", &pRespStr, WNC_TIMEOUT_MS); // Heartbeat? - send_wnc_cmd("AT@INTERNET=1", &pRespStr, WNC_TIMEOUT_MS); string cmd_str("AT%PDNSET=1,"); cmd_str += MY_APN_STR; cmd_str += ",IP"; send_wnc_cmd(cmd_str.c_str(), &pRespStr, 4*WNC_TIMEOUT_MS); // Set APN, cmd seems to take a little longer sometimes - send_wnc_cmd("AT", &pRespStr, WNC_TIMEOUT_MS); // Heartbeat? + } + + if (WNC_MDM_ERR == WNC_OK) + pdnSet = true; + else + return ; + + if (sockDialSet == false) send_wnc_cmd("AT@SOCKDIAL=1", &pRespStr, WNC_TIMEOUT_MS); - } - } - while (WNC_MDM_ERR != WNC_OK); - // One time during power up to set the APN - pdnSet = true; - -// send_wnc_cmd("AT", &pRespStr, WNC_TIMEOUT_MS); // Heartbeat? -// send_wnc_cmd("AT+CFUN=0", &pRespStr, WNC_TIMEOUT_MS); // Try to force on network pt1 -// send_wnc_cmd("AT", &pRespStr, WNC_TIMEOUT_MS); // Heartbeat? -// send_wnc_cmd("AT+CFUN=1", &pRespStr, WNC_TIMEOUT_MS); // Try to force on network pt2 -// send_wnc_cmd("AT", &pRespStr, WNC_TIMEOUT_MS); // Heartbeat? - pc.puts("WNC Status:\r\n"); - send_wnc_cmd("AT@SOCKDIAL?", &pRespStr, WNC_TIMEOUT_MS); - send_wnc_cmd("AT+CPIN?", &pRespStr, WNC_TIMEOUT_MS); // Check if SIM locked - send_wnc_cmd("AT+CREG?", &pRespStr, WNC_TIMEOUT_MS); // Check if registered on network - send_wnc_cmd("AT+CSQ", &pRespStr, WNC_TIMEOUT_MS); // Check RSSI - pc.puts("End AT init of WNC\r\n"); + + if (WNC_MDM_ERR == WNC_OK) + sockDialSet = true; + else + return ; + + pc.puts("SUCCESS: AT init of WNC!\r\n"); } void at_sockopen_wnc(const string & ipStr, const char * port ) @@ -284,8 +390,6 @@ cmd_str += port; cmd_str += ",30"; send_wnc_cmd(cmd_str.c_str(), &pRespStr, 31000); - send_wnc_cmd("AT@SOCKCREAT?", &pRespStr, WNC_TIMEOUT_MS); - send_wnc_cmd("AT@SOCKCONN?", &pRespStr, WNC_TIMEOUT_MS); } void at_sockclose_wnc(void) @@ -353,7 +457,7 @@ cmd_str += num2str; } cmd_str += "\""; - send_wnc_cmd(cmd_str.c_str(), &pRespStr, 31000); + send_wnc_cmd(cmd_str.c_str(), &pRespStr, 120000); } else pc.puts("sockwrite Err, string to long\r\n");