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:
- 30:33be8e2992f3
- Parent:
- 22:41e6c417ace1
- Child:
- 32:1e052a3e73fe
--- a/wnc_control.cpp Fri Jul 22 00:35:37 2016 +0000 +++ b/wnc_control.cpp Fri Jul 22 15:06:52 2016 +0000 @@ -31,7 +31,7 @@ { WNC_MDM_ERR = WNC_OK; at_init_wnc(); - if (WNC_MDM_ERR != WNC_OK) + if (WNC_MDM_ERR == WNC_NO_RESPONSE) reinitialize_mdm(); } while (WNC_MDM_ERR != WNC_OK); } @@ -55,7 +55,7 @@ } } while (WNC_MDM_ERR != WNC_OK); - pc.printf("My Server IP: %s\r\n", MyServerIpAddress.data()); + pc.printf("My Server IP: %s\r\n", MyServerIpAddress.c_str()); } void sockopen_mdm(void) @@ -104,25 +104,37 @@ puts("Socket is closed for write!\r\n"); } -void sockread_mdm(string * sockData, int len, int retries) +unsigned sockread_mdm(string * sockData, int len, int retries) { + unsigned n = 0; + + // Clean slate: + sockData->erase(); + if (socketOpen == 1) { do { WNC_MDM_ERR = WNC_OK; - at_sockread_wnc(sockData, len, retries); + n = at_sockread_wnc(sockData, len, retries); if (WNC_MDM_ERR == WNC_NO_RESPONSE) { - reinitialize_mdm(); - software_init_mdm(); + if (n == 0) + { + reinitialize_mdm(); + software_init_mdm(); + } + else + puts("Sock read partial data!!!\r\n"); } else if (WNC_MDM_ERR == WNC_CMD_ERR) puts("Sock read fail!!!!\r\n"); - } while (WNC_MDM_ERR != WNC_OK); + } while (WNC_MDM_ERR == WNC_NO_RESPONSE); } else puts("Socket is closed for read\r\n"); + + return (n); } void sockclose_mdm(void) @@ -190,6 +202,9 @@ static const char * rsp_lst[] = { "OK", "ERROR", NULL }; int len; + // Per WNC between every AT cmd: + wait_ms(20); + 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 @@ -197,7 +212,7 @@ if (res >= 0) { pc.puts("["); - pc.puts(wncStr.data()); + pc.puts(wncStr.c_str()); pc.puts("]\n\r"); if (res > 0) { @@ -230,7 +245,7 @@ string cmd_str("AT%PDNSET=1,"); cmd_str += MY_APN_STR; cmd_str += ",IP"; - send_wnc_cmd(cmd_str.data(), &pRespStr, 2*WNC_TIMEOUT_MS); // Set APN, cmd seems to take a little longer sometimes + send_wnc_cmd(cmd_str.c_str(), &pRespStr, 2*WNC_TIMEOUT_MS); // Set APN, cmd seems to take a little longer sometimes send_wnc_cmd("AT@INTERNET=1", &pRespStr, WNC_TIMEOUT_MS); // Internet services enabled send_wnc_cmd("AT@SOCKDIAL=1", &pRespStr, WNC_TIMEOUT_MS); } @@ -243,7 +258,7 @@ cmd_str += ipStr; cmd_str += "\","; cmd_str += port; - send_wnc_cmd(cmd_str.data(), &pRespStr, WNC_TIMEOUT_MS); + send_wnc_cmd(cmd_str.c_str(), &pRespStr, WNC_TIMEOUT_MS); } void at_sockclose_wnc(void) @@ -258,7 +273,7 @@ string str(s); str = "AT@DNSRESVDON=\"" + str; str += "\"\r\n"; - if (send_wnc_cmd(str.data(), &pRespStr, WNC_TIMEOUT_MS) == 0) + if (send_wnc_cmd(str.c_str(), &pRespStr, WNC_TIMEOUT_MS) == 0) { size_t pos_start = pRespStr->find(":\"") + 2; if (pos_start != string::npos) @@ -311,7 +326,7 @@ cmd_str += num2str; } cmd_str += "\""; - send_wnc_cmd(cmd_str.data(), &pRespStr, WNC_TIMEOUT_MS); + send_wnc_cmd(cmd_str.c_str(), &pRespStr, WNC_TIMEOUT_MS); } else pc.puts("sockwrite Err, string to long\r\n"); @@ -322,6 +337,10 @@ unsigned i; string * pRespStr; string cmd_str("AT@SOCKREAD=1,"); + + // Clean slate + pS->erase(); + if (n <= 1500) { char num2str[6]; @@ -336,7 +355,7 @@ // between each retry. wait_ms(10); - send_wnc_cmd(cmd_str.data(), &pRespStr, WNC_TIMEOUT_MS); + 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; i = pos_end - pos_start + 1; @@ -344,11 +363,10 @@ { retries = 0; // If any data found stop retrying string byte; - pS->erase(); while (pos_start < pos_end) { byte = pRespStr->substr(pos_start, 2); - *pS += (char)strtol(byte.data(), NULL, 16); + *pS += (char)strtol(byte.c_str(), NULL, 16); pos_start += 2; } return i;