WncController

Fork of WncControllerLibrary by Fred Kellerman

Committer:
jk431j
Date:
Mon Dec 11 19:58:38 2017 +0000
Revision:
36:11674252baf1
Parent:
35:7c9d0f29ff7a
Added wait for cellular link.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fkellermavnet 0:affdbb35faa4 1 /*
fkellermavnet 0:affdbb35faa4 2 Copyright (c) 2016 Fred Kellerman
fkellermavnet 0:affdbb35faa4 3
fkellermavnet 0:affdbb35faa4 4 Permission is hereby granted, free of charge, to any person obtaining a copy
fkellermavnet 0:affdbb35faa4 5 of this software and associated documentation files (the "Software"), to deal
fkellermavnet 0:affdbb35faa4 6 in the Software without restriction, including without limitation the rights
fkellermavnet 0:affdbb35faa4 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
fkellermavnet 0:affdbb35faa4 8 copies of the Software, and to permit persons to whom the Software is
fkellermavnet 0:affdbb35faa4 9 furnished to do so, subject to the following conditions:
fkellermavnet 0:affdbb35faa4 10
fkellermavnet 0:affdbb35faa4 11 The above copyright notice and this permission notice shall be included in
fkellermavnet 0:affdbb35faa4 12 all copies or substantial portions of the Software.
fkellermavnet 0:affdbb35faa4 13
fkellermavnet 0:affdbb35faa4 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
fkellermavnet 0:affdbb35faa4 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
fkellermavnet 0:affdbb35faa4 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
fkellermavnet 0:affdbb35faa4 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
fkellermavnet 0:affdbb35faa4 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
fkellermavnet 0:affdbb35faa4 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
fkellermavnet 0:affdbb35faa4 20 THE SOFTWARE.
fkellermavnet 0:affdbb35faa4 21
fkellermavnet 0:affdbb35faa4 22 @file WncController.cpp
fkellermavnet 0:affdbb35faa4 23 @purpose Controls WNC 14A2A Cellular Modem
fkellermavnet 0:affdbb35faa4 24 @version 1.0
fkellermavnet 0:affdbb35faa4 25 @date July 2016
fkellermavnet 0:affdbb35faa4 26 @author Fred Kellerman
fkellermavnet 33:2958e09ad308 27
fkellermavnet 33:2958e09ad308 28
fkellermavnet 33:2958e09ad308 29 An Example of usage:
fkellermavnet 33:2958e09ad308 30
fkellermavnet 33:2958e09ad308 31 WncControllerK64F mdm(&wncPinList, &mdmUart, &debugUart);
fkellermavnet 33:2958e09ad308 32
fkellermavnet 33:2958e09ad308 33 mdm.enableDebug(true, true);
fkellermavnet 33:2958e09ad308 34
fkellermavnet 33:2958e09ad308 35 if (false == mdm.powerWncOn("m2m.com.attz", 60)) {
fkellermavnet 33:2958e09ad308 36 while(1);
fkellermavnet 33:2958e09ad308 37 }
fkellermavnet 33:2958e09ad308 38
fkellermavnet 33:2958e09ad308 39 // ICCID and MSISDN
fkellermavnet 33:2958e09ad308 40 string iccid; string msisdn;
fkellermavnet 33:2958e09ad308 41 if (mdm.getICCID(&iccid) == true) {
fkellermavnet 33:2958e09ad308 42 if (mdm.convertICCIDtoMSISDN(iccid, &msisdn) == true) {
fkellermavnet 33:2958e09ad308 43 // Send an SMS message (must use 15-digit MISDN number!)
fkellermavnet 33:2958e09ad308 44 mdm.sendSMSText(msisdn.c_str(), "Hello from WNC Kit -> from WNC");
fkellermavnet 33:2958e09ad308 45 }
fkellermavnet 33:2958e09ad308 46 }
fkellermavnet 33:2958e09ad308 47
fkellermavnet 33:2958e09ad308 48 // Get an IP address setup for the socket #1 (0 indexed))
fkellermavnet 33:2958e09ad308 49 if (true == mdm.resolveUrl(0, "www.att.com"))
fkellermavnet 33:2958e09ad308 50 {
fkellermavnet 33:2958e09ad308 51 // Report server IP
fkellermavnet 33:2958e09ad308 52 if (true == mdm.getIpAddr(0, ipAddrStr)) {
fkellermavnet 33:2958e09ad308 53 debugUart.puts("Server IP: ");
fkellermavnet 33:2958e09ad308 54 debugUart.puts(ipAddrStr);
fkellermavnet 33:2958e09ad308 55 debugUart.puts("\r\n");
fkellermavnet 33:2958e09ad308 56 }
fkellermavnet 33:2958e09ad308 57
fkellermavnet 33:2958e09ad308 58 // Open Socket #1, TCP=true resolved IP on port 80:
fkellermavnet 33:2958e09ad308 59 if (true == mdm.openSocket(0, 80, true)) {
fkellermavnet 33:2958e09ad308 60 // Write some data
fkellermavnet 33:2958e09ad308 61 const uint8_t * dataStr = "GET /index.html HTTP/1.0\r\nFrom: someuser@someuser.com\r\nUser-Agent: HTTPTool/1.0\r\n\r\n";
fkellermavnet 33:2958e09ad308 62 if (true == mdm.write(0, dataStr, strlen((const char *)dataStr)))
fkellermavnet 33:2958e09ad308 63 {
fkellermavnet 33:2958e09ad308 64 const uint8_t * myBuf;
fkellermavnet 33:2958e09ad308 65 mdm.setReadRetries(0, 20);
fkellermavnet 33:2958e09ad308 66 uint32_t n = mdm.read(0, &myBuf);
fkellermavnet 33:2958e09ad308 67 if (n > 0)
fkellermavnet 33:2958e09ad308 68 debugUart.printf("Read %d chars: %s\r\n", n, myBuf);
fkellermavnet 33:2958e09ad308 69 else
fkellermavnet 33:2958e09ad308 70 debugUart.puts("No read data!\r\n");
fkellermavnet 33:2958e09ad308 71 }
fkellermavnet 33:2958e09ad308 72 }
fkellermavnet 33:2958e09ad308 73 }
fkellermavnet 33:2958e09ad308 74
fkellermavnet 0:affdbb35faa4 75 */
fkellermavnet 0:affdbb35faa4 76
fkellermavnet 0:affdbb35faa4 77
fkellermavnet 0:affdbb35faa4 78 #include <cstdlib>
fkellermavnet 0:affdbb35faa4 79 #include <cctype>
JMF 35:7c9d0f29ff7a 80 #include <string.h>
fkellermavnet 0:affdbb35faa4 81 #include "WncController.h"
fkellermavnet 0:affdbb35faa4 82
fkellermavnet 0:affdbb35faa4 83 namespace WncController_fk {
fkellermavnet 0:affdbb35faa4 84
fkellermavnet 0:affdbb35faa4 85 /////////////////////////////////////////////////////
fkellermavnet 0:affdbb35faa4 86 // Static initializers
fkellermavnet 0:affdbb35faa4 87 /////////////////////////////////////////////////////
fkellermavnet 10:2ec59906a24e 88 WncController::WncSocketInfo_s WncController::m_sSock[MAX_NUM_WNC_SOCKETS];
fkellermavnet 10:2ec59906a24e 89 const WncController::WncSocketInfo_s WncController::defaultSockStruct = { 0, false, "192.168.0.1", 80, 0, 25, true, 30 };
fkellermavnet 10:2ec59906a24e 90
fkellermavnet 0:affdbb35faa4 91 WncController::WncState_e WncController::m_sState = WNC_OFF;
fkellermavnet 0:affdbb35faa4 92 uint16_t WncController::m_sCmdTimeoutMs = WNC_CMD_TIMEOUT_MS;
fkellermavnet 0:affdbb35faa4 93 string WncController::m_sApnStr = "NULL";
fkellermavnet 0:affdbb35faa4 94 string WncController::m_sWncStr;
fkellermavnet 0:affdbb35faa4 95 uint8_t WncController::m_sPowerUpTimeoutSecs = MAX_POWERUP_TIMEOUT;
fkellermavnet 0:affdbb35faa4 96 bool WncController::m_sDebugEnabled = false;
fkellermavnet 0:affdbb35faa4 97 bool WncController::m_sMoreDebugEnabled = false;
fkellermavnet 0:affdbb35faa4 98 bool WncController::m_sCheckNetStatus = false; // Turn on internet status check between every command
fkellermavnet 0:affdbb35faa4 99 const char * const WncController::INVALID_IP_STR = "";
fkellermavnet 0:affdbb35faa4 100 bool WncController::m_sReadyForSMS = false;
fkellermavnet 0:affdbb35faa4 101
fkellermavnet 0:affdbb35faa4 102
fkellermavnet 0:affdbb35faa4 103 /**
fkellermavnet 0:affdbb35faa4 104 * C++ version 0.4 char* style "itoa":
fkellermavnet 0:affdbb35faa4 105 * Written by Lukás Chmela
fkellermavnet 0:affdbb35faa4 106 * Released under GPLv3.
fkellermavnet 33:2958e09ad308 107 */
fkellermavnet 0:affdbb35faa4 108 static char* itoa(int64_t value, char* result, int base)
fkellermavnet 0:affdbb35faa4 109 {
fkellermavnet 0:affdbb35faa4 110 // check that the base is valid
fkellermavnet 0:affdbb35faa4 111 if ( base < 2 || base > 36 ) {
fkellermavnet 0:affdbb35faa4 112 *result = '\0';
fkellermavnet 0:affdbb35faa4 113 return result;
fkellermavnet 0:affdbb35faa4 114 }
fkellermavnet 0:affdbb35faa4 115
fkellermavnet 0:affdbb35faa4 116 char* ptr = result, *ptr1 = result, tmp_char;
fkellermavnet 0:affdbb35faa4 117 int64_t tmp_value;
fkellermavnet 0:affdbb35faa4 118
fkellermavnet 0:affdbb35faa4 119 do {
fkellermavnet 0:affdbb35faa4 120 tmp_value = value;
fkellermavnet 0:affdbb35faa4 121 value /= base;
fkellermavnet 0:affdbb35faa4 122 *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value - value * base)];
fkellermavnet 0:affdbb35faa4 123 } while ( value );
fkellermavnet 0:affdbb35faa4 124
fkellermavnet 0:affdbb35faa4 125 // Apply negative sign
fkellermavnet 0:affdbb35faa4 126 if ( tmp_value < 0 )
fkellermavnet 0:affdbb35faa4 127 *ptr++ = '-';
fkellermavnet 0:affdbb35faa4 128
fkellermavnet 0:affdbb35faa4 129 *ptr-- = '\0';
fkellermavnet 0:affdbb35faa4 130
fkellermavnet 0:affdbb35faa4 131 while ( ptr1 < ptr ) {
fkellermavnet 0:affdbb35faa4 132 tmp_char = *ptr;
fkellermavnet 0:affdbb35faa4 133 *ptr-- = *ptr1;
fkellermavnet 0:affdbb35faa4 134 *ptr1++ = tmp_char;
fkellermavnet 0:affdbb35faa4 135 }
fkellermavnet 0:affdbb35faa4 136
fkellermavnet 0:affdbb35faa4 137 return result;
fkellermavnet 0:affdbb35faa4 138 }
fkellermavnet 0:affdbb35faa4 139
fkellermavnet 0:affdbb35faa4 140 const char * WncController::_to_string(int64_t value)
fkellermavnet 0:affdbb35faa4 141 {
fkellermavnet 0:affdbb35faa4 142 static char str[21]; // room for signed 64-bit + null
fkellermavnet 0:affdbb35faa4 143 itoa(value, str, 10);
fkellermavnet 0:affdbb35faa4 144 return (str);
fkellermavnet 0:affdbb35faa4 145 }
fkellermavnet 0:affdbb35faa4 146
fkellermavnet 1:ac2de545b981 147 const char * WncController::_to_hex_string(uint8_t value)
fkellermavnet 1:ac2de545b981 148 {
fkellermavnet 1:ac2de545b981 149 static char str[3]; // room for 8-bit + null
fkellermavnet 1:ac2de545b981 150 itoa(value, str, 16);
fkellermavnet 1:ac2de545b981 151 return (str);
fkellermavnet 1:ac2de545b981 152 }
fkellermavnet 0:affdbb35faa4 153
fkellermavnet 1:ac2de545b981 154 WncController::WncController(void)
fkellermavnet 0:affdbb35faa4 155 {
fkellermavnet 10:2ec59906a24e 156 for(unsigned i; i<MAX_NUM_WNC_SOCKETS; i++)
fkellermavnet 10:2ec59906a24e 157 m_sSock[i] = defaultSockStruct;
fkellermavnet 0:affdbb35faa4 158 }
fkellermavnet 0:affdbb35faa4 159
fkellermavnet 0:affdbb35faa4 160 void WncController::enableDebug(bool on, bool moreDebugOn)
fkellermavnet 0:affdbb35faa4 161 {
fkellermavnet 0:affdbb35faa4 162 m_sDebugEnabled = on;
fkellermavnet 0:affdbb35faa4 163 m_sMoreDebugEnabled = moreDebugOn;
fkellermavnet 0:affdbb35faa4 164 }
fkellermavnet 0:affdbb35faa4 165
fkellermavnet 0:affdbb35faa4 166 WncController::WncState_e WncController::getWncStatus(void)
fkellermavnet 0:affdbb35faa4 167 {
fkellermavnet 0:affdbb35faa4 168 return (m_sState);
fkellermavnet 0:affdbb35faa4 169 }
fkellermavnet 0:affdbb35faa4 170
fkellermavnet 0:affdbb35faa4 171 int16_t WncController::getDbmRssi(void)
fkellermavnet 0:affdbb35faa4 172 {
fkellermavnet 0:affdbb35faa4 173 int16_t rssi, ber;
fkellermavnet 0:affdbb35faa4 174 if (at_getrssiber_wnc(&rssi, &ber) == true)
fkellermavnet 0:affdbb35faa4 175 return (rssi);
fkellermavnet 0:affdbb35faa4 176 else
fkellermavnet 0:affdbb35faa4 177 return (99);
fkellermavnet 0:affdbb35faa4 178 }
fkellermavnet 0:affdbb35faa4 179
fkellermavnet 0:affdbb35faa4 180 int16_t WncController::get3gBer(void)
fkellermavnet 0:affdbb35faa4 181 {
fkellermavnet 0:affdbb35faa4 182 int16_t rssi, ber;
fkellermavnet 0:affdbb35faa4 183 if (at_getrssiber_wnc(&rssi, &ber) == true)
fkellermavnet 0:affdbb35faa4 184 return (ber);
fkellermavnet 0:affdbb35faa4 185 else
fkellermavnet 0:affdbb35faa4 186 return (99);
fkellermavnet 0:affdbb35faa4 187 }
fkellermavnet 0:affdbb35faa4 188
fkellermavnet 1:ac2de545b981 189 bool WncController::powerWncOn(const char * const apn, uint8_t powerUpTimeoutSecs)
fkellermavnet 0:affdbb35faa4 190 {
fkellermavnet 0:affdbb35faa4 191 dbgPuts("Waiting for WNC to Initialize...");
fkellermavnet 0:affdbb35faa4 192 m_sPowerUpTimeoutSecs = powerUpTimeoutSecs;
fkellermavnet 0:affdbb35faa4 193 m_sState = WNC_ON_NO_CELL_LINK; // Turn soft on to allow "AT" for init to be sent!
fkellermavnet 0:affdbb35faa4 194 if (initWncModem(powerUpTimeoutSecs) == true) {
fkellermavnet 0:affdbb35faa4 195 // Set the Apn
fkellermavnet 1:ac2de545b981 196 setApnName(apn);
fkellermavnet 0:affdbb35faa4 197 if (false == softwareInitMdm()) {
fkellermavnet 0:affdbb35faa4 198 dbgPuts("Software init failed!");
fkellermavnet 0:affdbb35faa4 199 m_sState = WNC_OFF;
fkellermavnet 0:affdbb35faa4 200 }
fkellermavnet 0:affdbb35faa4 201 }
fkellermavnet 0:affdbb35faa4 202 else {
fkellermavnet 0:affdbb35faa4 203 dbgPuts("Power up failed!");
fkellermavnet 0:affdbb35faa4 204 m_sState = WNC_OFF;
fkellermavnet 0:affdbb35faa4 205 }
fkellermavnet 0:affdbb35faa4 206
fkellermavnet 21:086841abc3aa 207 return ((m_sState == WNC_ON) || (m_sState == WNC_ON_NO_CELL_LINK));
fkellermavnet 0:affdbb35faa4 208 }
fkellermavnet 0:affdbb35faa4 209
fkellermavnet 0:affdbb35faa4 210 size_t WncController::sendCustomCmd(const char * cmd, char * resp, size_t sizeRespBuf, int ms_timeout)
fkellermavnet 0:affdbb35faa4 211 {
fkellermavnet 0:affdbb35faa4 212 string * respStr;
fkellermavnet 0:affdbb35faa4 213
fkellermavnet 0:affdbb35faa4 214 if (sizeRespBuf > 0) {
fkellermavnet 0:affdbb35faa4 215 AtCmdErr_e r = at_send_wnc_cmd(cmd, &respStr, ms_timeout);
fkellermavnet 18:ca2899c353c2 216 strncpy(resp, respStr->c_str(), sizeRespBuf);
fkellermavnet 18:ca2899c353c2 217 if (respStr->size() > sizeRespBuf)
fkellermavnet 18:ca2899c353c2 218 dbgPuts("sendCustomCmd truncated!");
fkellermavnet 18:ca2899c353c2 219
fkellermavnet 18:ca2899c353c2 220 return (respStr->size());
fkellermavnet 0:affdbb35faa4 221 }
fkellermavnet 0:affdbb35faa4 222
fkellermavnet 0:affdbb35faa4 223 dbgPuts("sendCustomCmd: would have overrun!");
fkellermavnet 0:affdbb35faa4 224
fkellermavnet 0:affdbb35faa4 225 return (0);
fkellermavnet 0:affdbb35faa4 226 }
fkellermavnet 0:affdbb35faa4 227
fkellermavnet 0:affdbb35faa4 228 bool WncController::pingUrl(const char * url)
fkellermavnet 0:affdbb35faa4 229 {
fkellermavnet 0:affdbb35faa4 230 string ipAddr;
fkellermavnet 0:affdbb35faa4 231
fkellermavnet 0:affdbb35faa4 232 if (true == at_dnsresolve_wnc(url, &ipAddr))
fkellermavnet 0:affdbb35faa4 233 return (pingIp(ipAddr.c_str()));
fkellermavnet 0:affdbb35faa4 234 else
fkellermavnet 0:affdbb35faa4 235 dbgPuts("pingUrl DNS resolve: failed!");
fkellermavnet 0:affdbb35faa4 236
fkellermavnet 0:affdbb35faa4 237 return (false);
fkellermavnet 0:affdbb35faa4 238 }
fkellermavnet 0:affdbb35faa4 239
fkellermavnet 0:affdbb35faa4 240 bool WncController::pingIp(const char * ip)
fkellermavnet 0:affdbb35faa4 241 {
fkellermavnet 0:affdbb35faa4 242 if (true == at_ping_wnc(ip))
fkellermavnet 0:affdbb35faa4 243 return (true);
fkellermavnet 0:affdbb35faa4 244 else
fkellermavnet 0:affdbb35faa4 245 dbgPuts("pingIp: failed!");
fkellermavnet 0:affdbb35faa4 246
fkellermavnet 0:affdbb35faa4 247 return (false);
fkellermavnet 0:affdbb35faa4 248 }
fkellermavnet 0:affdbb35faa4 249
fkellermavnet 0:affdbb35faa4 250 bool WncController::getWncNetworkingStats(WncIpStats * s)
fkellermavnet 0:affdbb35faa4 251 {
fkellermavnet 0:affdbb35faa4 252 return (at_get_wnc_net_stats(s));
fkellermavnet 0:affdbb35faa4 253 }
fkellermavnet 0:affdbb35faa4 254
fkellermavnet 0:affdbb35faa4 255 bool WncController::getIpAddr(uint16_t numSock, char myIpAddr[MAX_LEN_IP_STR])
fkellermavnet 0:affdbb35faa4 256 {
fkellermavnet 0:affdbb35faa4 257 if (numSock < MAX_NUM_WNC_SOCKETS) {
fkellermavnet 0:affdbb35faa4 258 strncpy(myIpAddr, m_sSock[numSock].myIpAddressStr.c_str(), MAX_LEN_IP_STR);
fkellermavnet 0:affdbb35faa4 259 myIpAddr[MAX_LEN_IP_STR - 1] = '\0';
fkellermavnet 0:affdbb35faa4 260 return (true);
fkellermavnet 0:affdbb35faa4 261 }
fkellermavnet 0:affdbb35faa4 262 else {
fkellermavnet 0:affdbb35faa4 263 myIpAddr[0] = '\0';
fkellermavnet 0:affdbb35faa4 264 return (false);
fkellermavnet 0:affdbb35faa4 265 }
fkellermavnet 0:affdbb35faa4 266 }
fkellermavnet 0:affdbb35faa4 267
fkellermavnet 0:affdbb35faa4 268 bool WncController::setApnName(const char * const apnStr)
fkellermavnet 0:affdbb35faa4 269 {
fkellermavnet 0:affdbb35faa4 270 if (at_setapn_wnc(apnStr) == true)
fkellermavnet 0:affdbb35faa4 271 {
fkellermavnet 0:affdbb35faa4 272 m_sApnStr = apnStr;
fkellermavnet 0:affdbb35faa4 273 return (true);
fkellermavnet 0:affdbb35faa4 274 }
fkellermavnet 0:affdbb35faa4 275 else
fkellermavnet 0:affdbb35faa4 276 return (false);
fkellermavnet 0:affdbb35faa4 277 }
fkellermavnet 0:affdbb35faa4 278
fkellermavnet 0:affdbb35faa4 279 bool WncController::resolveUrl(uint16_t numSock, const char * url)
fkellermavnet 0:affdbb35faa4 280 {
fkellermavnet 0:affdbb35faa4 281 bool cmdRes;
fkellermavnet 0:affdbb35faa4 282
fkellermavnet 0:affdbb35faa4 283 if (numSock < MAX_NUM_WNC_SOCKETS) {
fkellermavnet 0:affdbb35faa4 284 if (strlen(url) > 0) {
fkellermavnet 0:affdbb35faa4 285 cmdRes = at_dnsresolve_wnc(url, &m_sSock[numSock].myIpAddressStr);
fkellermavnet 0:affdbb35faa4 286 if (cmdRes == false)
fkellermavnet 0:affdbb35faa4 287 dbgPuts("Cannot resolve URL!");
fkellermavnet 0:affdbb35faa4 288 return (cmdRes);
fkellermavnet 0:affdbb35faa4 289 }
fkellermavnet 0:affdbb35faa4 290 else
fkellermavnet 0:affdbb35faa4 291 dbgPuts("Invalid URL");
fkellermavnet 0:affdbb35faa4 292 }
fkellermavnet 0:affdbb35faa4 293 else
fkellermavnet 0:affdbb35faa4 294 dbgPuts("Invalid Sock num!");
fkellermavnet 0:affdbb35faa4 295
fkellermavnet 0:affdbb35faa4 296 return (false);
fkellermavnet 0:affdbb35faa4 297 }
fkellermavnet 0:affdbb35faa4 298
fkellermavnet 0:affdbb35faa4 299 bool WncController::setIpAddr(uint16_t numSock, const char * ipStr)
fkellermavnet 0:affdbb35faa4 300 {
fkellermavnet 0:affdbb35faa4 301 if (numSock < MAX_NUM_WNC_SOCKETS) {
fkellermavnet 0:affdbb35faa4 302 m_sSock[numSock].myIpAddressStr = ipStr;
fkellermavnet 0:affdbb35faa4 303 return (true);
fkellermavnet 0:affdbb35faa4 304 }
fkellermavnet 0:affdbb35faa4 305 else {
fkellermavnet 0:affdbb35faa4 306 dbgPuts("Bad socket num!");
fkellermavnet 0:affdbb35faa4 307 return (false);
fkellermavnet 0:affdbb35faa4 308 }
fkellermavnet 0:affdbb35faa4 309 }
fkellermavnet 0:affdbb35faa4 310
fkellermavnet 6:a656e820d7ff 311 void WncController::setWncCmdTimeout(uint16_t toMs)
fkellermavnet 6:a656e820d7ff 312 {
fkellermavnet 6:a656e820d7ff 313 m_sCmdTimeoutMs = toMs;
fkellermavnet 6:a656e820d7ff 314 }
fkellermavnet 6:a656e820d7ff 315
fkellermavnet 15:2c8211ef69e1 316 bool WncController::openSocketUrl(uint16_t numSock, const char * url, uint16_t port, bool tcp, uint16_t timeOutSec)
fkellermavnet 15:2c8211ef69e1 317 {
fkellermavnet 15:2c8211ef69e1 318 if (resolveUrl(numSock, url) == true)
fkellermavnet 15:2c8211ef69e1 319 return (openSocket(numSock, port, tcp, timeOutSec));
fkellermavnet 15:2c8211ef69e1 320
fkellermavnet 15:2c8211ef69e1 321 return (false);
fkellermavnet 15:2c8211ef69e1 322 }
fkellermavnet 15:2c8211ef69e1 323
fkellermavnet 15:2c8211ef69e1 324 bool WncController::openSocketIpAddr(uint16_t numSock, const char * ipAddr, uint16_t port, bool tcp, uint16_t timeOutSec)
fkellermavnet 15:2c8211ef69e1 325 {
fkellermavnet 15:2c8211ef69e1 326 if (setIpAddr(numSock, ipAddr) == true)
fkellermavnet 15:2c8211ef69e1 327 return (openSocket(numSock, port, tcp, timeOutSec));
fkellermavnet 15:2c8211ef69e1 328
fkellermavnet 15:2c8211ef69e1 329 return (false);
fkellermavnet 15:2c8211ef69e1 330 }
fkellermavnet 15:2c8211ef69e1 331
fkellermavnet 0:affdbb35faa4 332 bool WncController::openSocket(uint16_t numSock, uint16_t port, bool tcp, uint16_t timeOutSec)
fkellermavnet 0:affdbb35faa4 333 {
fkellermavnet 0:affdbb35faa4 334 if (numSock < MAX_NUM_WNC_SOCKETS) {
fkellermavnet 0:affdbb35faa4 335 // IPV4 ip addr sanity check!
fkellermavnet 0:affdbb35faa4 336 size_t lenIpStr = m_sSock[numSock].myIpAddressStr.size();
fkellermavnet 0:affdbb35faa4 337 if (lenIpStr < 7 || lenIpStr > 15) {
fkellermavnet 0:affdbb35faa4 338 dbgPuts("Invalid IP Address!");
fkellermavnet 0:affdbb35faa4 339 return (false);
fkellermavnet 0:affdbb35faa4 340 }
fkellermavnet 0:affdbb35faa4 341
fkellermavnet 0:affdbb35faa4 342 // Already open ? Must close if want to re-open with new settings.
fkellermavnet 0:affdbb35faa4 343 if (m_sSock[numSock].open == true) {
fkellermavnet 0:affdbb35faa4 344 dbgPuts("Socket already open, close then re-open!");
fkellermavnet 28:eece2151e1e5 345 if (true == at_sockclose_wnc(m_sSock[numSock].numWncSock))
fkellermavnet 28:eece2151e1e5 346 m_sSock[numSock].open = false;
fkellermavnet 28:eece2151e1e5 347 else
fkellermavnet 28:eece2151e1e5 348 return (false);
fkellermavnet 0:affdbb35faa4 349 }
fkellermavnet 0:affdbb35faa4 350
fkellermavnet 0:affdbb35faa4 351 m_sSock[numSock].myPort = port;
fkellermavnet 0:affdbb35faa4 352 m_sSock[numSock].isTcp = tcp;
fkellermavnet 0:affdbb35faa4 353 m_sSock[numSock].timeOutSec = timeOutSec;
fkellermavnet 10:2ec59906a24e 354
fkellermavnet 28:eece2151e1e5 355 int16_t numWncSock = at_sockopen_wnc(m_sSock[numSock].myIpAddressStr.c_str(), port, numSock, tcp, timeOutSec);
fkellermavnet 10:2ec59906a24e 356 m_sSock[numSock].numWncSock = numWncSock;
fkellermavnet 10:2ec59906a24e 357 if (numWncSock > 0 && numWncSock <= MAX_NUM_WNC_SOCKETS)
fkellermavnet 10:2ec59906a24e 358 m_sSock[numSock].open = true;
fkellermavnet 28:eece2151e1e5 359 else {
fkellermavnet 10:2ec59906a24e 360 m_sSock[numSock].open = false;
fkellermavnet 0:affdbb35faa4 361 dbgPuts("Socket open fail!!!!");
fkellermavnet 28:eece2151e1e5 362
fkellermavnet 28:eece2151e1e5 363 // If the modem is not responding don't bother it.
fkellermavnet 28:eece2151e1e5 364 if (WNC_NO_RESPONSE != getWncStatus()) {
fkellermavnet 28:eece2151e1e5 365 // Work-around. If the sock open fails it needs to be told
fkellermavnet 28:eece2151e1e5 366 // to close. If 6 sock opens happen with a fail, it further
fkellermavnet 28:eece2151e1e5 367 // crashes the WNC. Not sure why the sock won't open.
fkellermavnet 28:eece2151e1e5 368 at_sockclose_wnc(m_sSock[numSock].numWncSock);
fkellermavnet 28:eece2151e1e5 369 }
fkellermavnet 0:affdbb35faa4 370 }
fkellermavnet 0:affdbb35faa4 371 }
fkellermavnet 0:affdbb35faa4 372 else {
fkellermavnet 0:affdbb35faa4 373 dbgPuts("Bad socket num or IP!");
fkellermavnet 0:affdbb35faa4 374 return (false);
fkellermavnet 0:affdbb35faa4 375 }
fkellermavnet 0:affdbb35faa4 376
fkellermavnet 0:affdbb35faa4 377 return (m_sSock[numSock].open);
fkellermavnet 0:affdbb35faa4 378 }
fkellermavnet 0:affdbb35faa4 379
fkellermavnet 33:2958e09ad308 380 bool WncController::sockWrite(const uint8_t * const s, uint16_t n, uint16_t numSock, bool isTcp)
fkellermavnet 0:affdbb35faa4 381 {
fkellermavnet 10:2ec59906a24e 382 bool result = true;
fkellermavnet 0:affdbb35faa4 383
fkellermavnet 10:2ec59906a24e 384 AtCmdErr_e cmdRes = at_sockwrite_wnc(s, n, m_sSock[numSock].numWncSock, isTcp);
fkellermavnet 0:affdbb35faa4 385 if (cmdRes != WNC_AT_CMD_OK) {
fkellermavnet 28:eece2151e1e5 386 if ((cmdRes == WNC_AT_CMD_ERREXT) || (cmdRes == WNC_AT_CMD_ERRCME))
fkellermavnet 0:affdbb35faa4 387 {
fkellermavnet 1:ac2de545b981 388 // This may throw away any data that hasn't been written out of the WNC
fkellermavnet 0:affdbb35faa4 389 // but at this point with the way the WNC currently works we have
fkellermavnet 0:affdbb35faa4 390 // no choice.
fkellermavnet 0:affdbb35faa4 391 closeOpenSocket(numSock);
fkellermavnet 0:affdbb35faa4 392 }
fkellermavnet 0:affdbb35faa4 393 result = false;
fkellermavnet 0:affdbb35faa4 394 }
fkellermavnet 0:affdbb35faa4 395
fkellermavnet 0:affdbb35faa4 396 return (result);
fkellermavnet 0:affdbb35faa4 397 }
fkellermavnet 0:affdbb35faa4 398
fkellermavnet 33:2958e09ad308 399 bool WncController::write(uint16_t numSock, const uint8_t * s, uint32_t n)
fkellermavnet 0:affdbb35faa4 400 {
fkellermavnet 0:affdbb35faa4 401 bool result;
fkellermavnet 0:affdbb35faa4 402
fkellermavnet 0:affdbb35faa4 403 if (numSock < MAX_NUM_WNC_SOCKETS) {
fkellermavnet 0:affdbb35faa4 404 if (m_sSock[numSock].open == true) {
fkellermavnet 0:affdbb35faa4 405 if (n <= MAX_WNC_WRITE_BYTES) {
fkellermavnet 0:affdbb35faa4 406 result = sockWrite(s, n, numSock, m_sSock[numSock].isTcp);
fkellermavnet 0:affdbb35faa4 407 }
fkellermavnet 0:affdbb35faa4 408 else {
fkellermavnet 0:affdbb35faa4 409 uint16_t rem = n % MAX_WNC_WRITE_BYTES;
fkellermavnet 13:73629a6e9122 410 while (n >= MAX_WNC_WRITE_BYTES) {
fkellermavnet 0:affdbb35faa4 411 n -= MAX_WNC_WRITE_BYTES;
fkellermavnet 0:affdbb35faa4 412 result = sockWrite(s, MAX_WNC_WRITE_BYTES, numSock, m_sSock[numSock].isTcp);
fkellermavnet 0:affdbb35faa4 413 if (result == false) {
fkellermavnet 0:affdbb35faa4 414 n = 0;
fkellermavnet 0:affdbb35faa4 415 rem = 0;
fkellermavnet 0:affdbb35faa4 416 dbgPuts("Sock write fail!");
fkellermavnet 0:affdbb35faa4 417 }
fkellermavnet 0:affdbb35faa4 418 else
fkellermavnet 0:affdbb35faa4 419 s += MAX_WNC_WRITE_BYTES;
fkellermavnet 0:affdbb35faa4 420 }
fkellermavnet 0:affdbb35faa4 421 if (rem > 0)
fkellermavnet 0:affdbb35faa4 422 result = sockWrite(s, rem, numSock, m_sSock[numSock].isTcp);
fkellermavnet 0:affdbb35faa4 423 }
fkellermavnet 0:affdbb35faa4 424 }
fkellermavnet 0:affdbb35faa4 425 else {
fkellermavnet 0:affdbb35faa4 426 dbgPuts("Socket is closed for write!");
fkellermavnet 0:affdbb35faa4 427 result = false;
fkellermavnet 0:affdbb35faa4 428 }
fkellermavnet 0:affdbb35faa4 429 }
fkellermavnet 0:affdbb35faa4 430 else {
fkellermavnet 0:affdbb35faa4 431 dbgPuts("Bad socket num!");
fkellermavnet 0:affdbb35faa4 432 result = false;
fkellermavnet 0:affdbb35faa4 433 }
fkellermavnet 0:affdbb35faa4 434
fkellermavnet 0:affdbb35faa4 435 return (result);
fkellermavnet 0:affdbb35faa4 436 }
fkellermavnet 0:affdbb35faa4 437
fkellermavnet 21:086841abc3aa 438 size_t WncController::read(uint16_t numSock, const uint8_t ** readBuf)
fkellermavnet 4:c5720f4d13ff 439 {
fkellermavnet 4:c5720f4d13ff 440 static string theBuf;
fkellermavnet 4:c5720f4d13ff 441 string readStr;
fkellermavnet 4:c5720f4d13ff 442
fkellermavnet 4:c5720f4d13ff 443 theBuf.erase(); // Clean-up from last time
fkellermavnet 4:c5720f4d13ff 444
fkellermavnet 4:c5720f4d13ff 445 if (numSock < MAX_NUM_WNC_SOCKETS) {
fkellermavnet 4:c5720f4d13ff 446 if (m_sSock[numSock].open == true) {
fkellermavnet 21:086841abc3aa 447 uint8_t i = m_sSock[numSock].readRetries;
fkellermavnet 4:c5720f4d13ff 448 uint16_t to = m_sSock[numSock].readRetryWaitMs;
fkellermavnet 4:c5720f4d13ff 449 bool foundData = false;
fkellermavnet 4:c5720f4d13ff 450 do {
fkellermavnet 4:c5720f4d13ff 451 AtCmdErr_e cmdRes;
fkellermavnet 10:2ec59906a24e 452 cmdRes = at_sockread_wnc(&readStr, m_sSock[numSock].numWncSock, m_sSock[numSock].isTcp);
fkellermavnet 4:c5720f4d13ff 453 if (WNC_AT_CMD_OK == cmdRes) {
fkellermavnet 4:c5720f4d13ff 454 // This will let this loop read until the socket data is
fkellermavnet 4:c5720f4d13ff 455 // empty. If no data, then wait the retry amount of time.
fkellermavnet 4:c5720f4d13ff 456 if (readStr.size() > 0) {
fkellermavnet 4:c5720f4d13ff 457 theBuf += readStr;
fkellermavnet 4:c5720f4d13ff 458 foundData = true;
fkellermavnet 4:c5720f4d13ff 459 i = 1;
fkellermavnet 4:c5720f4d13ff 460 }
fkellermavnet 4:c5720f4d13ff 461 else {
fkellermavnet 4:c5720f4d13ff 462 // Once data is found start returning it asap
fkellermavnet 4:c5720f4d13ff 463 if (foundData == false)
fkellermavnet 4:c5720f4d13ff 464 waitMs(to);
fkellermavnet 4:c5720f4d13ff 465 }
fkellermavnet 4:c5720f4d13ff 466 }
fkellermavnet 4:c5720f4d13ff 467 else {
fkellermavnet 4:c5720f4d13ff 468 theBuf += readStr; // Append what if any we got before it errored.
fkellermavnet 4:c5720f4d13ff 469 dbgPuts("Sockread failed!");
fkellermavnet 28:eece2151e1e5 470 if (WNC_NO_RESPONSE == getWncStatus()) {
fkellermavnet 28:eece2151e1e5 471 i = 0;
fkellermavnet 28:eece2151e1e5 472 }
fkellermavnet 28:eece2151e1e5 473 else if ((cmdRes == WNC_AT_CMD_ERREXT) || (cmdRes == WNC_AT_CMD_ERRCME))
fkellermavnet 4:c5720f4d13ff 474 {
fkellermavnet 4:c5720f4d13ff 475 // This may throw away any data that hasn't been read out of the WNC
fkellermavnet 4:c5720f4d13ff 476 // but at this point with the way the WNC currently works we have
fkellermavnet 4:c5720f4d13ff 477 // no choice.
fkellermavnet 4:c5720f4d13ff 478 closeOpenSocket(numSock);
fkellermavnet 21:086841abc3aa 479 i = 0;
fkellermavnet 4:c5720f4d13ff 480 }
fkellermavnet 4:c5720f4d13ff 481 else
fkellermavnet 4:c5720f4d13ff 482 waitMs(to);
fkellermavnet 4:c5720f4d13ff 483 }
fkellermavnet 4:c5720f4d13ff 484 } while (i-- > 0);
fkellermavnet 4:c5720f4d13ff 485 }
fkellermavnet 4:c5720f4d13ff 486 else {
fkellermavnet 4:c5720f4d13ff 487 dbgPuts("Socket is closed for read");
fkellermavnet 4:c5720f4d13ff 488 }
fkellermavnet 4:c5720f4d13ff 489 }
fkellermavnet 4:c5720f4d13ff 490 else {
fkellermavnet 4:c5720f4d13ff 491 dbgPuts("Bad socket num!");
fkellermavnet 4:c5720f4d13ff 492 }
fkellermavnet 4:c5720f4d13ff 493
fkellermavnet 4:c5720f4d13ff 494 *readBuf = (const uint8_t *)theBuf.c_str();
fkellermavnet 4:c5720f4d13ff 495
fkellermavnet 4:c5720f4d13ff 496 return (theBuf.size());
fkellermavnet 4:c5720f4d13ff 497 }
fkellermavnet 4:c5720f4d13ff 498
fkellermavnet 21:086841abc3aa 499 size_t WncController::read(uint16_t numSock, uint8_t * readBuf, uint32_t maxReadBufLen)
fkellermavnet 0:affdbb35faa4 500 {
fkellermavnet 0:affdbb35faa4 501 uint32_t numCopied = 0;
fkellermavnet 0:affdbb35faa4 502
fkellermavnet 0:affdbb35faa4 503 if (numSock < MAX_NUM_WNC_SOCKETS) {
fkellermavnet 0:affdbb35faa4 504 if (m_sSock[numSock].open == true) {
fkellermavnet 9:76c6dd1434e1 505 uint8_t i = m_sSock[numSock].readRetries;
fkellermavnet 0:affdbb35faa4 506 uint16_t to = m_sSock[numSock].readRetryWaitMs;
fkellermavnet 0:affdbb35faa4 507 bool foundData = false;
fkellermavnet 12:33290e9e6e5f 508 uint16_t numRead;
fkellermavnet 0:affdbb35faa4 509 do {
fkellermavnet 0:affdbb35faa4 510 AtCmdErr_e cmdRes;
fkellermavnet 10:2ec59906a24e 511 if (maxReadBufLen < MAX_WNC_READ_BYTES)
fkellermavnet 10:2ec59906a24e 512 cmdRes = at_sockread_wnc(readBuf, &numRead, maxReadBufLen, m_sSock[numSock].numWncSock, m_sSock[numSock].isTcp);
fkellermavnet 0:affdbb35faa4 513 else
fkellermavnet 10:2ec59906a24e 514 cmdRes = at_sockread_wnc(readBuf, &numRead, MAX_WNC_READ_BYTES, m_sSock[numSock].numWncSock, m_sSock[numSock].isTcp);
fkellermavnet 0:affdbb35faa4 515
fkellermavnet 0:affdbb35faa4 516 if (WNC_AT_CMD_OK == cmdRes) {
fkellermavnet 0:affdbb35faa4 517 // This will let this loop read until the socket data is
fkellermavnet 0:affdbb35faa4 518 // empty. If no data, then wait the retry amount of time.
fkellermavnet 0:affdbb35faa4 519 if (numRead > 0) {
fkellermavnet 0:affdbb35faa4 520 foundData = true;
fkellermavnet 0:affdbb35faa4 521 i = 1;
fkellermavnet 10:2ec59906a24e 522 if (numRead <= maxReadBufLen) {
fkellermavnet 0:affdbb35faa4 523 maxReadBufLen -= numRead;
fkellermavnet 0:affdbb35faa4 524 numCopied += numRead;
fkellermavnet 0:affdbb35faa4 525 readBuf += numRead;
fkellermavnet 0:affdbb35faa4 526 }
fkellermavnet 0:affdbb35faa4 527 else {
fkellermavnet 0:affdbb35faa4 528 i = 0; // No more room for data!
fkellermavnet 0:affdbb35faa4 529 dbgPutsNoTime("No more room for read data!");
fkellermavnet 0:affdbb35faa4 530 }
fkellermavnet 0:affdbb35faa4 531 }
fkellermavnet 0:affdbb35faa4 532 else {
fkellermavnet 0:affdbb35faa4 533 // Once data is found start returning it asap
fkellermavnet 0:affdbb35faa4 534 if (foundData == false)
fkellermavnet 0:affdbb35faa4 535 waitMs(to);
fkellermavnet 0:affdbb35faa4 536 }
fkellermavnet 0:affdbb35faa4 537 }
fkellermavnet 0:affdbb35faa4 538 else {
fkellermavnet 0:affdbb35faa4 539 dbgPuts("Sockread failed!");
fkellermavnet 28:eece2151e1e5 540 if (WNC_NO_RESPONSE == getWncStatus()) {
fkellermavnet 28:eece2151e1e5 541 i = 0;
fkellermavnet 28:eece2151e1e5 542 }
fkellermavnet 28:eece2151e1e5 543 else if ((cmdRes == WNC_AT_CMD_ERREXT) || (cmdRes == WNC_AT_CMD_ERRCME))
fkellermavnet 0:affdbb35faa4 544 {
fkellermavnet 0:affdbb35faa4 545 // This may throw away any data that hasn't been read out of the WNC
fkellermavnet 0:affdbb35faa4 546 // but at this point with the way the WNC currently works we have
fkellermavnet 0:affdbb35faa4 547 // no choice.
fkellermavnet 0:affdbb35faa4 548 closeOpenSocket(numSock);
fkellermavnet 21:086841abc3aa 549 i = 0;
fkellermavnet 0:affdbb35faa4 550 }
fkellermavnet 0:affdbb35faa4 551 else
fkellermavnet 0:affdbb35faa4 552 waitMs(to);
fkellermavnet 0:affdbb35faa4 553 }
fkellermavnet 10:2ec59906a24e 554 } while ((i-- > 0) && (maxReadBufLen > 0));
fkellermavnet 0:affdbb35faa4 555 }
fkellermavnet 0:affdbb35faa4 556 else {
fkellermavnet 0:affdbb35faa4 557 dbgPuts("Socket is closed for read");
fkellermavnet 0:affdbb35faa4 558 }
fkellermavnet 0:affdbb35faa4 559 }
fkellermavnet 0:affdbb35faa4 560 else {
fkellermavnet 0:affdbb35faa4 561 dbgPuts("Bad socket num!");
fkellermavnet 0:affdbb35faa4 562 }
fkellermavnet 0:affdbb35faa4 563
fkellermavnet 0:affdbb35faa4 564 return (numCopied);
fkellermavnet 0:affdbb35faa4 565 }
fkellermavnet 0:affdbb35faa4 566
fkellermavnet 0:affdbb35faa4 567 void WncController::setReadRetries(uint16_t numSock, uint16_t retries)
fkellermavnet 0:affdbb35faa4 568 {
fkellermavnet 0:affdbb35faa4 569 if (numSock < MAX_NUM_WNC_SOCKETS)
fkellermavnet 0:affdbb35faa4 570 m_sSock[numSock].readRetries = retries;
fkellermavnet 0:affdbb35faa4 571 else
fkellermavnet 0:affdbb35faa4 572 dbgPuts("Bad socket num!");
fkellermavnet 0:affdbb35faa4 573 }
fkellermavnet 0:affdbb35faa4 574
fkellermavnet 0:affdbb35faa4 575 void WncController::setReadRetryWait(uint16_t numSock, uint16_t readRetryWaitMs)
fkellermavnet 0:affdbb35faa4 576 {
fkellermavnet 0:affdbb35faa4 577 if (numSock < MAX_NUM_WNC_SOCKETS)
fkellermavnet 0:affdbb35faa4 578 m_sSock[numSock].readRetryWaitMs = readRetryWaitMs;
fkellermavnet 0:affdbb35faa4 579 else
fkellermavnet 0:affdbb35faa4 580 dbgPuts("Bad socket num!");
fkellermavnet 0:affdbb35faa4 581 }
fkellermavnet 0:affdbb35faa4 582
fkellermavnet 0:affdbb35faa4 583 bool WncController::closeSocket(uint16_t numSock)
fkellermavnet 0:affdbb35faa4 584 {
fkellermavnet 0:affdbb35faa4 585 if (numSock < MAX_NUM_WNC_SOCKETS) {
fkellermavnet 0:affdbb35faa4 586
fkellermavnet 10:2ec59906a24e 587 if (false == at_sockclose_wnc(m_sSock[numSock].numWncSock))
fkellermavnet 0:affdbb35faa4 588 dbgPuts("Sock close may not have closed!");
fkellermavnet 0:affdbb35faa4 589
fkellermavnet 0:affdbb35faa4 590 // Even with an error the socket could have closed,
fkellermavnet 0:affdbb35faa4 591 // can't tell for sure so just soft close it for now.
fkellermavnet 0:affdbb35faa4 592 m_sSock[numSock].open = false;
fkellermavnet 0:affdbb35faa4 593 }
fkellermavnet 0:affdbb35faa4 594 else {
fkellermavnet 0:affdbb35faa4 595 dbgPuts("Bad socket num!");
fkellermavnet 0:affdbb35faa4 596 }
fkellermavnet 0:affdbb35faa4 597
fkellermavnet 0:affdbb35faa4 598 return (m_sSock[numSock].open == false);
fkellermavnet 0:affdbb35faa4 599 }
fkellermavnet 0:affdbb35faa4 600
fkellermavnet 1:ac2de545b981 601 size_t WncController::mdmGetline(string * buff, int timeout_ms)
fkellermavnet 0:affdbb35faa4 602 {
fkellermavnet 0:affdbb35faa4 603 char chin = '\0';
fkellermavnet 0:affdbb35faa4 604 char chin_last;
fkellermavnet 0:affdbb35faa4 605 size_t len = 0;
fkellermavnet 0:affdbb35faa4 606
fkellermavnet 0:affdbb35faa4 607 startTimerB();
fkellermavnet 17:59b1e9341188 608 while ((len <= MAX_LEN_WNC_CMD_RESPONSE) && (getTimerTicksB_mS() < timeout_ms)) {
fkellermavnet 1:ac2de545b981 609 if (charReady()) {
fkellermavnet 0:affdbb35faa4 610 chin_last = chin;
fkellermavnet 1:ac2de545b981 611 chin = getc();
fkellermavnet 0:affdbb35faa4 612 if (isprint(chin)) {
fkellermavnet 1:ac2de545b981 613 *buff += chin;
fkellermavnet 0:affdbb35faa4 614 len++; // Bound the copy length to something reaonable just in case
fkellermavnet 0:affdbb35faa4 615 continue;
fkellermavnet 0:affdbb35faa4 616 }
fkellermavnet 0:affdbb35faa4 617 else if ((('\r' == chin_last) && ('\n' == chin)) || (('\n' == chin_last) && ('\r' == chin))) {
fkellermavnet 0:affdbb35faa4 618 break;
fkellermavnet 0:affdbb35faa4 619 }
fkellermavnet 0:affdbb35faa4 620 }
fkellermavnet 0:affdbb35faa4 621 }
fkellermavnet 0:affdbb35faa4 622 stopTimerB();
fkellermavnet 0:affdbb35faa4 623
fkellermavnet 17:59b1e9341188 624 if (len > MAX_LEN_WNC_CMD_RESPONSE)
fkellermavnet 0:affdbb35faa4 625 dbgPuts("Max cmd length reply exceeded!");
fkellermavnet 0:affdbb35faa4 626
fkellermavnet 0:affdbb35faa4 627 return (len);
fkellermavnet 0:affdbb35faa4 628 }
fkellermavnet 0:affdbb35faa4 629
fkellermavnet 0:affdbb35faa4 630 bool WncController::softwareInitMdm(void)
fkellermavnet 0:affdbb35faa4 631 {
fkellermavnet 0:affdbb35faa4 632 static bool reportStatus = true;
fkellermavnet 0:affdbb35faa4 633 unsigned i;
jk431j 36:11674252baf1 634 bool cellLink = false;
fkellermavnet 0:affdbb35faa4 635
jk431j 36:11674252baf1 636 for (short idx = 0; idx < 12; idx++) {
jk431j 36:11674252baf1 637 cellLink = checkCellLink();
jk431j 36:11674252baf1 638 if (cellLink)
jk431j 36:11674252baf1 639 break;
jk431j 36:11674252baf1 640 dbgPuts("Waiting for cell link to be established.");
jk431j 36:11674252baf1 641 waitMs(10*1000);
jk431j 36:11674252baf1 642 };
jk431j 36:11674252baf1 643
jk431j 36:11674252baf1 644 if (cellLink) {
fkellermavnet 0:affdbb35faa4 645 if (reportStatus == false) {
fkellermavnet 0:affdbb35faa4 646 dbgPuts("Re-connected to cellular network!");
fkellermavnet 0:affdbb35faa4 647 reportStatus = true;
fkellermavnet 0:affdbb35faa4 648 }
fkellermavnet 0:affdbb35faa4 649
fkellermavnet 0:affdbb35faa4 650 // WNC has SIM and registered on network so
fkellermavnet 0:affdbb35faa4 651 // soft initialize the WNC.
fkellermavnet 0:affdbb35faa4 652 for (i = 0; i < WNC_SOFT_INIT_RETRY_COUNT; i++)
fkellermavnet 0:affdbb35faa4 653 if (at_init_wnc() == true)
fkellermavnet 0:affdbb35faa4 654 break;
fkellermavnet 0:affdbb35faa4 655
fkellermavnet 0:affdbb35faa4 656 // If it did not respond try a hardware init
fkellermavnet 0:affdbb35faa4 657 if (i == WNC_SOFT_INIT_RETRY_COUNT)
fkellermavnet 0:affdbb35faa4 658 {
fkellermavnet 0:affdbb35faa4 659 at_reinitialize_mdm();
fkellermavnet 0:affdbb35faa4 660 return (at_init_wnc(true)); // Hard reset occurred so make it go through the software init();
fkellermavnet 0:affdbb35faa4 661 }
fkellermavnet 0:affdbb35faa4 662 else
fkellermavnet 0:affdbb35faa4 663 return (true);
fkellermavnet 0:affdbb35faa4 664 }
fkellermavnet 0:affdbb35faa4 665 else
fkellermavnet 0:affdbb35faa4 666 {
fkellermavnet 0:affdbb35faa4 667 if (reportStatus == true) {
fkellermavnet 0:affdbb35faa4 668 dbgPuts("Not connected to cellular network!");
fkellermavnet 0:affdbb35faa4 669 reportStatus = false;
fkellermavnet 0:affdbb35faa4 670 }
fkellermavnet 0:affdbb35faa4 671 return (false);
fkellermavnet 0:affdbb35faa4 672 }
fkellermavnet 0:affdbb35faa4 673 }
fkellermavnet 0:affdbb35faa4 674
fkellermavnet 0:affdbb35faa4 675 WncController::AtCmdErr_e WncController::sendWncCmd(const char * const s, string ** r, int ms_timeout)
fkellermavnet 0:affdbb35faa4 676 {
fkellermavnet 0:affdbb35faa4 677 if (checkCellLink() == false) {
fkellermavnet 0:affdbb35faa4 678 static string noRespStr;
fkellermavnet 0:affdbb35faa4 679
fkellermavnet 0:affdbb35faa4 680 // Save some run-time!
fkellermavnet 0:affdbb35faa4 681 if (m_sDebugEnabled)
fkellermavnet 0:affdbb35faa4 682 {
fkellermavnet 0:affdbb35faa4 683 dbgPuts("FAIL send cmd: ", false);
fkellermavnet 0:affdbb35faa4 684 if (m_sMoreDebugEnabled && m_sDebugEnabled) {
fkellermavnet 0:affdbb35faa4 685 dbgPutsNoTime(s);
fkellermavnet 0:affdbb35faa4 686 }
fkellermavnet 0:affdbb35faa4 687 else {
fkellermavnet 0:affdbb35faa4 688 size_t n = strlen(s);
fkellermavnet 0:affdbb35faa4 689 if (n <= WNC_TRUNC_DEBUG_LENGTH) {
fkellermavnet 0:affdbb35faa4 690 dbgPutsNoTime(s);
fkellermavnet 0:affdbb35faa4 691 }
fkellermavnet 0:affdbb35faa4 692 else {
fkellermavnet 0:affdbb35faa4 693 string truncStr(s,WNC_TRUNC_DEBUG_LENGTH/2);
fkellermavnet 0:affdbb35faa4 694 truncStr += "..";
fkellermavnet 0:affdbb35faa4 695 truncStr += &s[n-(WNC_TRUNC_DEBUG_LENGTH/2)];
fkellermavnet 0:affdbb35faa4 696 dbgPutsNoTime(truncStr.c_str());
fkellermavnet 0:affdbb35faa4 697 }
fkellermavnet 0:affdbb35faa4 698 }
fkellermavnet 0:affdbb35faa4 699 }
fkellermavnet 0:affdbb35faa4 700
fkellermavnet 0:affdbb35faa4 701 noRespStr.erase();
fkellermavnet 0:affdbb35faa4 702 *r = &noRespStr;
fkellermavnet 0:affdbb35faa4 703
fkellermavnet 0:affdbb35faa4 704 return (WNC_AT_CMD_NO_CELL_LINK);
fkellermavnet 0:affdbb35faa4 705 }
fkellermavnet 0:affdbb35faa4 706
fkellermavnet 0:affdbb35faa4 707 if (m_sCheckNetStatus)
fkellermavnet 0:affdbb35faa4 708 {
fkellermavnet 0:affdbb35faa4 709 if (m_sMoreDebugEnabled)
fkellermavnet 0:affdbb35faa4 710 dbgPuts("[---------- Network Status -------------");
fkellermavnet 0:affdbb35faa4 711 string * pRespStr;
fkellermavnet 0:affdbb35faa4 712 at_send_wnc_cmd("AT@SOCKDIAL?", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 713 if (m_sMoreDebugEnabled)
fkellermavnet 0:affdbb35faa4 714 dbgPuts("---------------------------------------]");
fkellermavnet 0:affdbb35faa4 715 }
fkellermavnet 0:affdbb35faa4 716
fkellermavnet 0:affdbb35faa4 717 // If WNC ready, send user command
fkellermavnet 0:affdbb35faa4 718 return (at_send_wnc_cmd(s, r, ms_timeout));
fkellermavnet 0:affdbb35faa4 719 }
fkellermavnet 0:affdbb35faa4 720
fkellermavnet 0:affdbb35faa4 721 WncController::AtCmdErr_e WncController::at_send_wnc_cmd(const char * s, string ** r, int ms_timeout)
fkellermavnet 0:affdbb35faa4 722 {
fkellermavnet 0:affdbb35faa4 723 // Save some run-time!
fkellermavnet 0:affdbb35faa4 724 if (m_sDebugEnabled)
fkellermavnet 0:affdbb35faa4 725 {
fkellermavnet 0:affdbb35faa4 726 if (m_sMoreDebugEnabled) {
fkellermavnet 0:affdbb35faa4 727 dbgPuts("TX: ", false); dbgPutsNoTime(s);
fkellermavnet 0:affdbb35faa4 728 }
fkellermavnet 0:affdbb35faa4 729 else {
fkellermavnet 0:affdbb35faa4 730 if (m_sDebugEnabled) { // Save some run-time!
fkellermavnet 0:affdbb35faa4 731 size_t n = strlen(s);
fkellermavnet 0:affdbb35faa4 732 if (n <= WNC_TRUNC_DEBUG_LENGTH) {
fkellermavnet 0:affdbb35faa4 733 dbgPuts("TX: ", false); dbgPutsNoTime(s);
fkellermavnet 0:affdbb35faa4 734 }
fkellermavnet 0:affdbb35faa4 735 else {
fkellermavnet 0:affdbb35faa4 736 string truncStr(s,WNC_TRUNC_DEBUG_LENGTH/2);
fkellermavnet 0:affdbb35faa4 737 truncStr += "..";
fkellermavnet 0:affdbb35faa4 738 truncStr += &s[n - (WNC_TRUNC_DEBUG_LENGTH/2)];
fkellermavnet 0:affdbb35faa4 739 dbgPuts("TX: ", false); dbgPutsNoTime(truncStr.c_str());
fkellermavnet 0:affdbb35faa4 740 }
fkellermavnet 0:affdbb35faa4 741 }
fkellermavnet 0:affdbb35faa4 742 }
fkellermavnet 0:affdbb35faa4 743 }
fkellermavnet 0:affdbb35faa4 744
fkellermavnet 0:affdbb35faa4 745 AtCmdErr_e atResult = mdmSendAtCmdRsp(s, ms_timeout, &m_sWncStr);
fkellermavnet 0:affdbb35faa4 746 *r = &m_sWncStr; // Return a pointer to the static string
fkellermavnet 0:affdbb35faa4 747
fkellermavnet 0:affdbb35faa4 748 if (atResult != WNC_AT_CMD_TIMEOUT) {
fkellermavnet 21:086841abc3aa 749 // If a prior command timed out but a new one works then
fkellermavnet 21:086841abc3aa 750 // change the state back to ON. We don't know here in this
fkellermavnet 21:086841abc3aa 751 // method if the Cell Link is good so assume it is. When a command
fkellermavnet 21:086841abc3aa 752 // that depends on the cell link is made it will update the state.
fkellermavnet 21:086841abc3aa 753 if (m_sState == WNC_NO_RESPONSE)
fkellermavnet 21:086841abc3aa 754 m_sState = WNC_ON;
fkellermavnet 21:086841abc3aa 755
fkellermavnet 0:affdbb35faa4 756 // Save some run-time!
fkellermavnet 0:affdbb35faa4 757 if (m_sDebugEnabled)
fkellermavnet 0:affdbb35faa4 758 {
fkellermavnet 0:affdbb35faa4 759 dbgPuts("RX: ", false);
fkellermavnet 0:affdbb35faa4 760 if (m_sMoreDebugEnabled) {
fkellermavnet 0:affdbb35faa4 761 dbgPutsNoTime(m_sWncStr.c_str());
fkellermavnet 0:affdbb35faa4 762 }
fkellermavnet 0:affdbb35faa4 763 else {
fkellermavnet 0:affdbb35faa4 764 if (m_sWncStr.size() <= WNC_TRUNC_DEBUG_LENGTH) {
fkellermavnet 0:affdbb35faa4 765 dbgPutsNoTime(m_sWncStr.c_str());
fkellermavnet 0:affdbb35faa4 766 }
fkellermavnet 0:affdbb35faa4 767 else {
fkellermavnet 0:affdbb35faa4 768 string truncStr = m_sWncStr.substr(0,WNC_TRUNC_DEBUG_LENGTH/2) + "..";
fkellermavnet 0:affdbb35faa4 769 truncStr += m_sWncStr.substr(m_sWncStr.size() - (WNC_TRUNC_DEBUG_LENGTH/2), WNC_TRUNC_DEBUG_LENGTH/2);
fkellermavnet 0:affdbb35faa4 770 dbgPutsNoTime(truncStr.c_str());
fkellermavnet 0:affdbb35faa4 771 }
fkellermavnet 0:affdbb35faa4 772 }
fkellermavnet 0:affdbb35faa4 773 }
fkellermavnet 0:affdbb35faa4 774 }
fkellermavnet 0:affdbb35faa4 775 else {
fkellermavnet 21:086841abc3aa 776 m_sState = WNC_NO_RESPONSE;
fkellermavnet 0:affdbb35faa4 777 dbgPuts("AT Cmd TIMEOUT!");
fkellermavnet 0:affdbb35faa4 778 dbgPuts("RX: ", false); dbgPutsNoTime(m_sWncStr.c_str());
fkellermavnet 0:affdbb35faa4 779 }
fkellermavnet 0:affdbb35faa4 780
fkellermavnet 0:affdbb35faa4 781 return (atResult);
fkellermavnet 0:affdbb35faa4 782 }
fkellermavnet 0:affdbb35faa4 783
fkellermavnet 0:affdbb35faa4 784 void WncController::closeOpenSocket(uint16_t numSock)
fkellermavnet 0:affdbb35faa4 785 {
fkellermavnet 0:affdbb35faa4 786 // Try to open and close the socket
fkellermavnet 0:affdbb35faa4 787 do {
fkellermavnet 0:affdbb35faa4 788 dbgPuts("Try to close and re-open socket");
fkellermavnet 28:eece2151e1e5 789 if (false == at_sockclose_wnc(m_sSock[numSock].numWncSock)) {
fkellermavnet 28:eece2151e1e5 790 if (WNC_NO_RESPONSE == getWncStatus()) {
fkellermavnet 28:eece2151e1e5 791 dbgPuts("No response for closeOpenSocket1");
fkellermavnet 28:eece2151e1e5 792 return ;
fkellermavnet 28:eece2151e1e5 793 }
fkellermavnet 28:eece2151e1e5 794 }
fkellermavnet 10:2ec59906a24e 795
fkellermavnet 10:2ec59906a24e 796 int numWncSock = at_sockopen_wnc(m_sSock[numSock].myIpAddressStr.c_str(), m_sSock[numSock].myPort, numSock, m_sSock[numSock].isTcp, m_sSock[numSock].timeOutSec);
fkellermavnet 10:2ec59906a24e 797 m_sSock[numSock].numWncSock = numWncSock;
fkellermavnet 10:2ec59906a24e 798 if (numWncSock > 0 && numWncSock <= MAX_NUM_WNC_SOCKETS)
fkellermavnet 10:2ec59906a24e 799 m_sSock[numSock].open = true;
fkellermavnet 28:eece2151e1e5 800 else {
fkellermavnet 10:2ec59906a24e 801 m_sSock[numSock].open = false;
fkellermavnet 0:affdbb35faa4 802 dbgPuts("Failed to re-open socket!");
fkellermavnet 28:eece2151e1e5 803 }
fkellermavnet 28:eece2151e1e5 804
fkellermavnet 28:eece2151e1e5 805 if (WNC_NO_RESPONSE == getWncStatus()) {
fkellermavnet 28:eece2151e1e5 806 dbgPuts("No response for closeOpenSocket2");
fkellermavnet 28:eece2151e1e5 807 return ;
fkellermavnet 28:eece2151e1e5 808 }
fkellermavnet 0:affdbb35faa4 809 } while (m_sSock[numSock].open == false);
fkellermavnet 0:affdbb35faa4 810 }
fkellermavnet 0:affdbb35faa4 811
fkellermavnet 18:ca2899c353c2 812 bool WncController::getICCID(string * iccid)
fkellermavnet 18:ca2899c353c2 813 {
fkellermavnet 19:83a52353b97e 814 if (at_geticcid_wnc(iccid) == false) {
fkellermavnet 19:83a52353b97e 815 dbgPuts("getICCID error!");
fkellermavnet 19:83a52353b97e 816 return (false);
fkellermavnet 19:83a52353b97e 817 }
fkellermavnet 19:83a52353b97e 818
fkellermavnet 19:83a52353b97e 819 return (true);
fkellermavnet 19:83a52353b97e 820 }
fkellermavnet 19:83a52353b97e 821
fkellermavnet 19:83a52353b97e 822 bool WncController::at_geticcid_wnc(string * iccid)
fkellermavnet 19:83a52353b97e 823 {
fkellermavnet 18:ca2899c353c2 824 string * respStr;
fkellermavnet 18:ca2899c353c2 825
fkellermavnet 18:ca2899c353c2 826 iccid->erase();
fkellermavnet 18:ca2899c353c2 827
fkellermavnet 18:ca2899c353c2 828 AtCmdErr_e r = at_send_wnc_cmd("AT%CCID", &respStr, m_sCmdTimeoutMs);
fkellermavnet 18:ca2899c353c2 829
fkellermavnet 18:ca2899c353c2 830 if (r != WNC_AT_CMD_OK || respStr->size() == 0)
fkellermavnet 18:ca2899c353c2 831 return (false);
fkellermavnet 18:ca2899c353c2 832
fkellermavnet 18:ca2899c353c2 833 size_t pos = respStr->find("AT%CCID");
fkellermavnet 18:ca2899c353c2 834 if (pos == string::npos)
fkellermavnet 18:ca2899c353c2 835 return (false);
fkellermavnet 18:ca2899c353c2 836
fkellermavnet 18:ca2899c353c2 837 size_t posOK = respStr->rfind("OK");
fkellermavnet 18:ca2899c353c2 838 if (posOK == string::npos)
fkellermavnet 18:ca2899c353c2 839 return (false);
fkellermavnet 18:ca2899c353c2 840
fkellermavnet 18:ca2899c353c2 841 pos += 7; // Advanced to the number
fkellermavnet 18:ca2899c353c2 842 *iccid = respStr->substr(pos, posOK - pos);
fkellermavnet 18:ca2899c353c2 843
fkellermavnet 18:ca2899c353c2 844 return (true);
fkellermavnet 18:ca2899c353c2 845 }
fkellermavnet 18:ca2899c353c2 846
fkellermavnet 18:ca2899c353c2 847 bool WncController::convertICCIDtoMSISDN(const string & iccid, string * msisdn)
fkellermavnet 18:ca2899c353c2 848 {
fkellermavnet 18:ca2899c353c2 849 msisdn->erase();
fkellermavnet 18:ca2899c353c2 850
fkellermavnet 18:ca2899c353c2 851 if (iccid.size() != 20 && iccid.size() != 19) {
fkellermavnet 18:ca2899c353c2 852 dbgPuts("Invalid ICCID length!");
fkellermavnet 18:ca2899c353c2 853 return (false);
fkellermavnet 18:ca2899c353c2 854 }
fkellermavnet 18:ca2899c353c2 855
fkellermavnet 18:ca2899c353c2 856 *msisdn = "882350";
fkellermavnet 18:ca2899c353c2 857
fkellermavnet 18:ca2899c353c2 858 if (iccid.size() == 20)
fkellermavnet 18:ca2899c353c2 859 *msisdn += iccid.substr(10,iccid.size() - 11);
fkellermavnet 18:ca2899c353c2 860 else
fkellermavnet 18:ca2899c353c2 861 *msisdn += iccid.substr(10,iccid.size() - 10);
fkellermavnet 18:ca2899c353c2 862
fkellermavnet 18:ca2899c353c2 863 return (true);
fkellermavnet 18:ca2899c353c2 864 }
fkellermavnet 18:ca2899c353c2 865
fkellermavnet 0:affdbb35faa4 866 bool WncController::sendSMSText(const char * const phoneNum, const char * const text)
fkellermavnet 0:affdbb35faa4 867 {
fkellermavnet 0:affdbb35faa4 868 if (at_sendSMStext_wnc(phoneNum, text) == true)
fkellermavnet 0:affdbb35faa4 869 return (true);
fkellermavnet 0:affdbb35faa4 870 else {
fkellermavnet 0:affdbb35faa4 871 dbgPuts("sendSMSText: Failed!");
fkellermavnet 0:affdbb35faa4 872 return (false);
fkellermavnet 0:affdbb35faa4 873 }
fkellermavnet 0:affdbb35faa4 874 }
fkellermavnet 0:affdbb35faa4 875
fkellermavnet 18:ca2899c353c2 876 bool WncController::readSMSLog(struct WncSmsList * log)
fkellermavnet 0:affdbb35faa4 877 {
fkellermavnet 18:ca2899c353c2 878 string * logStr;
fkellermavnet 18:ca2899c353c2 879 uint16_t i;
fkellermavnet 18:ca2899c353c2 880
fkellermavnet 18:ca2899c353c2 881 if (at_readSMSlog_wnc(&logStr) == false) {
fkellermavnet 18:ca2899c353c2 882 dbgPuts("readSMSLog: Failed!");
fkellermavnet 18:ca2899c353c2 883 return (false);
fkellermavnet 18:ca2899c353c2 884 }
fkellermavnet 18:ca2899c353c2 885
fkellermavnet 18:ca2899c353c2 886 // Clean slate
fkellermavnet 18:ca2899c353c2 887 log->msgCount = 0;
fkellermavnet 18:ca2899c353c2 888
fkellermavnet 27:c2b9ef5ccbef 889 if (logStr->size() == 0)
fkellermavnet 27:c2b9ef5ccbef 890 return (false);
fkellermavnet 27:c2b9ef5ccbef 891
fkellermavnet 18:ca2899c353c2 892 // Pick out the stuff from the string and convert to struct
fkellermavnet 18:ca2899c353c2 893 string s;
fkellermavnet 18:ca2899c353c2 894 size_t pos2;
fkellermavnet 18:ca2899c353c2 895 size_t pos = logStr->find("+CMGL:");
fkellermavnet 27:c2b9ef5ccbef 896
fkellermavnet 27:c2b9ef5ccbef 897 for(i=0; i<MAX_WNC_SMS_MSG_SLOTS; i++) {
fkellermavnet 27:c2b9ef5ccbef 898 // Start with a clean slate, let parsing fill out later.
fkellermavnet 27:c2b9ef5ccbef 899 log->e[i].unread = false;
fkellermavnet 27:c2b9ef5ccbef 900 log->e[i].incoming = false;
fkellermavnet 27:c2b9ef5ccbef 901 log->e[i].unsent = false;
fkellermavnet 27:c2b9ef5ccbef 902 log->e[i].pduMode = false;
fkellermavnet 27:c2b9ef5ccbef 903 log->e[i].msgReceipt = false;
fkellermavnet 0:affdbb35faa4 904
fkellermavnet 19:83a52353b97e 905 log->e[i].idx = logStr->at(pos + 7);
fkellermavnet 18:ca2899c353c2 906 if (pos == string::npos)
fkellermavnet 18:ca2899c353c2 907 return (false);
fkellermavnet 27:c2b9ef5ccbef 908 pos2 = logStr->find(",\"", pos);
fkellermavnet 27:c2b9ef5ccbef 909 if (pos2 == string::npos) {
fkellermavnet 27:c2b9ef5ccbef 910 // If the WNC acts wrong and receives a PDU mode
fkellermavnet 27:c2b9ef5ccbef 911 // SMS there will not be any quotes in the response,
fkellermavnet 27:c2b9ef5ccbef 912 // just take the whole reply and make it the message body for
fkellermavnet 27:c2b9ef5ccbef 913 // now, mark it as an unread message, set the pdu flag!
fkellermavnet 27:c2b9ef5ccbef 914 log->e[log->msgCount].unread = true;
fkellermavnet 27:c2b9ef5ccbef 915 log->e[log->msgCount].pduMode = true;
fkellermavnet 27:c2b9ef5ccbef 916 log->msgCount++;
fkellermavnet 27:c2b9ef5ccbef 917
fkellermavnet 27:c2b9ef5ccbef 918 pos2 = logStr->find("+CMGL", pos + 5);
fkellermavnet 27:c2b9ef5ccbef 919 if (pos2 == string::npos) {
fkellermavnet 27:c2b9ef5ccbef 920 pos2 = logStr->find("OK", pos + 5);
fkellermavnet 27:c2b9ef5ccbef 921 if (pos2 == string::npos) {
fkellermavnet 27:c2b9ef5ccbef 922 dbgPuts("Strange SMS Log Ending!");
fkellermavnet 27:c2b9ef5ccbef 923 return (false);
fkellermavnet 27:c2b9ef5ccbef 924 }
fkellermavnet 27:c2b9ef5ccbef 925 i = MAX_WNC_SMS_MSG_SLOTS;
fkellermavnet 27:c2b9ef5ccbef 926 }
fkellermavnet 27:c2b9ef5ccbef 927 log->e[log->msgCount].msg = logStr->substr(0, pos2 - pos);
fkellermavnet 27:c2b9ef5ccbef 928 pos = pos2; // for loop starts off expecting pos to point to next log msg
fkellermavnet 27:c2b9ef5ccbef 929 continue;
fkellermavnet 27:c2b9ef5ccbef 930 }
fkellermavnet 19:83a52353b97e 931 pos += 2; // Advance to the text we want
fkellermavnet 18:ca2899c353c2 932 pos2 = logStr->find("\",", pos);
fkellermavnet 18:ca2899c353c2 933 if ((pos2 == string::npos) || (pos >= pos2))
fkellermavnet 18:ca2899c353c2 934 return (false);
fkellermavnet 27:c2b9ef5ccbef 935
fkellermavnet 18:ca2899c353c2 936 // Setup attributes
fkellermavnet 18:ca2899c353c2 937 s = logStr->substr(pos, pos2 - pos);
fkellermavnet 19:83a52353b97e 938 if (s.find("REC READ") != string::npos)
fkellermavnet 18:ca2899c353c2 939 log->e[i].incoming = true;
fkellermavnet 19:83a52353b97e 940 if (s.find("REC UNREAD") != string::npos) {
fkellermavnet 18:ca2899c353c2 941 log->e[i].unread = true;
fkellermavnet 19:83a52353b97e 942 log->e[i].incoming = true;
fkellermavnet 19:83a52353b97e 943 }
fkellermavnet 18:ca2899c353c2 944 if (s.find("STO UNSENT") != string::npos)
fkellermavnet 18:ca2899c353c2 945 log->e[i].unsent = true;
fkellermavnet 27:c2b9ef5ccbef 946 if (logStr->find(",,") == string::npos)
fkellermavnet 27:c2b9ef5ccbef 947 log->e[i].msgReceipt = true;
fkellermavnet 18:ca2899c353c2 948
fkellermavnet 18:ca2899c353c2 949 // Tele number
fkellermavnet 20:ca2db38d6802 950 pos2 = logStr->find(",\"", pos2);
fkellermavnet 20:ca2db38d6802 951 if (pos2 == string::npos)
fkellermavnet 20:ca2db38d6802 952 return (false);
fkellermavnet 20:ca2db38d6802 953 pos2 += 2; // Advance to next field
fkellermavnet 18:ca2899c353c2 954 pos = logStr->find("\",", pos2);
fkellermavnet 18:ca2899c353c2 955 if ((pos == string::npos) || (pos2 > pos))
fkellermavnet 18:ca2899c353c2 956 return (false);
fkellermavnet 18:ca2899c353c2 957 if (pos == pos2)
fkellermavnet 18:ca2899c353c2 958 log->e[i].number.erase();
fkellermavnet 18:ca2899c353c2 959 else
fkellermavnet 18:ca2899c353c2 960 log->e[i].number = logStr->substr(pos2, pos - pos2);
fkellermavnet 18:ca2899c353c2 961
fkellermavnet 19:83a52353b97e 962 // Date
fkellermavnet 20:ca2db38d6802 963 pos = logStr->find(",\"", pos);
fkellermavnet 20:ca2db38d6802 964 if (pos == string::npos)
fkellermavnet 20:ca2db38d6802 965 return (false);
fkellermavnet 20:ca2db38d6802 966 pos += 2; // Beginning of date field
fkellermavnet 19:83a52353b97e 967 pos2 = logStr->find(",", pos); // End of timestamp field
fkellermavnet 18:ca2899c353c2 968 if ((pos2 == string::npos) || (pos > pos2))
fkellermavnet 18:ca2899c353c2 969 return (false);
fkellermavnet 18:ca2899c353c2 970 if (pos == pos2)
fkellermavnet 19:83a52353b97e 971 log->e[i].date.erase();
fkellermavnet 18:ca2899c353c2 972 else
fkellermavnet 19:83a52353b97e 973 log->e[i].date = logStr->substr(pos, pos2 - pos);
fkellermavnet 19:83a52353b97e 974
fkellermavnet 19:83a52353b97e 975 // Timestamp
fkellermavnet 27:c2b9ef5ccbef 976 pos = logStr->find("\",", pos2); // End of timestamp
fkellermavnet 27:c2b9ef5ccbef 977 if (pos == string::npos)
fkellermavnet 20:ca2db38d6802 978 return (false);
fkellermavnet 27:c2b9ef5ccbef 979 pos2 += 1; // Beginning of time field
fkellermavnet 27:c2b9ef5ccbef 980 if (pos < pos2)
fkellermavnet 19:83a52353b97e 981 return (false);
fkellermavnet 19:83a52353b97e 982 if (pos == pos2)
fkellermavnet 19:83a52353b97e 983 log->e[i].time.erase();
fkellermavnet 19:83a52353b97e 984 else
fkellermavnet 19:83a52353b97e 985 log->e[i].time = logStr->substr(pos2, pos - pos2);
fkellermavnet 0:affdbb35faa4 986
fkellermavnet 18:ca2899c353c2 987 // Message field
fkellermavnet 18:ca2899c353c2 988
fkellermavnet 18:ca2899c353c2 989 // We don't know how many messages we have so the next search
fkellermavnet 18:ca2899c353c2 990 // could end with +CMGL or OK.
fkellermavnet 19:83a52353b97e 991 pos += 2; // Advanced to message text
fkellermavnet 19:83a52353b97e 992 pos2 = logStr->find("+CMGL", pos);
fkellermavnet 19:83a52353b97e 993 if (pos2 == string::npos) {
fkellermavnet 19:83a52353b97e 994 pos2 = logStr->find("OK", pos);
fkellermavnet 19:83a52353b97e 995 if (pos2 == string::npos) {
fkellermavnet 18:ca2899c353c2 996 dbgPuts("Strange SMS Log Ending!");
fkellermavnet 18:ca2899c353c2 997 return (false);
fkellermavnet 18:ca2899c353c2 998 }
fkellermavnet 18:ca2899c353c2 999 i = MAX_WNC_SMS_MSG_SLOTS; // break
fkellermavnet 18:ca2899c353c2 1000 }
fkellermavnet 19:83a52353b97e 1001 if (pos > pos2)
fkellermavnet 18:ca2899c353c2 1002 return (false);
fkellermavnet 19:83a52353b97e 1003 if (pos == pos2)
fkellermavnet 18:ca2899c353c2 1004 log->e[log->msgCount].msg.erase();
fkellermavnet 18:ca2899c353c2 1005 else
fkellermavnet 19:83a52353b97e 1006 log->e[log->msgCount].msg = logStr->substr(pos, pos2 - pos);
fkellermavnet 18:ca2899c353c2 1007
fkellermavnet 18:ca2899c353c2 1008 log->msgCount++; // Message complete
fkellermavnet 18:ca2899c353c2 1009 }
fkellermavnet 18:ca2899c353c2 1010
fkellermavnet 18:ca2899c353c2 1011 return (true);
fkellermavnet 18:ca2899c353c2 1012 }
fkellermavnet 18:ca2899c353c2 1013
fkellermavnet 19:83a52353b97e 1014 bool WncController::readUnreadSMSText(struct WncSmsList * w, bool deleteRead)
fkellermavnet 18:ca2899c353c2 1015 {
fkellermavnet 18:ca2899c353c2 1016 struct WncController::WncSmsList tmp;
fkellermavnet 18:ca2899c353c2 1017
fkellermavnet 18:ca2899c353c2 1018 if (readSMSLog(&tmp) == false)
fkellermavnet 18:ca2899c353c2 1019 return (false);
fkellermavnet 18:ca2899c353c2 1020
fkellermavnet 18:ca2899c353c2 1021 w->msgCount = 0;
fkellermavnet 18:ca2899c353c2 1022 for(uint16_t i = 0; i < tmp.msgCount; i++) {
fkellermavnet 18:ca2899c353c2 1023 if (tmp.e[i].unread == true) {
fkellermavnet 18:ca2899c353c2 1024 w->e[w->msgCount] = tmp.e[i];
fkellermavnet 18:ca2899c353c2 1025 w->msgCount++;
fkellermavnet 19:83a52353b97e 1026 if (deleteRead == true) {
fkellermavnet 19:83a52353b97e 1027 // Clean up message that was copied out and read
fkellermavnet 19:83a52353b97e 1028 deleteSMSTextFromMem(w->e[i].idx);
fkellermavnet 19:83a52353b97e 1029 }
fkellermavnet 18:ca2899c353c2 1030 }
fkellermavnet 18:ca2899c353c2 1031 }
fkellermavnet 18:ca2899c353c2 1032
fkellermavnet 19:83a52353b97e 1033 return (w->msgCount > 0);
fkellermavnet 0:affdbb35faa4 1034 }
fkellermavnet 0:affdbb35faa4 1035
fkellermavnet 0:affdbb35faa4 1036 size_t WncController::getSignalQuality(const char ** log)
fkellermavnet 0:affdbb35faa4 1037 {
fkellermavnet 0:affdbb35faa4 1038 size_t n;
fkellermavnet 0:affdbb35faa4 1039
fkellermavnet 0:affdbb35faa4 1040 n = at_getSignalQuality_wnc(log);
fkellermavnet 0:affdbb35faa4 1041 if (n == 0)
fkellermavnet 0:affdbb35faa4 1042 dbgPuts("readSMSText: Failed!");
fkellermavnet 0:affdbb35faa4 1043
fkellermavnet 0:affdbb35faa4 1044 return (n);
fkellermavnet 0:affdbb35faa4 1045 }
fkellermavnet 0:affdbb35faa4 1046
fkellermavnet 0:affdbb35faa4 1047 size_t WncController::at_getSignalQuality_wnc(const char ** log)
fkellermavnet 0:affdbb35faa4 1048 {
fkellermavnet 0:affdbb35faa4 1049 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1050 static string logStr;
fkellermavnet 0:affdbb35faa4 1051
fkellermavnet 0:affdbb35faa4 1052 logStr.erase();
fkellermavnet 0:affdbb35faa4 1053
fkellermavnet 0:affdbb35faa4 1054 if (at_send_wnc_cmd("AT%MEAS=\"0\"", &pRespStr, m_sCmdTimeoutMs) == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 1055 logStr = *pRespStr;
fkellermavnet 0:affdbb35faa4 1056 logStr += "\r\n";
fkellermavnet 0:affdbb35faa4 1057 }
fkellermavnet 0:affdbb35faa4 1058 else
fkellermavnet 0:affdbb35faa4 1059 dbgPuts("AT%MEAS=0: failed!");
fkellermavnet 0:affdbb35faa4 1060
fkellermavnet 0:affdbb35faa4 1061 if (at_send_wnc_cmd("AT%MEAS=\"1\"", &pRespStr, m_sCmdTimeoutMs) == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 1062 logStr += *pRespStr;
fkellermavnet 0:affdbb35faa4 1063 logStr += "\r\n";
fkellermavnet 0:affdbb35faa4 1064 }
fkellermavnet 0:affdbb35faa4 1065 else
fkellermavnet 0:affdbb35faa4 1066 dbgPuts("AT%MEAS=1: failed!");
fkellermavnet 0:affdbb35faa4 1067
fkellermavnet 0:affdbb35faa4 1068 if (at_send_wnc_cmd("AT%MEAS=\"2\"", &pRespStr, m_sCmdTimeoutMs) == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 1069 logStr += *pRespStr;
fkellermavnet 0:affdbb35faa4 1070 logStr += "\r\n";
fkellermavnet 0:affdbb35faa4 1071 }
fkellermavnet 0:affdbb35faa4 1072 else
fkellermavnet 0:affdbb35faa4 1073 dbgPuts("AT%MEAS=2: failed!");
fkellermavnet 0:affdbb35faa4 1074
fkellermavnet 0:affdbb35faa4 1075 if (at_send_wnc_cmd("AT%MEAS=\"3\"", &pRespStr, m_sCmdTimeoutMs) == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 1076 logStr += *pRespStr;
fkellermavnet 0:affdbb35faa4 1077 logStr += "\r\n";
fkellermavnet 0:affdbb35faa4 1078 }
fkellermavnet 0:affdbb35faa4 1079 else
fkellermavnet 0:affdbb35faa4 1080 dbgPuts("AT%MEAS=3: failed!");
fkellermavnet 0:affdbb35faa4 1081
fkellermavnet 0:affdbb35faa4 1082 if (at_send_wnc_cmd("AT%MEAS=\"4\"", &pRespStr, m_sCmdTimeoutMs) == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 1083 logStr += *pRespStr;
fkellermavnet 0:affdbb35faa4 1084 logStr += "\r\n";
fkellermavnet 0:affdbb35faa4 1085 }
fkellermavnet 0:affdbb35faa4 1086 else
fkellermavnet 0:affdbb35faa4 1087 dbgPuts("AT%MEAS=4: failed!");
fkellermavnet 0:affdbb35faa4 1088
fkellermavnet 0:affdbb35faa4 1089 if (at_send_wnc_cmd("AT%MEAS=\"5\"", &pRespStr, m_sCmdTimeoutMs) == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 1090 logStr += *pRespStr;
fkellermavnet 0:affdbb35faa4 1091 logStr += "\r\n";
fkellermavnet 0:affdbb35faa4 1092 }
fkellermavnet 0:affdbb35faa4 1093 else
fkellermavnet 0:affdbb35faa4 1094 dbgPuts("AT%MEAS=5: failed!");
fkellermavnet 0:affdbb35faa4 1095
fkellermavnet 0:affdbb35faa4 1096 if (at_send_wnc_cmd("AT%MEAS=\"8\"", &pRespStr, m_sCmdTimeoutMs) == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 1097 logStr += *pRespStr;
fkellermavnet 0:affdbb35faa4 1098 logStr += "\r\n";
fkellermavnet 0:affdbb35faa4 1099 }
fkellermavnet 0:affdbb35faa4 1100 else
fkellermavnet 0:affdbb35faa4 1101 dbgPuts("AT%MEAS=8: failed!");
fkellermavnet 0:affdbb35faa4 1102
fkellermavnet 0:affdbb35faa4 1103 if (at_send_wnc_cmd("AT%MEAS=\"98\"", &pRespStr, m_sCmdTimeoutMs) == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 1104 logStr += *pRespStr;
fkellermavnet 0:affdbb35faa4 1105 logStr += "\r\n";
fkellermavnet 0:affdbb35faa4 1106 }
fkellermavnet 0:affdbb35faa4 1107 else
fkellermavnet 0:affdbb35faa4 1108 dbgPuts("AT%MEAS=98: failed!");
fkellermavnet 0:affdbb35faa4 1109
fkellermavnet 0:affdbb35faa4 1110 *log = logStr.c_str();
fkellermavnet 0:affdbb35faa4 1111
fkellermavnet 0:affdbb35faa4 1112 return (logStr.size());
fkellermavnet 0:affdbb35faa4 1113 }
fkellermavnet 0:affdbb35faa4 1114
fkellermavnet 0:affdbb35faa4 1115 bool WncController::getTimeDate(struct WncDateTime * tod)
fkellermavnet 0:affdbb35faa4 1116 {
fkellermavnet 0:affdbb35faa4 1117 if (at_gettimedate_wnc(tod) == true)
fkellermavnet 0:affdbb35faa4 1118 return (true);
fkellermavnet 0:affdbb35faa4 1119 else {
fkellermavnet 0:affdbb35faa4 1120 dbgPuts("Get time date failed!");
fkellermavnet 0:affdbb35faa4 1121 return (false);
fkellermavnet 0:affdbb35faa4 1122 }
fkellermavnet 0:affdbb35faa4 1123 }
fkellermavnet 0:affdbb35faa4 1124
fkellermavnet 0:affdbb35faa4 1125 bool WncController::at_ping_wnc(const char * ip)
fkellermavnet 0:affdbb35faa4 1126 {
fkellermavnet 0:affdbb35faa4 1127 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1128 string cmdStr = "AT@PINGREQ=\"";
fkellermavnet 0:affdbb35faa4 1129 cmdStr += ip;
fkellermavnet 0:affdbb35faa4 1130 cmdStr += "\"";
fkellermavnet 0:affdbb35faa4 1131 return (at_send_wnc_cmd(cmdStr.c_str(), &pRespStr, WNC_PING_CMD_TIMEOUT_MS) == WNC_AT_CMD_OK);
fkellermavnet 0:affdbb35faa4 1132 }
fkellermavnet 0:affdbb35faa4 1133
fkellermavnet 0:affdbb35faa4 1134 bool WncController::at_gettimedate_wnc(struct WncDateTime * tod)
fkellermavnet 0:affdbb35faa4 1135 {
fkellermavnet 0:affdbb35faa4 1136 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1137 char * pEnd;
fkellermavnet 0:affdbb35faa4 1138
fkellermavnet 0:affdbb35faa4 1139 if (at_send_wnc_cmd("AT+CCLK?", &pRespStr, m_sCmdTimeoutMs) == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 1140 if (pRespStr->size() > 0) {
fkellermavnet 0:affdbb35faa4 1141 size_t pos1 = pRespStr->find("+CCLK:");
fkellermavnet 0:affdbb35faa4 1142 if (pos1 != string::npos) {
fkellermavnet 0:affdbb35faa4 1143 pEnd = (char *)pRespStr->c_str() + pos1 + 8;
fkellermavnet 0:affdbb35faa4 1144 tod->year = strtol(pEnd, &pEnd, 10);
fkellermavnet 0:affdbb35faa4 1145 tod->month = strtol(pEnd+1, &pEnd, 10);
fkellermavnet 0:affdbb35faa4 1146 tod->day = strtol(pEnd+1, &pEnd, 10);
fkellermavnet 0:affdbb35faa4 1147 tod->hour = strtol(pEnd+1, &pEnd, 10);
fkellermavnet 0:affdbb35faa4 1148 tod->min = strtol(pEnd+1, &pEnd, 10);
fkellermavnet 0:affdbb35faa4 1149 tod->sec = strtol(pEnd+1, &pEnd, 10);
fkellermavnet 0:affdbb35faa4 1150 return (true);
fkellermavnet 0:affdbb35faa4 1151 }
fkellermavnet 0:affdbb35faa4 1152 }
fkellermavnet 0:affdbb35faa4 1153 }
fkellermavnet 0:affdbb35faa4 1154
fkellermavnet 0:affdbb35faa4 1155 return (false);
fkellermavnet 0:affdbb35faa4 1156 }
fkellermavnet 0:affdbb35faa4 1157
fkellermavnet 0:affdbb35faa4 1158 bool WncController::at_get_wnc_net_stats(WncIpStats * s)
fkellermavnet 0:affdbb35faa4 1159 {
fkellermavnet 0:affdbb35faa4 1160 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1161 AtCmdErr_e cmdRes = at_send_wnc_cmd("AT+CGCONTRDP=1", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1162
fkellermavnet 0:affdbb35faa4 1163 if (WNC_AT_CMD_OK == cmdRes) {
fkellermavnet 0:affdbb35faa4 1164 if (pRespStr->size() > 0) {
fkellermavnet 0:affdbb35faa4 1165 memset((void*)s, '\0', sizeof(*s)); // Clean-up
fkellermavnet 0:affdbb35faa4 1166 string ss;
fkellermavnet 0:affdbb35faa4 1167 size_t pe;
fkellermavnet 0:affdbb35faa4 1168 size_t ps = pRespStr->rfind("\"");
fkellermavnet 0:affdbb35faa4 1169 if (ps != string::npos) {
fkellermavnet 0:affdbb35faa4 1170 ps += 2; // Skip the , after the "
fkellermavnet 0:affdbb35faa4 1171 pe = ps;
fkellermavnet 14:e846217affcd 1172
fkellermavnet 14:e846217affcd 1173 pe = pRespStr->find(".", pe);
fkellermavnet 14:e846217affcd 1174 if (pe == string::npos)
fkellermavnet 14:e846217affcd 1175 return (false);
fkellermavnet 14:e846217affcd 1176 else
fkellermavnet 14:e846217affcd 1177 pe += 1;
fkellermavnet 14:e846217affcd 1178 pe = pRespStr->find(".", pe);
fkellermavnet 14:e846217affcd 1179 if (pe == string::npos)
fkellermavnet 14:e846217affcd 1180 return (false);
fkellermavnet 14:e846217affcd 1181 else
fkellermavnet 14:e846217affcd 1182 pe += 1;
fkellermavnet 14:e846217affcd 1183 pe = pRespStr->find(".", pe);
fkellermavnet 14:e846217affcd 1184 if (pe == string::npos)
fkellermavnet 14:e846217affcd 1185 return (false);
fkellermavnet 14:e846217affcd 1186 else
fkellermavnet 14:e846217affcd 1187 pe += 1;
fkellermavnet 14:e846217affcd 1188 pe = pRespStr->find(".", pe);
fkellermavnet 14:e846217affcd 1189 if (pe == string::npos)
fkellermavnet 14:e846217affcd 1190 return (false);
fkellermavnet 14:e846217affcd 1191 else
fkellermavnet 14:e846217affcd 1192 pe += 1;
fkellermavnet 14:e846217affcd 1193
fkellermavnet 0:affdbb35faa4 1194 ss = pRespStr->substr(ps, pe - 1 - ps);
fkellermavnet 0:affdbb35faa4 1195 strncpy(s->ip, ss.c_str(), MAX_LEN_IP_STR);
fkellermavnet 0:affdbb35faa4 1196 s->ip[MAX_LEN_IP_STR - 1] = '\0';
fkellermavnet 0:affdbb35faa4 1197 ps = pe;
fkellermavnet 14:e846217affcd 1198
fkellermavnet 14:e846217affcd 1199 pe = pRespStr->find(".", pe);
fkellermavnet 14:e846217affcd 1200 if (pe == string::npos)
fkellermavnet 14:e846217affcd 1201 return (false);
fkellermavnet 14:e846217affcd 1202 else
fkellermavnet 14:e846217affcd 1203 pe += 1;
fkellermavnet 14:e846217affcd 1204 pe = pRespStr->find(".", pe);
fkellermavnet 14:e846217affcd 1205 if (pe == string::npos)
fkellermavnet 14:e846217affcd 1206 return (false);
fkellermavnet 14:e846217affcd 1207 else
fkellermavnet 14:e846217affcd 1208 pe += 1;
fkellermavnet 14:e846217affcd 1209 pe = pRespStr->find(".", pe);
fkellermavnet 14:e846217affcd 1210 if (pe == string::npos)
fkellermavnet 14:e846217affcd 1211 return (false);
fkellermavnet 14:e846217affcd 1212 else
fkellermavnet 14:e846217affcd 1213 pe += 1;
fkellermavnet 0:affdbb35faa4 1214 pe = pRespStr->find(",", pe);
fkellermavnet 14:e846217affcd 1215
fkellermavnet 0:affdbb35faa4 1216 ss = pRespStr->substr(ps, pe - ps);
fkellermavnet 0:affdbb35faa4 1217 strncpy(s->mask, ss.c_str(), MAX_LEN_IP_STR);
fkellermavnet 0:affdbb35faa4 1218 s->mask[MAX_LEN_IP_STR - 1] = '\0';
fkellermavnet 0:affdbb35faa4 1219 ps = pe + 1;
fkellermavnet 14:e846217affcd 1220
fkellermavnet 14:e846217affcd 1221 pe = pRespStr->find(".", pe);
fkellermavnet 14:e846217affcd 1222 if (pe == string::npos)
fkellermavnet 14:e846217affcd 1223 return (false);
fkellermavnet 14:e846217affcd 1224 else
fkellermavnet 14:e846217affcd 1225 pe += 1;
fkellermavnet 14:e846217affcd 1226 pe = pRespStr->find(".", pe);
fkellermavnet 14:e846217affcd 1227 if (pe == string::npos)
fkellermavnet 14:e846217affcd 1228 return (false);
fkellermavnet 14:e846217affcd 1229 else
fkellermavnet 14:e846217affcd 1230 pe += 1;
fkellermavnet 14:e846217affcd 1231 pe = pRespStr->find(".", pe);
fkellermavnet 14:e846217affcd 1232 if (pe == string::npos)
fkellermavnet 14:e846217affcd 1233 return (false);
fkellermavnet 14:e846217affcd 1234 else
fkellermavnet 14:e846217affcd 1235 pe += 1;
fkellermavnet 0:affdbb35faa4 1236 pe = pRespStr->find(",", pe);
fkellermavnet 14:e846217affcd 1237
fkellermavnet 0:affdbb35faa4 1238 ss = pRespStr->substr(ps, pe - ps);
fkellermavnet 0:affdbb35faa4 1239 strncpy(s->gateway, ss.c_str(), MAX_LEN_IP_STR);
fkellermavnet 0:affdbb35faa4 1240 s->gateway[MAX_LEN_IP_STR - 1] = '\0';
fkellermavnet 0:affdbb35faa4 1241 ps = pe + 1;
fkellermavnet 14:e846217affcd 1242
fkellermavnet 14:e846217affcd 1243 pe = pRespStr->find(".", pe);
fkellermavnet 14:e846217affcd 1244 if (pe == string::npos)
fkellermavnet 14:e846217affcd 1245 return (false);
fkellermavnet 14:e846217affcd 1246 else
fkellermavnet 14:e846217affcd 1247 pe += 1;
fkellermavnet 14:e846217affcd 1248 pe = pRespStr->find(".", pe);
fkellermavnet 14:e846217affcd 1249 if (pe == string::npos)
fkellermavnet 14:e846217affcd 1250 return (false);
fkellermavnet 14:e846217affcd 1251 else
fkellermavnet 14:e846217affcd 1252 pe += 1;
fkellermavnet 14:e846217affcd 1253 pe = pRespStr->find(".", pe);
fkellermavnet 14:e846217affcd 1254 if (pe == string::npos)
fkellermavnet 14:e846217affcd 1255 return (false);
fkellermavnet 14:e846217affcd 1256 else
fkellermavnet 14:e846217affcd 1257 pe += 1;
fkellermavnet 0:affdbb35faa4 1258 pe = pRespStr->find(",", pe);
fkellermavnet 14:e846217affcd 1259
fkellermavnet 14:e846217affcd 1260
fkellermavnet 0:affdbb35faa4 1261 ss = pRespStr->substr(ps, pe - ps);
fkellermavnet 0:affdbb35faa4 1262 strncpy(s->dnsPrimary, ss.c_str(), MAX_LEN_IP_STR);
fkellermavnet 0:affdbb35faa4 1263 s->dnsPrimary[MAX_LEN_IP_STR - 1] = '\0';
fkellermavnet 0:affdbb35faa4 1264 ps = pe + 1;
fkellermavnet 14:e846217affcd 1265
fkellermavnet 14:e846217affcd 1266 pe = pRespStr->find(".", pe);
fkellermavnet 14:e846217affcd 1267 if (pe == string::npos)
fkellermavnet 14:e846217affcd 1268 return (false);
fkellermavnet 14:e846217affcd 1269 else
fkellermavnet 14:e846217affcd 1270 pe += 1;
fkellermavnet 14:e846217affcd 1271 pe = pRespStr->find(".", pe);
fkellermavnet 14:e846217affcd 1272 if (pe == string::npos)
fkellermavnet 14:e846217affcd 1273 return (false);
fkellermavnet 14:e846217affcd 1274 else
fkellermavnet 14:e846217affcd 1275 pe += 1;
fkellermavnet 14:e846217affcd 1276 pe = pRespStr->find(".", pe);
fkellermavnet 14:e846217affcd 1277 if (pe == string::npos)
fkellermavnet 14:e846217affcd 1278 return (false);
fkellermavnet 14:e846217affcd 1279 else
fkellermavnet 14:e846217affcd 1280 pe += 1;
fkellermavnet 0:affdbb35faa4 1281 pe = pRespStr->find(",", pe);
fkellermavnet 14:e846217affcd 1282
fkellermavnet 14:e846217affcd 1283
fkellermavnet 0:affdbb35faa4 1284 ss = pRespStr->substr(ps, pe - ps);
fkellermavnet 0:affdbb35faa4 1285 strncpy(s->dnsSecondary, ss.c_str(), MAX_LEN_IP_STR);
fkellermavnet 0:affdbb35faa4 1286 s->dnsSecondary[MAX_LEN_IP_STR - 1] = '\0';
fkellermavnet 0:affdbb35faa4 1287
fkellermavnet 0:affdbb35faa4 1288 dbgPuts("~~~~~~~~~~ WNC IP Stats ~~~~~~~~~~~~");
fkellermavnet 0:affdbb35faa4 1289 dbgPuts("ip: ", false); dbgPutsNoTime(s->ip);
fkellermavnet 0:affdbb35faa4 1290 dbgPuts("mask: ", false); dbgPutsNoTime(s->mask);
fkellermavnet 0:affdbb35faa4 1291 dbgPuts("gateway: ", false); dbgPutsNoTime(s->gateway);
fkellermavnet 0:affdbb35faa4 1292 dbgPuts("dns pri: ", false); dbgPutsNoTime(s->dnsPrimary);
fkellermavnet 0:affdbb35faa4 1293 dbgPuts("dns sec: ", false); dbgPutsNoTime(s->dnsSecondary);
fkellermavnet 0:affdbb35faa4 1294 dbgPuts("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
fkellermavnet 0:affdbb35faa4 1295
fkellermavnet 0:affdbb35faa4 1296 return (true);
fkellermavnet 0:affdbb35faa4 1297 }
fkellermavnet 0:affdbb35faa4 1298 }
fkellermavnet 0:affdbb35faa4 1299 }
fkellermavnet 0:affdbb35faa4 1300
fkellermavnet 0:affdbb35faa4 1301 return (false);
fkellermavnet 0:affdbb35faa4 1302 }
fkellermavnet 0:affdbb35faa4 1303
fkellermavnet 0:affdbb35faa4 1304 bool WncController::deleteSMSTextFromMem(char msgIdx)
fkellermavnet 0:affdbb35faa4 1305 {
fkellermavnet 0:affdbb35faa4 1306 const char * err = "deleteSMSTextFromMem: Failed!";
fkellermavnet 0:affdbb35faa4 1307
fkellermavnet 0:affdbb35faa4 1308 switch (msgIdx)
fkellermavnet 0:affdbb35faa4 1309 {
fkellermavnet 0:affdbb35faa4 1310 case '*':
fkellermavnet 0:affdbb35faa4 1311 at_deleteSMSTextFromMem_wnc('1');
fkellermavnet 0:affdbb35faa4 1312 at_deleteSMSTextFromMem_wnc('2');
fkellermavnet 0:affdbb35faa4 1313 at_deleteSMSTextFromMem_wnc('3');
fkellermavnet 0:affdbb35faa4 1314 return (true); // WNC may error if slot empty, just ignore!
fkellermavnet 0:affdbb35faa4 1315
fkellermavnet 0:affdbb35faa4 1316 case '1':
fkellermavnet 0:affdbb35faa4 1317 case '2':
fkellermavnet 0:affdbb35faa4 1318 case '3':
fkellermavnet 0:affdbb35faa4 1319 if (true == at_deleteSMSTextFromMem_wnc(msgIdx))
fkellermavnet 0:affdbb35faa4 1320 return (true);
fkellermavnet 0:affdbb35faa4 1321 else {
fkellermavnet 0:affdbb35faa4 1322 dbgPuts(err);
fkellermavnet 0:affdbb35faa4 1323 return (false);
fkellermavnet 0:affdbb35faa4 1324 }
fkellermavnet 0:affdbb35faa4 1325
fkellermavnet 0:affdbb35faa4 1326 default:
fkellermavnet 0:affdbb35faa4 1327 dbgPuts(err);
fkellermavnet 0:affdbb35faa4 1328 return (false);
fkellermavnet 0:affdbb35faa4 1329 }
fkellermavnet 0:affdbb35faa4 1330 }
fkellermavnet 0:affdbb35faa4 1331
fkellermavnet 0:affdbb35faa4 1332 bool WncController::sendSMSTextFromMem(char msgIdx)
fkellermavnet 0:affdbb35faa4 1333 {
fkellermavnet 0:affdbb35faa4 1334 const char * err = "deleteSMSTextFromMem: Failed!";
fkellermavnet 0:affdbb35faa4 1335
fkellermavnet 0:affdbb35faa4 1336 switch (msgIdx)
fkellermavnet 0:affdbb35faa4 1337 {
fkellermavnet 0:affdbb35faa4 1338 case '*':
fkellermavnet 0:affdbb35faa4 1339 at_sendSMStextMem_wnc('1');
fkellermavnet 0:affdbb35faa4 1340 at_sendSMStextMem_wnc('2');
fkellermavnet 0:affdbb35faa4 1341 at_sendSMStextMem_wnc('3');
fkellermavnet 0:affdbb35faa4 1342 return (true); // WNC may error if slot is empty, just ignore!
fkellermavnet 0:affdbb35faa4 1343
fkellermavnet 0:affdbb35faa4 1344 case '1':
fkellermavnet 0:affdbb35faa4 1345 case '2':
fkellermavnet 0:affdbb35faa4 1346 case '3':
fkellermavnet 0:affdbb35faa4 1347 if (at_sendSMStextMem_wnc(msgIdx) == true)
fkellermavnet 0:affdbb35faa4 1348 return (true);
fkellermavnet 0:affdbb35faa4 1349 else {
fkellermavnet 0:affdbb35faa4 1350 dbgPuts(err);
fkellermavnet 0:affdbb35faa4 1351 return (false);
fkellermavnet 0:affdbb35faa4 1352 }
fkellermavnet 0:affdbb35faa4 1353
fkellermavnet 0:affdbb35faa4 1354 default:
fkellermavnet 0:affdbb35faa4 1355 dbgPuts(err);
fkellermavnet 0:affdbb35faa4 1356 return (false);
fkellermavnet 0:affdbb35faa4 1357 }
fkellermavnet 0:affdbb35faa4 1358 }
fkellermavnet 0:affdbb35faa4 1359
fkellermavnet 0:affdbb35faa4 1360 bool WncController::at_deleteSMSTextFromMem_wnc(char n)
fkellermavnet 0:affdbb35faa4 1361 {
fkellermavnet 0:affdbb35faa4 1362 string cmdStr, respStr;
fkellermavnet 0:affdbb35faa4 1363 // Message is stored in WNC, now send it!
fkellermavnet 0:affdbb35faa4 1364 cmdStr = "AT+CMGD=";
fkellermavnet 0:affdbb35faa4 1365 cmdStr += n;
fkellermavnet 0:affdbb35faa4 1366 cmdStr += "\r\n";
fkellermavnet 0:affdbb35faa4 1367 dbgPuts("TX: ", false); dbgPutsNoTime(cmdStr.c_str(), false);
fkellermavnet 0:affdbb35faa4 1368 AtCmdErr_e r = mdmSendAtCmdRsp(cmdStr.c_str(), m_sCmdTimeoutMs, &respStr);
fkellermavnet 0:affdbb35faa4 1369 dbgPuts("RX: ", false); dbgPutsNoTime(respStr.c_str());
fkellermavnet 0:affdbb35faa4 1370 return (r == WNC_AT_CMD_OK);
fkellermavnet 0:affdbb35faa4 1371 }
fkellermavnet 0:affdbb35faa4 1372
fkellermavnet 0:affdbb35faa4 1373 bool WncController::at_sendSMStextMem_wnc(char n)
fkellermavnet 0:affdbb35faa4 1374 {
fkellermavnet 0:affdbb35faa4 1375 string cmdStr, respStr;
fkellermavnet 0:affdbb35faa4 1376 // Message is stored in WNC, now send it!
fkellermavnet 0:affdbb35faa4 1377 cmdStr = "AT+CMSS=";
fkellermavnet 0:affdbb35faa4 1378 cmdStr += n;
fkellermavnet 0:affdbb35faa4 1379 cmdStr += "\r\n";
fkellermavnet 0:affdbb35faa4 1380 dbgPuts("TX: ", false); dbgPutsNoTime(cmdStr.c_str(), false);
fkellermavnet 0:affdbb35faa4 1381 AtCmdErr_e r = mdmSendAtCmdRsp(cmdStr.c_str(), m_sCmdTimeoutMs, &respStr);
fkellermavnet 0:affdbb35faa4 1382 dbgPuts("RX: ", false); dbgPutsNoTime(respStr.c_str());
fkellermavnet 0:affdbb35faa4 1383 return (r == WNC_AT_CMD_OK);
fkellermavnet 0:affdbb35faa4 1384 }
fkellermavnet 0:affdbb35faa4 1385
fkellermavnet 0:affdbb35faa4 1386 bool WncController::at_sendSMStext_wnc(const char * const phoneNum, const char * const text)
fkellermavnet 0:affdbb35faa4 1387 {
fkellermavnet 0:affdbb35faa4 1388 string respStr;
fkellermavnet 0:affdbb35faa4 1389 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1390 size_t l = strlen(text);
fkellermavnet 0:affdbb35faa4 1391
fkellermavnet 20:ca2db38d6802 1392 if (l <= MAX_WNC_SMS_LENGTH)
fkellermavnet 0:affdbb35faa4 1393 {
fkellermavnet 0:affdbb35faa4 1394 // Check to see if the SMS service is available
fkellermavnet 0:affdbb35faa4 1395 checkCellLink();
fkellermavnet 0:affdbb35faa4 1396 if (m_sReadyForSMS == true) {
fkellermavnet 0:affdbb35faa4 1397 at_send_wnc_cmd("AT+CMGF=1", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1398 string cmdStr("AT+CMGS=\"");
fkellermavnet 0:affdbb35faa4 1399 cmdStr += phoneNum;
fkellermavnet 0:affdbb35faa4 1400 cmdStr += "\"";
fkellermavnet 0:affdbb35faa4 1401 dbgPuts("TX: ", false); dbgPutsNoTime(cmdStr.c_str());
fkellermavnet 0:affdbb35faa4 1402 cmdStr += "\x0d"; // x0d = <ENTER>
fkellermavnet 0:affdbb35faa4 1403 // Send raw command with short timeout (the timeout will fail cause the WNC is not supposed to reply yet!
fkellermavnet 0:affdbb35faa4 1404 // And we want a delay before sending the actual text part of the string!
fkellermavnet 0:affdbb35faa4 1405 mdmSendAtCmdRsp(cmdStr.c_str(), 300, &respStr, false); // False turns off auto-addition of CR+LF (the WNC wants nothing here)
fkellermavnet 0:affdbb35faa4 1406 dbgPuts("RX: ", false); dbgPutsNoTime(respStr.c_str());
fkellermavnet 0:affdbb35faa4 1407 if ((respStr.size() > 0) && (respStr.find("ERROR") == string::npos)) {
fkellermavnet 0:affdbb35faa4 1408 // Part 2 of the text, this is the actual text part:
fkellermavnet 0:affdbb35faa4 1409 cmdStr = text;
fkellermavnet 11:3ff6c1cb5b03 1410 dbgPuts("TX: ", false); dbgPutsNoTime(cmdStr.c_str());
fkellermavnet 0:affdbb35faa4 1411 cmdStr += "\x1A"; // <CTRL>-Z is what tells the WNC the message is complete to send!
fkellermavnet 0:affdbb35faa4 1412 AtCmdErr_e r = mdmSendAtCmdRsp(cmdStr.c_str(), 10000, &respStr);
fkellermavnet 11:3ff6c1cb5b03 1413 dbgPuts("RX: ", false); dbgPutsNoTime(respStr.c_str());
fkellermavnet 0:affdbb35faa4 1414 if (respStr.size() == 0)
fkellermavnet 0:affdbb35faa4 1415 return (false);
fkellermavnet 0:affdbb35faa4 1416 else
fkellermavnet 0:affdbb35faa4 1417 return (r == WNC_AT_CMD_OK);
fkellermavnet 0:affdbb35faa4 1418 }
fkellermavnet 0:affdbb35faa4 1419 }
fkellermavnet 0:affdbb35faa4 1420 }
fkellermavnet 0:affdbb35faa4 1421
fkellermavnet 0:affdbb35faa4 1422 return (false);
fkellermavnet 0:affdbb35faa4 1423 }
fkellermavnet 0:affdbb35faa4 1424
fkellermavnet 0:affdbb35faa4 1425 bool WncController::saveSMSText(const char * const phoneNum, const char * const text, char * msgIdx)
fkellermavnet 0:affdbb35faa4 1426 {
fkellermavnet 0:affdbb35faa4 1427 if (at_saveSMStext_wnc(phoneNum, text, msgIdx) == true)
fkellermavnet 0:affdbb35faa4 1428 return (true);
fkellermavnet 0:affdbb35faa4 1429 else {
fkellermavnet 0:affdbb35faa4 1430 dbgPuts("saveSMSTextToMem: failed!\r\n");
fkellermavnet 0:affdbb35faa4 1431 return (false);
fkellermavnet 0:affdbb35faa4 1432 }
fkellermavnet 0:affdbb35faa4 1433 }
fkellermavnet 0:affdbb35faa4 1434
fkellermavnet 0:affdbb35faa4 1435 bool WncController::at_saveSMStext_wnc(const char * const phoneNum, const char * const text, char * msgIdx)
fkellermavnet 0:affdbb35faa4 1436 {
fkellermavnet 0:affdbb35faa4 1437 string respStr;
fkellermavnet 0:affdbb35faa4 1438 size_t l = strlen(text);
fkellermavnet 0:affdbb35faa4 1439
fkellermavnet 0:affdbb35faa4 1440 if (l <= MAX_WNC_SMS_LENGTH)
fkellermavnet 0:affdbb35faa4 1441 {
fkellermavnet 0:affdbb35faa4 1442 // Check to see if the SMS service is available
fkellermavnet 0:affdbb35faa4 1443 checkCellLink();
fkellermavnet 0:affdbb35faa4 1444 if (m_sReadyForSMS == true) {
fkellermavnet 0:affdbb35faa4 1445 string cmdStr("AT+CMGW=\"");
fkellermavnet 0:affdbb35faa4 1446 cmdStr += phoneNum;
fkellermavnet 0:affdbb35faa4 1447 cmdStr += "\"";
fkellermavnet 0:affdbb35faa4 1448 dbgPuts("TX: ", false); dbgPutsNoTime(cmdStr.c_str());
fkellermavnet 0:affdbb35faa4 1449 cmdStr += "\x0d"; // x0d = <ENTER>
fkellermavnet 0:affdbb35faa4 1450 // Send raw command with short timeout (the timeout will fail cause the WNC is not supposed to reply yet!
fkellermavnet 0:affdbb35faa4 1451 // And we want a delay before sending the actual text part of the string!
fkellermavnet 0:affdbb35faa4 1452 mdmSendAtCmdRsp(cmdStr.c_str(), 300, &respStr, false); // False turns off auto-addition of CR+LF (the WNC wants nothing here)
fkellermavnet 0:affdbb35faa4 1453 dbgPuts("RX: ", false); dbgPutsNoTime(respStr.c_str());
fkellermavnet 0:affdbb35faa4 1454 if ((respStr.size() > 0) && (respStr.find("ERROR") == string::npos)) {
fkellermavnet 0:affdbb35faa4 1455 // Part 2 of the text, this is the actual text part:
fkellermavnet 0:affdbb35faa4 1456 cmdStr = text;
fkellermavnet 0:affdbb35faa4 1457 dbgPuts("TX: ", false); dbgPutsNoTime(cmdStr.c_str());
fkellermavnet 0:affdbb35faa4 1458 cmdStr += "\x1A"; // <CTRL>-Z is what tells the WNC the message is complete to save!
fkellermavnet 0:affdbb35faa4 1459 AtCmdErr_e r = mdmSendAtCmdRsp(cmdStr.c_str(), 10000, &respStr);
fkellermavnet 0:affdbb35faa4 1460 dbgPuts("RX: ", false); dbgPutsNoTime(respStr.c_str());
fkellermavnet 0:affdbb35faa4 1461 if (respStr.size() > 0) {
fkellermavnet 0:affdbb35faa4 1462 // respStr will have the SMS index
fkellermavnet 0:affdbb35faa4 1463 size_t pos1 = respStr.find("+CMGW: ");
fkellermavnet 0:affdbb35faa4 1464 size_t pos2 = respStr.rfind("OK");
fkellermavnet 0:affdbb35faa4 1465 if (pos1 != string::npos && pos2 != string::npos) {
fkellermavnet 0:affdbb35faa4 1466 *msgIdx = *string(respStr.substr(pos1+7, 1)).c_str();
fkellermavnet 0:affdbb35faa4 1467 return (true);
fkellermavnet 0:affdbb35faa4 1468 }
fkellermavnet 0:affdbb35faa4 1469 else {
fkellermavnet 0:affdbb35faa4 1470 *msgIdx = '!';
fkellermavnet 0:affdbb35faa4 1471 }
fkellermavnet 0:affdbb35faa4 1472 }
fkellermavnet 0:affdbb35faa4 1473 }
fkellermavnet 0:affdbb35faa4 1474 }
fkellermavnet 0:affdbb35faa4 1475 }
fkellermavnet 0:affdbb35faa4 1476
fkellermavnet 0:affdbb35faa4 1477 return (false);
fkellermavnet 0:affdbb35faa4 1478 }
fkellermavnet 0:affdbb35faa4 1479
fkellermavnet 18:ca2899c353c2 1480 bool WncController::at_readSMSlog_wnc(string ** log)
fkellermavnet 0:affdbb35faa4 1481 {
fkellermavnet 18:ca2899c353c2 1482 return (at_send_wnc_cmd("AT+CMGL", log, m_sCmdTimeoutMs) == WNC_AT_CMD_OK);
fkellermavnet 0:affdbb35faa4 1483 }
fkellermavnet 0:affdbb35faa4 1484
fkellermavnet 6:a656e820d7ff 1485 size_t WncController::at_readSMStext_wnc(const char n, const char ** log)
fkellermavnet 0:affdbb35faa4 1486 {
fkellermavnet 6:a656e820d7ff 1487 static string smsReadTxtStr;
fkellermavnet 0:affdbb35faa4 1488 string * pRespStr;
fkellermavnet 6:a656e820d7ff 1489 string cmdStr;
fkellermavnet 6:a656e820d7ff 1490
fkellermavnet 6:a656e820d7ff 1491 smsReadTxtStr.erase();
fkellermavnet 6:a656e820d7ff 1492 cmdStr = "AT+CMGR";
fkellermavnet 6:a656e820d7ff 1493 cmdStr += '1';
fkellermavnet 0:affdbb35faa4 1494 if (at_send_wnc_cmd("AT+CMGR", &pRespStr, m_sCmdTimeoutMs) == WNC_AT_CMD_OK)
fkellermavnet 0:affdbb35faa4 1495 *log = pRespStr->c_str();
fkellermavnet 0:affdbb35faa4 1496 else
fkellermavnet 0:affdbb35faa4 1497 *log = "\0";
fkellermavnet 0:affdbb35faa4 1498
fkellermavnet 0:affdbb35faa4 1499 return (pRespStr->size());
fkellermavnet 0:affdbb35faa4 1500 }
fkellermavnet 0:affdbb35faa4 1501
fkellermavnet 0:affdbb35faa4 1502 bool WncController::at_at_wnc(void)
fkellermavnet 0:affdbb35faa4 1503 {
fkellermavnet 0:affdbb35faa4 1504 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1505 return (WNC_AT_CMD_OK == at_send_wnc_cmd("AT", &pRespStr, WNC_QUICK_CMD_TIMEOUT_MS)); // Heartbeat?
fkellermavnet 0:affdbb35faa4 1506 }
fkellermavnet 0:affdbb35faa4 1507
fkellermavnet 0:affdbb35faa4 1508 bool WncController::at_init_wnc(bool hardReset)
fkellermavnet 0:affdbb35faa4 1509 {
fkellermavnet 0:affdbb35faa4 1510 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1511 AtCmdErr_e cmdRes;
fkellermavnet 0:affdbb35faa4 1512
fkellermavnet 0:affdbb35faa4 1513 if (hardReset == true)
fkellermavnet 0:affdbb35faa4 1514 dbgPuts("Hard Soft Reset!");
fkellermavnet 0:affdbb35faa4 1515
fkellermavnet 0:affdbb35faa4 1516 dbgPuts("Start AT init of WNC:");
fkellermavnet 0:affdbb35faa4 1517
fkellermavnet 0:affdbb35faa4 1518 // Kick it twice to perhaps remove cued responses from an incomplete
fkellermavnet 0:affdbb35faa4 1519 // power cycle.
fkellermavnet 0:affdbb35faa4 1520 at_send_wnc_cmd("AT", &pRespStr, WNC_QUICK_CMD_TIMEOUT_MS);
fkellermavnet 0:affdbb35faa4 1521 at_send_wnc_cmd("AT", &pRespStr, WNC_QUICK_CMD_TIMEOUT_MS);
fkellermavnet 23:aa2d716e234c 1522
fkellermavnet 23:aa2d716e234c 1523 // Dump the firmware revision on the debug log:
fkellermavnet 23:aa2d716e234c 1524 at_send_wnc_cmd("AT+GMR", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1525
fkellermavnet 0:affdbb35faa4 1526 // Quick commands below do not need to check cellular connectivity
fkellermavnet 0:affdbb35faa4 1527 at_send_wnc_cmd("ATE0", &pRespStr, WNC_QUICK_CMD_TIMEOUT_MS); // Echo Off
fkellermavnet 0:affdbb35faa4 1528 at_send_wnc_cmd("AT+CMEE=2", &pRespStr, m_sCmdTimeoutMs); // 2 - verbose error, 1 - numeric error, 0 - just ERROR
fkellermavnet 6:a656e820d7ff 1529
fkellermavnet 6:a656e820d7ff 1530 // Setup 3 memory slots in the WNC SIM for SMS usage.
fkellermavnet 6:a656e820d7ff 1531 at_send_wnc_cmd("AT+CMGF=1", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 6:a656e820d7ff 1532 at_send_wnc_cmd("AT+CPMS=\"SM\",\"SM\",\"SM\"", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 6:a656e820d7ff 1533
fkellermavnet 0:affdbb35faa4 1534 cmdRes = at_send_wnc_cmd("AT", &pRespStr, WNC_QUICK_CMD_TIMEOUT_MS); // Heartbeat?
fkellermavnet 0:affdbb35faa4 1535
fkellermavnet 0:affdbb35faa4 1536 // If the simple commands are not working, no chance of more complex.
fkellermavnet 0:affdbb35faa4 1537 // I have seen re-trying commands make it worse.
fkellermavnet 0:affdbb35faa4 1538 if (cmdRes != WNC_AT_CMD_OK)
fkellermavnet 0:affdbb35faa4 1539 return (false);
fkellermavnet 0:affdbb35faa4 1540
fkellermavnet 0:affdbb35faa4 1541 cmdRes = at_send_wnc_cmd("AT@INTERNET=1", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1542 if (cmdRes != WNC_AT_CMD_OK)
fkellermavnet 0:affdbb35faa4 1543 return (false);
fkellermavnet 0:affdbb35faa4 1544
fkellermavnet 0:affdbb35faa4 1545 cmdRes = at_send_wnc_cmd("AT@SOCKDIAL=1", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1546 if (cmdRes != WNC_AT_CMD_OK)
fkellermavnet 0:affdbb35faa4 1547 return (false);
fkellermavnet 0:affdbb35faa4 1548
fkellermavnet 0:affdbb35faa4 1549 dbgPuts("SUCCESS: AT init of WNC!");
fkellermavnet 0:affdbb35faa4 1550
fkellermavnet 0:affdbb35faa4 1551 return (true);
fkellermavnet 0:affdbb35faa4 1552 }
fkellermavnet 0:affdbb35faa4 1553
fkellermavnet 10:2ec59906a24e 1554 int16_t WncController::at_sockopen_wnc(const char * const ip, uint16_t port, uint16_t numSock, bool tcp, uint16_t timeOutSec)
fkellermavnet 0:affdbb35faa4 1555 {
fkellermavnet 0:affdbb35faa4 1556 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1557 string cmd_str("AT@SOCKCREAT=");
fkellermavnet 0:affdbb35faa4 1558 AtCmdErr_e res;
fkellermavnet 0:affdbb35faa4 1559
fkellermavnet 0:affdbb35faa4 1560 if (tcp) cmd_str += "1"; // TCP
fkellermavnet 0:affdbb35faa4 1561 else cmd_str += "2"; // else UDP
fkellermavnet 0:affdbb35faa4 1562
fkellermavnet 0:affdbb35faa4 1563 cmd_str += ",0";
fkellermavnet 0:affdbb35faa4 1564 res = sendWncCmd(cmd_str.c_str(), &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 14:e846217affcd 1565 if (res == WNC_AT_CMD_OK && pRespStr->size() > 0)
fkellermavnet 0:affdbb35faa4 1566 {
fkellermavnet 10:2ec59906a24e 1567 size_t pos1 = pRespStr->find("T:");
fkellermavnet 10:2ec59906a24e 1568 size_t pos2 = pRespStr->rfind("OK");
fkellermavnet 10:2ec59906a24e 1569 if ((pos1 != string::npos) && (pos2 != string::npos)) {
fkellermavnet 10:2ec59906a24e 1570 size_t numLen = pos2 - (pos1 + 2);
fkellermavnet 10:2ec59906a24e 1571 string sockStr = pRespStr->substr(pos1 + 2, numLen);
fkellermavnet 10:2ec59906a24e 1572 cmd_str = "AT@SOCKCONN=";
fkellermavnet 10:2ec59906a24e 1573 cmd_str += sockStr;
fkellermavnet 10:2ec59906a24e 1574 cmd_str += ",\"";
fkellermavnet 10:2ec59906a24e 1575 cmd_str += ip;
fkellermavnet 10:2ec59906a24e 1576 cmd_str += "\",";
fkellermavnet 10:2ec59906a24e 1577 cmd_str += _to_string(port);
fkellermavnet 10:2ec59906a24e 1578 cmd_str += ",";
fkellermavnet 10:2ec59906a24e 1579 if (timeOutSec < 30)
fkellermavnet 10:2ec59906a24e 1580 timeOutSec = 30;
fkellermavnet 10:2ec59906a24e 1581 else if (timeOutSec > 360)
fkellermavnet 10:2ec59906a24e 1582 timeOutSec = 360;
fkellermavnet 10:2ec59906a24e 1583 cmd_str += _to_string(timeOutSec);
fkellermavnet 10:2ec59906a24e 1584 res = sendWncCmd(cmd_str.c_str(), &pRespStr, 1000 * timeOutSec + 1000);
fkellermavnet 10:2ec59906a24e 1585 if (m_sMoreDebugEnabled) {
fkellermavnet 10:2ec59906a24e 1586 at_send_wnc_cmd("AT@SOCKCREAT?", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 10:2ec59906a24e 1587 at_send_wnc_cmd("AT@SOCKCONN?", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 10:2ec59906a24e 1588 }
fkellermavnet 10:2ec59906a24e 1589 return (strtol(sockStr.c_str(), NULL, 10));
fkellermavnet 0:affdbb35faa4 1590 }
fkellermavnet 10:2ec59906a24e 1591 else {
fkellermavnet 10:2ec59906a24e 1592 dbgPuts("Invalid sockcreat response!");
fkellermavnet 10:2ec59906a24e 1593 return (0);
fkellermavnet 10:2ec59906a24e 1594 }
fkellermavnet 0:affdbb35faa4 1595 }
fkellermavnet 0:affdbb35faa4 1596 else
fkellermavnet 10:2ec59906a24e 1597 return (0);
fkellermavnet 0:affdbb35faa4 1598 }
fkellermavnet 0:affdbb35faa4 1599
fkellermavnet 0:affdbb35faa4 1600 bool WncController::at_sockclose_wnc(uint16_t numSock)
fkellermavnet 0:affdbb35faa4 1601 {
fkellermavnet 0:affdbb35faa4 1602 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1603 string cmd_str("AT@SOCKCLOSE=");
fkellermavnet 0:affdbb35faa4 1604
fkellermavnet 10:2ec59906a24e 1605 cmd_str += _to_string(numSock);
fkellermavnet 29:69ada8524b4a 1606
fkellermavnet 0:affdbb35faa4 1607 // Don't check the cell status to close the socket
fkellermavnet 29:69ada8524b4a 1608 AtCmdErr_e res = at_send_wnc_cmd(cmd_str.c_str(), &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 29:69ada8524b4a 1609
fkellermavnet 29:69ada8524b4a 1610 if ((res != WNC_AT_CMD_TIMEOUT) && (res != WNC_AT_CMD_OK)) {
fkellermavnet 29:69ada8524b4a 1611 for (unsigned i = 0; i < WNC_SOCK_CLOSE_RETRY_CNT; i++) {
fkellermavnet 29:69ada8524b4a 1612 res = at_send_wnc_cmd(cmd_str.c_str(), &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 29:69ada8524b4a 1613 if ((res == WNC_AT_CMD_TIMEOUT) || (res == WNC_AT_CMD_OK))
fkellermavnet 29:69ada8524b4a 1614 break;
fkellermavnet 29:69ada8524b4a 1615 }
fkellermavnet 29:69ada8524b4a 1616 }
fkellermavnet 29:69ada8524b4a 1617
fkellermavnet 29:69ada8524b4a 1618 return (res == WNC_AT_CMD_OK);
fkellermavnet 0:affdbb35faa4 1619 }
fkellermavnet 0:affdbb35faa4 1620
fkellermavnet 0:affdbb35faa4 1621 bool WncController::at_dnsresolve_wnc(const char * s, string * ipStr)
fkellermavnet 0:affdbb35faa4 1622 {
fkellermavnet 0:affdbb35faa4 1623 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1624 string str(s);
fkellermavnet 14:e846217affcd 1625 AtCmdErr_e r;
fkellermavnet 0:affdbb35faa4 1626
fkellermavnet 0:affdbb35faa4 1627 ipStr->erase(); // Clear out string until resolved!
fkellermavnet 0:affdbb35faa4 1628 str = "AT@DNSRESVDON=\"" + str;
fkellermavnet 0:affdbb35faa4 1629 str += "\"";
fkellermavnet 14:e846217affcd 1630 r = sendWncCmd(str.c_str(), &pRespStr, WNC_DNS_RESOLVE_WAIT_MS);
fkellermavnet 14:e846217affcd 1631 if (r == WNC_AT_CMD_OK && pRespStr->size() > 0) {
fkellermavnet 0:affdbb35faa4 1632 size_t pos_start = pRespStr->find(":\"") + 2;
fkellermavnet 0:affdbb35faa4 1633 if (pos_start != string::npos) {
fkellermavnet 0:affdbb35faa4 1634 size_t pos_end = pRespStr->find("\"", pos_start) - 1;
fkellermavnet 0:affdbb35faa4 1635 if (pos_end != string::npos) {
fkellermavnet 0:affdbb35faa4 1636 if (pos_end > pos_start) {
fkellermavnet 0:affdbb35faa4 1637 // Make a copy for use later (the source string is re-used)
fkellermavnet 0:affdbb35faa4 1638 *ipStr = pRespStr->substr(pos_start, pos_end - pos_start + 1);
fkellermavnet 0:affdbb35faa4 1639 return (true);
fkellermavnet 0:affdbb35faa4 1640 }
fkellermavnet 0:affdbb35faa4 1641 }
fkellermavnet 0:affdbb35faa4 1642 }
fkellermavnet 0:affdbb35faa4 1643 }
fkellermavnet 0:affdbb35faa4 1644
fkellermavnet 0:affdbb35faa4 1645 *ipStr = INVALID_IP_STR;
fkellermavnet 0:affdbb35faa4 1646
fkellermavnet 0:affdbb35faa4 1647 return (false);
fkellermavnet 0:affdbb35faa4 1648 }
fkellermavnet 0:affdbb35faa4 1649
fkellermavnet 0:affdbb35faa4 1650 bool WncController::waitForPowerOnModemToRespond(uint8_t timeoutSecs)
fkellermavnet 0:affdbb35faa4 1651 {
fkellermavnet 0:affdbb35faa4 1652 // Now, give the modem x seconds to start responding by
fkellermavnet 0:affdbb35faa4 1653 // sending simple 'AT' commands to modem once per second.
fkellermavnet 0:affdbb35faa4 1654 if (timeoutSecs > 0) {
fkellermavnet 0:affdbb35faa4 1655 do {
fkellermavnet 0:affdbb35faa4 1656 timeoutSecs--;
fkellermavnet 1:ac2de545b981 1657 dbgPutsNoTime("\rWaiting ", false); dbgPutsNoTime(_to_string(timeoutSecs), false);
fkellermavnet 1:ac2de545b981 1658 dbgPutsNoTime(" ", false);
fkellermavnet 0:affdbb35faa4 1659 AtCmdErr_e rc = mdmSendAtCmdRsp("AT", 500, &m_sWncStr);
fkellermavnet 0:affdbb35faa4 1660 if (rc == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 1661 dbgPutsNoTime(""); // CR LF
fkellermavnet 0:affdbb35faa4 1662 return true; //timer.read();
fkellermavnet 0:affdbb35faa4 1663 }
fkellermavnet 0:affdbb35faa4 1664 waitMs(500);
fkellermavnet 0:affdbb35faa4 1665 }
fkellermavnet 0:affdbb35faa4 1666 while (timeoutSecs > 0);
fkellermavnet 1:ac2de545b981 1667 dbgPutsNoTime(""); // CR LF
fkellermavnet 0:affdbb35faa4 1668 }
fkellermavnet 0:affdbb35faa4 1669
fkellermavnet 0:affdbb35faa4 1670 return (false);
fkellermavnet 0:affdbb35faa4 1671 }
fkellermavnet 0:affdbb35faa4 1672
fkellermavnet 33:2958e09ad308 1673 WncController::AtCmdErr_e WncController::at_sockwrite_wnc(const uint8_t * s, uint16_t n, uint16_t numSock, bool isTcp)
fkellermavnet 0:affdbb35faa4 1674 {
fkellermavnet 0:affdbb35faa4 1675 AtCmdErr_e result;
fkellermavnet 0:affdbb35faa4 1676
fkellermavnet 0:affdbb35faa4 1677 if ((n > 0) && (n <= MAX_WNC_WRITE_BYTES)) {
fkellermavnet 0:affdbb35faa4 1678 string * pRespStr;
fkellermavnet 1:ac2de545b981 1679 const char * num2str;
fkellermavnet 0:affdbb35faa4 1680 string cmd_str;
fkellermavnet 0:affdbb35faa4 1681
fkellermavnet 0:affdbb35faa4 1682 if (isTcp == true)
fkellermavnet 0:affdbb35faa4 1683 cmd_str="AT@SOCKWRITE=";
fkellermavnet 0:affdbb35faa4 1684 else
fkellermavnet 0:affdbb35faa4 1685 cmd_str="AT@SOCKWRITE="; // "AT@SOCKSEND=";
fkellermavnet 0:affdbb35faa4 1686
fkellermavnet 10:2ec59906a24e 1687 cmd_str += _to_string(numSock);
fkellermavnet 0:affdbb35faa4 1688 cmd_str += ",";
fkellermavnet 1:ac2de545b981 1689 cmd_str += _to_string(n);
fkellermavnet 0:affdbb35faa4 1690 cmd_str += ",\"";
fkellermavnet 6:a656e820d7ff 1691 while(n > 0) {
fkellermavnet 6:a656e820d7ff 1692 n--;
fkellermavnet 33:2958e09ad308 1693 num2str = _to_hex_string(*s++);
fkellermavnet 0:affdbb35faa4 1694 // Always 2-digit ascii hex:
fkellermavnet 13:73629a6e9122 1695 if (num2str[1] == '\0')
fkellermavnet 1:ac2de545b981 1696 cmd_str += '0';
fkellermavnet 0:affdbb35faa4 1697 cmd_str += num2str;
fkellermavnet 0:affdbb35faa4 1698 }
fkellermavnet 0:affdbb35faa4 1699 cmd_str += "\"";
fkellermavnet 0:affdbb35faa4 1700 result = sendWncCmd(cmd_str.c_str(), &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1701 }
fkellermavnet 0:affdbb35faa4 1702 else {
fkellermavnet 0:affdbb35faa4 1703 dbgPuts("sockwrite Err, string len bad!");
fkellermavnet 0:affdbb35faa4 1704 result = WNC_AT_CMD_ERR;
fkellermavnet 0:affdbb35faa4 1705 }
fkellermavnet 0:affdbb35faa4 1706
fkellermavnet 0:affdbb35faa4 1707 return (result);
fkellermavnet 0:affdbb35faa4 1708 }
fkellermavnet 0:affdbb35faa4 1709
fkellermavnet 4:c5720f4d13ff 1710 WncController::AtCmdErr_e WncController::at_sockread_wnc(string * pS, uint16_t numSock, bool isTcp)
fkellermavnet 4:c5720f4d13ff 1711 {
fkellermavnet 4:c5720f4d13ff 1712 AtCmdErr_e result = WNC_AT_CMD_OK;
fkellermavnet 4:c5720f4d13ff 1713
fkellermavnet 4:c5720f4d13ff 1714 string * pRespStr;
fkellermavnet 4:c5720f4d13ff 1715 string cmd_str;
fkellermavnet 4:c5720f4d13ff 1716 size_t pos_start, pos_end;
fkellermavnet 4:c5720f4d13ff 1717 int i;
fkellermavnet 5:20207cc5502e 1718
fkellermavnet 5:20207cc5502e 1719 pS->erase(); // Start with a fresh string
fkellermavnet 4:c5720f4d13ff 1720
fkellermavnet 4:c5720f4d13ff 1721 if (isTcp == true)
fkellermavnet 4:c5720f4d13ff 1722 cmd_str="AT@SOCKREAD=";
fkellermavnet 4:c5720f4d13ff 1723 else
fkellermavnet 4:c5720f4d13ff 1724 cmd_str="AT@SOCKREAD="; // "AT@SOCKRECV=";
fkellermavnet 4:c5720f4d13ff 1725
fkellermavnet 10:2ec59906a24e 1726 cmd_str += _to_string(numSock);
fkellermavnet 4:c5720f4d13ff 1727 cmd_str += ",";
fkellermavnet 4:c5720f4d13ff 1728 cmd_str += _to_string(MAX_WNC_READ_BYTES);
fkellermavnet 4:c5720f4d13ff 1729
fkellermavnet 4:c5720f4d13ff 1730 // Experimental: read should not need to check cell net status
fkellermavnet 4:c5720f4d13ff 1731 result = at_send_wnc_cmd(cmd_str.c_str(), &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 4:c5720f4d13ff 1732 if (result == WNC_AT_CMD_OK) {
fkellermavnet 14:e846217affcd 1733 if (pRespStr->size() > 0) {
fkellermavnet 14:e846217affcd 1734 pos_start = pRespStr->find("\"");
fkellermavnet 14:e846217affcd 1735 pos_end = pRespStr->rfind("\"");
fkellermavnet 14:e846217affcd 1736 // Make sure search finds what it's looking for!
fkellermavnet 14:e846217affcd 1737 if (pos_start != string::npos && pos_end != string::npos) {
fkellermavnet 14:e846217affcd 1738 pos_start++;
fkellermavnet 14:e846217affcd 1739 i = pos_end - pos_start; // Num hex chars, 2 per byte
fkellermavnet 14:e846217affcd 1740 }
fkellermavnet 14:e846217affcd 1741 else
fkellermavnet 14:e846217affcd 1742 i = 0;
fkellermavnet 12:33290e9e6e5f 1743 }
fkellermavnet 4:c5720f4d13ff 1744 else
fkellermavnet 4:c5720f4d13ff 1745 i = 0;
fkellermavnet 4:c5720f4d13ff 1746
fkellermavnet 12:33290e9e6e5f 1747 if ((i < 0) || ((i % 2) == 1))
fkellermavnet 4:c5720f4d13ff 1748 dbgPuts("Invalid READ string!");
fkellermavnet 12:33290e9e6e5f 1749
fkellermavnet 12:33290e9e6e5f 1750 if (i > 2*MAX_WNC_READ_BYTES) {
fkellermavnet 4:c5720f4d13ff 1751 i = 2*MAX_WNC_READ_BYTES;
fkellermavnet 12:33290e9e6e5f 1752 dbgPuts("DANGER WNC read data does not match length!");
fkellermavnet 4:c5720f4d13ff 1753 }
fkellermavnet 4:c5720f4d13ff 1754
fkellermavnet 4:c5720f4d13ff 1755 // If data, convert the hex string into byte values
fkellermavnet 12:33290e9e6e5f 1756 while (i > 0) {
fkellermavnet 12:33290e9e6e5f 1757 i -= 2;
fkellermavnet 12:33290e9e6e5f 1758 *pS += (uint8_t)strtol(pRespStr->substr(pos_start, 2).c_str(), NULL, 16);
fkellermavnet 12:33290e9e6e5f 1759 pos_start += 2;
fkellermavnet 4:c5720f4d13ff 1760 }
fkellermavnet 4:c5720f4d13ff 1761 }
fkellermavnet 4:c5720f4d13ff 1762
fkellermavnet 4:c5720f4d13ff 1763 return (result);
fkellermavnet 4:c5720f4d13ff 1764 }
fkellermavnet 4:c5720f4d13ff 1765
fkellermavnet 12:33290e9e6e5f 1766 WncController::AtCmdErr_e WncController::at_sockread_wnc(uint8_t * pS, uint16_t * numRead, uint16_t n, uint16_t numSock, bool isTcp)
fkellermavnet 0:affdbb35faa4 1767 {
fkellermavnet 0:affdbb35faa4 1768 AtCmdErr_e result = WNC_AT_CMD_OK;
fkellermavnet 0:affdbb35faa4 1769 *numRead = 0;
fkellermavnet 0:affdbb35faa4 1770
fkellermavnet 0:affdbb35faa4 1771 if ((n > 0) && (n <= MAX_WNC_READ_BYTES)) {
fkellermavnet 0:affdbb35faa4 1772 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1773 string cmd_str;
fkellermavnet 0:affdbb35faa4 1774 size_t pos_start, pos_end;
fkellermavnet 0:affdbb35faa4 1775 int i;
fkellermavnet 0:affdbb35faa4 1776
fkellermavnet 0:affdbb35faa4 1777 if (isTcp == true)
fkellermavnet 0:affdbb35faa4 1778 cmd_str="AT@SOCKREAD=";
fkellermavnet 0:affdbb35faa4 1779 else
fkellermavnet 0:affdbb35faa4 1780 cmd_str="AT@SOCKREAD="; // "AT@SOCKRECV=";
fkellermavnet 0:affdbb35faa4 1781
fkellermavnet 10:2ec59906a24e 1782 cmd_str += _to_string(numSock);
fkellermavnet 0:affdbb35faa4 1783 cmd_str += ",";
fkellermavnet 0:affdbb35faa4 1784 cmd_str += _to_string(n);
fkellermavnet 0:affdbb35faa4 1785
fkellermavnet 0:affdbb35faa4 1786 // Experimental: read should not need to check cell net status
fkellermavnet 0:affdbb35faa4 1787 result = at_send_wnc_cmd(cmd_str.c_str(), &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1788 if (result == WNC_AT_CMD_OK) {
fkellermavnet 14:e846217affcd 1789 if (pRespStr->size() > 0) {
fkellermavnet 14:e846217affcd 1790 pos_start = pRespStr->find("\"");
fkellermavnet 14:e846217affcd 1791 pos_end = pRespStr->rfind("\"");
fkellermavnet 14:e846217affcd 1792 // Make sure search finds what it's looking for!
fkellermavnet 14:e846217affcd 1793 if (pos_start != string::npos && pos_end != string::npos) {
fkellermavnet 14:e846217affcd 1794 pos_start++;
fkellermavnet 14:e846217affcd 1795 i = pos_end - pos_start; // Num hex chars, 2 per byte
fkellermavnet 14:e846217affcd 1796 }
fkellermavnet 14:e846217affcd 1797 else
fkellermavnet 14:e846217affcd 1798 i = 0;
fkellermavnet 12:33290e9e6e5f 1799 }
fkellermavnet 0:affdbb35faa4 1800 else
fkellermavnet 0:affdbb35faa4 1801 i = 0;
fkellermavnet 10:2ec59906a24e 1802
fkellermavnet 12:33290e9e6e5f 1803 if ((i < 0) || ((i % 2) == 1))
fkellermavnet 4:c5720f4d13ff 1804 dbgPuts("Invalid READ string!");
fkellermavnet 12:33290e9e6e5f 1805
fkellermavnet 12:33290e9e6e5f 1806 if (i > 2*n) {
fkellermavnet 4:c5720f4d13ff 1807 // Bound the ill formated WNC read string!
fkellermavnet 7:e6f22159ef23 1808 i = 2*n;
fkellermavnet 4:c5720f4d13ff 1809 dbgPuts("TRUNCATING read data!");
fkellermavnet 4:c5720f4d13ff 1810 }
fkellermavnet 4:c5720f4d13ff 1811
fkellermavnet 1:ac2de545b981 1812 // If data, convert the hex string into byte values
fkellermavnet 16:f748245382ac 1813 i /= 2;
fkellermavnet 16:f748245382ac 1814 *numRead = i;
fkellermavnet 12:33290e9e6e5f 1815 while (i > 0) {
fkellermavnet 16:f748245382ac 1816 i--;
fkellermavnet 12:33290e9e6e5f 1817 *pS++ = (uint8_t)strtol(pRespStr->substr(pos_start, 2).c_str(), NULL, 16);
fkellermavnet 12:33290e9e6e5f 1818 pos_start += 2;
fkellermavnet 0:affdbb35faa4 1819 }
fkellermavnet 0:affdbb35faa4 1820 }
fkellermavnet 0:affdbb35faa4 1821 }
fkellermavnet 0:affdbb35faa4 1822 else {
fkellermavnet 0:affdbb35faa4 1823 dbgPuts("sockread Err, to many to read!");
fkellermavnet 0:affdbb35faa4 1824 result = WNC_AT_CMD_ERR;
fkellermavnet 0:affdbb35faa4 1825 }
fkellermavnet 0:affdbb35faa4 1826
fkellermavnet 0:affdbb35faa4 1827 return (result);
fkellermavnet 0:affdbb35faa4 1828 }
fkellermavnet 0:affdbb35faa4 1829
fkellermavnet 0:affdbb35faa4 1830 bool WncController::at_reinitialize_mdm(void)
fkellermavnet 0:affdbb35faa4 1831 {
fkellermavnet 0:affdbb35faa4 1832 // Atempt to re-register
fkellermavnet 0:affdbb35faa4 1833 // string * pRespStr;
fkellermavnet 0:affdbb35faa4 1834 // dbgPuts("Force re-register!");
fkellermavnet 0:affdbb35faa4 1835 // at_send_wnc_cmd("AT+CFUN=0,0", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1836 // waitMs(31000);
fkellermavnet 0:affdbb35faa4 1837 // at_send_wnc_cmd("AT+CFUN=1,0", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1838 // waitMs(31000);
fkellermavnet 0:affdbb35faa4 1839
fkellermavnet 0:affdbb35faa4 1840 // Initialize the modem
fkellermavnet 0:affdbb35faa4 1841 dbgPuts("Modem RE-initializing with SOFT Reset...");
fkellermavnet 0:affdbb35faa4 1842
fkellermavnet 0:affdbb35faa4 1843 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1844 at_send_wnc_cmd("AT@DMREBOOT", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1845 waitMs(5000);
fkellermavnet 0:affdbb35faa4 1846
fkellermavnet 0:affdbb35faa4 1847 // Now, give the modem time to start responding by
fkellermavnet 0:affdbb35faa4 1848 // sending simple 'AT' commands to the modem once per second.
fkellermavnet 0:affdbb35faa4 1849 int timeoutSecs = WNC_REINIT_MAX_TIME_MS;
fkellermavnet 0:affdbb35faa4 1850 do {
fkellermavnet 0:affdbb35faa4 1851 dbgPuts("\rWaiting ", false); dbgPutsNoTime(_to_string(timeoutSecs), false);
fkellermavnet 0:affdbb35faa4 1852 AtCmdErr_e rc = mdmSendAtCmdRsp("AT", 500, &m_sWncStr);
fkellermavnet 0:affdbb35faa4 1853 if (rc == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 1854 dbgPutsNoTime(""); // CR LF
fkellermavnet 0:affdbb35faa4 1855 break;
fkellermavnet 0:affdbb35faa4 1856 }
fkellermavnet 0:affdbb35faa4 1857 waitMs(500);
fkellermavnet 0:affdbb35faa4 1858 timeoutSecs--;
fkellermavnet 0:affdbb35faa4 1859 }
fkellermavnet 0:affdbb35faa4 1860 while (timeoutSecs > 0);
fkellermavnet 0:affdbb35faa4 1861
fkellermavnet 0:affdbb35faa4 1862 if (timeoutSecs <= 0)
fkellermavnet 0:affdbb35faa4 1863 dbgPuts("\r\nModem RE-init FAILED!");
fkellermavnet 0:affdbb35faa4 1864 else
fkellermavnet 0:affdbb35faa4 1865 dbgPuts("\r\nModem RE-init complete!");
fkellermavnet 0:affdbb35faa4 1866
fkellermavnet 0:affdbb35faa4 1867 return (timeoutSecs > 0);
fkellermavnet 0:affdbb35faa4 1868 }
fkellermavnet 0:affdbb35faa4 1869
fkellermavnet 0:affdbb35faa4 1870 WncController::AtCmdErr_e WncController::mdmSendAtCmdRsp(const char *cmd, int timeout_ms, string * rsp, bool crLf)
fkellermavnet 0:affdbb35faa4 1871 {
fkellermavnet 0:affdbb35faa4 1872 rsp->erase(); // Clean up from possible prior cmd response
fkellermavnet 0:affdbb35faa4 1873
fkellermavnet 0:affdbb35faa4 1874 // Don't bother the WNC if user hasn't turned it on.
fkellermavnet 0:affdbb35faa4 1875 if (m_sState == WNC_OFF)
fkellermavnet 0:affdbb35faa4 1876 return (WNC_AT_CMD_WNC_NOT_ON);
fkellermavnet 0:affdbb35faa4 1877
fkellermavnet 0:affdbb35faa4 1878 size_t n = strlen(cmd);
fkellermavnet 0:affdbb35faa4 1879
fkellermavnet 0:affdbb35faa4 1880 // Wait per WNC advise
fkellermavnet 0:affdbb35faa4 1881 waitMs(WNC_WAIT_FOR_AT_CMD_MS);
fkellermavnet 0:affdbb35faa4 1882
fkellermavnet 0:affdbb35faa4 1883 if (cmd && n > 0) {
fkellermavnet 0:affdbb35faa4 1884 sendCmd(cmd, crLf);
fkellermavnet 28:eece2151e1e5 1885 // sendCmd(cmd, n, 1000, crLf); // 3rd arg is micro seconds between chars sent
fkellermavnet 0:affdbb35faa4 1886 }
fkellermavnet 0:affdbb35faa4 1887
fkellermavnet 0:affdbb35faa4 1888 startTimerA();
fkellermavnet 1:ac2de545b981 1889 while (getTimerTicksA_mS() < timeout_ms) {
fkellermavnet 1:ac2de545b981 1890 n = mdmGetline(rsp, timeout_ms - getTimerTicksA_mS());
fkellermavnet 0:affdbb35faa4 1891
fkellermavnet 0:affdbb35faa4 1892 if (n == 0)
fkellermavnet 0:affdbb35faa4 1893 continue;
fkellermavnet 14:e846217affcd 1894
fkellermavnet 0:affdbb35faa4 1895 if (rsp->rfind("OK") != string::npos) {
fkellermavnet 0:affdbb35faa4 1896 stopTimerA();
fkellermavnet 0:affdbb35faa4 1897 return (WNC_AT_CMD_OK);
fkellermavnet 0:affdbb35faa4 1898 }
fkellermavnet 0:affdbb35faa4 1899
fkellermavnet 0:affdbb35faa4 1900 if (rsp->rfind("+CME ERROR") != string::npos) {
fkellermavnet 0:affdbb35faa4 1901 stopTimerA();
fkellermavnet 0:affdbb35faa4 1902 return (WNC_AT_CMD_ERRCME);
fkellermavnet 0:affdbb35faa4 1903 }
fkellermavnet 0:affdbb35faa4 1904
fkellermavnet 0:affdbb35faa4 1905 if (rsp->rfind("@EXTERR") != string::npos) {
fkellermavnet 0:affdbb35faa4 1906 stopTimerA();
fkellermavnet 0:affdbb35faa4 1907 return (WNC_AT_CMD_ERREXT);
fkellermavnet 0:affdbb35faa4 1908 }
fkellermavnet 0:affdbb35faa4 1909
fkellermavnet 0:affdbb35faa4 1910 if (rsp->rfind("ERROR") != string::npos) {
fkellermavnet 0:affdbb35faa4 1911 stopTimerA();
fkellermavnet 0:affdbb35faa4 1912 return (WNC_AT_CMD_ERR);
fkellermavnet 0:affdbb35faa4 1913 }
fkellermavnet 0:affdbb35faa4 1914 }
fkellermavnet 0:affdbb35faa4 1915 stopTimerA();
fkellermavnet 0:affdbb35faa4 1916
fkellermavnet 0:affdbb35faa4 1917 return (WNC_AT_CMD_TIMEOUT);
fkellermavnet 0:affdbb35faa4 1918 }
fkellermavnet 0:affdbb35faa4 1919
fkellermavnet 0:affdbb35faa4 1920 bool WncController::at_setapn_wnc(const char * const apnStr)
fkellermavnet 0:affdbb35faa4 1921 {
fkellermavnet 0:affdbb35faa4 1922 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1923
fkellermavnet 0:affdbb35faa4 1924 string cmd_str("AT%PDNSET=1,");
fkellermavnet 0:affdbb35faa4 1925 cmd_str += apnStr;
fkellermavnet 0:affdbb35faa4 1926 cmd_str += ",IP";
fkellermavnet 0:affdbb35faa4 1927 if (WNC_AT_CMD_OK == at_send_wnc_cmd(cmd_str.c_str(), &pRespStr, WNC_APNSET_TIMEOUT_MS)) // Set APN, cmd seems to take a little longer sometimes
fkellermavnet 0:affdbb35faa4 1928 return (true);
fkellermavnet 0:affdbb35faa4 1929 else
fkellermavnet 0:affdbb35faa4 1930 return (false);
fkellermavnet 0:affdbb35faa4 1931 }
fkellermavnet 0:affdbb35faa4 1932
fkellermavnet 0:affdbb35faa4 1933 bool WncController::at_getrssiber_wnc(int16_t * dBm, int16_t * ber)
fkellermavnet 0:affdbb35faa4 1934 {
fkellermavnet 0:affdbb35faa4 1935 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1936 AtCmdErr_e cmdRes;
fkellermavnet 0:affdbb35faa4 1937 cmdRes = at_send_wnc_cmd("AT+CSQ", &pRespStr, m_sCmdTimeoutMs); // Check RSSI,BER
fkellermavnet 0:affdbb35faa4 1938 if (cmdRes != WNC_AT_CMD_OK)
fkellermavnet 0:affdbb35faa4 1939 return (false);
fkellermavnet 0:affdbb35faa4 1940
fkellermavnet 0:affdbb35faa4 1941 if (pRespStr->size() == 0) {
fkellermavnet 0:affdbb35faa4 1942 dbgPuts("Strange RSSI result!");
fkellermavnet 0:affdbb35faa4 1943 return (false);
fkellermavnet 0:affdbb35faa4 1944 }
fkellermavnet 0:affdbb35faa4 1945 else {
fkellermavnet 0:affdbb35faa4 1946 size_t pos1 = pRespStr->find("SQ:");
fkellermavnet 0:affdbb35faa4 1947 size_t pos2 = pRespStr->rfind(",");
fkellermavnet 0:affdbb35faa4 1948 // Sanity check
fkellermavnet 0:affdbb35faa4 1949 if ((pos1 != string::npos) && (pos2 != string::npos) && (pos2 > pos1)) {
fkellermavnet 0:affdbb35faa4 1950 string subStr = pRespStr->substr(pos1 + 4, pos2 - pos1 );
fkellermavnet 0:affdbb35faa4 1951 int rawRssi = atoi(subStr.c_str());
fkellermavnet 0:affdbb35faa4 1952
fkellermavnet 0:affdbb35faa4 1953 // Convert WNC RSSI into dBm range:
fkellermavnet 0:affdbb35faa4 1954 // 0 - -113 dBm
fkellermavnet 0:affdbb35faa4 1955 // 1 - -111 dBm
fkellermavnet 0:affdbb35faa4 1956 // 2..30 - -109 to -53 dBm
fkellermavnet 0:affdbb35faa4 1957 // 31 - -51dBm or >
fkellermavnet 0:affdbb35faa4 1958 // 99 - not known or not detectable
fkellermavnet 0:affdbb35faa4 1959 if (rawRssi == 99)
fkellermavnet 0:affdbb35faa4 1960 *dBm = -199;
fkellermavnet 0:affdbb35faa4 1961 else if (rawRssi == 0)
fkellermavnet 0:affdbb35faa4 1962 *dBm = -113;
fkellermavnet 0:affdbb35faa4 1963 else if (rawRssi == 1)
fkellermavnet 0:affdbb35faa4 1964 *dBm = -111;
fkellermavnet 0:affdbb35faa4 1965 else if (rawRssi == 31)
fkellermavnet 0:affdbb35faa4 1966 *dBm = -51;
fkellermavnet 0:affdbb35faa4 1967 else if (rawRssi >= 2 && rawRssi <= 30)
fkellermavnet 0:affdbb35faa4 1968 *dBm = -113 + 2 * rawRssi;
fkellermavnet 0:affdbb35faa4 1969 else {
fkellermavnet 0:affdbb35faa4 1970 dbgPuts("Invalid RSSI!");
fkellermavnet 0:affdbb35faa4 1971 return (false);
fkellermavnet 0:affdbb35faa4 1972 }
fkellermavnet 0:affdbb35faa4 1973 // Parse out BER: 0..7 as RXQUAL values in the table 3GPP TS 45.008 subclause 8.2.4
fkellermavnet 0:affdbb35faa4 1974 // 99 - unknown or undetectable
fkellermavnet 0:affdbb35faa4 1975 subStr = pRespStr->substr(pos2 + 1, pRespStr->length() - (pos2 + 1));
fkellermavnet 0:affdbb35faa4 1976 *ber = atoi(subStr.c_str());
fkellermavnet 0:affdbb35faa4 1977 }
fkellermavnet 0:affdbb35faa4 1978 else {
fkellermavnet 0:affdbb35faa4 1979 dbgPuts("Strange RSSI result2!");
fkellermavnet 0:affdbb35faa4 1980 return (false);
fkellermavnet 0:affdbb35faa4 1981 }
fkellermavnet 0:affdbb35faa4 1982 }
fkellermavnet 0:affdbb35faa4 1983
fkellermavnet 0:affdbb35faa4 1984 return (true);
fkellermavnet 0:affdbb35faa4 1985 }
fkellermavnet 0:affdbb35faa4 1986
fkellermavnet 0:affdbb35faa4 1987 bool WncController::checkCellLink(void)
fkellermavnet 0:affdbb35faa4 1988 {
fkellermavnet 0:affdbb35faa4 1989 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1990 size_t pos;
fkellermavnet 0:affdbb35faa4 1991 int regSts;
fkellermavnet 0:affdbb35faa4 1992 int cmdRes1, cmdRes2;
fkellermavnet 0:affdbb35faa4 1993
fkellermavnet 0:affdbb35faa4 1994 if (m_sState == WNC_OFF)
fkellermavnet 0:affdbb35faa4 1995 return (false);
fkellermavnet 30:98c9ff850c1b 1996
fkellermavnet 0:affdbb35faa4 1997 m_sState = WNC_ON_NO_CELL_LINK;
fkellermavnet 0:affdbb35faa4 1998
fkellermavnet 0:affdbb35faa4 1999 if (m_sMoreDebugEnabled)
fkellermavnet 0:affdbb35faa4 2000 dbgPuts("<-------- Begin Cell Status ------------");
fkellermavnet 0:affdbb35faa4 2001
fkellermavnet 0:affdbb35faa4 2002 cmdRes1 = at_send_wnc_cmd("AT+CSQ", &pRespStr, m_sCmdTimeoutMs); // Check RSSI,BER
fkellermavnet 30:98c9ff850c1b 2003
fkellermavnet 30:98c9ff850c1b 2004 // If no response, don't bother with more commands
fkellermavnet 30:98c9ff850c1b 2005 if (cmdRes1 != WNC_AT_CMD_TIMEOUT)
fkellermavnet 30:98c9ff850c1b 2006 cmdRes2 = at_send_wnc_cmd("AT+CPIN?", &pRespStr, m_sCmdTimeoutMs); // Check if SIM locked
fkellermavnet 30:98c9ff850c1b 2007 else {
fkellermavnet 30:98c9ff850c1b 2008 if (m_sMoreDebugEnabled)
fkellermavnet 30:98c9ff850c1b 2009 dbgPuts("------------ WNC No Response! --------->");
fkellermavnet 30:98c9ff850c1b 2010
fkellermavnet 30:98c9ff850c1b 2011 return (false);
fkellermavnet 30:98c9ff850c1b 2012 }
fkellermavnet 0:affdbb35faa4 2013
fkellermavnet 14:e846217affcd 2014 if ((cmdRes1 != WNC_AT_CMD_OK) || (cmdRes2 != WNC_AT_CMD_OK) || (pRespStr->size() == 0))
fkellermavnet 0:affdbb35faa4 2015 {
fkellermavnet 0:affdbb35faa4 2016 if (m_sMoreDebugEnabled)
fkellermavnet 0:affdbb35faa4 2017 {
fkellermavnet 0:affdbb35faa4 2018 if ((cmdRes1 == WNC_AT_CMD_TIMEOUT) || (cmdRes2 == WNC_AT_CMD_TIMEOUT))
fkellermavnet 0:affdbb35faa4 2019 dbgPuts("------------ WNC No Response! --------->");
fkellermavnet 0:affdbb35faa4 2020 else
fkellermavnet 0:affdbb35faa4 2021 dbgPuts("------------ WNC Cmd Error! ----------->");
fkellermavnet 0:affdbb35faa4 2022 }
fkellermavnet 30:98c9ff850c1b 2023
fkellermavnet 30:98c9ff850c1b 2024 // If by a miracle it responds to the 2nd after the 1st, keep going
fkellermavnet 30:98c9ff850c1b 2025 if ((cmdRes2 == WNC_AT_CMD_TIMEOUT) || (pRespStr->size() == 0))
fkellermavnet 30:98c9ff850c1b 2026 return (false);
fkellermavnet 0:affdbb35faa4 2027 }
fkellermavnet 0:affdbb35faa4 2028
fkellermavnet 0:affdbb35faa4 2029 // If SIM Card not ready don't bother with commands!
fkellermavnet 0:affdbb35faa4 2030 if (pRespStr->find("CPIN: READY") == string::npos)
fkellermavnet 0:affdbb35faa4 2031 {
fkellermavnet 0:affdbb35faa4 2032 if (m_sMoreDebugEnabled)
fkellermavnet 0:affdbb35faa4 2033 dbgPuts("------------ WNC SIM Problem! --------->");
fkellermavnet 0:affdbb35faa4 2034
fkellermavnet 0:affdbb35faa4 2035 return (false);
fkellermavnet 0:affdbb35faa4 2036 }
fkellermavnet 0:affdbb35faa4 2037
fkellermavnet 0:affdbb35faa4 2038 // SIM card OK, now check for signal and cellular network registration
fkellermavnet 0:affdbb35faa4 2039 cmdRes1 = at_send_wnc_cmd("AT+CREG?", &pRespStr, m_sCmdTimeoutMs); // Check if registered on network
fkellermavnet 14:e846217affcd 2040 if (cmdRes1 != WNC_AT_CMD_OK || pRespStr->size() == 0)
fkellermavnet 0:affdbb35faa4 2041 {
fkellermavnet 0:affdbb35faa4 2042 if (m_sMoreDebugEnabled)
fkellermavnet 0:affdbb35faa4 2043 dbgPuts("------------ WNC +CREG? Fail! --------->");
fkellermavnet 0:affdbb35faa4 2044
fkellermavnet 0:affdbb35faa4 2045 return (false);
fkellermavnet 0:affdbb35faa4 2046 }
fkellermavnet 0:affdbb35faa4 2047 else
fkellermavnet 0:affdbb35faa4 2048 {
fkellermavnet 0:affdbb35faa4 2049 pos = pRespStr->find("CREG: ");
fkellermavnet 0:affdbb35faa4 2050 if (pos != string::npos)
fkellermavnet 0:affdbb35faa4 2051 {
fkellermavnet 0:affdbb35faa4 2052 // The registration is the 2nd arg in the comma separated list
fkellermavnet 0:affdbb35faa4 2053 *pRespStr = pRespStr->substr(pos+8, 1);
fkellermavnet 0:affdbb35faa4 2054 regSts = atoi(pRespStr->c_str());
fkellermavnet 0:affdbb35faa4 2055 switch (regSts) {
fkellermavnet 0:affdbb35faa4 2056 case 1:
fkellermavnet 0:affdbb35faa4 2057 case 5:
fkellermavnet 0:affdbb35faa4 2058 case 6:
fkellermavnet 0:affdbb35faa4 2059 case 7:
fkellermavnet 0:affdbb35faa4 2060 m_sReadyForSMS = true;
fkellermavnet 0:affdbb35faa4 2061 break;
fkellermavnet 0:affdbb35faa4 2062 default:
fkellermavnet 0:affdbb35faa4 2063 m_sReadyForSMS = false;
fkellermavnet 0:affdbb35faa4 2064 dbgPuts("SMS Service Down!");
fkellermavnet 0:affdbb35faa4 2065 }
fkellermavnet 0:affdbb35faa4 2066
fkellermavnet 0:affdbb35faa4 2067 // 1 - registered home, 5 - registered roaming
fkellermavnet 0:affdbb35faa4 2068 if ((regSts != 1) && (regSts != 5))
fkellermavnet 0:affdbb35faa4 2069 {
fkellermavnet 0:affdbb35faa4 2070 if (m_sMoreDebugEnabled)
fkellermavnet 0:affdbb35faa4 2071 dbgPuts("------ WNC Cell Link Down for Data! --->");
fkellermavnet 0:affdbb35faa4 2072
fkellermavnet 0:affdbb35faa4 2073 return (false);
fkellermavnet 0:affdbb35faa4 2074 }
fkellermavnet 0:affdbb35faa4 2075 }
fkellermavnet 0:affdbb35faa4 2076
fkellermavnet 0:affdbb35faa4 2077 if (m_sMoreDebugEnabled)
fkellermavnet 0:affdbb35faa4 2078 dbgPuts("------------ WNC Ready ---------------->");
fkellermavnet 0:affdbb35faa4 2079 }
fkellermavnet 0:affdbb35faa4 2080
fkellermavnet 21:086841abc3aa 2081 // If we made it this far and the WNC did respond, keep the ON state
fkellermavnet 21:086841abc3aa 2082 if (m_sState != WNC_NO_RESPONSE)
fkellermavnet 21:086841abc3aa 2083 m_sState = WNC_ON;
fkellermavnet 0:affdbb35faa4 2084
fkellermavnet 0:affdbb35faa4 2085 return (true);
fkellermavnet 0:affdbb35faa4 2086 }
fkellermavnet 0:affdbb35faa4 2087
fkellermavnet 0:affdbb35faa4 2088 int WncController::dbgPutsNoTime(const char * s, bool crlf)
fkellermavnet 0:affdbb35faa4 2089 {
fkellermavnet 0:affdbb35faa4 2090 if (m_sDebugEnabled == true) {
fkellermavnet 1:ac2de545b981 2091 int r = dbgWriteChars(s);
fkellermavnet 0:affdbb35faa4 2092 if (crlf == true)
fkellermavnet 1:ac2de545b981 2093 return (dbgWriteChars("\r\n"));
fkellermavnet 0:affdbb35faa4 2094 else
fkellermavnet 0:affdbb35faa4 2095 return (r);
fkellermavnet 0:affdbb35faa4 2096 }
fkellermavnet 0:affdbb35faa4 2097 else
fkellermavnet 0:affdbb35faa4 2098 return 0;
fkellermavnet 0:affdbb35faa4 2099 };
fkellermavnet 0:affdbb35faa4 2100
fkellermavnet 0:affdbb35faa4 2101 int WncController::dbgPuts(const char * s, bool crlf)
fkellermavnet 0:affdbb35faa4 2102 {
fkellermavnet 0:affdbb35faa4 2103 dbgPutsNoTime("[*] ", false);
fkellermavnet 0:affdbb35faa4 2104 dbgPutsNoTime(_to_string(getLogTimerTicks()), false);
fkellermavnet 1:ac2de545b981 2105 dbgPutsNoTime(" ", false);
fkellermavnet 0:affdbb35faa4 2106
fkellermavnet 0:affdbb35faa4 2107 int r = dbgPutsNoTime(s, false);
fkellermavnet 1:ac2de545b981 2108
fkellermavnet 0:affdbb35faa4 2109 if (crlf == true)
fkellermavnet 1:ac2de545b981 2110 return (dbgPutsNoTime("", true));
fkellermavnet 0:affdbb35faa4 2111 else
fkellermavnet 0:affdbb35faa4 2112 return (r);
fkellermavnet 0:affdbb35faa4 2113 };
fkellermavnet 0:affdbb35faa4 2114
fkellermavnet 0:affdbb35faa4 2115 void WncController::sendCmd(const char * cmd, bool crLf)
fkellermavnet 0:affdbb35faa4 2116 {
fkellermavnet 0:affdbb35faa4 2117 puts(cmd);
fkellermavnet 0:affdbb35faa4 2118 if (crLf == true)
fkellermavnet 0:affdbb35faa4 2119 puts("\r\n");
fkellermavnet 0:affdbb35faa4 2120 }
fkellermavnet 0:affdbb35faa4 2121
fkellermavnet 0:affdbb35faa4 2122 void WncController::sendCmd(const char * cmd, unsigned n, unsigned wait_uS, bool crLf)
fkellermavnet 0:affdbb35faa4 2123 {
fkellermavnet 0:affdbb35faa4 2124 while (n--) {
fkellermavnet 0:affdbb35faa4 2125 putc(*cmd++);
fkellermavnet 0:affdbb35faa4 2126 waitUs(wait_uS);
fkellermavnet 0:affdbb35faa4 2127 };
fkellermavnet 0:affdbb35faa4 2128 if (crLf == true) {
fkellermavnet 0:affdbb35faa4 2129 putc('\r');
fkellermavnet 0:affdbb35faa4 2130 waitUs(wait_uS);
fkellermavnet 0:affdbb35faa4 2131 putc('\n');
fkellermavnet 0:affdbb35faa4 2132 waitUs(wait_uS);
fkellermavnet 0:affdbb35faa4 2133 }
fkellermavnet 0:affdbb35faa4 2134 }
fkellermavnet 0:affdbb35faa4 2135
fkellermavnet 0:affdbb35faa4 2136 }; // End namespace WncController_fk