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

Fork of WncControllerLibrary by Fred Kellerman

Committer:
fkellermavnet
Date:
Thu Sep 01 22:28:10 2016 +0000
Revision:
2:30d78cda6779
Parent:
1:ac2de545b981
Child:
4:c5720f4d13ff
Added a new method to K64F library to allow one to type in the debug serial port and send and receive commands to the WNC.

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.h
fkellermavnet 0:affdbb35faa4 23 @purpose Controls WNC 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 #ifndef __WNCCONTROLLER_H_
fkellermavnet 0:affdbb35faa4 30 #define __WNCCONTROLLER_H_
fkellermavnet 0:affdbb35faa4 31
fkellermavnet 0:affdbb35faa4 32 #include <string>
fkellermavnet 0:affdbb35faa4 33 #include <stdint.h>
fkellermavnet 0:affdbb35faa4 34
fkellermavnet 0:affdbb35faa4 35 namespace WncController_fk {
fkellermavnet 0:affdbb35faa4 36
fkellermavnet 0:affdbb35faa4 37 using namespace std;
fkellermavnet 0:affdbb35faa4 38
fkellermavnet 0:affdbb35faa4 39 /**
fkellermavnet 0:affdbb35faa4 40 * \file WncController.h
fkellermavnet 0:affdbb35faa4 41 * \brief This mbed C++ class is for controlling the WNC
fkellermavnet 0:affdbb35faa4 42 * Cellular modem via the AT command interface. This was
fkellermavnet 0:affdbb35faa4 43 * developed with respect to version 1.3 of the WNC authored
fkellermavnet 0:affdbb35faa4 44 * spec. This class is only designed to have 1 instantiation
fkellermavnet 0:affdbb35faa4 45 * it is also not multi-thread safe.
fkellermavnet 0:affdbb35faa4 46 */
fkellermavnet 0:affdbb35faa4 47
fkellermavnet 0:affdbb35faa4 48
fkellermavnet 0:affdbb35faa4 49 static const uint8_t MAX_LEN_IP_STR = 16; // Length includes room for the extra NULL
fkellermavnet 0:affdbb35faa4 50
fkellermavnet 0:affdbb35faa4 51
fkellermavnet 0:affdbb35faa4 52 /**
fkellermavnet 0:affdbb35faa4 53 * \brief Contains info fields for the WNC Internet Attributes
fkellermavnet 0:affdbb35faa4 54 */
fkellermavnet 0:affdbb35faa4 55 struct WncIpStats
fkellermavnet 0:affdbb35faa4 56 {
fkellermavnet 0:affdbb35faa4 57 char ip[MAX_LEN_IP_STR];
fkellermavnet 0:affdbb35faa4 58 char mask[MAX_LEN_IP_STR];
fkellermavnet 0:affdbb35faa4 59 char gateway[MAX_LEN_IP_STR];
fkellermavnet 0:affdbb35faa4 60 char dnsPrimary[MAX_LEN_IP_STR];
fkellermavnet 0:affdbb35faa4 61 char dnsSecondary[MAX_LEN_IP_STR];
fkellermavnet 0:affdbb35faa4 62 };
fkellermavnet 0:affdbb35faa4 63
fkellermavnet 0:affdbb35faa4 64 struct WncDateTime
fkellermavnet 0:affdbb35faa4 65 {
fkellermavnet 0:affdbb35faa4 66 uint8_t year;
fkellermavnet 0:affdbb35faa4 67 uint8_t month;
fkellermavnet 0:affdbb35faa4 68 uint8_t day;
fkellermavnet 0:affdbb35faa4 69 uint8_t hour;
fkellermavnet 0:affdbb35faa4 70 uint8_t min;
fkellermavnet 0:affdbb35faa4 71 uint8_t sec;
fkellermavnet 0:affdbb35faa4 72 };
fkellermavnet 0:affdbb35faa4 73
fkellermavnet 0:affdbb35faa4 74 class WncController
fkellermavnet 0:affdbb35faa4 75 {
fkellermavnet 0:affdbb35faa4 76 public:
fkellermavnet 0:affdbb35faa4 77
fkellermavnet 0:affdbb35faa4 78 static const unsigned MAX_NUM_WNC_SOCKETS = 1; // Max number of simultaneous sockets that the WNC supports
fkellermavnet 0:affdbb35faa4 79 static const unsigned MAX_POWERUP_TIMEOUT = 60; // How long the powerUp method will try to turn on the WNC Shield
fkellermavnet 0:affdbb35faa4 80 // (this is the default if the user does not over-ride on power-up
fkellermavnet 0:affdbb35faa4 81
fkellermavnet 0:affdbb35faa4 82 // Tracks mode of the WNC Shield hardware
fkellermavnet 0:affdbb35faa4 83 enum WncState_e {
fkellermavnet 0:affdbb35faa4 84 WNC_OFF = 0,
fkellermavnet 0:affdbb35faa4 85 WNC_ON, // This is intended to mean all systems go, including cell link up but socket may not be open
fkellermavnet 0:affdbb35faa4 86 WNC_ON_NO_CELL_LINK
fkellermavnet 0:affdbb35faa4 87 };
fkellermavnet 0:affdbb35faa4 88
fkellermavnet 0:affdbb35faa4 89 /**
fkellermavnet 0:affdbb35faa4 90 * \brief Constructor for UART controlled WNC
fkellermavnet 0:affdbb35faa4 91 *
fkellermavnet 0:affdbb35faa4 92 * \param [in] wnc_uart - Reference to a SerialBuffered object which will
fkellermavnet 0:affdbb35faa4 93 * be used as the bus to control the WNC. apnStr = a text string for
fkellermavnet 0:affdbb35faa4 94 * the cellular APN name.
fkellermavnet 0:affdbb35faa4 95 *
fkellermavnet 0:affdbb35faa4 96 * \return None.
fkellermavnet 0:affdbb35faa4 97 *
fkellermavnet 0:affdbb35faa4 98 * \details Adding another way to talk to the WNC, like I2C or USB,
fkellermavnet 0:affdbb35faa4 99 * a constructor should be added for each type just like the SerialBuffered
fkellermavnet 0:affdbb35faa4 100 * constructor below. Assumes UART is enabled, setup and ready to go. This
fkellermavnet 0:affdbb35faa4 101 * class will read and write to this UART.
fkellermavnet 0:affdbb35faa4 102 */
fkellermavnet 1:ac2de545b981 103 WncController(void);
fkellermavnet 0:affdbb35faa4 104
fkellermavnet 0:affdbb35faa4 105 // WncController( const char * const apnStr, MODSERIAL * wnc_uart, MODSERIAL * debug_uart = NULL);
fkellermavnet 0:affdbb35faa4 106
fkellermavnet 0:affdbb35faa4 107 /**
fkellermavnet 0:affdbb35faa4 108 * \brief Used internally but also make public for a user of the Class to interrogate state as well.
fkellermavnet 0:affdbb35faa4 109 *
fkellermavnet 0:affdbb35faa4 110 * \param [in] None.
fkellermavnet 0:affdbb35faa4 111 *
fkellermavnet 0:affdbb35faa4 112 * \return The state of the WNC Modem.
fkellermavnet 0:affdbb35faa4 113 *
fkellermavnet 0:affdbb35faa4 114 * \details None.
fkellermavnet 0:affdbb35faa4 115 */
fkellermavnet 0:affdbb35faa4 116 WncState_e getWncStatus(void);
fkellermavnet 0:affdbb35faa4 117
fkellermavnet 0:affdbb35faa4 118 bool setApnName(const char * const apnStr);
fkellermavnet 0:affdbb35faa4 119
fkellermavnet 0:affdbb35faa4 120 /**
fkellermavnet 0:affdbb35faa4 121 * \brief Return signal quality dBm level
fkellermavnet 0:affdbb35faa4 122 *
fkellermavnet 0:affdbb35faa4 123 * \param [in] None.
fkellermavnet 0:affdbb35faa4 124 *
fkellermavnet 0:affdbb35faa4 125 * \return The dBm signal level at the time of the request.
fkellermavnet 0:affdbb35faa4 126 *
fkellermavnet 0:affdbb35faa4 127 * \details This polls (at the time of the call) the cell signal.
fkellermavnet 0:affdbb35faa4 128 */
fkellermavnet 0:affdbb35faa4 129 int16_t getDbmRssi(void);
fkellermavnet 0:affdbb35faa4 130 int16_t get3gBer(void);
fkellermavnet 0:affdbb35faa4 131
fkellermavnet 0:affdbb35faa4 132 /**
fkellermavnet 0:affdbb35faa4 133 * \brief Power up and down (down not implemented yet)
fkellermavnet 0:affdbb35faa4 134 *
fkellermavnet 0:affdbb35faa4 135 * \param [in] NXP Pins that are critical for the initialization of the WNC Shield.
fkellermavnet 0:affdbb35faa4 136 *
fkellermavnet 0:affdbb35faa4 137 * \return true if request successful else false.
fkellermavnet 0:affdbb35faa4 138 *
fkellermavnet 0:affdbb35faa4 139 * \details Power-on works but not power-down. This will manipulate WNC Shield hardware
fkellermavnet 0:affdbb35faa4 140 * and bring it to life. It will also initialize the WNC enough to get it to be able to open sockets
fkellermavnet 0:affdbb35faa4 141 * (with AT commands)
fkellermavnet 0:affdbb35faa4 142 */
fkellermavnet 1:ac2de545b981 143 bool powerWncOn(const char * const apn, uint8_t powerUpTimeoutSecs = MAX_POWERUP_TIMEOUT);
fkellermavnet 0:affdbb35faa4 144
fkellermavnet 0:affdbb35faa4 145 /**
fkellermavnet 0:affdbb35faa4 146 * \brief Query the WNC modem for its Internet attributes
fkellermavnet 0:affdbb35faa4 147 *
fkellermavnet 0:affdbb35faa4 148 * \param [in] Pointer to a struct where to put the info.
fkellermavnet 0:affdbb35faa4 149 *
fkellermavnet 0:affdbb35faa4 150 * \return true if request successful else false.
fkellermavnet 0:affdbb35faa4 151 *
fkellermavnet 0:affdbb35faa4 152 * \details This method will do a few sanity checks and then gather the
fkellermavnet 0:affdbb35faa4 153 * fields of the struct.
fkellermavnet 0:affdbb35faa4 154 */
fkellermavnet 0:affdbb35faa4 155 bool getWncNetworkingStats(WncIpStats * s);
fkellermavnet 0:affdbb35faa4 156
fkellermavnet 0:affdbb35faa4 157 /**
fkellermavnet 0:affdbb35faa4 158 * \brief Look-up a URL text string and convert into an IP Address string.
fkellermavnet 0:affdbb35faa4 159 *
fkellermavnet 0:affdbb35faa4 160 * \param [in] url - the URL to lookup. numSock - the socket reference.
fkellermavnet 0:affdbb35faa4 161 *
fkellermavnet 0:affdbb35faa4 162 * \return true - if the IP address has been resolved. false - if the URL could not be resolved.
fkellermavnet 0:affdbb35faa4 163 *
fkellermavnet 0:affdbb35faa4 164 * \details None.
fkellermavnet 0:affdbb35faa4 165 */
fkellermavnet 0:affdbb35faa4 166 bool resolveUrl(uint16_t numSock, const char * url);
fkellermavnet 0:affdbb35faa4 167
fkellermavnet 0:affdbb35faa4 168 /**
fkellermavnet 0:affdbb35faa4 169 * \brief Set IP Address string
fkellermavnet 0:affdbb35faa4 170 *
fkellermavnet 0:affdbb35faa4 171 * \param [in] numSock - socket reference to set the string for. ipStr - text string of the IP
fkellermavnet 0:affdbb35faa4 172 * address you want to talk to. There is no sanity check - beware!!!
fkellermavnet 0:affdbb35faa4 173 *
fkellermavnet 0:affdbb35faa4 174 * \return true - if the IP address has been set. false - if the IP could not be set.
fkellermavnet 0:affdbb35faa4 175 *
fkellermavnet 0:affdbb35faa4 176 * \details None.
fkellermavnet 0:affdbb35faa4 177 */
fkellermavnet 0:affdbb35faa4 178 bool setIpAddr(uint16_t numSock, const char * ipStr);
fkellermavnet 0:affdbb35faa4 179
fkellermavnet 0:affdbb35faa4 180 /**
fkellermavnet 0:affdbb35faa4 181 * \brief Opens a WNC socket.
fkellermavnet 0:affdbb35faa4 182 *
fkellermavnet 0:affdbb35faa4 183 * \param [in] sockNum - the number of the socket to open. ipAddr - a string containing
fkellermavnet 0:affdbb35faa4 184 * the IP address. port - the IP port number to open the socket connection.
fkellermavnet 0:affdbb35faa4 185 *
fkellermavnet 0:affdbb35faa4 186 * \return true - if the socket is/was opened. false otherwise.
fkellermavnet 0:affdbb35faa4 187 *
fkellermavnet 0:affdbb35faa4 188 * \details None.
fkellermavnet 0:affdbb35faa4 189 */
fkellermavnet 0:affdbb35faa4 190 bool openSocket(uint16_t numSock, uint16_t port, bool tcp, uint16_t timeOutSec = 30);
fkellermavnet 0:affdbb35faa4 191
fkellermavnet 0:affdbb35faa4 192 /**
fkellermavnet 0:affdbb35faa4 193 * \brief Write bytes of data to an open socket
fkellermavnet 0:affdbb35faa4 194 *
fkellermavnet 0:affdbb35faa4 195 * \param [in] sockNum - the number of the socket to write. s - a string containing
fkellermavnet 0:affdbb35faa4 196 * the byte data to send.
fkellermavnet 0:affdbb35faa4 197 *
fkellermavnet 0:affdbb35faa4 198 * \return true - if the write was successful. false otherwise.
fkellermavnet 0:affdbb35faa4 199 *
fkellermavnet 0:affdbb35faa4 200 * \details The results of the write do not have anything to do with the data
fkellermavnet 0:affdbb35faa4 201 * arriving at the endpoint.
fkellermavnet 0:affdbb35faa4 202 */
fkellermavnet 0:affdbb35faa4 203 bool write(uint16_t numSock, const char * s, uint32_t n);
fkellermavnet 0:affdbb35faa4 204
fkellermavnet 0:affdbb35faa4 205 /**
fkellermavnet 0:affdbb35faa4 206 * \brief Poll and read back data from the WNC (if it has any)
fkellermavnet 0:affdbb35faa4 207 * If auto poll is enabled this read might fail (return with no data).
fkellermavnet 0:affdbb35faa4 208 *
fkellermavnet 0:affdbb35faa4 209 * \param [in] sockNum - the number of the socket to read. result - a string pointer containing
fkellermavnet 0:affdbb35faa4 210 * the byte data readback from the WNC.
fkellermavnet 0:affdbb35faa4 211 *
fkellermavnet 0:affdbb35faa4 212 * \return The number of bytes/chars that are read from the socket.
fkellermavnet 0:affdbb35faa4 213 *
fkellermavnet 0:affdbb35faa4 214 * \details DO NOT use the same string as is passed to the auto poll setup method!
fkellermavnet 0:affdbb35faa4 215 */
fkellermavnet 0:affdbb35faa4 216 size_t read(uint16_t numSock, uint8_t * readBuf, uint32_t maxReadBufLen);
fkellermavnet 0:affdbb35faa4 217
fkellermavnet 0:affdbb35faa4 218 /**
fkellermavnet 0:affdbb35faa4 219 * \brief Set how many times the above read method will retry if data is not returned.
fkellermavnet 0:affdbb35faa4 220 *
fkellermavnet 0:affdbb35faa4 221 * \param [in] sockNum - the number of the socket to set. retries - how many times to
fkellermavnet 0:affdbb35faa4 222 * poll until data is found.
fkellermavnet 0:affdbb35faa4 223 *
fkellermavnet 0:affdbb35faa4 224 * \return None.
fkellermavnet 0:affdbb35faa4 225 *
fkellermavnet 0:affdbb35faa4 226 * \details None.
fkellermavnet 0:affdbb35faa4 227 */
fkellermavnet 0:affdbb35faa4 228 void setReadRetries(uint16_t numSock, uint16_t retries);
fkellermavnet 0:affdbb35faa4 229
fkellermavnet 0:affdbb35faa4 230 /**
fkellermavnet 0:affdbb35faa4 231 * \brief Set how long between retries to wait.
fkellermavnet 0:affdbb35faa4 232 *
fkellermavnet 0:affdbb35faa4 233 * \param [in] sockNum - the number of the socket to set. waitMs - how long to wait
fkellermavnet 0:affdbb35faa4 234 * before doing the read poll (calling read(...)).
fkellermavnet 0:affdbb35faa4 235 *
fkellermavnet 0:affdbb35faa4 236 * \return None.
fkellermavnet 0:affdbb35faa4 237 *
fkellermavnet 0:affdbb35faa4 238 * \details None.
fkellermavnet 0:affdbb35faa4 239 */
fkellermavnet 0:affdbb35faa4 240 void setReadRetryWait(uint16_t numSock, uint16_t waitMs);
fkellermavnet 0:affdbb35faa4 241
fkellermavnet 0:affdbb35faa4 242 /**
fkellermavnet 0:affdbb35faa4 243 * \brief Close the socket.
fkellermavnet 0:affdbb35faa4 244 *
fkellermavnet 0:affdbb35faa4 245 * \param [in] sockNum - the number of the socket to close.
fkellermavnet 0:affdbb35faa4 246 *
fkellermavnet 0:affdbb35faa4 247 * \return None.
fkellermavnet 0:affdbb35faa4 248 *
fkellermavnet 0:affdbb35faa4 249 * \details None.
fkellermavnet 0:affdbb35faa4 250 */
fkellermavnet 0:affdbb35faa4 251 bool closeSocket(uint16_t numSock);
fkellermavnet 0:affdbb35faa4 252
fkellermavnet 0:affdbb35faa4 253 void setWncCmdTimeout(uint16_t toMs) {
fkellermavnet 0:affdbb35faa4 254 m_sCmdTimeoutMs = toMs;
fkellermavnet 0:affdbb35faa4 255 };
fkellermavnet 0:affdbb35faa4 256
fkellermavnet 0:affdbb35faa4 257 bool getIpAddr(uint16_t numSock, char myIpAddr[MAX_LEN_IP_STR]);
fkellermavnet 0:affdbb35faa4 258
fkellermavnet 0:affdbb35faa4 259 void enableDebug(bool on, bool moreDebugOn);
fkellermavnet 0:affdbb35faa4 260
fkellermavnet 0:affdbb35faa4 261 ///////////////////////////////////////////
fkellermavnet 0:affdbb35faa4 262 // SMS messaging
fkellermavnet 0:affdbb35faa4 263 ///////////////////////////////////////////
fkellermavnet 0:affdbb35faa4 264
fkellermavnet 0:affdbb35faa4 265 bool sendSMSText(const char * const phoneNum, const char * const text);
fkellermavnet 0:affdbb35faa4 266
fkellermavnet 0:affdbb35faa4 267 size_t readSMSLog(const char ** log);
fkellermavnet 0:affdbb35faa4 268
fkellermavnet 0:affdbb35faa4 269 bool saveSMSText(const char * const phoneNum, const char * const text, char * msgIdx);
fkellermavnet 0:affdbb35faa4 270
fkellermavnet 0:affdbb35faa4 271 bool sendSMSTextFromMem(char msgIdx);
fkellermavnet 0:affdbb35faa4 272
fkellermavnet 0:affdbb35faa4 273 bool deleteSMSTextFromMem(char msgIdx);
fkellermavnet 0:affdbb35faa4 274
fkellermavnet 0:affdbb35faa4 275 size_t readSMSText(const char ** log);
fkellermavnet 0:affdbb35faa4 276
fkellermavnet 0:affdbb35faa4 277 ///////////////////////////////////////////
fkellermavnet 0:affdbb35faa4 278 // Neighborhood Cell Info
fkellermavnet 0:affdbb35faa4 279 ///////////////////////////////////////////
fkellermavnet 0:affdbb35faa4 280 size_t getSignalQuality(const char ** log);
fkellermavnet 0:affdbb35faa4 281
fkellermavnet 0:affdbb35faa4 282 // Date Time
fkellermavnet 0:affdbb35faa4 283 bool getTimeDate(struct WncDateTime * tod);
fkellermavnet 0:affdbb35faa4 284
fkellermavnet 0:affdbb35faa4 285 // Ping
fkellermavnet 0:affdbb35faa4 286 bool pingUrl(const char * url);
fkellermavnet 0:affdbb35faa4 287 bool pingIp(const char * ip);
fkellermavnet 0:affdbb35faa4 288
fkellermavnet 0:affdbb35faa4 289 // User command:
fkellermavnet 0:affdbb35faa4 290 size_t sendCustomCmd(const char * cmd, char * resp, size_t sizeRespBuf, int ms_timeout);
fkellermavnet 0:affdbb35faa4 291
fkellermavnet 0:affdbb35faa4 292 protected:
fkellermavnet 0:affdbb35faa4 293
fkellermavnet 0:affdbb35faa4 294 // Debug output methods
fkellermavnet 0:affdbb35faa4 295 int dbgPutsNoTime(const char * s, bool crlf = true);
fkellermavnet 0:affdbb35faa4 296 int dbgPuts(const char * s, bool crlf = true);
fkellermavnet 0:affdbb35faa4 297 const char * _to_string(int64_t value);
fkellermavnet 1:ac2de545b981 298 const char * _to_hex_string(uint8_t value);
fkellermavnet 0:affdbb35faa4 299
fkellermavnet 0:affdbb35faa4 300 // Sends commands to WNC via
fkellermavnet 0:affdbb35faa4 301 enum AtCmdErr_e {
fkellermavnet 0:affdbb35faa4 302 WNC_AT_CMD_OK,
fkellermavnet 0:affdbb35faa4 303 WNC_AT_CMD_ERR,
fkellermavnet 0:affdbb35faa4 304 WNC_AT_CMD_ERREXT,
fkellermavnet 0:affdbb35faa4 305 WNC_AT_CMD_ERRCME,
fkellermavnet 0:affdbb35faa4 306 WNC_AT_CMD_INVALID_RESPONSE,
fkellermavnet 0:affdbb35faa4 307 WNC_AT_CMD_TIMEOUT,
fkellermavnet 0:affdbb35faa4 308 WNC_AT_CMD_NO_CELL_LINK,
fkellermavnet 0:affdbb35faa4 309 WNC_AT_CMD_WNC_NOT_ON
fkellermavnet 0:affdbb35faa4 310 };
fkellermavnet 0:affdbb35faa4 311
fkellermavnet 0:affdbb35faa4 312 // Users must define these functionalities:
fkellermavnet 0:affdbb35faa4 313 virtual int putc(char c) = 0;
fkellermavnet 0:affdbb35faa4 314 virtual int puts(const char * s) = 0;
fkellermavnet 0:affdbb35faa4 315 virtual char getc(void) = 0;
fkellermavnet 1:ac2de545b981 316 virtual int charReady(void) = 0;
fkellermavnet 1:ac2de545b981 317 virtual int dbgWriteChar(char b) = 0;
fkellermavnet 1:ac2de545b981 318 virtual int dbgWriteChars(const char *b) = 0;
fkellermavnet 0:affdbb35faa4 319 virtual void waitMs(int t) = 0;
fkellermavnet 0:affdbb35faa4 320 virtual void waitUs(int t) = 0;
fkellermavnet 0:affdbb35faa4 321 virtual bool initWncModem(uint8_t powerUpTimeoutSecs) = 0;
fkellermavnet 0:affdbb35faa4 322
fkellermavnet 0:affdbb35faa4 323 // Isolate OS timers
fkellermavnet 1:ac2de545b981 324 virtual int getLogTimerTicks(void) = 0;
fkellermavnet 1:ac2de545b981 325 virtual void startTimerA(void) = 0;
fkellermavnet 1:ac2de545b981 326 virtual void stopTimerA(void) = 0;
fkellermavnet 1:ac2de545b981 327 virtual int getTimerTicksA_mS(void) = 0;
fkellermavnet 1:ac2de545b981 328 virtual void startTimerB(void) = 0;
fkellermavnet 1:ac2de545b981 329 virtual void stopTimerB(void) = 0;
fkellermavnet 1:ac2de545b981 330 virtual int getTimerTicksB_mS(void) = 0;
fkellermavnet 0:affdbb35faa4 331
fkellermavnet 0:affdbb35faa4 332 bool waitForPowerOnModemToRespond(uint8_t powerUpTimeoutSecs);
fkellermavnet 2:30d78cda6779 333 AtCmdErr_e sendWncCmd(const char * const s, string ** r, int ms_timeout);
fkellermavnet 2:30d78cda6779 334
fkellermavnet 0:affdbb35faa4 335 private:
fkellermavnet 0:affdbb35faa4 336
fkellermavnet 0:affdbb35faa4 337 bool softwareInitMdm(void);
fkellermavnet 0:affdbb35faa4 338 bool checkCellLink(void);
fkellermavnet 0:affdbb35faa4 339 AtCmdErr_e mdmSendAtCmdRsp(const char * cmd, int timeout_ms, string * rsp, bool crLf = true);
fkellermavnet 1:ac2de545b981 340 size_t mdmGetline(string * buff, int timeout_ms);
fkellermavnet 0:affdbb35faa4 341 bool at_at_wnc(void);
fkellermavnet 0:affdbb35faa4 342 bool at_init_wnc(bool hardReset = false);
fkellermavnet 1:ac2de545b981 343 bool at_sockopen_wnc(const char * const ip, uint16_t port, uint16_t numSock, bool tcp, uint16_t timeOutSec);
fkellermavnet 0:affdbb35faa4 344 bool at_sockclose_wnc(uint16_t numSock);
fkellermavnet 0:affdbb35faa4 345 bool at_dnsresolve_wnc(const char * s, string * ipStr);
fkellermavnet 0:affdbb35faa4 346 AtCmdErr_e at_sockwrite_wnc(const char * s, uint32_t n, uint16_t numSock, bool isTcp);
fkellermavnet 0:affdbb35faa4 347 AtCmdErr_e at_sockread_wnc(uint8_t * pS, uint32_t * numRead, uint16_t n, uint16_t numSock, bool isTcp);
fkellermavnet 0:affdbb35faa4 348 bool at_reinitialize_mdm(void);
fkellermavnet 0:affdbb35faa4 349 AtCmdErr_e at_send_wnc_cmd(const char * s, string ** r, int ms_timeout);
fkellermavnet 0:affdbb35faa4 350 bool at_setapn_wnc(const char * const apnStr);
fkellermavnet 0:affdbb35faa4 351 bool at_sendSMStext_wnc(const char * const phoneNum, const char * const text);
fkellermavnet 0:affdbb35faa4 352 bool at_get_wnc_net_stats(WncIpStats * s);
fkellermavnet 0:affdbb35faa4 353 size_t at_readSMSlog_wnc(const char ** log);
fkellermavnet 0:affdbb35faa4 354 size_t at_readSMStext_wnc(const char ** log);
fkellermavnet 0:affdbb35faa4 355 bool at_getrssiber_wnc(int16_t * dBm, int16_t * ber3g);
fkellermavnet 0:affdbb35faa4 356 void closeOpenSocket(uint16_t numSock);
fkellermavnet 1:ac2de545b981 357 bool sockWrite(const char * const s, uint32_t n, uint16_t numSock, bool isTcp);
fkellermavnet 0:affdbb35faa4 358 bool at_sendSMStextMem_wnc(char n);
fkellermavnet 0:affdbb35faa4 359 bool at_deleteSMSTextFromMem_wnc(char n);
fkellermavnet 0:affdbb35faa4 360 bool at_saveSMStext_wnc(const char * const phoneNum, const char * const text, char * msgIdx);
fkellermavnet 0:affdbb35faa4 361 size_t at_getSignalQuality_wnc(const char ** log);
fkellermavnet 0:affdbb35faa4 362 bool at_gettimedate_wnc(struct WncDateTime * tod);
fkellermavnet 0:affdbb35faa4 363 bool at_ping_wnc(const char * ip);
fkellermavnet 0:affdbb35faa4 364
fkellermavnet 0:affdbb35faa4 365 // Utility methods
fkellermavnet 0:affdbb35faa4 366 void sendCmd(const char * cmd, bool crLf);
fkellermavnet 0:affdbb35faa4 367 void sendCmd(const char * cmd, unsigned n, unsigned wait_uS, bool crLf);
fkellermavnet 0:affdbb35faa4 368 inline void rx_char_wait(void) {
fkellermavnet 0:affdbb35faa4 369 // waitUs(1000);
fkellermavnet 0:affdbb35faa4 370 }
fkellermavnet 0:affdbb35faa4 371
fkellermavnet 0:affdbb35faa4 372 // Important constants
fkellermavnet 0:affdbb35faa4 373 static const uint16_t MAX_WNC_READ_BYTES = 1500; // This bounds the largest amount of data that the WNC read from a socket will return, careful here large chunks come out of the heap
fkellermavnet 0:affdbb35faa4 374 static const uint16_t MAX_WNC_WRITE_BYTES = MAX_WNC_READ_BYTES;
fkellermavnet 0:affdbb35faa4 375 static const uint16_t MAX_LEN_WNC_CMD_RESPONSE = (MAX_WNC_READ_BYTES * 2 + 100); // Max number of text characters in a WNC AT response
fkellermavnet 0:affdbb35faa4 376 static const uint16_t WNC_AUTO_POLL_MS = 250; // Sets default (may be overriden with method) poll interval
fkellermavnet 0:affdbb35faa4 377 static const uint16_t WNC_CMD_TIMEOUT_MS = 40000; // Sets default (may be overriden) time that the software waits for an AT response from the WNC
fkellermavnet 0:affdbb35faa4 378 static const uint16_t WNC_QUICK_CMD_TIMEOUT_MS = 2000; // Used for simple commands that should immediately respond such as "AT"
fkellermavnet 0:affdbb35faa4 379 static const uint16_t WNC_WAIT_FOR_AT_CMD_MS = 0; // 40; // Wait this much between AT commands, this is what WNC advises (they said 20mS, I added margin).
fkellermavnet 0:affdbb35faa4 380 static const uint16_t MAX_WNC_SMS_LENGTH = 150;
fkellermavnet 0:affdbb35faa4 381 static const uint16_t WNC_SOFT_INIT_RETRY_COUNT = 10;
fkellermavnet 0:affdbb35faa4 382 static const uint16_t WNC_DNS_RESOLVE_WAIT_MS = 60000;
fkellermavnet 0:affdbb35faa4 383 static const uint16_t WNC_TRUNC_DEBUG_LENGTH = 80; // Always make this an even number
fkellermavnet 0:affdbb35faa4 384 static const uint16_t WNC_APNSET_TIMEOUT_MS = 60000;
fkellermavnet 0:affdbb35faa4 385 static const uint16_t WNC_PING_CMD_TIMEOUT_MS = 60000; // Amount of time to wait for AT@PINGREQ with default params to timeout
fkellermavnet 0:affdbb35faa4 386 static const int WNC_REINIT_MAX_TIME_MS = 60000;
fkellermavnet 0:affdbb35faa4 387 static const char * const INVALID_IP_STR;
fkellermavnet 0:affdbb35faa4 388
fkellermavnet 0:affdbb35faa4 389 struct WncSocketInfo_s {
fkellermavnet 0:affdbb35faa4 390 bool open;
fkellermavnet 0:affdbb35faa4 391 string myIpAddressStr;
fkellermavnet 0:affdbb35faa4 392 uint16_t myPort;
fkellermavnet 0:affdbb35faa4 393 uint8_t readRetries;
fkellermavnet 0:affdbb35faa4 394 uint16_t readRetryWaitMs;
fkellermavnet 0:affdbb35faa4 395 bool isTcp;
fkellermavnet 0:affdbb35faa4 396 uint16_t timeOutSec;
fkellermavnet 0:affdbb35faa4 397 };
fkellermavnet 0:affdbb35faa4 398
fkellermavnet 0:affdbb35faa4 399 static WncSocketInfo_s m_sSock[MAX_NUM_WNC_SOCKETS];
fkellermavnet 0:affdbb35faa4 400 static WncState_e m_sState;
fkellermavnet 0:affdbb35faa4 401 static uint16_t m_sCmdTimeoutMs;
fkellermavnet 0:affdbb35faa4 402 static string m_sApnStr;
fkellermavnet 0:affdbb35faa4 403 static string m_sWncStr;
fkellermavnet 0:affdbb35faa4 404 static uint8_t m_sPowerUpTimeoutSecs;
fkellermavnet 0:affdbb35faa4 405 static bool m_sDebugEnabled;
fkellermavnet 0:affdbb35faa4 406 static bool m_sMoreDebugEnabled;
fkellermavnet 0:affdbb35faa4 407 static bool m_sCheckNetStatus;
fkellermavnet 0:affdbb35faa4 408 static bool m_sReadyForSMS;
fkellermavnet 0:affdbb35faa4 409 };
fkellermavnet 0:affdbb35faa4 410
fkellermavnet 0:affdbb35faa4 411 }; // End namespace WncController_fk
fkellermavnet 0:affdbb35faa4 412
fkellermavnet 0:affdbb35faa4 413 #endif