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:
Sat Sep 10 02:02:05 2016 +0000
Revision:
14:e846217affcd
Parent:
13:73629a6e9122
Child:
15:2c8211ef69e1
Added more checks to make sure find is not used on empty string for some reason mbed sometimes crashes when that is done.

Who changed what in which revision?

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