This library controls the WNC. There is a derived class for usage from the K64F board.

Fork of WncControllerLibrary by Fred Kellerman

Committer:
fkellermavnet
Date:
Wed Sep 21 02:31:23 2016 +0000
Revision:
27:c2b9ef5ccbef
Parent:
23:aa2d716e234c
Child:
28:eece2151e1e5
Patched up SMS message parsing, the WNC though makes it really really hard to handle all cases.

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