Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: WncControllerK64F-httpmmodified
Fork of WNC14A2AInterface by
WNC14A2AInterface.h
00001 /* WNC14A2A implementation of NetworkInterfaceAPI 00002 * Copyright (c) 2015 ARM Limited 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 00017 #ifndef WNC14A2A_INTERFACE_H 00018 #define WNC14A2A_INTERFACE_H 00019 00020 #include <stdint.h> 00021 00022 #include "mbed.h" 00023 #include "WNCDebug.h" 00024 #include "WncControllerK64F/WncControllerK64F.h" 00025 00026 #define WNC14A2A_SOCKET_COUNT 5 00027 00028 00029 typedef struct smsmsg_t { 00030 string number; 00031 string date; 00032 string time; 00033 string msg; 00034 } IOTSMS; 00035 00036 typedef struct socket_t { 00037 int socket; //index of this socket 00038 string url; 00039 SocketAddress addr; //hold info for this socket 00040 bool opened; //has the socket been opened 00041 int proto; //this is a TCP or UDP socket 00042 } WNCSOCKET; 00043 00044 #define WNC_DEBUG 0 //1=enable the WNC startup debug output 00045 //0=disable the WNC startup debug output 00046 #define STOP_ON_FE 1 //1=hang forever if a fatal error occurs 00047 //0=simply return failed response for all socket calls 00048 #define DISPLAY_FE 1 //1 to display the fatal error when it occurs 00049 //0 to NOT display the fatal error 00050 #define RESETON_FE 0 //1 to cause the MCU to reset on fatal error 00051 //0 to NOT reset the MCU 00052 00053 #define APN_DEFAULT "m2m.com.attz" 00054 00055 // 00056 // WNC Error Handling macros & data 00057 // 00058 #define FATAL_FLAG WncController::WNC_NO_RESPONSE 00059 #define WNC_GOOD WncController::WNC_ON 00060 00061 #define RETfail return -1 00062 #define RETvoid return 00063 #define RETnull return NULL 00064 #define RETresume 00065 00066 #define DORET(x) RET##x 00067 00068 #define TOSTR(x) #x 00069 #define INTSTR(x) TOSTR(x) 00070 #define FATAL_STR (char*)(__FILE__ ":" INTSTR(__LINE__)) 00071 00072 #if RESETON_FE == 1 //reset on fatal error 00073 #define MCURESET ((*((volatile unsigned long *)0xE000ED0CU))=(unsigned long)((0x5fa<<16) | 0x04L)) 00074 #define RSTMSG "RESET MCU! " 00075 #else 00076 #define MCURESET 00077 #define RSTMSG "" 00078 #endif 00079 00080 #if DISPLAY_FE == 1 //display fatal error message 00081 #define PFE {if(_debugUart)_debugUart->printf(RSTMSG "\r\n>>WNC FAILED @ %s\r\n", FATAL_STR);} 00082 #else 00083 #define PFE 00084 #endif 00085 00086 #if STOP_ON_FE == 1 //halt cpu on fatal error 00087 #define FATAL_WNC_ERROR(v) {_fatal_err_loc=FATAL_STR;PFE;MCURESET;while(1);} 00088 #else 00089 #define FATAL_WNC_ERROR(v) {_fatal_err_loc=FATAL_STR;PFE;DORET(v);} 00090 #endif 00091 00092 #define CHK_WNCFE(x,y) if( x ){FATAL_WNC_ERROR(y);} 00093 00094 #define MAX_SMS_MSGS 3 00095 00096 using namespace WncController_fk; 00097 00098 /** WNC14A2AInterface class 00099 * Implementation of the NetworkInterface for WNC14A2A 00100 */ 00101 class WNC14A2AInterface : public NetworkStack, public CellularInterface 00102 { 00103 public: 00104 /** WNC14A2AInterface Constructors... 00105 * @param can include an APN string and/or a debug uart 00106 */ 00107 WNC14A2AInterface(WNCDebug *_dbgUart = NULL); 00108 virtual ~WNC14A2AInterface(); 00109 00110 /** Set the cellular network APN and credentials 00111 * 00112 * @param apn Optional name of the network to connect to 00113 * @param user Optional username for the APN 00114 * @param pass Optional password fot the APN 00115 * @return 0 on success, negative error code on failure 00116 */ 00117 virtual nsapi_error_t set_credentials(const char *apn = 0, 00118 const char *username = 0, const char *password = 0); 00119 00120 /** Start the interface 00121 * 00122 * @param apn Optional name of the network to connect to 00123 * @param username Optional username for your APN 00124 * @param password Optional password for your APN 00125 * @return 0 on success, negative error code on failure 00126 */ 00127 virtual nsapi_error_t connect(const char *apn, 00128 const char *username = 0, const char *password = 0); 00129 00130 /** Start the interface 00131 * 00132 * Attempts to connect to a cellular network based on supplied credentials 00133 * 00134 * @return 0 on success, negative error code on failure 00135 */ 00136 virtual nsapi_error_t connect(); 00137 00138 /** Stop the interface 00139 * 00140 * @return 0 on success, negative error code on failure 00141 */ 00142 virtual nsapi_error_t disconnect(); 00143 00144 /** Get the internally stored IP address. From NetworkStack Class 00145 * @return IP address of the interface or null if not yet connected 00146 */ 00147 virtual const char *get_ip_address(); 00148 00149 /** Get the network assigned IP address. 00150 * @return IP address of the interface or null if not yet connected 00151 */ 00152 const char *get_my_ip_address(); 00153 00154 /** Get the internally stored MAC address. From CellularInterface Class 00155 * @return MAC address of the interface 00156 */ 00157 virtual const char *get_mac_address(); 00158 00159 /** Attach a function to be called when a text is recevieds 00160 * @param callback function pointer to a callback that will accept the message 00161 * contents when a text is received. 00162 */ 00163 void sms_attach(void (*callback)(IOTSMS *)); 00164 00165 void doDebug(int v); 00166 00167 bool registered(); 00168 00169 void sms_start(void); 00170 00171 /** start listening for incomming SMS messages 00172 * @param time in msec to check 00173 */ 00174 void sms_listen(uint16_t=1000); // Configure device to listen for text messages 00175 00176 int getSMS(IOTSMS **msg); 00177 00178 int sendIOTSms(const string&, const string&); 00179 00180 char* getSMSnbr(); 00181 00182 00183 protected: 00184 00185 /** Get Host IP by name. From NetworkStack Class 00186 */ 00187 virtual nsapi_error_t gethostbyname(const char* name, SocketAddress *address, nsapi_version_t version); 00188 00189 00190 /** Provide access to the NetworkStack object 00191 * 00192 * @return The underlying NetworkStack object 00193 */ 00194 virtual NetworkStack *get_stack(); 00195 00196 /** Open a socket. FROM NetworkStack 00197 * @param handle Handle in which to store new socket 00198 * @param proto Type of socket to open, NSAPI_TCP or NSAPI_UDP 00199 * @return 0 on success, negative on failure 00200 */ 00201 virtual int socket_open(void **handle, nsapi_protocol_t proto); 00202 00203 /** Close the socket. FROM NetworkStack 00204 * @param handle Socket handle 00205 * @return 0 on success, negative on failure 00206 * @note On failure, any memory associated with the socket must still 00207 * be cleaned up 00208 */ 00209 virtual int socket_close(void *handle); 00210 00211 /** Bind a server socket to a specific port.FROM NetworkStack 00212 * @param handle Socket handle 00213 * @param address Local address to listen for incoming connections on 00214 * @return 0 on success, negative on failure. 00215 */ 00216 virtual int socket_bind(void *handle, const SocketAddress &address); 00217 00218 /** Start listening for incoming connections.FROM NetworkStack 00219 * @param handle Socket handle 00220 * @param backlog Number of pending connections that can be queued up at any 00221 * one time [Default: 1] 00222 * @return 0 on success, negative on failure 00223 */ 00224 virtual int socket_listen(void *handle, int backlog); 00225 00226 /** Connects this TCP socket to the server.FROM NetworkStack 00227 * @param handle Socket handle 00228 * @param address SocketAddress to connect to 00229 * @return 0 on success, negative on failure 00230 */ 00231 virtual int socket_connect(void *handle, const SocketAddress &address); 00232 00233 /** Accept a new connection.FROM NetworkStack 00234 * @param handle Handle in which to store new socket 00235 * @param server Socket handle to server to accept from 00236 * @return 0 on success, negative on failure 00237 * @note This call is not-blocking, if this call would block, must 00238 * immediately return NSAPI_ERROR_WOULD_WAIT 00239 */ 00240 virtual int socket_accept(nsapi_socket_t server, 00241 nsapi_socket_t *handle, SocketAddress *address=0); 00242 00243 /** Send data to the remote host.FROM NetworkStack 00244 * @param handle Socket handle 00245 * @param data The buffer to send to the host 00246 * @param size The length of the buffer to send 00247 * @return Number of written bytes on success, negative on failure 00248 * @note This call is not-blocking, if this call would block, must 00249 * immediately return NSAPI_ERROR_WOULD_WAIT 00250 */ 00251 virtual int socket_send(void *handle, const void *data, unsigned size); 00252 00253 /** Receive data from the remote host.FROM NetworkStack 00254 * @param handle Socket handle 00255 * @param data The buffer in which to store the data received from the host 00256 * @param size The maximum length of the buffer 00257 * @return Number of received bytes on success, negative on failure 00258 * @note This call is not-blocking, if this call would block, must 00259 * immediately return NSAPI_ERROR_WOULD_WAIT 00260 */ 00261 virtual int socket_recv(void *handle, void *data, unsigned size); 00262 00263 /** Send a packet to a remote endpoint.FROM NetworkStack 00264 * @param handle Socket handle 00265 * @param address The remote SocketAddress 00266 * @param data The packet to be sent 00267 * @param size The length of the packet to be sent 00268 * @return the number of written bytes on success, negative on failure 00269 * @note This call is not-blocking, if this call would block, must 00270 * immediately return NSAPI_ERROR_WOULD_WAIT 00271 */ 00272 virtual int socket_sendto(void *handle, const SocketAddress &address, const void *data, unsigned size); 00273 00274 /** Receive a packet from a remote endpoint.FROM NetworkStack 00275 * @param handle Socket handle 00276 * @param address Destination for the remote SocketAddress or null 00277 * @param buffer The buffer for storing the incoming packet data 00278 * If a packet is too long to fit in the supplied buffer, 00279 * excess bytes are discarded 00280 * @param size The length of the buffer 00281 * @return the number of received bytes on success, negative on failure 00282 * @note This call is not-blocking, if this call would block, must 00283 * immediately return NSAPI_ERROR_WOULD_WAIT 00284 */ 00285 virtual int socket_recvfrom(void *handle, SocketAddress *address, void *buffer, unsigned size); 00286 00287 /** Register a callback on state change of the socket.FROM NetworkStack 00288 * @param handle Socket handle 00289 * @param callback Function to call on state change 00290 * @param data Argument to pass to callback 00291 * @note Callback may be called in an interrupt context. 00292 */ 00293 virtual void socket_attach(void *handle, void (*callback)(void *), void *data); 00294 00295 /** check for errors that may have occured 00296 * @param none. 00297 * @note this function can be called after any WNC14A2A class operation 00298 * to determine error specifics if desired. 00299 */ 00300 uint16_t wnc14a2a_chk_error(void) { return _errors; } 00301 00302 00303 private: 00304 // WncController Class for managing the 14A2a 00305 friend class WncControllerK64F; 00306 00307 bool m_wncpoweredup; //track if WNC has been power-up 00308 bool m_debug; 00309 00310 WncIpStats myNetStats; //maintaint the network statistics 00311 WncControllerK64F_fk::WncControllerK64F *_pwnc; //pointer to the WncController instance 00312 00313 int m_active_socket; // a 'pseudo' global to track the active socket 00314 WNCDebug *_debugUart; // Serial object for parser to communicate with radio 00315 char *_fatal_err_loc; // holds string containing location of fatal error 00316 nsapi_error_t _errors; 00317 00318 bool m_smsmoning; // Track if the SMS monitoring thread is running 00319 EventQueue sms_queue; // Queue used to schedule for SMS checks 00320 Semaphore sms_rx_sem; // Semaphore to signal sms_event_thread to check for incoming text 00321 void (*_sms_cb)(IOTSMS *); // Callback when text message is received. User must define this as 00322 // a static function because I'm not handling an object offset 00323 IOTSMS m_MsgText, m_MsgText_array[MAX_SMS_MSGS]; // Used to pass SMS message to the user 00324 struct WncController::WncSmsList m_smsmsgs; //use the WncSmsList structure to hold messages 00325 00326 void handle_sms_event(); // Handle incoming text data 00327 00328 char _mac_address[NSAPI_MAC_SIZE]; // local Mac 00329 void debugOutput(WNCDebug *dbgOut, char * format, ...); 00330 }; 00331 00332 #endif
Generated on Sat Jul 23 2022 09:42:04 by
1.7.2
