modified to get more signal info

Fork of WncControllerLibrary by Fred Kellerman

Committer:
fkellermavnet
Date:
Mon Sep 19 17:39:40 2016 +0000
Revision:
24:b0bc03d4ab93
Parent:
22:db78f3e0d782
Child:
25:cc8548faab1d
Test comment.

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