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:
Thu Sep 01 02:28:10 2016 +0000
Revision:
1:ac2de545b981
Parent:
0:affdbb35faa4
Child:
4:c5720f4d13ff
Had to revert back to MODSERIAL and cleaned up a bunch of minor things.

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 0:affdbb35faa4 39 WncController::WncSocketInfo_s WncController::m_sSock[MAX_NUM_WNC_SOCKETS] = {
fkellermavnet 0:affdbb35faa4 40 { false, "192.168.0.1", 80, 0, 25, true, 30 } // ,
fkellermavnet 0:affdbb35faa4 41 // { false, "192.168.0.1", 80, 0, 25, true, 30 }
fkellermavnet 0:affdbb35faa4 42 };
fkellermavnet 0:affdbb35faa4 43 WncController::WncState_e WncController::m_sState = WNC_OFF;
fkellermavnet 0:affdbb35faa4 44 uint16_t WncController::m_sCmdTimeoutMs = WNC_CMD_TIMEOUT_MS;
fkellermavnet 0:affdbb35faa4 45 string WncController::m_sApnStr = "NULL";
fkellermavnet 0:affdbb35faa4 46 string WncController::m_sWncStr;
fkellermavnet 0:affdbb35faa4 47 uint8_t WncController::m_sPowerUpTimeoutSecs = MAX_POWERUP_TIMEOUT;
fkellermavnet 0:affdbb35faa4 48 bool WncController::m_sDebugEnabled = false;
fkellermavnet 0:affdbb35faa4 49 bool WncController::m_sMoreDebugEnabled = false;
fkellermavnet 0:affdbb35faa4 50 bool WncController::m_sCheckNetStatus = false; // Turn on internet status check between every command
fkellermavnet 0:affdbb35faa4 51 const char * const WncController::INVALID_IP_STR = "";
fkellermavnet 0:affdbb35faa4 52 bool WncController::m_sReadyForSMS = false;
fkellermavnet 0:affdbb35faa4 53
fkellermavnet 0:affdbb35faa4 54
fkellermavnet 0:affdbb35faa4 55 /**
fkellermavnet 0:affdbb35faa4 56 * C++ version 0.4 char* style "itoa":
fkellermavnet 0:affdbb35faa4 57 * Written by Lukás Chmela
fkellermavnet 0:affdbb35faa4 58 * Released under GPLv3.
fkellermavnet 0:affdbb35faa4 59 */
fkellermavnet 0:affdbb35faa4 60
fkellermavnet 0:affdbb35faa4 61 static char* itoa(int64_t value, char* result, int base)
fkellermavnet 0:affdbb35faa4 62 {
fkellermavnet 0:affdbb35faa4 63 // check that the base is valid
fkellermavnet 0:affdbb35faa4 64 if ( base < 2 || base > 36 ) {
fkellermavnet 0:affdbb35faa4 65 *result = '\0';
fkellermavnet 0:affdbb35faa4 66 return result;
fkellermavnet 0:affdbb35faa4 67 }
fkellermavnet 0:affdbb35faa4 68
fkellermavnet 0:affdbb35faa4 69 char* ptr = result, *ptr1 = result, tmp_char;
fkellermavnet 0:affdbb35faa4 70 int64_t tmp_value;
fkellermavnet 0:affdbb35faa4 71
fkellermavnet 0:affdbb35faa4 72 do {
fkellermavnet 0:affdbb35faa4 73 tmp_value = value;
fkellermavnet 0:affdbb35faa4 74 value /= base;
fkellermavnet 0:affdbb35faa4 75 *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value - value * base)];
fkellermavnet 0:affdbb35faa4 76 } while ( value );
fkellermavnet 0:affdbb35faa4 77
fkellermavnet 0:affdbb35faa4 78 // Apply negative sign
fkellermavnet 0:affdbb35faa4 79 if ( tmp_value < 0 )
fkellermavnet 0:affdbb35faa4 80 *ptr++ = '-';
fkellermavnet 0:affdbb35faa4 81
fkellermavnet 0:affdbb35faa4 82 *ptr-- = '\0';
fkellermavnet 0:affdbb35faa4 83
fkellermavnet 0:affdbb35faa4 84 while ( ptr1 < ptr ) {
fkellermavnet 0:affdbb35faa4 85 tmp_char = *ptr;
fkellermavnet 0:affdbb35faa4 86 *ptr-- = *ptr1;
fkellermavnet 0:affdbb35faa4 87 *ptr1++ = tmp_char;
fkellermavnet 0:affdbb35faa4 88 }
fkellermavnet 0:affdbb35faa4 89
fkellermavnet 0:affdbb35faa4 90 return result;
fkellermavnet 0:affdbb35faa4 91 }
fkellermavnet 0:affdbb35faa4 92
fkellermavnet 0:affdbb35faa4 93 const char * WncController::_to_string(int64_t value)
fkellermavnet 0:affdbb35faa4 94 {
fkellermavnet 0:affdbb35faa4 95 static char str[21]; // room for signed 64-bit + null
fkellermavnet 0:affdbb35faa4 96 itoa(value, str, 10);
fkellermavnet 0:affdbb35faa4 97 return (str);
fkellermavnet 0:affdbb35faa4 98 }
fkellermavnet 0:affdbb35faa4 99
fkellermavnet 1:ac2de545b981 100 const char * WncController::_to_hex_string(uint8_t value)
fkellermavnet 1:ac2de545b981 101 {
fkellermavnet 1:ac2de545b981 102 static char str[3]; // room for 8-bit + null
fkellermavnet 1:ac2de545b981 103 itoa(value, str, 16);
fkellermavnet 1:ac2de545b981 104 return (str);
fkellermavnet 1:ac2de545b981 105 }
fkellermavnet 0:affdbb35faa4 106
fkellermavnet 0:affdbb35faa4 107 /**
fkellermavnet 0:affdbb35faa4 108 * \brief Constructor for UART controlled WNC
fkellermavnet 0:affdbb35faa4 109 *
fkellermavnet 0:affdbb35faa4 110 * \param [in] wnc_uart - Reference to a SerialBuffered object which will
fkellermavnet 0:affdbb35faa4 111 * be used as the bus to control the WNC.
fkellermavnet 0:affdbb35faa4 112 *
fkellermavnet 0:affdbb35faa4 113 * \return None.
fkellermavnet 0:affdbb35faa4 114 *
fkellermavnet 0:affdbb35faa4 115 * \details Adding another way to talk to the WNC, like I2C or USB,
fkellermavnet 0:affdbb35faa4 116 * a constructor should be added for each type just like the SerialBuffered
fkellermavnet 0:affdbb35faa4 117 * constructor below.
fkellermavnet 0:affdbb35faa4 118 */
fkellermavnet 1:ac2de545b981 119 WncController::WncController(void)
fkellermavnet 0:affdbb35faa4 120 {
fkellermavnet 0:affdbb35faa4 121 }
fkellermavnet 0:affdbb35faa4 122
fkellermavnet 0:affdbb35faa4 123 void WncController::enableDebug(bool on, bool moreDebugOn)
fkellermavnet 0:affdbb35faa4 124 {
fkellermavnet 0:affdbb35faa4 125 m_sDebugEnabled = on;
fkellermavnet 0:affdbb35faa4 126 m_sMoreDebugEnabled = moreDebugOn;
fkellermavnet 0:affdbb35faa4 127 }
fkellermavnet 0:affdbb35faa4 128
fkellermavnet 0:affdbb35faa4 129 /**
fkellermavnet 0:affdbb35faa4 130 * \brief Used internally but also make public for a user of the Class to interrogate state as well.
fkellermavnet 0:affdbb35faa4 131 *
fkellermavnet 0:affdbb35faa4 132 * \param [in] None.
fkellermavnet 0:affdbb35faa4 133 *
fkellermavnet 0:affdbb35faa4 134 * \return The state of the WNC Modem.
fkellermavnet 0:affdbb35faa4 135 *
fkellermavnet 0:affdbb35faa4 136 * \details None.
fkellermavnet 0:affdbb35faa4 137 */
fkellermavnet 0:affdbb35faa4 138 WncController::WncState_e WncController::getWncStatus(void)
fkellermavnet 0:affdbb35faa4 139 {
fkellermavnet 0:affdbb35faa4 140 return (m_sState);
fkellermavnet 0:affdbb35faa4 141 }
fkellermavnet 0:affdbb35faa4 142
fkellermavnet 0:affdbb35faa4 143 /**
fkellermavnet 0:affdbb35faa4 144 * \brief Return signal quality dBm level
fkellermavnet 0:affdbb35faa4 145 *
fkellermavnet 0:affdbb35faa4 146 * \param [in] None.
fkellermavnet 0:affdbb35faa4 147 *
fkellermavnet 0:affdbb35faa4 148 * \return The dBm signal level at the time of the request.
fkellermavnet 0:affdbb35faa4 149 *
fkellermavnet 0:affdbb35faa4 150 * \details This polls (at the time of the call) the cell signal.
fkellermavnet 0:affdbb35faa4 151 */
fkellermavnet 0:affdbb35faa4 152 int16_t WncController::getDbmRssi(void)
fkellermavnet 0:affdbb35faa4 153 {
fkellermavnet 0:affdbb35faa4 154 int16_t rssi, ber;
fkellermavnet 0:affdbb35faa4 155 if (at_getrssiber_wnc(&rssi, &ber) == true)
fkellermavnet 0:affdbb35faa4 156 return (rssi);
fkellermavnet 0:affdbb35faa4 157 else
fkellermavnet 0:affdbb35faa4 158 return (99);
fkellermavnet 0:affdbb35faa4 159 }
fkellermavnet 0:affdbb35faa4 160
fkellermavnet 0:affdbb35faa4 161 int16_t WncController::get3gBer(void)
fkellermavnet 0:affdbb35faa4 162 {
fkellermavnet 0:affdbb35faa4 163 int16_t rssi, ber;
fkellermavnet 0:affdbb35faa4 164 if (at_getrssiber_wnc(&rssi, &ber) == true)
fkellermavnet 0:affdbb35faa4 165 return (ber);
fkellermavnet 0:affdbb35faa4 166 else
fkellermavnet 0:affdbb35faa4 167 return (99);
fkellermavnet 0:affdbb35faa4 168 }
fkellermavnet 0:affdbb35faa4 169
fkellermavnet 0:affdbb35faa4 170
fkellermavnet 0:affdbb35faa4 171 /**
fkellermavnet 0:affdbb35faa4 172 * \brief Power up and down (down not implemented yet)
fkellermavnet 0:affdbb35faa4 173 *
fkellermavnet 0:affdbb35faa4 174 * \param [in] on - set true to power on, otherwise false
fkellermavnet 0:affdbb35faa4 175 *
fkellermavnet 0:affdbb35faa4 176 * \return None.
fkellermavnet 0:affdbb35faa4 177 *
fkellermavnet 0:affdbb35faa4 178 * \details Power-on works but not power-down. This will manipulate WNC Shield hardware
fkellermavnet 0:affdbb35faa4 179 * and bring it to life. It will also initialize the WNC enough to get it to be able to open sockets
fkellermavnet 0:affdbb35faa4 180 * (with AT commands)
fkellermavnet 0:affdbb35faa4 181 */
fkellermavnet 1:ac2de545b981 182 bool WncController::powerWncOn(const char * const apn, uint8_t powerUpTimeoutSecs)
fkellermavnet 0:affdbb35faa4 183 {
fkellermavnet 0:affdbb35faa4 184 dbgPuts("Waiting for WNC to Initialize...");
fkellermavnet 0:affdbb35faa4 185 m_sPowerUpTimeoutSecs = powerUpTimeoutSecs;
fkellermavnet 0:affdbb35faa4 186 m_sState = WNC_ON_NO_CELL_LINK; // Turn soft on to allow "AT" for init to be sent!
fkellermavnet 0:affdbb35faa4 187 if (initWncModem(powerUpTimeoutSecs) == true) {
fkellermavnet 0:affdbb35faa4 188 // Set the Apn
fkellermavnet 1:ac2de545b981 189 setApnName(apn);
fkellermavnet 0:affdbb35faa4 190 if (false == softwareInitMdm()) {
fkellermavnet 0:affdbb35faa4 191 dbgPuts("Software init failed!");
fkellermavnet 0:affdbb35faa4 192 m_sState = WNC_OFF;
fkellermavnet 0:affdbb35faa4 193 }
fkellermavnet 0:affdbb35faa4 194 }
fkellermavnet 0:affdbb35faa4 195 else {
fkellermavnet 0:affdbb35faa4 196 dbgPuts("Power up failed!");
fkellermavnet 0:affdbb35faa4 197 m_sState = WNC_OFF;
fkellermavnet 0:affdbb35faa4 198 }
fkellermavnet 0:affdbb35faa4 199
fkellermavnet 1:ac2de545b981 200 return (m_sState != WNC_ON_NO_CELL_LINK);
fkellermavnet 0:affdbb35faa4 201 }
fkellermavnet 0:affdbb35faa4 202
fkellermavnet 0:affdbb35faa4 203 size_t WncController::sendCustomCmd(const char * cmd, char * resp, size_t sizeRespBuf, int ms_timeout)
fkellermavnet 0:affdbb35faa4 204 {
fkellermavnet 0:affdbb35faa4 205 string * respStr;
fkellermavnet 0:affdbb35faa4 206
fkellermavnet 0:affdbb35faa4 207 if (sizeRespBuf > 0) {
fkellermavnet 0:affdbb35faa4 208 AtCmdErr_e r = at_send_wnc_cmd(cmd, &respStr, ms_timeout);
fkellermavnet 0:affdbb35faa4 209 if (respStr->size() < sizeRespBuf) {
fkellermavnet 0:affdbb35faa4 210 strcpy(resp, respStr->c_str());
fkellermavnet 0:affdbb35faa4 211 return (respStr->size());
fkellermavnet 0:affdbb35faa4 212 }
fkellermavnet 0:affdbb35faa4 213 }
fkellermavnet 0:affdbb35faa4 214
fkellermavnet 0:affdbb35faa4 215 dbgPuts("sendCustomCmd: would have overrun!");
fkellermavnet 0:affdbb35faa4 216
fkellermavnet 0:affdbb35faa4 217 return (0);
fkellermavnet 0:affdbb35faa4 218 }
fkellermavnet 0:affdbb35faa4 219
fkellermavnet 0:affdbb35faa4 220 bool WncController::pingUrl(const char * url)
fkellermavnet 0:affdbb35faa4 221 {
fkellermavnet 0:affdbb35faa4 222 string ipAddr;
fkellermavnet 0:affdbb35faa4 223
fkellermavnet 0:affdbb35faa4 224 if (true == at_dnsresolve_wnc(url, &ipAddr))
fkellermavnet 0:affdbb35faa4 225 return (pingIp(ipAddr.c_str()));
fkellermavnet 0:affdbb35faa4 226 else
fkellermavnet 0:affdbb35faa4 227 dbgPuts("pingUrl DNS resolve: failed!");
fkellermavnet 0:affdbb35faa4 228
fkellermavnet 0:affdbb35faa4 229 return (false);
fkellermavnet 0:affdbb35faa4 230 }
fkellermavnet 0:affdbb35faa4 231
fkellermavnet 0:affdbb35faa4 232 bool WncController::pingIp(const char * ip)
fkellermavnet 0:affdbb35faa4 233 {
fkellermavnet 0:affdbb35faa4 234 if (true == at_ping_wnc(ip))
fkellermavnet 0:affdbb35faa4 235 return (true);
fkellermavnet 0:affdbb35faa4 236 else
fkellermavnet 0:affdbb35faa4 237 dbgPuts("pingIp: failed!");
fkellermavnet 0:affdbb35faa4 238
fkellermavnet 0:affdbb35faa4 239 return (false);
fkellermavnet 0:affdbb35faa4 240 }
fkellermavnet 0:affdbb35faa4 241
fkellermavnet 0:affdbb35faa4 242 bool WncController::getWncNetworkingStats(WncIpStats * s)
fkellermavnet 0:affdbb35faa4 243 {
fkellermavnet 0:affdbb35faa4 244 return (at_get_wnc_net_stats(s));
fkellermavnet 0:affdbb35faa4 245 }
fkellermavnet 0:affdbb35faa4 246
fkellermavnet 0:affdbb35faa4 247 bool WncController::getIpAddr(uint16_t numSock, char myIpAddr[MAX_LEN_IP_STR])
fkellermavnet 0:affdbb35faa4 248 {
fkellermavnet 0:affdbb35faa4 249 if (numSock < MAX_NUM_WNC_SOCKETS) {
fkellermavnet 0:affdbb35faa4 250 strncpy(myIpAddr, m_sSock[numSock].myIpAddressStr.c_str(), MAX_LEN_IP_STR);
fkellermavnet 0:affdbb35faa4 251 myIpAddr[MAX_LEN_IP_STR - 1] = '\0';
fkellermavnet 0:affdbb35faa4 252 return (true);
fkellermavnet 0:affdbb35faa4 253 }
fkellermavnet 0:affdbb35faa4 254 else {
fkellermavnet 0:affdbb35faa4 255 myIpAddr[0] = '\0';
fkellermavnet 0:affdbb35faa4 256 return (false);
fkellermavnet 0:affdbb35faa4 257 }
fkellermavnet 0:affdbb35faa4 258 }
fkellermavnet 0:affdbb35faa4 259
fkellermavnet 0:affdbb35faa4 260 bool WncController::setApnName(const char * const apnStr)
fkellermavnet 0:affdbb35faa4 261 {
fkellermavnet 0:affdbb35faa4 262 if (at_setapn_wnc(apnStr) == true)
fkellermavnet 0:affdbb35faa4 263 {
fkellermavnet 0:affdbb35faa4 264 m_sApnStr = apnStr;
fkellermavnet 0:affdbb35faa4 265 return (true);
fkellermavnet 0:affdbb35faa4 266 }
fkellermavnet 0:affdbb35faa4 267 else
fkellermavnet 0:affdbb35faa4 268 return (false);
fkellermavnet 0:affdbb35faa4 269 }
fkellermavnet 0:affdbb35faa4 270
fkellermavnet 0:affdbb35faa4 271
fkellermavnet 0:affdbb35faa4 272 /**
fkellermavnet 0:affdbb35faa4 273 * \brief Look-up a URL text string and convert into an IP Address string.
fkellermavnet 0:affdbb35faa4 274 *
fkellermavnet 0:affdbb35faa4 275 * \param [in] url - the URL to lookup. numSock - the socket number to resolve.
fkellermavnet 0:affdbb35faa4 276 *
fkellermavnet 0:affdbb35faa4 277 * \return true - if the IP address has been resolved. false - if the URL could not be resolved.
fkellermavnet 0:affdbb35faa4 278 *
fkellermavnet 0:affdbb35faa4 279 * \details None.
fkellermavnet 0:affdbb35faa4 280 */
fkellermavnet 0:affdbb35faa4 281 bool WncController::resolveUrl(uint16_t numSock, const char * url)
fkellermavnet 0:affdbb35faa4 282 {
fkellermavnet 0:affdbb35faa4 283 bool cmdRes;
fkellermavnet 0:affdbb35faa4 284
fkellermavnet 0:affdbb35faa4 285 if (numSock < MAX_NUM_WNC_SOCKETS) {
fkellermavnet 0:affdbb35faa4 286 if (strlen(url) > 0) {
fkellermavnet 0:affdbb35faa4 287 cmdRes = at_dnsresolve_wnc(url, &m_sSock[numSock].myIpAddressStr);
fkellermavnet 0:affdbb35faa4 288 if (cmdRes == false)
fkellermavnet 0:affdbb35faa4 289 dbgPuts("Cannot resolve URL!");
fkellermavnet 0:affdbb35faa4 290 return (cmdRes);
fkellermavnet 0:affdbb35faa4 291 }
fkellermavnet 0:affdbb35faa4 292 else
fkellermavnet 0:affdbb35faa4 293 dbgPuts("Invalid URL");
fkellermavnet 0:affdbb35faa4 294 }
fkellermavnet 0:affdbb35faa4 295 else
fkellermavnet 0:affdbb35faa4 296 dbgPuts("Invalid Sock num!");
fkellermavnet 0:affdbb35faa4 297
fkellermavnet 0:affdbb35faa4 298 return (false);
fkellermavnet 0:affdbb35faa4 299 }
fkellermavnet 0:affdbb35faa4 300
fkellermavnet 0:affdbb35faa4 301 /**
fkellermavnet 0:affdbb35faa4 302 * \brief Set IP Address string
fkellermavnet 0:affdbb35faa4 303 *
fkellermavnet 0:affdbb35faa4 304 * \param [in] numSock - socket reference to set the string for. ipStr - text string of the IP
fkellermavnet 0:affdbb35faa4 305 * address you want to talk to. There is no sanity check - beware!!!
fkellermavnet 0:affdbb35faa4 306 *
fkellermavnet 0:affdbb35faa4 307 * \return true - if the IP address has been set. false - if the IP could not be set.
fkellermavnet 0:affdbb35faa4 308 *
fkellermavnet 0:affdbb35faa4 309 * \details None.
fkellermavnet 0:affdbb35faa4 310 */
fkellermavnet 0:affdbb35faa4 311 bool WncController::setIpAddr(uint16_t numSock, const char * ipStr)
fkellermavnet 0:affdbb35faa4 312 {
fkellermavnet 0:affdbb35faa4 313 if (numSock < MAX_NUM_WNC_SOCKETS) {
fkellermavnet 0:affdbb35faa4 314 m_sSock[numSock].myIpAddressStr = ipStr;
fkellermavnet 0:affdbb35faa4 315 return (true);
fkellermavnet 0:affdbb35faa4 316 }
fkellermavnet 0:affdbb35faa4 317 else {
fkellermavnet 0:affdbb35faa4 318 dbgPuts("Bad socket num!");
fkellermavnet 0:affdbb35faa4 319 return (false);
fkellermavnet 0:affdbb35faa4 320 }
fkellermavnet 0:affdbb35faa4 321 }
fkellermavnet 0:affdbb35faa4 322
fkellermavnet 0:affdbb35faa4 323 /**
fkellermavnet 0:affdbb35faa4 324 * \brief Opens a WNC socket.
fkellermavnet 0:affdbb35faa4 325 *
fkellermavnet 0:affdbb35faa4 326 * \param [in] sockNum - the number of the socket to open. ipAddr - a string containing
fkellermavnet 0:affdbb35faa4 327 * the IP address. port - the IP port number to open the socket connection.
fkellermavnet 0:affdbb35faa4 328 *
fkellermavnet 0:affdbb35faa4 329 * \return true - if the socket is/was opened. false otherwise.
fkellermavnet 0:affdbb35faa4 330 *
fkellermavnet 0:affdbb35faa4 331 * \details None.
fkellermavnet 0:affdbb35faa4 332 */
fkellermavnet 0:affdbb35faa4 333 bool WncController::openSocket(uint16_t numSock, uint16_t port, bool tcp, uint16_t timeOutSec)
fkellermavnet 0:affdbb35faa4 334 {
fkellermavnet 0:affdbb35faa4 335 if (numSock < MAX_NUM_WNC_SOCKETS) {
fkellermavnet 0:affdbb35faa4 336 // IPV4 ip addr sanity check!
fkellermavnet 0:affdbb35faa4 337 size_t lenIpStr = m_sSock[numSock].myIpAddressStr.size();
fkellermavnet 0:affdbb35faa4 338 if (lenIpStr < 7 || lenIpStr > 15) {
fkellermavnet 0:affdbb35faa4 339 dbgPuts("Invalid IP Address!");
fkellermavnet 0:affdbb35faa4 340 return (false);
fkellermavnet 0:affdbb35faa4 341 }
fkellermavnet 0:affdbb35faa4 342
fkellermavnet 0:affdbb35faa4 343 // Already open ? Must close if want to re-open with new settings.
fkellermavnet 0:affdbb35faa4 344 if (m_sSock[numSock].open == true) {
fkellermavnet 0:affdbb35faa4 345 dbgPuts("Socket already open, close then re-open!");
fkellermavnet 0:affdbb35faa4 346 at_sockclose_wnc(numSock);
fkellermavnet 0:affdbb35faa4 347 m_sSock[numSock].open = false;
fkellermavnet 0:affdbb35faa4 348 }
fkellermavnet 0:affdbb35faa4 349
fkellermavnet 0:affdbb35faa4 350 m_sSock[numSock].myPort = port;
fkellermavnet 0:affdbb35faa4 351 m_sSock[numSock].isTcp = tcp;
fkellermavnet 0:affdbb35faa4 352 m_sSock[numSock].timeOutSec = timeOutSec;
fkellermavnet 1:ac2de545b981 353 m_sSock[numSock].open = at_sockopen_wnc(m_sSock[numSock].myIpAddressStr.c_str(), port, numSock, tcp, timeOutSec);
fkellermavnet 0:affdbb35faa4 354 if (m_sSock[numSock].open == false) {
fkellermavnet 0:affdbb35faa4 355 dbgPuts("Socket open fail!!!!");
fkellermavnet 0:affdbb35faa4 356 // Work-around. If the sock open fails it needs to be told
fkellermavnet 0:affdbb35faa4 357 // to close. If 6 sock opens happen with a fail, it further
fkellermavnet 0:affdbb35faa4 358 // crashes the WNC. Not sure why the sock won't open.
fkellermavnet 0:affdbb35faa4 359 at_sockclose_wnc(numSock);
fkellermavnet 0:affdbb35faa4 360 }
fkellermavnet 0:affdbb35faa4 361 }
fkellermavnet 0:affdbb35faa4 362 else {
fkellermavnet 0:affdbb35faa4 363 dbgPuts("Bad socket num or IP!");
fkellermavnet 0:affdbb35faa4 364 return (false);
fkellermavnet 0:affdbb35faa4 365 }
fkellermavnet 0:affdbb35faa4 366
fkellermavnet 0:affdbb35faa4 367 return (m_sSock[numSock].open);
fkellermavnet 0:affdbb35faa4 368 }
fkellermavnet 0:affdbb35faa4 369
fkellermavnet 0:affdbb35faa4 370 /**
fkellermavnet 0:affdbb35faa4 371 * \brief Write bytes of data to an open socket
fkellermavnet 0:affdbb35faa4 372 *
fkellermavnet 0:affdbb35faa4 373 * \param [in] sockNum - the number of the socket to write. s - a string containing
fkellermavnet 0:affdbb35faa4 374 * the byte data to send must be less than = 1500.
fkellermavnet 0:affdbb35faa4 375 *
fkellermavnet 0:affdbb35faa4 376 * \return true - if the write was successful. false otherwise.
fkellermavnet 0:affdbb35faa4 377 *
fkellermavnet 0:affdbb35faa4 378 * \details The results of the write do not have anything to do with the data
fkellermavnet 0:affdbb35faa4 379 * arriving at the endpoint.
fkellermavnet 0:affdbb35faa4 380 */
fkellermavnet 0:affdbb35faa4 381
fkellermavnet 1:ac2de545b981 382 bool WncController::sockWrite(const char * const s, uint32_t n, uint16_t numSock, bool isTcp)
fkellermavnet 0:affdbb35faa4 383 {
fkellermavnet 0:affdbb35faa4 384 bool result = true;;
fkellermavnet 0:affdbb35faa4 385
fkellermavnet 0:affdbb35faa4 386 AtCmdErr_e cmdRes = at_sockwrite_wnc(s, n, numSock, isTcp);
fkellermavnet 0:affdbb35faa4 387 if (cmdRes != WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 388 if ((cmdRes == WNC_AT_CMD_ERREXT) || (cmdRes == WNC_AT_CMD_TIMEOUT) || (cmdRes == WNC_AT_CMD_ERRCME))
fkellermavnet 0:affdbb35faa4 389 {
fkellermavnet 1:ac2de545b981 390 // This may throw away any data that hasn't been written out of the WNC
fkellermavnet 0:affdbb35faa4 391 // but at this point with the way the WNC currently works we have
fkellermavnet 0:affdbb35faa4 392 // no choice.
fkellermavnet 0:affdbb35faa4 393 closeOpenSocket(numSock);
fkellermavnet 0:affdbb35faa4 394 }
fkellermavnet 0:affdbb35faa4 395 result = false;
fkellermavnet 0:affdbb35faa4 396 }
fkellermavnet 0:affdbb35faa4 397
fkellermavnet 0:affdbb35faa4 398 return (result);
fkellermavnet 0:affdbb35faa4 399 }
fkellermavnet 0:affdbb35faa4 400
fkellermavnet 0:affdbb35faa4 401 bool WncController::write(uint16_t numSock, const char * s, uint32_t n)
fkellermavnet 0:affdbb35faa4 402 {
fkellermavnet 0:affdbb35faa4 403 bool result;
fkellermavnet 0:affdbb35faa4 404
fkellermavnet 0:affdbb35faa4 405 if (numSock < MAX_NUM_WNC_SOCKETS) {
fkellermavnet 0:affdbb35faa4 406 if (m_sSock[numSock].open == true) {
fkellermavnet 0:affdbb35faa4 407 if (n <= MAX_WNC_WRITE_BYTES) {
fkellermavnet 0:affdbb35faa4 408 result = sockWrite(s, n, numSock, m_sSock[numSock].isTcp);
fkellermavnet 0:affdbb35faa4 409 }
fkellermavnet 0:affdbb35faa4 410 else {
fkellermavnet 0:affdbb35faa4 411 uint16_t rem = n % MAX_WNC_WRITE_BYTES;
fkellermavnet 0:affdbb35faa4 412 while (n > MAX_WNC_WRITE_BYTES) {
fkellermavnet 0:affdbb35faa4 413 n -= MAX_WNC_WRITE_BYTES;
fkellermavnet 0:affdbb35faa4 414 result = sockWrite(s, MAX_WNC_WRITE_BYTES, numSock, m_sSock[numSock].isTcp);
fkellermavnet 0:affdbb35faa4 415 if (result == false) {
fkellermavnet 0:affdbb35faa4 416 n = 0;
fkellermavnet 0:affdbb35faa4 417 rem = 0;
fkellermavnet 0:affdbb35faa4 418 dbgPuts("Sock write fail!");
fkellermavnet 0:affdbb35faa4 419 }
fkellermavnet 0:affdbb35faa4 420 else
fkellermavnet 0:affdbb35faa4 421 s += MAX_WNC_WRITE_BYTES;
fkellermavnet 0:affdbb35faa4 422 }
fkellermavnet 0:affdbb35faa4 423 if (rem > 0)
fkellermavnet 0:affdbb35faa4 424 result = sockWrite(s, rem, numSock, m_sSock[numSock].isTcp);
fkellermavnet 0:affdbb35faa4 425 }
fkellermavnet 0:affdbb35faa4 426 }
fkellermavnet 0:affdbb35faa4 427 else {
fkellermavnet 0:affdbb35faa4 428 dbgPuts("Socket is closed for write!");
fkellermavnet 0:affdbb35faa4 429 result = false;
fkellermavnet 0:affdbb35faa4 430 }
fkellermavnet 0:affdbb35faa4 431 }
fkellermavnet 0:affdbb35faa4 432 else {
fkellermavnet 0:affdbb35faa4 433 dbgPuts("Bad socket num!");
fkellermavnet 0:affdbb35faa4 434 result = false;
fkellermavnet 0:affdbb35faa4 435 }
fkellermavnet 0:affdbb35faa4 436
fkellermavnet 0:affdbb35faa4 437 return (result);
fkellermavnet 0:affdbb35faa4 438 }
fkellermavnet 0:affdbb35faa4 439
fkellermavnet 0:affdbb35faa4 440 /**
fkellermavnet 0:affdbb35faa4 441 * \brief Poll and read back data from the WNC (if it has any)
fkellermavnet 0:affdbb35faa4 442 * If auto poll is enabled this read might fail (return with no data).
fkellermavnet 0:affdbb35faa4 443 *
fkellermavnet 0:affdbb35faa4 444 * \param [in] sockNum - the number of the socket to read. result - a string pointer containing
fkellermavnet 0:affdbb35faa4 445 * the byte data readback from the WNC.
fkellermavnet 0:affdbb35faa4 446 *
fkellermavnet 0:affdbb35faa4 447 * \return The number of bytes/chars that are read from the socket.
fkellermavnet 0:affdbb35faa4 448 *
fkellermavnet 0:affdbb35faa4 449 * \details DO NOT use the same string as is passed to the auto poll setup method!
fkellermavnet 0:affdbb35faa4 450 */
fkellermavnet 0:affdbb35faa4 451 size_t WncController::read(uint16_t numSock, uint8_t * readBuf, uint32_t maxReadBufLen)
fkellermavnet 0:affdbb35faa4 452 {
fkellermavnet 0:affdbb35faa4 453 uint32_t numCopied = 0;
fkellermavnet 0:affdbb35faa4 454
fkellermavnet 0:affdbb35faa4 455 if (numSock < MAX_NUM_WNC_SOCKETS) {
fkellermavnet 0:affdbb35faa4 456 if (m_sSock[numSock].open == true) {
fkellermavnet 0:affdbb35faa4 457 uint8_t i = m_sSock[numSock].readRetries;
fkellermavnet 0:affdbb35faa4 458 uint16_t to = m_sSock[numSock].readRetryWaitMs;
fkellermavnet 0:affdbb35faa4 459 bool foundData = false;
fkellermavnet 0:affdbb35faa4 460 size_t numRead;
fkellermavnet 0:affdbb35faa4 461 do {
fkellermavnet 0:affdbb35faa4 462 AtCmdErr_e cmdRes;
fkellermavnet 0:affdbb35faa4 463 if (maxReadBufLen < MAX_WNC_READ_BYTES) {
fkellermavnet 0:affdbb35faa4 464 cmdRes = at_sockread_wnc(readBuf, &numRead, maxReadBufLen, numSock, m_sSock[numSock].isTcp);
fkellermavnet 0:affdbb35faa4 465 dbgPutsNoTime("Warning: read back buffer to small?");
fkellermavnet 0:affdbb35faa4 466 }
fkellermavnet 0:affdbb35faa4 467 else
fkellermavnet 0:affdbb35faa4 468 cmdRes = at_sockread_wnc(readBuf, &numRead, MAX_WNC_READ_BYTES, numSock, m_sSock[numSock].isTcp);
fkellermavnet 0:affdbb35faa4 469
fkellermavnet 0:affdbb35faa4 470 if (WNC_AT_CMD_OK == cmdRes) {
fkellermavnet 0:affdbb35faa4 471 // This will let this loop read until the socket data is
fkellermavnet 0:affdbb35faa4 472 // empty. If no data, then wait the retry amount of time.
fkellermavnet 0:affdbb35faa4 473 if (numRead > 0) {
fkellermavnet 0:affdbb35faa4 474 foundData = true;
fkellermavnet 0:affdbb35faa4 475 i = 1;
fkellermavnet 0:affdbb35faa4 476 if (numRead < maxReadBufLen) {
fkellermavnet 0:affdbb35faa4 477 maxReadBufLen -= numRead;
fkellermavnet 0:affdbb35faa4 478 numCopied += numRead;
fkellermavnet 0:affdbb35faa4 479 readBuf += numRead;
fkellermavnet 0:affdbb35faa4 480 }
fkellermavnet 0:affdbb35faa4 481 else {
fkellermavnet 0:affdbb35faa4 482 i = 0; // No more room for data!
fkellermavnet 0:affdbb35faa4 483 dbgPutsNoTime("No more room for read data!");
fkellermavnet 0:affdbb35faa4 484 }
fkellermavnet 0:affdbb35faa4 485 }
fkellermavnet 0:affdbb35faa4 486 else {
fkellermavnet 0:affdbb35faa4 487 // Once data is found start returning it asap
fkellermavnet 0:affdbb35faa4 488 if (foundData == false)
fkellermavnet 0:affdbb35faa4 489 waitMs(to);
fkellermavnet 0:affdbb35faa4 490 }
fkellermavnet 0:affdbb35faa4 491 }
fkellermavnet 0:affdbb35faa4 492 else {
fkellermavnet 0:affdbb35faa4 493 dbgPuts("Sockread failed!");
fkellermavnet 0:affdbb35faa4 494 if (cmdRes == WNC_AT_CMD_ERREXT || cmdRes == WNC_AT_CMD_TIMEOUT)
fkellermavnet 0:affdbb35faa4 495 {
fkellermavnet 0:affdbb35faa4 496 // This may throw away any data that hasn't been read out of the WNC
fkellermavnet 0:affdbb35faa4 497 // but at this point with the way the WNC currently works we have
fkellermavnet 0:affdbb35faa4 498 // no choice.
fkellermavnet 0:affdbb35faa4 499 closeOpenSocket(numSock);
fkellermavnet 0:affdbb35faa4 500 i = 0;
fkellermavnet 0:affdbb35faa4 501 }
fkellermavnet 0:affdbb35faa4 502 else
fkellermavnet 0:affdbb35faa4 503 waitMs(to);
fkellermavnet 0:affdbb35faa4 504 }
fkellermavnet 0:affdbb35faa4 505 } while (i-- > 0);
fkellermavnet 0:affdbb35faa4 506 }
fkellermavnet 0:affdbb35faa4 507 else {
fkellermavnet 0:affdbb35faa4 508 dbgPuts("Socket is closed for read");
fkellermavnet 0:affdbb35faa4 509 }
fkellermavnet 0:affdbb35faa4 510 }
fkellermavnet 0:affdbb35faa4 511 else {
fkellermavnet 0:affdbb35faa4 512 dbgPuts("Bad socket num!");
fkellermavnet 0:affdbb35faa4 513 }
fkellermavnet 0:affdbb35faa4 514
fkellermavnet 0:affdbb35faa4 515 return (numCopied);
fkellermavnet 0:affdbb35faa4 516 }
fkellermavnet 0:affdbb35faa4 517
fkellermavnet 0:affdbb35faa4 518 /**
fkellermavnet 0:affdbb35faa4 519 * \brief Set how many times the above read method will retry if data is not returned.
fkellermavnet 0:affdbb35faa4 520 *
fkellermavnet 0:affdbb35faa4 521 * \param [in] sockNum - the number of the socket to set. retries - how many times to
fkellermavnet 0:affdbb35faa4 522 * poll until data is found.
fkellermavnet 0:affdbb35faa4 523 *
fkellermavnet 0:affdbb35faa4 524 * \return None.
fkellermavnet 0:affdbb35faa4 525 *
fkellermavnet 0:affdbb35faa4 526 * \details None.
fkellermavnet 0:affdbb35faa4 527 */
fkellermavnet 0:affdbb35faa4 528 void WncController::setReadRetries(uint16_t numSock, uint16_t retries)
fkellermavnet 0:affdbb35faa4 529 {
fkellermavnet 0:affdbb35faa4 530 if (numSock < MAX_NUM_WNC_SOCKETS)
fkellermavnet 0:affdbb35faa4 531 m_sSock[numSock].readRetries = retries;
fkellermavnet 0:affdbb35faa4 532 else
fkellermavnet 0:affdbb35faa4 533 dbgPuts("Bad socket num!");
fkellermavnet 0:affdbb35faa4 534 }
fkellermavnet 0:affdbb35faa4 535
fkellermavnet 0:affdbb35faa4 536 /**
fkellermavnet 0:affdbb35faa4 537 * \brief Set how long between retries to wait.
fkellermavnet 0:affdbb35faa4 538 *
fkellermavnet 0:affdbb35faa4 539 * \param [in] sockNum - the number of the socket to set. readRetryWaitMs - how long to wait
fkellermavnet 0:affdbb35faa4 540 * before doing the read poll (calling read(...)).
fkellermavnet 0:affdbb35faa4 541 *
fkellermavnet 0:affdbb35faa4 542 * \return None.
fkellermavnet 0:affdbb35faa4 543 *
fkellermavnet 0:affdbb35faa4 544 * \details None.
fkellermavnet 0:affdbb35faa4 545 */
fkellermavnet 0:affdbb35faa4 546 void WncController::setReadRetryWait(uint16_t numSock, uint16_t readRetryWaitMs)
fkellermavnet 0:affdbb35faa4 547 {
fkellermavnet 0:affdbb35faa4 548 if (numSock < MAX_NUM_WNC_SOCKETS)
fkellermavnet 0:affdbb35faa4 549 m_sSock[numSock].readRetryWaitMs = readRetryWaitMs;
fkellermavnet 0:affdbb35faa4 550 else
fkellermavnet 0:affdbb35faa4 551 dbgPuts("Bad socket num!");
fkellermavnet 0:affdbb35faa4 552 }
fkellermavnet 0:affdbb35faa4 553
fkellermavnet 0:affdbb35faa4 554 /**
fkellermavnet 0:affdbb35faa4 555 * \brief Close the socket.
fkellermavnet 0:affdbb35faa4 556 *
fkellermavnet 0:affdbb35faa4 557 * \param [in] sockNum - the number of the socket to close.
fkellermavnet 0:affdbb35faa4 558 *
fkellermavnet 0:affdbb35faa4 559 * \return None.
fkellermavnet 0:affdbb35faa4 560 *
fkellermavnet 0:affdbb35faa4 561 * \details None.
fkellermavnet 0:affdbb35faa4 562 */
fkellermavnet 0:affdbb35faa4 563 bool WncController::closeSocket(uint16_t numSock)
fkellermavnet 0:affdbb35faa4 564 {
fkellermavnet 0:affdbb35faa4 565 if (numSock < MAX_NUM_WNC_SOCKETS) {
fkellermavnet 0:affdbb35faa4 566
fkellermavnet 0:affdbb35faa4 567 if (false == at_sockclose_wnc(numSock))
fkellermavnet 0:affdbb35faa4 568 dbgPuts("Sock close may not have closed!");
fkellermavnet 0:affdbb35faa4 569
fkellermavnet 0:affdbb35faa4 570 // Even with an error the socket could have closed,
fkellermavnet 0:affdbb35faa4 571 // can't tell for sure so just soft close it for now.
fkellermavnet 0:affdbb35faa4 572 m_sSock[numSock].open = false;
fkellermavnet 0:affdbb35faa4 573 }
fkellermavnet 0:affdbb35faa4 574 else {
fkellermavnet 0:affdbb35faa4 575 dbgPuts("Bad socket num!");
fkellermavnet 0:affdbb35faa4 576 }
fkellermavnet 0:affdbb35faa4 577
fkellermavnet 0:affdbb35faa4 578 return (m_sSock[numSock].open == false);
fkellermavnet 0:affdbb35faa4 579 }
fkellermavnet 0:affdbb35faa4 580
fkellermavnet 0:affdbb35faa4 581 // Note: If you want to make it more portable, create a
fkellermavnet 0:affdbb35faa4 582 // arecharsavailable() and readchar()
fkellermavnet 1:ac2de545b981 583 size_t WncController::mdmGetline(string * buff, int timeout_ms)
fkellermavnet 0:affdbb35faa4 584 {
fkellermavnet 0:affdbb35faa4 585 char chin = '\0';
fkellermavnet 0:affdbb35faa4 586 char chin_last;
fkellermavnet 0:affdbb35faa4 587 size_t len = 0;
fkellermavnet 0:affdbb35faa4 588
fkellermavnet 0:affdbb35faa4 589 startTimerB();
fkellermavnet 1:ac2de545b981 590 while ((len < (MAX_LEN_WNC_CMD_RESPONSE - 1)) && (getTimerTicksB_mS() < timeout_ms)) {
fkellermavnet 1:ac2de545b981 591 if (charReady()) {
fkellermavnet 0:affdbb35faa4 592 chin_last = chin;
fkellermavnet 1:ac2de545b981 593 chin = getc();
fkellermavnet 0:affdbb35faa4 594 if (isprint(chin)) {
fkellermavnet 1:ac2de545b981 595 *buff += chin;
fkellermavnet 0:affdbb35faa4 596 len++; // Bound the copy length to something reaonable just in case
fkellermavnet 0:affdbb35faa4 597 continue;
fkellermavnet 0:affdbb35faa4 598 }
fkellermavnet 0:affdbb35faa4 599 else if ((('\r' == chin_last) && ('\n' == chin)) || (('\n' == chin_last) && ('\r' == chin))) {
fkellermavnet 0:affdbb35faa4 600 break;
fkellermavnet 0:affdbb35faa4 601 }
fkellermavnet 0:affdbb35faa4 602 }
fkellermavnet 0:affdbb35faa4 603 }
fkellermavnet 0:affdbb35faa4 604 stopTimerB();
fkellermavnet 0:affdbb35faa4 605
fkellermavnet 0:affdbb35faa4 606 if (len >= (MAX_LEN_WNC_CMD_RESPONSE - 1))
fkellermavnet 0:affdbb35faa4 607 dbgPuts("Max cmd length reply exceeded!");
fkellermavnet 0:affdbb35faa4 608
fkellermavnet 0:affdbb35faa4 609 return (len);
fkellermavnet 0:affdbb35faa4 610 }
fkellermavnet 0:affdbb35faa4 611
fkellermavnet 0:affdbb35faa4 612 // Eventually this should try to reinstate the sockets open
fkellermavnet 0:affdbb35faa4 613 bool WncController::softwareInitMdm(void)
fkellermavnet 0:affdbb35faa4 614 {
fkellermavnet 0:affdbb35faa4 615 static bool reportStatus = true;
fkellermavnet 0:affdbb35faa4 616 unsigned i;
fkellermavnet 0:affdbb35faa4 617
fkellermavnet 0:affdbb35faa4 618 if (checkCellLink() == true) {
fkellermavnet 0:affdbb35faa4 619 if (reportStatus == false) {
fkellermavnet 0:affdbb35faa4 620 dbgPuts("Re-connected to cellular network!");
fkellermavnet 0:affdbb35faa4 621 reportStatus = true;
fkellermavnet 0:affdbb35faa4 622 }
fkellermavnet 0:affdbb35faa4 623
fkellermavnet 0:affdbb35faa4 624 // WNC has SIM and registered on network so
fkellermavnet 0:affdbb35faa4 625 // soft initialize the WNC.
fkellermavnet 0:affdbb35faa4 626 for (i = 0; i < WNC_SOFT_INIT_RETRY_COUNT; i++)
fkellermavnet 0:affdbb35faa4 627 if (at_init_wnc() == true)
fkellermavnet 0:affdbb35faa4 628 break;
fkellermavnet 0:affdbb35faa4 629
fkellermavnet 0:affdbb35faa4 630 // If it did not respond try a hardware init
fkellermavnet 0:affdbb35faa4 631 if (i == WNC_SOFT_INIT_RETRY_COUNT)
fkellermavnet 0:affdbb35faa4 632 {
fkellermavnet 0:affdbb35faa4 633 at_reinitialize_mdm();
fkellermavnet 0:affdbb35faa4 634 return (at_init_wnc(true)); // Hard reset occurred so make it go through the software init();
fkellermavnet 0:affdbb35faa4 635 }
fkellermavnet 0:affdbb35faa4 636 else
fkellermavnet 0:affdbb35faa4 637 return (true);
fkellermavnet 0:affdbb35faa4 638 }
fkellermavnet 0:affdbb35faa4 639 else
fkellermavnet 0:affdbb35faa4 640 {
fkellermavnet 0:affdbb35faa4 641 if (reportStatus == true) {
fkellermavnet 0:affdbb35faa4 642 dbgPuts("Not connected to cellular network!");
fkellermavnet 0:affdbb35faa4 643 reportStatus = false;
fkellermavnet 0:affdbb35faa4 644 }
fkellermavnet 0:affdbb35faa4 645 return (false);
fkellermavnet 0:affdbb35faa4 646 }
fkellermavnet 0:affdbb35faa4 647 }
fkellermavnet 0:affdbb35faa4 648
fkellermavnet 0:affdbb35faa4 649
fkellermavnet 0:affdbb35faa4 650 // Sets a global with failure or success, assumes 1 thread all the time
fkellermavnet 0:affdbb35faa4 651 WncController::AtCmdErr_e WncController::sendWncCmd(const char * const s, string ** r, int ms_timeout)
fkellermavnet 0:affdbb35faa4 652 {
fkellermavnet 0:affdbb35faa4 653 if (checkCellLink() == false) {
fkellermavnet 0:affdbb35faa4 654 static string noRespStr;
fkellermavnet 0:affdbb35faa4 655
fkellermavnet 0:affdbb35faa4 656 // Save some run-time!
fkellermavnet 0:affdbb35faa4 657 if (m_sDebugEnabled)
fkellermavnet 0:affdbb35faa4 658 {
fkellermavnet 0:affdbb35faa4 659 dbgPuts("FAIL send cmd: ", false);
fkellermavnet 0:affdbb35faa4 660 if (m_sMoreDebugEnabled && m_sDebugEnabled) {
fkellermavnet 0:affdbb35faa4 661 dbgPutsNoTime(s);
fkellermavnet 0:affdbb35faa4 662 }
fkellermavnet 0:affdbb35faa4 663 else {
fkellermavnet 0:affdbb35faa4 664 size_t n = strlen(s);
fkellermavnet 0:affdbb35faa4 665 if (n <= WNC_TRUNC_DEBUG_LENGTH) {
fkellermavnet 0:affdbb35faa4 666 dbgPutsNoTime(s);
fkellermavnet 0:affdbb35faa4 667 }
fkellermavnet 0:affdbb35faa4 668 else {
fkellermavnet 0:affdbb35faa4 669 string truncStr(s,WNC_TRUNC_DEBUG_LENGTH/2);
fkellermavnet 0:affdbb35faa4 670 truncStr += "..";
fkellermavnet 0:affdbb35faa4 671 truncStr += &s[n-(WNC_TRUNC_DEBUG_LENGTH/2)];
fkellermavnet 0:affdbb35faa4 672 dbgPutsNoTime(truncStr.c_str());
fkellermavnet 0:affdbb35faa4 673 }
fkellermavnet 0:affdbb35faa4 674 }
fkellermavnet 0:affdbb35faa4 675 }
fkellermavnet 0:affdbb35faa4 676
fkellermavnet 0:affdbb35faa4 677 noRespStr.erase();
fkellermavnet 0:affdbb35faa4 678 *r = &noRespStr;
fkellermavnet 0:affdbb35faa4 679
fkellermavnet 0:affdbb35faa4 680 return (WNC_AT_CMD_NO_CELL_LINK);
fkellermavnet 0:affdbb35faa4 681 }
fkellermavnet 0:affdbb35faa4 682
fkellermavnet 0:affdbb35faa4 683 if (m_sCheckNetStatus)
fkellermavnet 0:affdbb35faa4 684 {
fkellermavnet 0:affdbb35faa4 685 if (m_sMoreDebugEnabled)
fkellermavnet 0:affdbb35faa4 686 dbgPuts("[---------- Network Status -------------");
fkellermavnet 0:affdbb35faa4 687 string * pRespStr;
fkellermavnet 0:affdbb35faa4 688 at_send_wnc_cmd("AT@SOCKDIAL?", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 689 if (m_sMoreDebugEnabled)
fkellermavnet 0:affdbb35faa4 690 dbgPuts("---------------------------------------]");
fkellermavnet 0:affdbb35faa4 691 }
fkellermavnet 0:affdbb35faa4 692
fkellermavnet 0:affdbb35faa4 693 // If WNC ready, send user command
fkellermavnet 0:affdbb35faa4 694 return (at_send_wnc_cmd(s, r, ms_timeout));
fkellermavnet 0:affdbb35faa4 695 }
fkellermavnet 0:affdbb35faa4 696
fkellermavnet 0:affdbb35faa4 697 WncController::AtCmdErr_e WncController::at_send_wnc_cmd(const char * s, string ** r, int ms_timeout)
fkellermavnet 0:affdbb35faa4 698 {
fkellermavnet 0:affdbb35faa4 699 // Save some run-time!
fkellermavnet 0:affdbb35faa4 700 if (m_sDebugEnabled)
fkellermavnet 0:affdbb35faa4 701 {
fkellermavnet 0:affdbb35faa4 702 if (m_sMoreDebugEnabled) {
fkellermavnet 0:affdbb35faa4 703 dbgPuts("TX: ", false); dbgPutsNoTime(s);
fkellermavnet 0:affdbb35faa4 704 }
fkellermavnet 0:affdbb35faa4 705 else {
fkellermavnet 0:affdbb35faa4 706 if (m_sDebugEnabled) { // Save some run-time!
fkellermavnet 0:affdbb35faa4 707 size_t n = strlen(s);
fkellermavnet 0:affdbb35faa4 708 if (n <= WNC_TRUNC_DEBUG_LENGTH) {
fkellermavnet 0:affdbb35faa4 709 dbgPuts("TX: ", false); dbgPutsNoTime(s);
fkellermavnet 0:affdbb35faa4 710 }
fkellermavnet 0:affdbb35faa4 711 else {
fkellermavnet 0:affdbb35faa4 712 string truncStr(s,WNC_TRUNC_DEBUG_LENGTH/2);
fkellermavnet 0:affdbb35faa4 713 truncStr += "..";
fkellermavnet 0:affdbb35faa4 714 truncStr += &s[n - (WNC_TRUNC_DEBUG_LENGTH/2)];
fkellermavnet 0:affdbb35faa4 715 dbgPuts("TX: ", false); dbgPutsNoTime(truncStr.c_str());
fkellermavnet 0:affdbb35faa4 716 }
fkellermavnet 0:affdbb35faa4 717 }
fkellermavnet 0:affdbb35faa4 718 }
fkellermavnet 0:affdbb35faa4 719 }
fkellermavnet 0:affdbb35faa4 720
fkellermavnet 0:affdbb35faa4 721 AtCmdErr_e atResult = mdmSendAtCmdRsp(s, ms_timeout, &m_sWncStr);
fkellermavnet 0:affdbb35faa4 722 *r = &m_sWncStr; // Return a pointer to the static string
fkellermavnet 0:affdbb35faa4 723
fkellermavnet 0:affdbb35faa4 724 if (atResult != WNC_AT_CMD_TIMEOUT) {
fkellermavnet 0:affdbb35faa4 725 // Save some run-time!
fkellermavnet 0:affdbb35faa4 726 if (m_sDebugEnabled)
fkellermavnet 0:affdbb35faa4 727 {
fkellermavnet 0:affdbb35faa4 728 dbgPuts("RX: ", false);
fkellermavnet 0:affdbb35faa4 729 if (m_sMoreDebugEnabled) {
fkellermavnet 0:affdbb35faa4 730 dbgPutsNoTime(m_sWncStr.c_str());
fkellermavnet 0:affdbb35faa4 731 }
fkellermavnet 0:affdbb35faa4 732 else {
fkellermavnet 0:affdbb35faa4 733 if (m_sWncStr.size() <= WNC_TRUNC_DEBUG_LENGTH) {
fkellermavnet 0:affdbb35faa4 734 dbgPutsNoTime(m_sWncStr.c_str());
fkellermavnet 0:affdbb35faa4 735 }
fkellermavnet 0:affdbb35faa4 736 else {
fkellermavnet 0:affdbb35faa4 737 string truncStr = m_sWncStr.substr(0,WNC_TRUNC_DEBUG_LENGTH/2) + "..";
fkellermavnet 0:affdbb35faa4 738 truncStr += m_sWncStr.substr(m_sWncStr.size() - (WNC_TRUNC_DEBUG_LENGTH/2), WNC_TRUNC_DEBUG_LENGTH/2);
fkellermavnet 0:affdbb35faa4 739 dbgPutsNoTime(truncStr.c_str());
fkellermavnet 0:affdbb35faa4 740 }
fkellermavnet 0:affdbb35faa4 741 }
fkellermavnet 0:affdbb35faa4 742 }
fkellermavnet 0:affdbb35faa4 743 }
fkellermavnet 0:affdbb35faa4 744 else {
fkellermavnet 0:affdbb35faa4 745 dbgPuts("AT Cmd TIMEOUT!");
fkellermavnet 0:affdbb35faa4 746 dbgPuts("RX: ", false); dbgPutsNoTime(m_sWncStr.c_str());
fkellermavnet 0:affdbb35faa4 747 }
fkellermavnet 0:affdbb35faa4 748
fkellermavnet 0:affdbb35faa4 749 return (atResult);
fkellermavnet 0:affdbb35faa4 750 }
fkellermavnet 0:affdbb35faa4 751
fkellermavnet 0:affdbb35faa4 752 void WncController::closeOpenSocket(uint16_t numSock)
fkellermavnet 0:affdbb35faa4 753 {
fkellermavnet 0:affdbb35faa4 754 // Try to open and close the socket
fkellermavnet 0:affdbb35faa4 755 do {
fkellermavnet 0:affdbb35faa4 756 dbgPuts("Try to close and re-open socket");
fkellermavnet 0:affdbb35faa4 757 at_sockclose_wnc(numSock);
fkellermavnet 1:ac2de545b981 758 m_sSock[numSock].open = at_sockopen_wnc(m_sSock[numSock].myIpAddressStr.c_str(), m_sSock[numSock].myPort, numSock, m_sSock[numSock].isTcp, m_sSock[numSock].timeOutSec);
fkellermavnet 0:affdbb35faa4 759 if (m_sSock[numSock].open == false)
fkellermavnet 0:affdbb35faa4 760 dbgPuts("Failed to re-open socket!");
fkellermavnet 0:affdbb35faa4 761 } while (m_sSock[numSock].open == false);
fkellermavnet 0:affdbb35faa4 762 }
fkellermavnet 0:affdbb35faa4 763
fkellermavnet 0:affdbb35faa4 764 bool WncController::sendSMSText(const char * const phoneNum, const char * const text)
fkellermavnet 0:affdbb35faa4 765 {
fkellermavnet 0:affdbb35faa4 766 if (at_sendSMStext_wnc(phoneNum, text) == true)
fkellermavnet 0:affdbb35faa4 767 return (true);
fkellermavnet 0:affdbb35faa4 768 else {
fkellermavnet 0:affdbb35faa4 769 dbgPuts("sendSMSText: Failed!");
fkellermavnet 0:affdbb35faa4 770 return (false);
fkellermavnet 0:affdbb35faa4 771 }
fkellermavnet 0:affdbb35faa4 772 }
fkellermavnet 0:affdbb35faa4 773
fkellermavnet 0:affdbb35faa4 774 size_t WncController::readSMSLog(const char ** log)
fkellermavnet 0:affdbb35faa4 775 {
fkellermavnet 0:affdbb35faa4 776 size_t n;
fkellermavnet 0:affdbb35faa4 777
fkellermavnet 0:affdbb35faa4 778 n = at_readSMSlog_wnc(log);
fkellermavnet 0:affdbb35faa4 779 if (n == 0)
fkellermavnet 0:affdbb35faa4 780 dbgPuts("readSMSLog: Failed!");
fkellermavnet 0:affdbb35faa4 781
fkellermavnet 0:affdbb35faa4 782 return (n);
fkellermavnet 0:affdbb35faa4 783 }
fkellermavnet 0:affdbb35faa4 784
fkellermavnet 0:affdbb35faa4 785 size_t WncController::getSignalQuality(const char ** log)
fkellermavnet 0:affdbb35faa4 786 {
fkellermavnet 0:affdbb35faa4 787 size_t n;
fkellermavnet 0:affdbb35faa4 788
fkellermavnet 0:affdbb35faa4 789 n = at_getSignalQuality_wnc(log);
fkellermavnet 0:affdbb35faa4 790 if (n == 0)
fkellermavnet 0:affdbb35faa4 791 dbgPuts("readSMSText: Failed!");
fkellermavnet 0:affdbb35faa4 792
fkellermavnet 0:affdbb35faa4 793 return (n);
fkellermavnet 0:affdbb35faa4 794 }
fkellermavnet 0:affdbb35faa4 795
fkellermavnet 0:affdbb35faa4 796 size_t WncController::at_getSignalQuality_wnc(const char ** log)
fkellermavnet 0:affdbb35faa4 797 {
fkellermavnet 0:affdbb35faa4 798 string * pRespStr;
fkellermavnet 0:affdbb35faa4 799 static string logStr;
fkellermavnet 0:affdbb35faa4 800
fkellermavnet 0:affdbb35faa4 801 logStr.erase();
fkellermavnet 0:affdbb35faa4 802
fkellermavnet 0:affdbb35faa4 803 if (at_send_wnc_cmd("AT%MEAS=\"0\"", &pRespStr, m_sCmdTimeoutMs) == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 804 logStr = *pRespStr;
fkellermavnet 0:affdbb35faa4 805 logStr += "\r\n";
fkellermavnet 0:affdbb35faa4 806 }
fkellermavnet 0:affdbb35faa4 807 else
fkellermavnet 0:affdbb35faa4 808 dbgPuts("AT%MEAS=0: failed!");
fkellermavnet 0:affdbb35faa4 809
fkellermavnet 0:affdbb35faa4 810 if (at_send_wnc_cmd("AT%MEAS=\"1\"", &pRespStr, m_sCmdTimeoutMs) == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 811 logStr += *pRespStr;
fkellermavnet 0:affdbb35faa4 812 logStr += "\r\n";
fkellermavnet 0:affdbb35faa4 813 }
fkellermavnet 0:affdbb35faa4 814 else
fkellermavnet 0:affdbb35faa4 815 dbgPuts("AT%MEAS=1: failed!");
fkellermavnet 0:affdbb35faa4 816
fkellermavnet 0:affdbb35faa4 817 if (at_send_wnc_cmd("AT%MEAS=\"2\"", &pRespStr, m_sCmdTimeoutMs) == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 818 logStr += *pRespStr;
fkellermavnet 0:affdbb35faa4 819 logStr += "\r\n";
fkellermavnet 0:affdbb35faa4 820 }
fkellermavnet 0:affdbb35faa4 821 else
fkellermavnet 0:affdbb35faa4 822 dbgPuts("AT%MEAS=2: failed!");
fkellermavnet 0:affdbb35faa4 823
fkellermavnet 0:affdbb35faa4 824 if (at_send_wnc_cmd("AT%MEAS=\"3\"", &pRespStr, m_sCmdTimeoutMs) == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 825 logStr += *pRespStr;
fkellermavnet 0:affdbb35faa4 826 logStr += "\r\n";
fkellermavnet 0:affdbb35faa4 827 }
fkellermavnet 0:affdbb35faa4 828 else
fkellermavnet 0:affdbb35faa4 829 dbgPuts("AT%MEAS=3: failed!");
fkellermavnet 0:affdbb35faa4 830
fkellermavnet 0:affdbb35faa4 831 if (at_send_wnc_cmd("AT%MEAS=\"4\"", &pRespStr, m_sCmdTimeoutMs) == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 832 logStr += *pRespStr;
fkellermavnet 0:affdbb35faa4 833 logStr += "\r\n";
fkellermavnet 0:affdbb35faa4 834 }
fkellermavnet 0:affdbb35faa4 835 else
fkellermavnet 0:affdbb35faa4 836 dbgPuts("AT%MEAS=4: failed!");
fkellermavnet 0:affdbb35faa4 837
fkellermavnet 0:affdbb35faa4 838 if (at_send_wnc_cmd("AT%MEAS=\"5\"", &pRespStr, m_sCmdTimeoutMs) == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 839 logStr += *pRespStr;
fkellermavnet 0:affdbb35faa4 840 logStr += "\r\n";
fkellermavnet 0:affdbb35faa4 841 }
fkellermavnet 0:affdbb35faa4 842 else
fkellermavnet 0:affdbb35faa4 843 dbgPuts("AT%MEAS=5: failed!");
fkellermavnet 0:affdbb35faa4 844
fkellermavnet 0:affdbb35faa4 845 if (at_send_wnc_cmd("AT%MEAS=\"8\"", &pRespStr, m_sCmdTimeoutMs) == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 846 logStr += *pRespStr;
fkellermavnet 0:affdbb35faa4 847 logStr += "\r\n";
fkellermavnet 0:affdbb35faa4 848 }
fkellermavnet 0:affdbb35faa4 849 else
fkellermavnet 0:affdbb35faa4 850 dbgPuts("AT%MEAS=8: failed!");
fkellermavnet 0:affdbb35faa4 851
fkellermavnet 0:affdbb35faa4 852 if (at_send_wnc_cmd("AT%MEAS=\"98\"", &pRespStr, m_sCmdTimeoutMs) == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 853 logStr += *pRespStr;
fkellermavnet 0:affdbb35faa4 854 logStr += "\r\n";
fkellermavnet 0:affdbb35faa4 855 }
fkellermavnet 0:affdbb35faa4 856 else
fkellermavnet 0:affdbb35faa4 857 dbgPuts("AT%MEAS=98: failed!");
fkellermavnet 0:affdbb35faa4 858
fkellermavnet 0:affdbb35faa4 859 *log = logStr.c_str();
fkellermavnet 0:affdbb35faa4 860
fkellermavnet 0:affdbb35faa4 861 return (logStr.size());
fkellermavnet 0:affdbb35faa4 862 }
fkellermavnet 0:affdbb35faa4 863
fkellermavnet 0:affdbb35faa4 864 bool WncController::getTimeDate(struct WncDateTime * tod)
fkellermavnet 0:affdbb35faa4 865 {
fkellermavnet 0:affdbb35faa4 866 if (at_gettimedate_wnc(tod) == true)
fkellermavnet 0:affdbb35faa4 867 return (true);
fkellermavnet 0:affdbb35faa4 868 else {
fkellermavnet 0:affdbb35faa4 869 dbgPuts("Get time date failed!");
fkellermavnet 0:affdbb35faa4 870 return (false);
fkellermavnet 0:affdbb35faa4 871 }
fkellermavnet 0:affdbb35faa4 872 }
fkellermavnet 0:affdbb35faa4 873
fkellermavnet 0:affdbb35faa4 874 bool WncController::at_ping_wnc(const char * ip)
fkellermavnet 0:affdbb35faa4 875 {
fkellermavnet 0:affdbb35faa4 876 string * pRespStr;
fkellermavnet 0:affdbb35faa4 877 string cmdStr = "AT@PINGREQ=\"";
fkellermavnet 0:affdbb35faa4 878 cmdStr += ip;
fkellermavnet 0:affdbb35faa4 879 cmdStr += "\"";
fkellermavnet 0:affdbb35faa4 880 return (at_send_wnc_cmd(cmdStr.c_str(), &pRespStr, WNC_PING_CMD_TIMEOUT_MS) == WNC_AT_CMD_OK);
fkellermavnet 0:affdbb35faa4 881 }
fkellermavnet 0:affdbb35faa4 882
fkellermavnet 0:affdbb35faa4 883 bool WncController::at_gettimedate_wnc(struct WncDateTime * tod)
fkellermavnet 0:affdbb35faa4 884 {
fkellermavnet 0:affdbb35faa4 885 string * pRespStr;
fkellermavnet 0:affdbb35faa4 886 char * pEnd;
fkellermavnet 0:affdbb35faa4 887
fkellermavnet 0:affdbb35faa4 888 if (at_send_wnc_cmd("AT+CCLK?", &pRespStr, m_sCmdTimeoutMs) == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 889 if (pRespStr->size() > 0) {
fkellermavnet 0:affdbb35faa4 890 size_t pos1 = pRespStr->find("+CCLK:");
fkellermavnet 0:affdbb35faa4 891 if (pos1 != string::npos) {
fkellermavnet 0:affdbb35faa4 892 pEnd = (char *)pRespStr->c_str() + pos1 + 8;
fkellermavnet 0:affdbb35faa4 893 tod->year = strtol(pEnd, &pEnd, 10);
fkellermavnet 0:affdbb35faa4 894 tod->month = strtol(pEnd+1, &pEnd, 10);
fkellermavnet 0:affdbb35faa4 895 tod->day = strtol(pEnd+1, &pEnd, 10);
fkellermavnet 0:affdbb35faa4 896 tod->hour = strtol(pEnd+1, &pEnd, 10);
fkellermavnet 0:affdbb35faa4 897 tod->min = strtol(pEnd+1, &pEnd, 10);
fkellermavnet 0:affdbb35faa4 898 tod->sec = strtol(pEnd+1, &pEnd, 10);
fkellermavnet 0:affdbb35faa4 899 return (true);
fkellermavnet 0:affdbb35faa4 900 }
fkellermavnet 0:affdbb35faa4 901 }
fkellermavnet 0:affdbb35faa4 902 }
fkellermavnet 0:affdbb35faa4 903
fkellermavnet 0:affdbb35faa4 904 return (false);
fkellermavnet 0:affdbb35faa4 905 }
fkellermavnet 0:affdbb35faa4 906
fkellermavnet 0:affdbb35faa4 907 size_t WncController::readSMSText(const char ** log)
fkellermavnet 0:affdbb35faa4 908 {
fkellermavnet 0:affdbb35faa4 909 size_t n;
fkellermavnet 0:affdbb35faa4 910
fkellermavnet 0:affdbb35faa4 911 n = at_readSMStext_wnc(log);
fkellermavnet 0:affdbb35faa4 912 if (n == 0)
fkellermavnet 0:affdbb35faa4 913 dbgPuts("readSMSText: Failed!");
fkellermavnet 0:affdbb35faa4 914
fkellermavnet 0:affdbb35faa4 915 return (n);
fkellermavnet 0:affdbb35faa4 916 }
fkellermavnet 0:affdbb35faa4 917
fkellermavnet 0:affdbb35faa4 918 bool WncController::at_get_wnc_net_stats(WncIpStats * s)
fkellermavnet 0:affdbb35faa4 919 {
fkellermavnet 0:affdbb35faa4 920 string * pRespStr;
fkellermavnet 0:affdbb35faa4 921 AtCmdErr_e cmdRes = at_send_wnc_cmd("AT+CGCONTRDP=1", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 922
fkellermavnet 0:affdbb35faa4 923 if (WNC_AT_CMD_OK == cmdRes) {
fkellermavnet 0:affdbb35faa4 924 if (pRespStr->size() > 0) {
fkellermavnet 0:affdbb35faa4 925 memset((void*)s, '\0', sizeof(*s)); // Clean-up
fkellermavnet 0:affdbb35faa4 926 string ss;
fkellermavnet 0:affdbb35faa4 927 unsigned i;
fkellermavnet 0:affdbb35faa4 928 size_t pe;
fkellermavnet 0:affdbb35faa4 929 size_t ps = pRespStr->rfind("\"");
fkellermavnet 0:affdbb35faa4 930 if (ps != string::npos) {
fkellermavnet 0:affdbb35faa4 931 ps += 2; // Skip the , after the "
fkellermavnet 0:affdbb35faa4 932 pe = ps;
fkellermavnet 0:affdbb35faa4 933 for(i=0;i<4;i++)
fkellermavnet 0:affdbb35faa4 934 pe = pRespStr->find(".", pe) + 1;
fkellermavnet 0:affdbb35faa4 935 ss = pRespStr->substr(ps, pe - 1 - ps);
fkellermavnet 0:affdbb35faa4 936 strncpy(s->ip, ss.c_str(), MAX_LEN_IP_STR);
fkellermavnet 0:affdbb35faa4 937 s->ip[MAX_LEN_IP_STR - 1] = '\0';
fkellermavnet 0:affdbb35faa4 938 ps = pe;
fkellermavnet 0:affdbb35faa4 939 for(i=0;i<3;i++)
fkellermavnet 0:affdbb35faa4 940 pe = pRespStr->find(".", pe) + 1;
fkellermavnet 0:affdbb35faa4 941 pe = pRespStr->find(",", pe);
fkellermavnet 0:affdbb35faa4 942 ss = pRespStr->substr(ps, pe - ps);
fkellermavnet 0:affdbb35faa4 943 strncpy(s->mask, ss.c_str(), MAX_LEN_IP_STR);
fkellermavnet 0:affdbb35faa4 944 s->mask[MAX_LEN_IP_STR - 1] = '\0';
fkellermavnet 0:affdbb35faa4 945 ps = pe + 1;
fkellermavnet 0:affdbb35faa4 946 for(i=0;i<3;i++)
fkellermavnet 0:affdbb35faa4 947 pe = pRespStr->find(".", pe) + 1;
fkellermavnet 0:affdbb35faa4 948 pe = pRespStr->find(",", pe);
fkellermavnet 0:affdbb35faa4 949 ss = pRespStr->substr(ps, pe - ps);
fkellermavnet 0:affdbb35faa4 950 strncpy(s->gateway, ss.c_str(), MAX_LEN_IP_STR);
fkellermavnet 0:affdbb35faa4 951 s->gateway[MAX_LEN_IP_STR - 1] = '\0';
fkellermavnet 0:affdbb35faa4 952 ps = pe + 1;
fkellermavnet 0:affdbb35faa4 953 for(i=0;i<3;i++)
fkellermavnet 0:affdbb35faa4 954 pe = pRespStr->find(".", pe) + 1;
fkellermavnet 0:affdbb35faa4 955 pe = pRespStr->find(",", pe);
fkellermavnet 0:affdbb35faa4 956 ss = pRespStr->substr(ps, pe - ps);
fkellermavnet 0:affdbb35faa4 957 strncpy(s->dnsPrimary, ss.c_str(), MAX_LEN_IP_STR);
fkellermavnet 0:affdbb35faa4 958 s->dnsPrimary[MAX_LEN_IP_STR - 1] = '\0';
fkellermavnet 0:affdbb35faa4 959 ps = pe + 1;
fkellermavnet 0:affdbb35faa4 960 for(i=0;i<3;i++)
fkellermavnet 0:affdbb35faa4 961 pe = pRespStr->find(".", pe) + 1;
fkellermavnet 0:affdbb35faa4 962 pe = pRespStr->find(",", pe);
fkellermavnet 0:affdbb35faa4 963 ss = pRespStr->substr(ps, pe - ps);
fkellermavnet 0:affdbb35faa4 964 strncpy(s->dnsSecondary, ss.c_str(), MAX_LEN_IP_STR);
fkellermavnet 0:affdbb35faa4 965 s->dnsSecondary[MAX_LEN_IP_STR - 1] = '\0';
fkellermavnet 0:affdbb35faa4 966
fkellermavnet 0:affdbb35faa4 967 dbgPuts("~~~~~~~~~~ WNC IP Stats ~~~~~~~~~~~~");
fkellermavnet 0:affdbb35faa4 968 dbgPuts("ip: ", false); dbgPutsNoTime(s->ip);
fkellermavnet 0:affdbb35faa4 969 dbgPuts("mask: ", false); dbgPutsNoTime(s->mask);
fkellermavnet 0:affdbb35faa4 970 dbgPuts("gateway: ", false); dbgPutsNoTime(s->gateway);
fkellermavnet 0:affdbb35faa4 971 dbgPuts("dns pri: ", false); dbgPutsNoTime(s->dnsPrimary);
fkellermavnet 0:affdbb35faa4 972 dbgPuts("dns sec: ", false); dbgPutsNoTime(s->dnsSecondary);
fkellermavnet 0:affdbb35faa4 973 dbgPuts("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
fkellermavnet 0:affdbb35faa4 974
fkellermavnet 0:affdbb35faa4 975 return (true);
fkellermavnet 0:affdbb35faa4 976 }
fkellermavnet 0:affdbb35faa4 977 }
fkellermavnet 0:affdbb35faa4 978 }
fkellermavnet 0:affdbb35faa4 979
fkellermavnet 0:affdbb35faa4 980 return (false);
fkellermavnet 0:affdbb35faa4 981 }
fkellermavnet 0:affdbb35faa4 982
fkellermavnet 0:affdbb35faa4 983 bool WncController::deleteSMSTextFromMem(char msgIdx)
fkellermavnet 0:affdbb35faa4 984 {
fkellermavnet 0:affdbb35faa4 985 const char * err = "deleteSMSTextFromMem: Failed!";
fkellermavnet 0:affdbb35faa4 986
fkellermavnet 0:affdbb35faa4 987 switch (msgIdx)
fkellermavnet 0:affdbb35faa4 988 {
fkellermavnet 0:affdbb35faa4 989 case '*':
fkellermavnet 0:affdbb35faa4 990 at_deleteSMSTextFromMem_wnc('1');
fkellermavnet 0:affdbb35faa4 991 at_deleteSMSTextFromMem_wnc('2');
fkellermavnet 0:affdbb35faa4 992 at_deleteSMSTextFromMem_wnc('3');
fkellermavnet 0:affdbb35faa4 993 return (true); // WNC may error if slot empty, just ignore!
fkellermavnet 0:affdbb35faa4 994
fkellermavnet 0:affdbb35faa4 995 case '1':
fkellermavnet 0:affdbb35faa4 996 case '2':
fkellermavnet 0:affdbb35faa4 997 case '3':
fkellermavnet 0:affdbb35faa4 998 if (true == at_deleteSMSTextFromMem_wnc(msgIdx))
fkellermavnet 0:affdbb35faa4 999 return (true);
fkellermavnet 0:affdbb35faa4 1000 else {
fkellermavnet 0:affdbb35faa4 1001 dbgPuts(err);
fkellermavnet 0:affdbb35faa4 1002 return (false);
fkellermavnet 0:affdbb35faa4 1003 }
fkellermavnet 0:affdbb35faa4 1004
fkellermavnet 0:affdbb35faa4 1005 default:
fkellermavnet 0:affdbb35faa4 1006 dbgPuts(err);
fkellermavnet 0:affdbb35faa4 1007 return (false);
fkellermavnet 0:affdbb35faa4 1008 }
fkellermavnet 0:affdbb35faa4 1009 }
fkellermavnet 0:affdbb35faa4 1010
fkellermavnet 0:affdbb35faa4 1011 bool WncController::sendSMSTextFromMem(char msgIdx)
fkellermavnet 0:affdbb35faa4 1012 {
fkellermavnet 0:affdbb35faa4 1013 const char * err = "deleteSMSTextFromMem: Failed!";
fkellermavnet 0:affdbb35faa4 1014
fkellermavnet 0:affdbb35faa4 1015 switch (msgIdx)
fkellermavnet 0:affdbb35faa4 1016 {
fkellermavnet 0:affdbb35faa4 1017 case '*':
fkellermavnet 0:affdbb35faa4 1018 at_sendSMStextMem_wnc('1');
fkellermavnet 0:affdbb35faa4 1019 at_sendSMStextMem_wnc('2');
fkellermavnet 0:affdbb35faa4 1020 at_sendSMStextMem_wnc('3');
fkellermavnet 0:affdbb35faa4 1021 return (true); // WNC may error if slot is empty, just ignore!
fkellermavnet 0:affdbb35faa4 1022
fkellermavnet 0:affdbb35faa4 1023 case '1':
fkellermavnet 0:affdbb35faa4 1024 case '2':
fkellermavnet 0:affdbb35faa4 1025 case '3':
fkellermavnet 0:affdbb35faa4 1026 if (at_sendSMStextMem_wnc(msgIdx) == true)
fkellermavnet 0:affdbb35faa4 1027 return (true);
fkellermavnet 0:affdbb35faa4 1028 else {
fkellermavnet 0:affdbb35faa4 1029 dbgPuts(err);
fkellermavnet 0:affdbb35faa4 1030 return (false);
fkellermavnet 0:affdbb35faa4 1031 }
fkellermavnet 0:affdbb35faa4 1032
fkellermavnet 0:affdbb35faa4 1033 default:
fkellermavnet 0:affdbb35faa4 1034 dbgPuts(err);
fkellermavnet 0:affdbb35faa4 1035 return (false);
fkellermavnet 0:affdbb35faa4 1036 }
fkellermavnet 0:affdbb35faa4 1037 }
fkellermavnet 0:affdbb35faa4 1038
fkellermavnet 0:affdbb35faa4 1039 bool WncController::at_deleteSMSTextFromMem_wnc(char n)
fkellermavnet 0:affdbb35faa4 1040 {
fkellermavnet 0:affdbb35faa4 1041 string cmdStr, respStr;
fkellermavnet 0:affdbb35faa4 1042 // Message is stored in WNC, now send it!
fkellermavnet 0:affdbb35faa4 1043 cmdStr = "AT+CMGD=";
fkellermavnet 0:affdbb35faa4 1044 cmdStr += n;
fkellermavnet 0:affdbb35faa4 1045 cmdStr += "\r\n";
fkellermavnet 0:affdbb35faa4 1046 dbgPuts("TX: ", false); dbgPutsNoTime(cmdStr.c_str(), false);
fkellermavnet 0:affdbb35faa4 1047 AtCmdErr_e r = mdmSendAtCmdRsp(cmdStr.c_str(), m_sCmdTimeoutMs, &respStr);
fkellermavnet 0:affdbb35faa4 1048 dbgPuts("RX: ", false); dbgPutsNoTime(respStr.c_str());
fkellermavnet 0:affdbb35faa4 1049 return (r == WNC_AT_CMD_OK);
fkellermavnet 0:affdbb35faa4 1050 }
fkellermavnet 0:affdbb35faa4 1051
fkellermavnet 0:affdbb35faa4 1052 bool WncController::at_sendSMStextMem_wnc(char n)
fkellermavnet 0:affdbb35faa4 1053 {
fkellermavnet 0:affdbb35faa4 1054 string cmdStr, respStr;
fkellermavnet 0:affdbb35faa4 1055 // Message is stored in WNC, now send it!
fkellermavnet 0:affdbb35faa4 1056 cmdStr = "AT+CMSS=";
fkellermavnet 0:affdbb35faa4 1057 cmdStr += n;
fkellermavnet 0:affdbb35faa4 1058 cmdStr += "\r\n";
fkellermavnet 0:affdbb35faa4 1059 dbgPuts("TX: ", false); dbgPutsNoTime(cmdStr.c_str(), false);
fkellermavnet 0:affdbb35faa4 1060 AtCmdErr_e r = mdmSendAtCmdRsp(cmdStr.c_str(), m_sCmdTimeoutMs, &respStr);
fkellermavnet 0:affdbb35faa4 1061 dbgPuts("RX: ", false); dbgPutsNoTime(respStr.c_str());
fkellermavnet 0:affdbb35faa4 1062 return (r == WNC_AT_CMD_OK);
fkellermavnet 0:affdbb35faa4 1063 }
fkellermavnet 0:affdbb35faa4 1064
fkellermavnet 0:affdbb35faa4 1065 bool WncController::at_sendSMStext_wnc(const char * const phoneNum, const char * const text)
fkellermavnet 0:affdbb35faa4 1066 {
fkellermavnet 0:affdbb35faa4 1067 string respStr;
fkellermavnet 0:affdbb35faa4 1068 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1069 size_t l = strlen(text);
fkellermavnet 0:affdbb35faa4 1070
fkellermavnet 0:affdbb35faa4 1071 if (l <= MAX_WNC_SMS_LENGTH)
fkellermavnet 0:affdbb35faa4 1072 {
fkellermavnet 0:affdbb35faa4 1073 // Check to see if the SMS service is available
fkellermavnet 0:affdbb35faa4 1074 checkCellLink();
fkellermavnet 0:affdbb35faa4 1075 if (m_sReadyForSMS == true) {
fkellermavnet 0:affdbb35faa4 1076 at_send_wnc_cmd("AT+CMGF=1", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1077 string cmdStr("AT+CMGS=\"");
fkellermavnet 0:affdbb35faa4 1078 cmdStr += phoneNum;
fkellermavnet 0:affdbb35faa4 1079 cmdStr += "\"";
fkellermavnet 0:affdbb35faa4 1080 dbgPuts("TX: ", false); dbgPutsNoTime(cmdStr.c_str());
fkellermavnet 0:affdbb35faa4 1081 cmdStr += "\x0d"; // x0d = <ENTER>
fkellermavnet 0:affdbb35faa4 1082 // Send raw command with short timeout (the timeout will fail cause the WNC is not supposed to reply yet!
fkellermavnet 0:affdbb35faa4 1083 // And we want a delay before sending the actual text part of the string!
fkellermavnet 0:affdbb35faa4 1084 mdmSendAtCmdRsp(cmdStr.c_str(), 300, &respStr, false); // False turns off auto-addition of CR+LF (the WNC wants nothing here)
fkellermavnet 0:affdbb35faa4 1085 dbgPuts("RX: ", false); dbgPutsNoTime(respStr.c_str());
fkellermavnet 0:affdbb35faa4 1086 if ((respStr.size() > 0) && (respStr.find("ERROR") == string::npos)) {
fkellermavnet 0:affdbb35faa4 1087 // Part 2 of the text, this is the actual text part:
fkellermavnet 0:affdbb35faa4 1088 cmdStr = text;
fkellermavnet 0:affdbb35faa4 1089 dbgPuts("TX: ", false); dbgPuts(cmdStr.c_str());
fkellermavnet 0:affdbb35faa4 1090 cmdStr += "\x1A"; // <CTRL>-Z is what tells the WNC the message is complete to send!
fkellermavnet 0:affdbb35faa4 1091 AtCmdErr_e r = mdmSendAtCmdRsp(cmdStr.c_str(), 10000, &respStr);
fkellermavnet 0:affdbb35faa4 1092 dbgPuts("RX: ", false); dbgPuts(respStr.c_str());
fkellermavnet 0:affdbb35faa4 1093 if (respStr.size() == 0)
fkellermavnet 0:affdbb35faa4 1094 return (false);
fkellermavnet 0:affdbb35faa4 1095 else
fkellermavnet 0:affdbb35faa4 1096 return (r == WNC_AT_CMD_OK);
fkellermavnet 0:affdbb35faa4 1097 }
fkellermavnet 0:affdbb35faa4 1098 }
fkellermavnet 0:affdbb35faa4 1099 }
fkellermavnet 0:affdbb35faa4 1100
fkellermavnet 0:affdbb35faa4 1101 return (false);
fkellermavnet 0:affdbb35faa4 1102 }
fkellermavnet 0:affdbb35faa4 1103
fkellermavnet 0:affdbb35faa4 1104 bool WncController::saveSMSText(const char * const phoneNum, const char * const text, char * msgIdx)
fkellermavnet 0:affdbb35faa4 1105 {
fkellermavnet 0:affdbb35faa4 1106 if (at_saveSMStext_wnc(phoneNum, text, msgIdx) == true)
fkellermavnet 0:affdbb35faa4 1107 return (true);
fkellermavnet 0:affdbb35faa4 1108 else {
fkellermavnet 0:affdbb35faa4 1109 dbgPuts("saveSMSTextToMem: failed!\r\n");
fkellermavnet 0:affdbb35faa4 1110 return (false);
fkellermavnet 0:affdbb35faa4 1111 }
fkellermavnet 0:affdbb35faa4 1112 }
fkellermavnet 0:affdbb35faa4 1113
fkellermavnet 0:affdbb35faa4 1114 bool WncController::at_saveSMStext_wnc(const char * const phoneNum, const char * const text, char * msgIdx)
fkellermavnet 0:affdbb35faa4 1115 {
fkellermavnet 0:affdbb35faa4 1116 string respStr;
fkellermavnet 0:affdbb35faa4 1117 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1118 size_t l = strlen(text);
fkellermavnet 0:affdbb35faa4 1119
fkellermavnet 0:affdbb35faa4 1120 if (l <= MAX_WNC_SMS_LENGTH)
fkellermavnet 0:affdbb35faa4 1121 {
fkellermavnet 0:affdbb35faa4 1122 // Check to see if the SMS service is available
fkellermavnet 0:affdbb35faa4 1123 checkCellLink();
fkellermavnet 0:affdbb35faa4 1124 if (m_sReadyForSMS == true) {
fkellermavnet 0:affdbb35faa4 1125 at_send_wnc_cmd("AT+CMGF=1", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1126 at_send_wnc_cmd("AT+CPMS=\"SM\",\"SM\",\"SM\"", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1127 string cmdStr("AT+CMGW=\"");
fkellermavnet 0:affdbb35faa4 1128 cmdStr += phoneNum;
fkellermavnet 0:affdbb35faa4 1129 cmdStr += "\"";
fkellermavnet 0:affdbb35faa4 1130 dbgPuts("TX: ", false); dbgPutsNoTime(cmdStr.c_str());
fkellermavnet 0:affdbb35faa4 1131 cmdStr += "\x0d"; // x0d = <ENTER>
fkellermavnet 0:affdbb35faa4 1132 // Send raw command with short timeout (the timeout will fail cause the WNC is not supposed to reply yet!
fkellermavnet 0:affdbb35faa4 1133 // And we want a delay before sending the actual text part of the string!
fkellermavnet 0:affdbb35faa4 1134 mdmSendAtCmdRsp(cmdStr.c_str(), 300, &respStr, false); // False turns off auto-addition of CR+LF (the WNC wants nothing here)
fkellermavnet 0:affdbb35faa4 1135 dbgPuts("RX: ", false); dbgPutsNoTime(respStr.c_str());
fkellermavnet 0:affdbb35faa4 1136 if ((respStr.size() > 0) && (respStr.find("ERROR") == string::npos)) {
fkellermavnet 0:affdbb35faa4 1137 // Part 2 of the text, this is the actual text part:
fkellermavnet 0:affdbb35faa4 1138 cmdStr = text;
fkellermavnet 0:affdbb35faa4 1139 dbgPuts("TX: ", false); dbgPutsNoTime(cmdStr.c_str());
fkellermavnet 0:affdbb35faa4 1140 cmdStr += "\x1A"; // <CTRL>-Z is what tells the WNC the message is complete to save!
fkellermavnet 0:affdbb35faa4 1141 AtCmdErr_e r = mdmSendAtCmdRsp(cmdStr.c_str(), 10000, &respStr);
fkellermavnet 0:affdbb35faa4 1142 dbgPuts("RX: ", false); dbgPutsNoTime(respStr.c_str());
fkellermavnet 0:affdbb35faa4 1143 if (respStr.size() > 0) {
fkellermavnet 0:affdbb35faa4 1144 // respStr will have the SMS index
fkellermavnet 0:affdbb35faa4 1145 size_t pos1 = respStr.find("+CMGW: ");
fkellermavnet 0:affdbb35faa4 1146 size_t pos2 = respStr.rfind("OK");
fkellermavnet 0:affdbb35faa4 1147 if (pos1 != string::npos && pos2 != string::npos) {
fkellermavnet 0:affdbb35faa4 1148 *msgIdx = *string(respStr.substr(pos1+7, 1)).c_str();
fkellermavnet 0:affdbb35faa4 1149 return (true);
fkellermavnet 0:affdbb35faa4 1150 }
fkellermavnet 0:affdbb35faa4 1151 else {
fkellermavnet 0:affdbb35faa4 1152 *msgIdx = '!';
fkellermavnet 0:affdbb35faa4 1153 }
fkellermavnet 0:affdbb35faa4 1154 }
fkellermavnet 0:affdbb35faa4 1155 }
fkellermavnet 0:affdbb35faa4 1156 }
fkellermavnet 0:affdbb35faa4 1157 }
fkellermavnet 0:affdbb35faa4 1158
fkellermavnet 0:affdbb35faa4 1159 return (false);
fkellermavnet 0:affdbb35faa4 1160 }
fkellermavnet 0:affdbb35faa4 1161
fkellermavnet 0:affdbb35faa4 1162
fkellermavnet 0:affdbb35faa4 1163 size_t WncController::at_readSMSlog_wnc(const char ** log)
fkellermavnet 0:affdbb35faa4 1164 {
fkellermavnet 0:affdbb35faa4 1165 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1166
fkellermavnet 0:affdbb35faa4 1167 if (at_send_wnc_cmd("AT+CMGL", &pRespStr, m_sCmdTimeoutMs) == WNC_AT_CMD_OK)
fkellermavnet 0:affdbb35faa4 1168 *log = pRespStr->c_str();
fkellermavnet 0:affdbb35faa4 1169 else
fkellermavnet 0:affdbb35faa4 1170 *log = "\0";
fkellermavnet 0:affdbb35faa4 1171
fkellermavnet 0:affdbb35faa4 1172 return (pRespStr->size());
fkellermavnet 0:affdbb35faa4 1173 }
fkellermavnet 0:affdbb35faa4 1174
fkellermavnet 0:affdbb35faa4 1175 size_t WncController::at_readSMStext_wnc(const char ** log)
fkellermavnet 0:affdbb35faa4 1176 {
fkellermavnet 0:affdbb35faa4 1177 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1178
fkellermavnet 0:affdbb35faa4 1179 if (at_send_wnc_cmd("AT+CMGR", &pRespStr, m_sCmdTimeoutMs) == WNC_AT_CMD_OK)
fkellermavnet 0:affdbb35faa4 1180 *log = pRespStr->c_str();
fkellermavnet 0:affdbb35faa4 1181 else
fkellermavnet 0:affdbb35faa4 1182 *log = "\0";
fkellermavnet 0:affdbb35faa4 1183
fkellermavnet 0:affdbb35faa4 1184 return (pRespStr->size());
fkellermavnet 0:affdbb35faa4 1185 }
fkellermavnet 0:affdbb35faa4 1186
fkellermavnet 0:affdbb35faa4 1187 bool WncController::at_at_wnc(void)
fkellermavnet 0:affdbb35faa4 1188 {
fkellermavnet 0:affdbb35faa4 1189 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1190 return (WNC_AT_CMD_OK == at_send_wnc_cmd("AT", &pRespStr, WNC_QUICK_CMD_TIMEOUT_MS)); // Heartbeat?
fkellermavnet 0:affdbb35faa4 1191 }
fkellermavnet 0:affdbb35faa4 1192
fkellermavnet 0:affdbb35faa4 1193 bool WncController::at_init_wnc(bool hardReset)
fkellermavnet 0:affdbb35faa4 1194 {
fkellermavnet 0:affdbb35faa4 1195 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1196 AtCmdErr_e cmdRes;
fkellermavnet 0:affdbb35faa4 1197
fkellermavnet 0:affdbb35faa4 1198 if (hardReset == true)
fkellermavnet 0:affdbb35faa4 1199 dbgPuts("Hard Soft Reset!");
fkellermavnet 0:affdbb35faa4 1200
fkellermavnet 0:affdbb35faa4 1201 dbgPuts("Start AT init of WNC:");
fkellermavnet 0:affdbb35faa4 1202
fkellermavnet 0:affdbb35faa4 1203 // Kick it twice to perhaps remove cued responses from an incomplete
fkellermavnet 0:affdbb35faa4 1204 // power cycle.
fkellermavnet 0:affdbb35faa4 1205 at_send_wnc_cmd("AT", &pRespStr, WNC_QUICK_CMD_TIMEOUT_MS);
fkellermavnet 0:affdbb35faa4 1206 at_send_wnc_cmd("AT", &pRespStr, WNC_QUICK_CMD_TIMEOUT_MS);
fkellermavnet 0:affdbb35faa4 1207
fkellermavnet 0:affdbb35faa4 1208 // Quick commands below do not need to check cellular connectivity
fkellermavnet 0:affdbb35faa4 1209 at_send_wnc_cmd("ATE0", &pRespStr, WNC_QUICK_CMD_TIMEOUT_MS); // Echo Off
fkellermavnet 0:affdbb35faa4 1210 at_send_wnc_cmd("AT+CMEE=2", &pRespStr, m_sCmdTimeoutMs); // 2 - verbose error, 1 - numeric error, 0 - just ERROR
fkellermavnet 0:affdbb35faa4 1211 cmdRes = at_send_wnc_cmd("AT", &pRespStr, WNC_QUICK_CMD_TIMEOUT_MS); // Heartbeat?
fkellermavnet 0:affdbb35faa4 1212
fkellermavnet 0:affdbb35faa4 1213 // If the simple commands are not working, no chance of more complex.
fkellermavnet 0:affdbb35faa4 1214 // I have seen re-trying commands make it worse.
fkellermavnet 0:affdbb35faa4 1215 if (cmdRes != WNC_AT_CMD_OK)
fkellermavnet 0:affdbb35faa4 1216 return (false);
fkellermavnet 0:affdbb35faa4 1217
fkellermavnet 0:affdbb35faa4 1218 cmdRes = at_send_wnc_cmd("AT@INTERNET=1", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1219 if (cmdRes != WNC_AT_CMD_OK)
fkellermavnet 0:affdbb35faa4 1220 return (false);
fkellermavnet 0:affdbb35faa4 1221
fkellermavnet 0:affdbb35faa4 1222 cmdRes = at_send_wnc_cmd("AT@SOCKDIAL=1", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1223 if (cmdRes != WNC_AT_CMD_OK)
fkellermavnet 0:affdbb35faa4 1224 return (false);
fkellermavnet 0:affdbb35faa4 1225
fkellermavnet 0:affdbb35faa4 1226 dbgPuts("SUCCESS: AT init of WNC!");
fkellermavnet 0:affdbb35faa4 1227
fkellermavnet 0:affdbb35faa4 1228 return (true);
fkellermavnet 0:affdbb35faa4 1229 }
fkellermavnet 0:affdbb35faa4 1230
fkellermavnet 0:affdbb35faa4 1231
fkellermavnet 1:ac2de545b981 1232 bool WncController::at_sockopen_wnc(const char * const ip, uint16_t port, uint16_t numSock, bool tcp, uint16_t timeOutSec)
fkellermavnet 0:affdbb35faa4 1233 {
fkellermavnet 0:affdbb35faa4 1234 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1235 string cmd_str("AT@SOCKCREAT=");
fkellermavnet 0:affdbb35faa4 1236 AtCmdErr_e res;
fkellermavnet 0:affdbb35faa4 1237
fkellermavnet 0:affdbb35faa4 1238 if (tcp) cmd_str += "1"; // TCP
fkellermavnet 0:affdbb35faa4 1239 else cmd_str += "2"; // else UDP
fkellermavnet 0:affdbb35faa4 1240
fkellermavnet 0:affdbb35faa4 1241 cmd_str += ",0";
fkellermavnet 0:affdbb35faa4 1242 res = sendWncCmd(cmd_str.c_str(), &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1243 if (res == WNC_AT_CMD_OK)
fkellermavnet 0:affdbb35faa4 1244 {
fkellermavnet 0:affdbb35faa4 1245 cmd_str = "AT@SOCKCONN=";
fkellermavnet 0:affdbb35faa4 1246 cmd_str += _to_string(numSock + 1);
fkellermavnet 0:affdbb35faa4 1247 cmd_str += ",\"";
fkellermavnet 1:ac2de545b981 1248 cmd_str += ip;
fkellermavnet 0:affdbb35faa4 1249 cmd_str += "\",";
fkellermavnet 0:affdbb35faa4 1250 cmd_str += _to_string(port);
fkellermavnet 0:affdbb35faa4 1251 cmd_str += ",";
fkellermavnet 0:affdbb35faa4 1252 if (timeOutSec < 30)
fkellermavnet 0:affdbb35faa4 1253 timeOutSec = 30;
fkellermavnet 0:affdbb35faa4 1254 else if (timeOutSec > 360)
fkellermavnet 0:affdbb35faa4 1255 timeOutSec = 360;
fkellermavnet 0:affdbb35faa4 1256 cmd_str += _to_string(timeOutSec);
fkellermavnet 0:affdbb35faa4 1257 res = sendWncCmd(cmd_str.c_str(), &pRespStr, 1000 * timeOutSec + 1000);
fkellermavnet 0:affdbb35faa4 1258 if (m_sMoreDebugEnabled) {
fkellermavnet 0:affdbb35faa4 1259 at_send_wnc_cmd("AT@SOCKCREAT?", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1260 at_send_wnc_cmd("AT@SOCKCONN?", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1261 }
fkellermavnet 0:affdbb35faa4 1262 return (res == WNC_AT_CMD_OK);
fkellermavnet 0:affdbb35faa4 1263 }
fkellermavnet 0:affdbb35faa4 1264 else
fkellermavnet 0:affdbb35faa4 1265 return (false);
fkellermavnet 0:affdbb35faa4 1266 }
fkellermavnet 0:affdbb35faa4 1267
fkellermavnet 0:affdbb35faa4 1268 bool WncController::at_sockclose_wnc(uint16_t numSock)
fkellermavnet 0:affdbb35faa4 1269 {
fkellermavnet 0:affdbb35faa4 1270 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1271 string cmd_str("AT@SOCKCLOSE=");
fkellermavnet 0:affdbb35faa4 1272
fkellermavnet 0:affdbb35faa4 1273 cmd_str += _to_string(numSock + 1);
fkellermavnet 0:affdbb35faa4 1274 // Don't check the cell status to close the socket
fkellermavnet 0:affdbb35faa4 1275 return (WNC_AT_CMD_OK == at_send_wnc_cmd(cmd_str.c_str(), &pRespStr, m_sCmdTimeoutMs));
fkellermavnet 0:affdbb35faa4 1276 }
fkellermavnet 0:affdbb35faa4 1277
fkellermavnet 0:affdbb35faa4 1278 bool WncController::at_dnsresolve_wnc(const char * s, string * ipStr)
fkellermavnet 0:affdbb35faa4 1279 {
fkellermavnet 0:affdbb35faa4 1280 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1281 string str(s);
fkellermavnet 0:affdbb35faa4 1282
fkellermavnet 0:affdbb35faa4 1283 ipStr->erase(); // Clear out string until resolved!
fkellermavnet 0:affdbb35faa4 1284 str = "AT@DNSRESVDON=\"" + str;
fkellermavnet 0:affdbb35faa4 1285 str += "\"";
fkellermavnet 0:affdbb35faa4 1286 if (sendWncCmd(str.c_str(), &pRespStr, WNC_DNS_RESOLVE_WAIT_MS) == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 1287 size_t pos_start = pRespStr->find(":\"") + 2;
fkellermavnet 0:affdbb35faa4 1288 if (pos_start != string::npos) {
fkellermavnet 0:affdbb35faa4 1289 size_t pos_end = pRespStr->find("\"", pos_start) - 1;
fkellermavnet 0:affdbb35faa4 1290 if (pos_end != string::npos) {
fkellermavnet 0:affdbb35faa4 1291 if (pos_end > pos_start) {
fkellermavnet 0:affdbb35faa4 1292 // Make a copy for use later (the source string is re-used)
fkellermavnet 0:affdbb35faa4 1293 *ipStr = pRespStr->substr(pos_start, pos_end - pos_start + 1);
fkellermavnet 0:affdbb35faa4 1294 return (true);
fkellermavnet 0:affdbb35faa4 1295 }
fkellermavnet 0:affdbb35faa4 1296 }
fkellermavnet 0:affdbb35faa4 1297 }
fkellermavnet 0:affdbb35faa4 1298 }
fkellermavnet 0:affdbb35faa4 1299
fkellermavnet 0:affdbb35faa4 1300 *ipStr = INVALID_IP_STR;
fkellermavnet 0:affdbb35faa4 1301
fkellermavnet 0:affdbb35faa4 1302 return (false);
fkellermavnet 0:affdbb35faa4 1303 }
fkellermavnet 0:affdbb35faa4 1304
fkellermavnet 0:affdbb35faa4 1305 bool WncController::waitForPowerOnModemToRespond(uint8_t timeoutSecs)
fkellermavnet 0:affdbb35faa4 1306 {
fkellermavnet 0:affdbb35faa4 1307 // Now, give the modem x seconds to start responding by
fkellermavnet 0:affdbb35faa4 1308 // sending simple 'AT' commands to modem once per second.
fkellermavnet 0:affdbb35faa4 1309 if (timeoutSecs > 0) {
fkellermavnet 0:affdbb35faa4 1310 do {
fkellermavnet 0:affdbb35faa4 1311 timeoutSecs--;
fkellermavnet 1:ac2de545b981 1312 dbgPutsNoTime("\rWaiting ", false); dbgPutsNoTime(_to_string(timeoutSecs), false);
fkellermavnet 1:ac2de545b981 1313 dbgPutsNoTime(" ", false);
fkellermavnet 0:affdbb35faa4 1314 AtCmdErr_e rc = mdmSendAtCmdRsp("AT", 500, &m_sWncStr);
fkellermavnet 0:affdbb35faa4 1315 if (rc == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 1316 dbgPutsNoTime(""); // CR LF
fkellermavnet 0:affdbb35faa4 1317 return true; //timer.read();
fkellermavnet 0:affdbb35faa4 1318 }
fkellermavnet 0:affdbb35faa4 1319 waitMs(500);
fkellermavnet 0:affdbb35faa4 1320 }
fkellermavnet 0:affdbb35faa4 1321 while (timeoutSecs > 0);
fkellermavnet 1:ac2de545b981 1322 dbgPutsNoTime(""); // CR LF
fkellermavnet 0:affdbb35faa4 1323 }
fkellermavnet 0:affdbb35faa4 1324
fkellermavnet 0:affdbb35faa4 1325 return (false);
fkellermavnet 0:affdbb35faa4 1326 }
fkellermavnet 0:affdbb35faa4 1327
fkellermavnet 0:affdbb35faa4 1328 WncController::AtCmdErr_e WncController::at_sockwrite_wnc(const char * s, uint32_t n, uint16_t numSock, bool isTcp)
fkellermavnet 0:affdbb35faa4 1329 {
fkellermavnet 0:affdbb35faa4 1330 AtCmdErr_e result;
fkellermavnet 0:affdbb35faa4 1331
fkellermavnet 0:affdbb35faa4 1332 if ((n > 0) && (n <= MAX_WNC_WRITE_BYTES)) {
fkellermavnet 0:affdbb35faa4 1333 string * pRespStr;
fkellermavnet 1:ac2de545b981 1334 const char * num2str;
fkellermavnet 0:affdbb35faa4 1335 string cmd_str;
fkellermavnet 0:affdbb35faa4 1336
fkellermavnet 0:affdbb35faa4 1337 if (isTcp == true)
fkellermavnet 0:affdbb35faa4 1338 cmd_str="AT@SOCKWRITE=";
fkellermavnet 0:affdbb35faa4 1339 else
fkellermavnet 0:affdbb35faa4 1340 cmd_str="AT@SOCKWRITE="; // "AT@SOCKSEND=";
fkellermavnet 0:affdbb35faa4 1341
fkellermavnet 0:affdbb35faa4 1342 cmd_str += _to_string(numSock + 1);
fkellermavnet 0:affdbb35faa4 1343 cmd_str += ",";
fkellermavnet 1:ac2de545b981 1344 cmd_str += _to_string(n);
fkellermavnet 0:affdbb35faa4 1345 cmd_str += num2str;
fkellermavnet 0:affdbb35faa4 1346 cmd_str += ",\"";
fkellermavnet 0:affdbb35faa4 1347 while(*s != '\0') {
fkellermavnet 1:ac2de545b981 1348 num2str = _to_hex_string((uint8_t)*s++);
fkellermavnet 0:affdbb35faa4 1349 // Always 2-digit ascii hex:
fkellermavnet 1:ac2de545b981 1350 if (strlen(num2str) == 1)
fkellermavnet 1:ac2de545b981 1351 cmd_str += '0';
fkellermavnet 0:affdbb35faa4 1352 cmd_str += num2str;
fkellermavnet 0:affdbb35faa4 1353 }
fkellermavnet 0:affdbb35faa4 1354 cmd_str += "\"";
fkellermavnet 0:affdbb35faa4 1355 result = sendWncCmd(cmd_str.c_str(), &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1356 }
fkellermavnet 0:affdbb35faa4 1357 else {
fkellermavnet 0:affdbb35faa4 1358 dbgPuts("sockwrite Err, string len bad!");
fkellermavnet 0:affdbb35faa4 1359 result = WNC_AT_CMD_ERR;
fkellermavnet 0:affdbb35faa4 1360 }
fkellermavnet 0:affdbb35faa4 1361
fkellermavnet 0:affdbb35faa4 1362 return (result);
fkellermavnet 0:affdbb35faa4 1363 }
fkellermavnet 0:affdbb35faa4 1364
fkellermavnet 0:affdbb35faa4 1365 WncController::AtCmdErr_e WncController::at_sockread_wnc(uint8_t * pS, uint32_t * numRead, uint16_t n, uint16_t numSock, bool isTcp)
fkellermavnet 0:affdbb35faa4 1366 {
fkellermavnet 0:affdbb35faa4 1367 AtCmdErr_e result = WNC_AT_CMD_OK;
fkellermavnet 0:affdbb35faa4 1368 *numRead = 0;
fkellermavnet 0:affdbb35faa4 1369
fkellermavnet 0:affdbb35faa4 1370 if ((n > 0) && (n <= MAX_WNC_READ_BYTES)) {
fkellermavnet 0:affdbb35faa4 1371 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1372 string cmd_str;
fkellermavnet 0:affdbb35faa4 1373 size_t pos_start, pos_end;
fkellermavnet 0:affdbb35faa4 1374 int i;
fkellermavnet 0:affdbb35faa4 1375
fkellermavnet 0:affdbb35faa4 1376 if (isTcp == true)
fkellermavnet 0:affdbb35faa4 1377 cmd_str="AT@SOCKREAD=";
fkellermavnet 0:affdbb35faa4 1378 else
fkellermavnet 0:affdbb35faa4 1379 cmd_str="AT@SOCKREAD="; // "AT@SOCKRECV=";
fkellermavnet 0:affdbb35faa4 1380
fkellermavnet 0:affdbb35faa4 1381 cmd_str += _to_string(numSock + 1);
fkellermavnet 0:affdbb35faa4 1382 cmd_str += ",";
fkellermavnet 0:affdbb35faa4 1383 cmd_str += _to_string(n);
fkellermavnet 0:affdbb35faa4 1384
fkellermavnet 0:affdbb35faa4 1385 // Experimental: read should not need to check cell net status
fkellermavnet 0:affdbb35faa4 1386 result = at_send_wnc_cmd(cmd_str.c_str(), &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1387 if (result == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 1388 pos_start = pRespStr->find("\"") + 1;
fkellermavnet 0:affdbb35faa4 1389 pos_end = pRespStr->rfind("\"") - 1;
fkellermavnet 0:affdbb35faa4 1390
fkellermavnet 0:affdbb35faa4 1391 // Make sure search finds what it's looking for!
fkellermavnet 0:affdbb35faa4 1392 if (pos_start != string::npos && pos_end != string::npos)
fkellermavnet 0:affdbb35faa4 1393 i = (pos_end - pos_start + 1); // Num hex chars, 2 per byte
fkellermavnet 0:affdbb35faa4 1394 else
fkellermavnet 0:affdbb35faa4 1395 i = 0;
fkellermavnet 0:affdbb35faa4 1396
fkellermavnet 1:ac2de545b981 1397 // If data, convert the hex string into byte values
fkellermavnet 0:affdbb35faa4 1398 if (i > 0 && i <= (2*MAX_WNC_READ_BYTES))
fkellermavnet 0:affdbb35faa4 1399 {
fkellermavnet 0:affdbb35faa4 1400 string byte;
fkellermavnet 0:affdbb35faa4 1401 while (pos_start < pos_end) {
fkellermavnet 0:affdbb35faa4 1402 byte = pRespStr->substr(pos_start, 2);
fkellermavnet 1:ac2de545b981 1403 *pS += (uint8_t)strtol(byte.c_str(), NULL, 16);
fkellermavnet 0:affdbb35faa4 1404 pos_start += 2;
fkellermavnet 0:affdbb35faa4 1405 (*numRead)++;
fkellermavnet 0:affdbb35faa4 1406 }
fkellermavnet 0:affdbb35faa4 1407 }
fkellermavnet 0:affdbb35faa4 1408 }
fkellermavnet 0:affdbb35faa4 1409 }
fkellermavnet 0:affdbb35faa4 1410 else {
fkellermavnet 0:affdbb35faa4 1411 dbgPuts("sockread Err, to many to read!");
fkellermavnet 0:affdbb35faa4 1412 result = WNC_AT_CMD_ERR;
fkellermavnet 0:affdbb35faa4 1413 }
fkellermavnet 0:affdbb35faa4 1414
fkellermavnet 0:affdbb35faa4 1415 return (result);
fkellermavnet 0:affdbb35faa4 1416 }
fkellermavnet 0:affdbb35faa4 1417
fkellermavnet 0:affdbb35faa4 1418 bool WncController::at_reinitialize_mdm(void)
fkellermavnet 0:affdbb35faa4 1419 {
fkellermavnet 0:affdbb35faa4 1420 // Atempt to re-register
fkellermavnet 0:affdbb35faa4 1421 // string * pRespStr;
fkellermavnet 0:affdbb35faa4 1422 // dbgPuts("Force re-register!");
fkellermavnet 0:affdbb35faa4 1423 // at_send_wnc_cmd("AT+CFUN=0,0", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1424 // waitMs(31000);
fkellermavnet 0:affdbb35faa4 1425 // at_send_wnc_cmd("AT+CFUN=1,0", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1426 // waitMs(31000);
fkellermavnet 0:affdbb35faa4 1427
fkellermavnet 0:affdbb35faa4 1428 // Initialize the modem
fkellermavnet 0:affdbb35faa4 1429 dbgPuts("Modem RE-initializing with SOFT Reset...");
fkellermavnet 0:affdbb35faa4 1430
fkellermavnet 0:affdbb35faa4 1431 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1432 at_send_wnc_cmd("AT@DMREBOOT", &pRespStr, m_sCmdTimeoutMs);
fkellermavnet 0:affdbb35faa4 1433 waitMs(5000);
fkellermavnet 0:affdbb35faa4 1434
fkellermavnet 0:affdbb35faa4 1435 // Now, give the modem time to start responding by
fkellermavnet 0:affdbb35faa4 1436 // sending simple 'AT' commands to the modem once per second.
fkellermavnet 0:affdbb35faa4 1437 int timeoutSecs = WNC_REINIT_MAX_TIME_MS;
fkellermavnet 0:affdbb35faa4 1438 do {
fkellermavnet 0:affdbb35faa4 1439 dbgPuts("\rWaiting ", false); dbgPutsNoTime(_to_string(timeoutSecs), false);
fkellermavnet 0:affdbb35faa4 1440 AtCmdErr_e rc = mdmSendAtCmdRsp("AT", 500, &m_sWncStr);
fkellermavnet 0:affdbb35faa4 1441 if (rc == WNC_AT_CMD_OK) {
fkellermavnet 0:affdbb35faa4 1442 dbgPutsNoTime(""); // CR LF
fkellermavnet 0:affdbb35faa4 1443 break;
fkellermavnet 0:affdbb35faa4 1444 }
fkellermavnet 0:affdbb35faa4 1445 waitMs(500);
fkellermavnet 0:affdbb35faa4 1446 timeoutSecs--;
fkellermavnet 0:affdbb35faa4 1447 }
fkellermavnet 0:affdbb35faa4 1448 while (timeoutSecs > 0);
fkellermavnet 0:affdbb35faa4 1449
fkellermavnet 0:affdbb35faa4 1450 if (timeoutSecs <= 0)
fkellermavnet 0:affdbb35faa4 1451 dbgPuts("\r\nModem RE-init FAILED!");
fkellermavnet 0:affdbb35faa4 1452 else
fkellermavnet 0:affdbb35faa4 1453 dbgPuts("\r\nModem RE-init complete!");
fkellermavnet 0:affdbb35faa4 1454
fkellermavnet 0:affdbb35faa4 1455 return (timeoutSecs > 0);
fkellermavnet 0:affdbb35faa4 1456 }
fkellermavnet 0:affdbb35faa4 1457
fkellermavnet 0:affdbb35faa4 1458 WncController::AtCmdErr_e WncController::mdmSendAtCmdRsp(const char *cmd, int timeout_ms, string * rsp, bool crLf)
fkellermavnet 0:affdbb35faa4 1459 {
fkellermavnet 0:affdbb35faa4 1460 rsp->erase(); // Clean up from possible prior cmd response
fkellermavnet 0:affdbb35faa4 1461
fkellermavnet 0:affdbb35faa4 1462 // Don't bother the WNC if user hasn't turned it on.
fkellermavnet 0:affdbb35faa4 1463 if (m_sState == WNC_OFF)
fkellermavnet 0:affdbb35faa4 1464 return (WNC_AT_CMD_WNC_NOT_ON);
fkellermavnet 0:affdbb35faa4 1465
fkellermavnet 0:affdbb35faa4 1466 size_t n = strlen(cmd);
fkellermavnet 0:affdbb35faa4 1467
fkellermavnet 0:affdbb35faa4 1468 // Wait per WNC advise
fkellermavnet 0:affdbb35faa4 1469 waitMs(WNC_WAIT_FOR_AT_CMD_MS);
fkellermavnet 0:affdbb35faa4 1470
fkellermavnet 0:affdbb35faa4 1471 if (cmd && n > 0) {
fkellermavnet 0:affdbb35faa4 1472 sendCmd(cmd, crLf);
fkellermavnet 0:affdbb35faa4 1473 // sendCmdSlow(cmd, n, 500); // 3rd arg is micro seconds between chars sent
fkellermavnet 0:affdbb35faa4 1474 }
fkellermavnet 0:affdbb35faa4 1475
fkellermavnet 0:affdbb35faa4 1476 startTimerA();
fkellermavnet 1:ac2de545b981 1477 while (getTimerTicksA_mS() < timeout_ms) {
fkellermavnet 1:ac2de545b981 1478 n = mdmGetline(rsp, timeout_ms - getTimerTicksA_mS());
fkellermavnet 0:affdbb35faa4 1479
fkellermavnet 0:affdbb35faa4 1480 if (n == 0)
fkellermavnet 0:affdbb35faa4 1481 continue;
fkellermavnet 0:affdbb35faa4 1482
fkellermavnet 0:affdbb35faa4 1483 if (rsp->rfind("OK") != string::npos) {
fkellermavnet 0:affdbb35faa4 1484 stopTimerA();
fkellermavnet 0:affdbb35faa4 1485 return (WNC_AT_CMD_OK);
fkellermavnet 0:affdbb35faa4 1486 }
fkellermavnet 0:affdbb35faa4 1487
fkellermavnet 0:affdbb35faa4 1488 if (rsp->rfind("+CME ERROR") != string::npos) {
fkellermavnet 0:affdbb35faa4 1489 stopTimerA();
fkellermavnet 0:affdbb35faa4 1490 return (WNC_AT_CMD_ERRCME);
fkellermavnet 0:affdbb35faa4 1491 }
fkellermavnet 0:affdbb35faa4 1492
fkellermavnet 0:affdbb35faa4 1493 if (rsp->rfind("@EXTERR") != string::npos) {
fkellermavnet 0:affdbb35faa4 1494 stopTimerA();
fkellermavnet 0:affdbb35faa4 1495 return (WNC_AT_CMD_ERREXT);
fkellermavnet 0:affdbb35faa4 1496 }
fkellermavnet 0:affdbb35faa4 1497
fkellermavnet 0:affdbb35faa4 1498 if (rsp->rfind("ERROR") != string::npos) {
fkellermavnet 0:affdbb35faa4 1499 stopTimerA();
fkellermavnet 0:affdbb35faa4 1500 return (WNC_AT_CMD_ERR);
fkellermavnet 0:affdbb35faa4 1501 }
fkellermavnet 0:affdbb35faa4 1502 }
fkellermavnet 0:affdbb35faa4 1503 stopTimerA();
fkellermavnet 0:affdbb35faa4 1504
fkellermavnet 0:affdbb35faa4 1505 return (WNC_AT_CMD_TIMEOUT);
fkellermavnet 0:affdbb35faa4 1506 }
fkellermavnet 0:affdbb35faa4 1507
fkellermavnet 0:affdbb35faa4 1508 bool WncController::at_setapn_wnc(const char * const apnStr)
fkellermavnet 0:affdbb35faa4 1509 {
fkellermavnet 0:affdbb35faa4 1510 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1511
fkellermavnet 0:affdbb35faa4 1512 string cmd_str("AT%PDNSET=1,");
fkellermavnet 0:affdbb35faa4 1513 cmd_str += apnStr;
fkellermavnet 0:affdbb35faa4 1514 cmd_str += ",IP";
fkellermavnet 0:affdbb35faa4 1515 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 1516 return (true);
fkellermavnet 0:affdbb35faa4 1517 else
fkellermavnet 0:affdbb35faa4 1518 return (false);
fkellermavnet 0:affdbb35faa4 1519 }
fkellermavnet 0:affdbb35faa4 1520
fkellermavnet 0:affdbb35faa4 1521 bool WncController::at_getrssiber_wnc(int16_t * dBm, int16_t * ber)
fkellermavnet 0:affdbb35faa4 1522 {
fkellermavnet 0:affdbb35faa4 1523 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1524 AtCmdErr_e cmdRes;
fkellermavnet 0:affdbb35faa4 1525 cmdRes = at_send_wnc_cmd("AT+CSQ", &pRespStr, m_sCmdTimeoutMs); // Check RSSI,BER
fkellermavnet 0:affdbb35faa4 1526 if (cmdRes != WNC_AT_CMD_OK)
fkellermavnet 0:affdbb35faa4 1527 return (false);
fkellermavnet 0:affdbb35faa4 1528
fkellermavnet 0:affdbb35faa4 1529 if (pRespStr->size() == 0) {
fkellermavnet 0:affdbb35faa4 1530 dbgPuts("Strange RSSI result!");
fkellermavnet 0:affdbb35faa4 1531 return (false);
fkellermavnet 0:affdbb35faa4 1532 }
fkellermavnet 0:affdbb35faa4 1533 else {
fkellermavnet 0:affdbb35faa4 1534 size_t pos1 = pRespStr->find("SQ:");
fkellermavnet 0:affdbb35faa4 1535 size_t pos2 = pRespStr->rfind(",");
fkellermavnet 0:affdbb35faa4 1536 // Sanity check
fkellermavnet 0:affdbb35faa4 1537 if ((pos1 != string::npos) && (pos2 != string::npos) && (pos2 > pos1)) {
fkellermavnet 0:affdbb35faa4 1538 string subStr = pRespStr->substr(pos1 + 4, pos2 - pos1 );
fkellermavnet 0:affdbb35faa4 1539 int rawRssi = atoi(subStr.c_str());
fkellermavnet 0:affdbb35faa4 1540
fkellermavnet 0:affdbb35faa4 1541 // Convert WNC RSSI into dBm range:
fkellermavnet 0:affdbb35faa4 1542 // 0 - -113 dBm
fkellermavnet 0:affdbb35faa4 1543 // 1 - -111 dBm
fkellermavnet 0:affdbb35faa4 1544 // 2..30 - -109 to -53 dBm
fkellermavnet 0:affdbb35faa4 1545 // 31 - -51dBm or >
fkellermavnet 0:affdbb35faa4 1546 // 99 - not known or not detectable
fkellermavnet 0:affdbb35faa4 1547 if (rawRssi == 99)
fkellermavnet 0:affdbb35faa4 1548 *dBm = -199;
fkellermavnet 0:affdbb35faa4 1549 else if (rawRssi == 0)
fkellermavnet 0:affdbb35faa4 1550 *dBm = -113;
fkellermavnet 0:affdbb35faa4 1551 else if (rawRssi == 1)
fkellermavnet 0:affdbb35faa4 1552 *dBm = -111;
fkellermavnet 0:affdbb35faa4 1553 else if (rawRssi == 31)
fkellermavnet 0:affdbb35faa4 1554 *dBm = -51;
fkellermavnet 0:affdbb35faa4 1555 else if (rawRssi >= 2 && rawRssi <= 30)
fkellermavnet 0:affdbb35faa4 1556 *dBm = -113 + 2 * rawRssi;
fkellermavnet 0:affdbb35faa4 1557 else {
fkellermavnet 0:affdbb35faa4 1558 dbgPuts("Invalid RSSI!");
fkellermavnet 0:affdbb35faa4 1559 return (false);
fkellermavnet 0:affdbb35faa4 1560 }
fkellermavnet 0:affdbb35faa4 1561 // Parse out BER: 0..7 as RXQUAL values in the table 3GPP TS 45.008 subclause 8.2.4
fkellermavnet 0:affdbb35faa4 1562 // 99 - unknown or undetectable
fkellermavnet 0:affdbb35faa4 1563 subStr = pRespStr->substr(pos2 + 1, pRespStr->length() - (pos2 + 1));
fkellermavnet 0:affdbb35faa4 1564 *ber = atoi(subStr.c_str());
fkellermavnet 0:affdbb35faa4 1565 }
fkellermavnet 0:affdbb35faa4 1566 else {
fkellermavnet 0:affdbb35faa4 1567 dbgPuts("Strange RSSI result2!");
fkellermavnet 0:affdbb35faa4 1568 return (false);
fkellermavnet 0:affdbb35faa4 1569 }
fkellermavnet 0:affdbb35faa4 1570 }
fkellermavnet 0:affdbb35faa4 1571
fkellermavnet 0:affdbb35faa4 1572 return (true);
fkellermavnet 0:affdbb35faa4 1573 }
fkellermavnet 0:affdbb35faa4 1574
fkellermavnet 0:affdbb35faa4 1575 bool WncController::checkCellLink(void)
fkellermavnet 0:affdbb35faa4 1576 {
fkellermavnet 0:affdbb35faa4 1577 string * pRespStr;
fkellermavnet 0:affdbb35faa4 1578 size_t pos;
fkellermavnet 0:affdbb35faa4 1579 int regSts;
fkellermavnet 0:affdbb35faa4 1580 int cmdRes1, cmdRes2;
fkellermavnet 0:affdbb35faa4 1581
fkellermavnet 0:affdbb35faa4 1582 if (m_sState == WNC_OFF)
fkellermavnet 0:affdbb35faa4 1583 return (false);
fkellermavnet 0:affdbb35faa4 1584
fkellermavnet 0:affdbb35faa4 1585 m_sState = WNC_ON_NO_CELL_LINK;
fkellermavnet 0:affdbb35faa4 1586
fkellermavnet 0:affdbb35faa4 1587 if (m_sMoreDebugEnabled)
fkellermavnet 0:affdbb35faa4 1588 dbgPuts("<-------- Begin Cell Status ------------");
fkellermavnet 0:affdbb35faa4 1589
fkellermavnet 0:affdbb35faa4 1590 cmdRes1 = at_send_wnc_cmd("AT+CSQ", &pRespStr, m_sCmdTimeoutMs); // Check RSSI,BER
fkellermavnet 0:affdbb35faa4 1591 cmdRes2 = at_send_wnc_cmd("AT+CPIN?", &pRespStr, m_sCmdTimeoutMs); // Check if SIM locked
fkellermavnet 0:affdbb35faa4 1592
fkellermavnet 0:affdbb35faa4 1593 if ((cmdRes1 != WNC_AT_CMD_OK) && (cmdRes2 != WNC_AT_CMD_OK))
fkellermavnet 0:affdbb35faa4 1594 {
fkellermavnet 0:affdbb35faa4 1595 if (m_sMoreDebugEnabled)
fkellermavnet 0:affdbb35faa4 1596 {
fkellermavnet 0:affdbb35faa4 1597 if ((cmdRes1 == WNC_AT_CMD_TIMEOUT) || (cmdRes2 == WNC_AT_CMD_TIMEOUT))
fkellermavnet 0:affdbb35faa4 1598 dbgPuts("------------ WNC No Response! --------->");
fkellermavnet 0:affdbb35faa4 1599 else
fkellermavnet 0:affdbb35faa4 1600 dbgPuts("------------ WNC Cmd Error! ----------->");
fkellermavnet 0:affdbb35faa4 1601 }
fkellermavnet 0:affdbb35faa4 1602 return (false);
fkellermavnet 0:affdbb35faa4 1603 }
fkellermavnet 0:affdbb35faa4 1604
fkellermavnet 0:affdbb35faa4 1605 // If SIM Card not ready don't bother with commands!
fkellermavnet 0:affdbb35faa4 1606 if (pRespStr->find("CPIN: READY") == string::npos)
fkellermavnet 0:affdbb35faa4 1607 {
fkellermavnet 0:affdbb35faa4 1608 if (m_sMoreDebugEnabled)
fkellermavnet 0:affdbb35faa4 1609 dbgPuts("------------ WNC SIM Problem! --------->");
fkellermavnet 0:affdbb35faa4 1610
fkellermavnet 0:affdbb35faa4 1611 return (false);
fkellermavnet 0:affdbb35faa4 1612 }
fkellermavnet 0:affdbb35faa4 1613
fkellermavnet 0:affdbb35faa4 1614 // SIM card OK, now check for signal and cellular network registration
fkellermavnet 0:affdbb35faa4 1615 cmdRes1 = at_send_wnc_cmd("AT+CREG?", &pRespStr, m_sCmdTimeoutMs); // Check if registered on network
fkellermavnet 0:affdbb35faa4 1616 if (cmdRes1 != WNC_AT_CMD_OK)
fkellermavnet 0:affdbb35faa4 1617 {
fkellermavnet 0:affdbb35faa4 1618 if (m_sMoreDebugEnabled)
fkellermavnet 0:affdbb35faa4 1619 dbgPuts("------------ WNC +CREG? Fail! --------->");
fkellermavnet 0:affdbb35faa4 1620
fkellermavnet 0:affdbb35faa4 1621 return (false);
fkellermavnet 0:affdbb35faa4 1622 }
fkellermavnet 0:affdbb35faa4 1623 else
fkellermavnet 0:affdbb35faa4 1624 {
fkellermavnet 0:affdbb35faa4 1625 pos = pRespStr->find("CREG: ");
fkellermavnet 0:affdbb35faa4 1626 if (pos != string::npos)
fkellermavnet 0:affdbb35faa4 1627 {
fkellermavnet 0:affdbb35faa4 1628 // The registration is the 2nd arg in the comma separated list
fkellermavnet 0:affdbb35faa4 1629 *pRespStr = pRespStr->substr(pos+8, 1);
fkellermavnet 0:affdbb35faa4 1630 regSts = atoi(pRespStr->c_str());
fkellermavnet 0:affdbb35faa4 1631 switch (regSts) {
fkellermavnet 0:affdbb35faa4 1632 case 1:
fkellermavnet 0:affdbb35faa4 1633 case 5:
fkellermavnet 0:affdbb35faa4 1634 case 6:
fkellermavnet 0:affdbb35faa4 1635 case 7:
fkellermavnet 0:affdbb35faa4 1636 m_sReadyForSMS = true;
fkellermavnet 0:affdbb35faa4 1637 break;
fkellermavnet 0:affdbb35faa4 1638 default:
fkellermavnet 0:affdbb35faa4 1639 m_sReadyForSMS = false;
fkellermavnet 0:affdbb35faa4 1640 dbgPuts("SMS Service Down!");
fkellermavnet 0:affdbb35faa4 1641 }
fkellermavnet 0:affdbb35faa4 1642
fkellermavnet 0:affdbb35faa4 1643 // 1 - registered home, 5 - registered roaming
fkellermavnet 0:affdbb35faa4 1644 if ((regSts != 1) && (regSts != 5))
fkellermavnet 0:affdbb35faa4 1645 {
fkellermavnet 0:affdbb35faa4 1646 if (m_sMoreDebugEnabled)
fkellermavnet 0:affdbb35faa4 1647 dbgPuts("------ WNC Cell Link Down for Data! --->");
fkellermavnet 0:affdbb35faa4 1648
fkellermavnet 0:affdbb35faa4 1649 return (false);
fkellermavnet 0:affdbb35faa4 1650 }
fkellermavnet 0:affdbb35faa4 1651 }
fkellermavnet 0:affdbb35faa4 1652
fkellermavnet 0:affdbb35faa4 1653 if (m_sMoreDebugEnabled)
fkellermavnet 0:affdbb35faa4 1654 dbgPuts("------------ WNC Ready ---------------->");
fkellermavnet 0:affdbb35faa4 1655 }
fkellermavnet 0:affdbb35faa4 1656
fkellermavnet 0:affdbb35faa4 1657 m_sState = WNC_ON;
fkellermavnet 0:affdbb35faa4 1658
fkellermavnet 0:affdbb35faa4 1659 return (true);
fkellermavnet 0:affdbb35faa4 1660 }
fkellermavnet 0:affdbb35faa4 1661
fkellermavnet 0:affdbb35faa4 1662 int WncController::dbgPutsNoTime(const char * s, bool crlf)
fkellermavnet 0:affdbb35faa4 1663 {
fkellermavnet 0:affdbb35faa4 1664 if (m_sDebugEnabled == true) {
fkellermavnet 1:ac2de545b981 1665 int r = dbgWriteChars(s);
fkellermavnet 0:affdbb35faa4 1666 if (crlf == true)
fkellermavnet 1:ac2de545b981 1667 return (dbgWriteChars("\r\n"));
fkellermavnet 0:affdbb35faa4 1668 else
fkellermavnet 0:affdbb35faa4 1669 return (r);
fkellermavnet 0:affdbb35faa4 1670 }
fkellermavnet 0:affdbb35faa4 1671 else
fkellermavnet 0:affdbb35faa4 1672 return 0;
fkellermavnet 0:affdbb35faa4 1673 };
fkellermavnet 0:affdbb35faa4 1674
fkellermavnet 0:affdbb35faa4 1675 int WncController::dbgPuts(const char * s, bool crlf)
fkellermavnet 0:affdbb35faa4 1676 {
fkellermavnet 0:affdbb35faa4 1677 dbgPutsNoTime("[*] ", false);
fkellermavnet 0:affdbb35faa4 1678 dbgPutsNoTime(_to_string(getLogTimerTicks()), false);
fkellermavnet 1:ac2de545b981 1679 dbgPutsNoTime(" ", false);
fkellermavnet 0:affdbb35faa4 1680
fkellermavnet 0:affdbb35faa4 1681 int r = dbgPutsNoTime(s, false);
fkellermavnet 1:ac2de545b981 1682
fkellermavnet 0:affdbb35faa4 1683 if (crlf == true)
fkellermavnet 1:ac2de545b981 1684 return (dbgPutsNoTime("", true));
fkellermavnet 0:affdbb35faa4 1685 else
fkellermavnet 0:affdbb35faa4 1686 return (r);
fkellermavnet 0:affdbb35faa4 1687 };
fkellermavnet 0:affdbb35faa4 1688
fkellermavnet 0:affdbb35faa4 1689 void WncController::sendCmd(const char * cmd, bool crLf)
fkellermavnet 0:affdbb35faa4 1690 {
fkellermavnet 0:affdbb35faa4 1691 puts(cmd);
fkellermavnet 0:affdbb35faa4 1692 if (crLf == true)
fkellermavnet 0:affdbb35faa4 1693 puts("\r\n");
fkellermavnet 0:affdbb35faa4 1694 }
fkellermavnet 0:affdbb35faa4 1695
fkellermavnet 0:affdbb35faa4 1696 // WNC used to have troubles handling full speed, seems to not need this now.
fkellermavnet 0:affdbb35faa4 1697 void WncController::sendCmd(const char * cmd, unsigned n, unsigned wait_uS, bool crLf)
fkellermavnet 0:affdbb35faa4 1698 {
fkellermavnet 0:affdbb35faa4 1699 while (n--) {
fkellermavnet 0:affdbb35faa4 1700 putc(*cmd++);
fkellermavnet 0:affdbb35faa4 1701 waitUs(wait_uS);
fkellermavnet 0:affdbb35faa4 1702 };
fkellermavnet 0:affdbb35faa4 1703 if (crLf == true) {
fkellermavnet 0:affdbb35faa4 1704 putc('\r');
fkellermavnet 0:affdbb35faa4 1705 waitUs(wait_uS);
fkellermavnet 0:affdbb35faa4 1706 putc('\n');
fkellermavnet 0:affdbb35faa4 1707 waitUs(wait_uS);
fkellermavnet 0:affdbb35faa4 1708 }
fkellermavnet 0:affdbb35faa4 1709 }
fkellermavnet 0:affdbb35faa4 1710
fkellermavnet 0:affdbb35faa4 1711
fkellermavnet 0:affdbb35faa4 1712 }; // End namespace WncController_fk