WncController
Fork of WncControllerLibrary by
Diff: WncController.cpp
- Revision:
- 12:33290e9e6e5f
- Parent:
- 11:3ff6c1cb5b03
- Child:
- 13:73629a6e9122
--- a/WncController.cpp Fri Sep 09 23:58:12 2016 +0000 +++ b/WncController.cpp Sat Sep 10 00:49:34 2016 +0000 @@ -529,7 +529,7 @@ uint8_t i = m_sSock[numSock].readRetries; uint16_t to = m_sSock[numSock].readRetryWaitMs; bool foundData = false; - size_t numRead; + uint16_t numRead; do { AtCmdErr_e cmdRes; if (maxReadBufLen < MAX_WNC_READ_BYTES) @@ -1482,39 +1482,36 @@ // Experimental: read should not need to check cell net status result = at_send_wnc_cmd(cmd_str.c_str(), &pRespStr, m_sCmdTimeoutMs); if (result == WNC_AT_CMD_OK) { - pos_start = pRespStr->find("\"") + 1; - pos_end = pRespStr->rfind("\"") - 1; - + pos_start = pRespStr->find("\""); + pos_end = pRespStr->rfind("\""); // 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 + if (pos_start != string::npos && pos_end != string::npos) { + pos_start++; + i = pos_end - pos_start; // Num hex chars, 2 per byte + } else i = 0; - if (i < 0) + if ((i < 0) || ((i % 2) == 1)) dbgPuts("Invalid READ string!"); - else if (i > 2*MAX_WNC_READ_BYTES) { - // Bound the ill formated WNC read string! + + if (i > 2*MAX_WNC_READ_BYTES) { i = 2*MAX_WNC_READ_BYTES; - dbgPuts("TRUNCATING read data!"); + dbgPuts("DANGER WNC read data does not match length!"); } // If data, convert the hex string into byte values - if (i > 0) - { - string byte; - while (pos_start < pos_end) { - byte = pRespStr->substr(pos_start, 2); - *pS += (uint8_t)strtol(byte.c_str(), NULL, 16); - pos_start += 2; - } + while (i > 0) { + i -= 2; + *pS += (uint8_t)strtol(pRespStr->substr(pos_start, 2).c_str(), NULL, 16); + pos_start += 2; } } return (result); } -WncController::AtCmdErr_e WncController::at_sockread_wnc(uint8_t * pS, uint32_t * numRead, uint16_t n, uint16_t numSock, bool isTcp) +WncController::AtCmdErr_e WncController::at_sockread_wnc(uint8_t * pS, uint16_t * numRead, uint16_t n, uint16_t numSock, bool isTcp) { AtCmdErr_e result = WNC_AT_CMD_OK; *numRead = 0; @@ -1537,33 +1534,31 @@ // Experimental: read should not need to check cell net status result = at_send_wnc_cmd(cmd_str.c_str(), &pRespStr, m_sCmdTimeoutMs); if (result == WNC_AT_CMD_OK) { - pos_start = pRespStr->find("\"") + 1; - pos_end = pRespStr->rfind("\"") - 1; - + pos_start = pRespStr->find("\""); + pos_end = pRespStr->rfind("\""); // 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 + if (pos_start != string::npos && pos_end != string::npos) { + pos_start++; + i = pos_end - pos_start; // Num hex chars, 2 per byte + } else i = 0; - if (i < 0) + if ((i < 0) || ((i % 2) == 1)) dbgPuts("Invalid READ string!"); - else if (i > 2*n) { + + if (i > 2*n) { // Bound the ill formated WNC read string! i = 2*n; dbgPuts("TRUNCATING read data!"); } // If data, convert the hex string into byte values - if (i > 0) - { - string byte; - while (pos_start < pos_end) { - byte = pRespStr->substr(pos_start, 2); - *pS++ = (uint8_t)strtol(byte.c_str(), NULL, 16); - pos_start += 2; - (*numRead)++; - } + *numRead = i / 2; + while (i > 0) { + i -= 2; + *pS++ = (uint8_t)strtol(pRespStr->substr(pos_start, 2).c_str(), NULL, 16); + pos_start += 2; } } }