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:
Fri Oct 07 18:36:42 2016 +0000
Revision:
31:5db38ccccd1d
Parent:
30:98c9ff850c1b
Child:
32:6512f41ac6f0
Added a toggle of the wakeup pin to try to stop the 'A' from being dropped.; Added an AT% cmd to turn off power saving mode, this is thought to maybe be a solution to the no response problem.;

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