wifi test

Dependencies:   X_NUCLEO_IKS01A2 mbed-http

Committer:
JMF
Date:
Wed Sep 05 14:28:24 2018 +0000
Revision:
0:24d3eb812fd4
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JMF 0:24d3eb812fd4 1 /* SPWFSAxx Devices
JMF 0:24d3eb812fd4 2 * Copyright (c) 2015 ARM Limited
JMF 0:24d3eb812fd4 3 *
JMF 0:24d3eb812fd4 4 * Licensed under the Apache License, Version 2.0 (the "License");
JMF 0:24d3eb812fd4 5 * you may not use this file except in compliance with the License.
JMF 0:24d3eb812fd4 6 * You may obtain a copy of the License at
JMF 0:24d3eb812fd4 7 *
JMF 0:24d3eb812fd4 8 * http://www.apache.org/licenses/LICENSE-2.0
JMF 0:24d3eb812fd4 9 *
JMF 0:24d3eb812fd4 10 * Unless required by applicable law or agreed to in writing, software
JMF 0:24d3eb812fd4 11 * distributed under the License is distributed on an "AS IS" BASIS,
JMF 0:24d3eb812fd4 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
JMF 0:24d3eb812fd4 13 * See the License for the specific language governing permissions and
JMF 0:24d3eb812fd4 14 * limitations under the License.
JMF 0:24d3eb812fd4 15 */
JMF 0:24d3eb812fd4 16
JMF 0:24d3eb812fd4 17 #ifndef SPWFSAXX_H
JMF 0:24d3eb812fd4 18 #define SPWFSAXX_H
JMF 0:24d3eb812fd4 19
JMF 0:24d3eb812fd4 20 #include "mbed.h"
JMF 0:24d3eb812fd4 21 #include "ATCmdParser.h"
JMF 0:24d3eb812fd4 22 #include "BlockExecuter.h"
JMF 0:24d3eb812fd4 23
JMF 0:24d3eb812fd4 24 /* Common SPWFSAxx macros */
JMF 0:24d3eb812fd4 25 #define SPWFXX_WINDS_LOW_ON "0x00000000"
JMF 0:24d3eb812fd4 26 #define SPWFXX_DEFAULT_BAUD_RATE 115200
JMF 0:24d3eb812fd4 27 #define SPWFXX_MAX_TRIALS 3
JMF 0:24d3eb812fd4 28
JMF 0:24d3eb812fd4 29 #if !defined(SPWFSAXX_RTS_PIN)
JMF 0:24d3eb812fd4 30 #define SPWFSAXX_RTS_PIN NC
JMF 0:24d3eb812fd4 31 #endif // !defined(SPWFSAXX_RTS_PIN)
JMF 0:24d3eb812fd4 32 #if !defined(SPWFSAXX_CTS_PIN)
JMF 0:24d3eb812fd4 33 #define SPWFSAXX_CTS_PIN NC
JMF 0:24d3eb812fd4 34 #endif // !defined(SPWFSAXX_CTS_PIN)
JMF 0:24d3eb812fd4 35
JMF 0:24d3eb812fd4 36 #define SPWFXX_ERR_OK (+1)
JMF 0:24d3eb812fd4 37 #define SPWFXX_ERR_OOM (-1)
JMF 0:24d3eb812fd4 38 #define SPWFXX_ERR_READ (-2)
JMF 0:24d3eb812fd4 39 #define SPWFXX_ERR_LEN (-3)
JMF 0:24d3eb812fd4 40
JMF 0:24d3eb812fd4 41
JMF 0:24d3eb812fd4 42 /* Max number of sockets & packets */
JMF 0:24d3eb812fd4 43 #define SPWFSA_SOCKET_COUNT (8)
JMF 0:24d3eb812fd4 44 #define SPWFSA_MAX_PACKETS (4)
JMF 0:24d3eb812fd4 45
JMF 0:24d3eb812fd4 46 #define PENDING_DATA_SLOTS (13)
JMF 0:24d3eb812fd4 47
JMF 0:24d3eb812fd4 48 /* Pending data packets size buffer */
JMF 0:24d3eb812fd4 49 class SpwfRealPendingPackets {
JMF 0:24d3eb812fd4 50 public:
JMF 0:24d3eb812fd4 51 SpwfRealPendingPackets() {
JMF 0:24d3eb812fd4 52 reset();
JMF 0:24d3eb812fd4 53 }
JMF 0:24d3eb812fd4 54
JMF 0:24d3eb812fd4 55 void add(uint32_t new_cum_size) {
JMF 0:24d3eb812fd4 56 MBED_ASSERT(new_cum_size >= cumulative_size);
JMF 0:24d3eb812fd4 57
JMF 0:24d3eb812fd4 58 if(new_cum_size == cumulative_size) {
JMF 0:24d3eb812fd4 59 /* nothing to do */
JMF 0:24d3eb812fd4 60 return;
JMF 0:24d3eb812fd4 61 }
JMF 0:24d3eb812fd4 62
JMF 0:24d3eb812fd4 63 /* => `new_cum_size > cumulative_size` */
JMF 0:24d3eb812fd4 64 real_pkt_sizes[last_pkt_ptr] = (uint16_t)(new_cum_size - cumulative_size);
JMF 0:24d3eb812fd4 65 cumulative_size = new_cum_size;
JMF 0:24d3eb812fd4 66
JMF 0:24d3eb812fd4 67 last_pkt_ptr = (last_pkt_ptr + 1) % PENDING_DATA_SLOTS;
JMF 0:24d3eb812fd4 68
JMF 0:24d3eb812fd4 69 MBED_ASSERT(first_pkt_ptr != last_pkt_ptr);
JMF 0:24d3eb812fd4 70 }
JMF 0:24d3eb812fd4 71
JMF 0:24d3eb812fd4 72 uint32_t get(void) {
JMF 0:24d3eb812fd4 73 if(empty()) return 0;
JMF 0:24d3eb812fd4 74
JMF 0:24d3eb812fd4 75 return real_pkt_sizes[first_pkt_ptr];
JMF 0:24d3eb812fd4 76 }
JMF 0:24d3eb812fd4 77
JMF 0:24d3eb812fd4 78 uint32_t cumulative(void) {
JMF 0:24d3eb812fd4 79 return cumulative_size;
JMF 0:24d3eb812fd4 80 }
JMF 0:24d3eb812fd4 81
JMF 0:24d3eb812fd4 82 uint32_t remove(uint32_t size) {
JMF 0:24d3eb812fd4 83 MBED_ASSERT(!empty());
JMF 0:24d3eb812fd4 84
JMF 0:24d3eb812fd4 85 uint32_t ret = real_pkt_sizes[first_pkt_ptr];
JMF 0:24d3eb812fd4 86 first_pkt_ptr = (first_pkt_ptr + 1) % PENDING_DATA_SLOTS;
JMF 0:24d3eb812fd4 87
JMF 0:24d3eb812fd4 88 MBED_ASSERT(ret == size);
JMF 0:24d3eb812fd4 89 MBED_ASSERT(ret <= cumulative_size);
JMF 0:24d3eb812fd4 90 cumulative_size -= ret;
JMF 0:24d3eb812fd4 91
JMF 0:24d3eb812fd4 92 return ret;
JMF 0:24d3eb812fd4 93 }
JMF 0:24d3eb812fd4 94
JMF 0:24d3eb812fd4 95 void reset(void) {
JMF 0:24d3eb812fd4 96 memset(this, 0, sizeof(*this));
JMF 0:24d3eb812fd4 97 }
JMF 0:24d3eb812fd4 98
JMF 0:24d3eb812fd4 99 private:
JMF 0:24d3eb812fd4 100 bool empty(void) {
JMF 0:24d3eb812fd4 101 if(first_pkt_ptr == last_pkt_ptr) {
JMF 0:24d3eb812fd4 102 MBED_ASSERT(cumulative_size == 0);
JMF 0:24d3eb812fd4 103 return true;
JMF 0:24d3eb812fd4 104 }
JMF 0:24d3eb812fd4 105 return false;
JMF 0:24d3eb812fd4 106 }
JMF 0:24d3eb812fd4 107
JMF 0:24d3eb812fd4 108 uint16_t real_pkt_sizes[PENDING_DATA_SLOTS];
JMF 0:24d3eb812fd4 109 uint8_t first_pkt_ptr;
JMF 0:24d3eb812fd4 110 uint8_t last_pkt_ptr;
JMF 0:24d3eb812fd4 111 uint32_t cumulative_size;
JMF 0:24d3eb812fd4 112 };
JMF 0:24d3eb812fd4 113
JMF 0:24d3eb812fd4 114 class SpwfSAInterface;
JMF 0:24d3eb812fd4 115
JMF 0:24d3eb812fd4 116 /** SPWFSAxx Interface class.
JMF 0:24d3eb812fd4 117 This is an interface to a SPWFSAxx module.
JMF 0:24d3eb812fd4 118 */
JMF 0:24d3eb812fd4 119 class SPWFSAxx
JMF 0:24d3eb812fd4 120 {
JMF 0:24d3eb812fd4 121 private:
JMF 0:24d3eb812fd4 122 /* abstract class*/
JMF 0:24d3eb812fd4 123 SPWFSAxx(PinName tx, PinName rx, PinName rts, PinName cts,
JMF 0:24d3eb812fd4 124 SpwfSAInterface &ifce, bool debug,
JMF 0:24d3eb812fd4 125 PinName wakeup, PinName reset);
JMF 0:24d3eb812fd4 126
JMF 0:24d3eb812fd4 127 public:
JMF 0:24d3eb812fd4 128 /**
JMF 0:24d3eb812fd4 129 * Init the SPWFSAxx
JMF 0:24d3eb812fd4 130 *
JMF 0:24d3eb812fd4 131 * @param mode mode in which to startup
JMF 0:24d3eb812fd4 132 * @return true only if SPWFSAxx has started up correctly
JMF 0:24d3eb812fd4 133 */
JMF 0:24d3eb812fd4 134 bool startup(int mode);
JMF 0:24d3eb812fd4 135
JMF 0:24d3eb812fd4 136 /**
JMF 0:24d3eb812fd4 137 * Connect SPWFSAxx to AP
JMF 0:24d3eb812fd4 138 *
JMF 0:24d3eb812fd4 139 * @param ap the name of the AP
JMF 0:24d3eb812fd4 140 * @param passPhrase the password of AP
JMF 0:24d3eb812fd4 141 * @param securityMode the security mode of AP (WPA/WPA2, WEP, Open)
JMF 0:24d3eb812fd4 142 * @return true only if SPWFSAxx is connected successfully
JMF 0:24d3eb812fd4 143 */
JMF 0:24d3eb812fd4 144 bool connect(const char *ap, const char *passPhrase, int securityMode);
JMF 0:24d3eb812fd4 145
JMF 0:24d3eb812fd4 146 /**
JMF 0:24d3eb812fd4 147 * Disconnect SPWFSAxx from AP
JMF 0:24d3eb812fd4 148 *
JMF 0:24d3eb812fd4 149 * @return true only if SPWFSAxx is disconnected successfully
JMF 0:24d3eb812fd4 150 */
JMF 0:24d3eb812fd4 151 bool disconnect(void);
JMF 0:24d3eb812fd4 152
JMF 0:24d3eb812fd4 153 /**
JMF 0:24d3eb812fd4 154 * Get the IP address of SPWFSAxx
JMF 0:24d3eb812fd4 155 *
JMF 0:24d3eb812fd4 156 * @return null-terminated IP address or null if no IP address is assigned
JMF 0:24d3eb812fd4 157 */
JMF 0:24d3eb812fd4 158 const char *getIPAddress(void);
JMF 0:24d3eb812fd4 159
JMF 0:24d3eb812fd4 160 /**
JMF 0:24d3eb812fd4 161 * Get the MAC address of SPWFSAxx
JMF 0:24d3eb812fd4 162 *
JMF 0:24d3eb812fd4 163 * @return null-terminated MAC address or null if no MAC address is assigned
JMF 0:24d3eb812fd4 164 */
JMF 0:24d3eb812fd4 165 const char *getMACAddress(void);
JMF 0:24d3eb812fd4 166
JMF 0:24d3eb812fd4 167 /** Get the local gateway
JMF 0:24d3eb812fd4 168 *
JMF 0:24d3eb812fd4 169 * @return Null-terminated representation of the local gateway
JMF 0:24d3eb812fd4 170 * or null if no network mask has been received
JMF 0:24d3eb812fd4 171 */
JMF 0:24d3eb812fd4 172 const char *getGateway(void);
JMF 0:24d3eb812fd4 173
JMF 0:24d3eb812fd4 174 /** Get the local network mask
JMF 0:24d3eb812fd4 175 *
JMF 0:24d3eb812fd4 176 * @return Null-terminated representation of the local network mask
JMF 0:24d3eb812fd4 177 * or null if no network mask has been received
JMF 0:24d3eb812fd4 178 */
JMF 0:24d3eb812fd4 179 const char *getNetmask(void);
JMF 0:24d3eb812fd4 180
JMF 0:24d3eb812fd4 181 /** Gets the current radio signal strength for active connection
JMF 0:24d3eb812fd4 182 *
JMF 0:24d3eb812fd4 183 * @return Connection strength in dBm (negative value)
JMF 0:24d3eb812fd4 184 */
JMF 0:24d3eb812fd4 185 int8_t getRssi();
JMF 0:24d3eb812fd4 186
JMF 0:24d3eb812fd4 187 /**
JMF 0:24d3eb812fd4 188 * Sends data to an open socket
JMF 0:24d3eb812fd4 189 *
JMF 0:24d3eb812fd4 190 * @param spwf_id module id of socket to send to
JMF 0:24d3eb812fd4 191 * @param data data to be sent
JMF 0:24d3eb812fd4 192 * @param amount amount of data to be sent - max 1024
JMF 0:24d3eb812fd4 193 * @param internal_id driver id of socket to send to
JMF 0:24d3eb812fd4 194 * @return number of written bytes on success, negative on failure
JMF 0:24d3eb812fd4 195 */
JMF 0:24d3eb812fd4 196 nsapi_size_or_error_t send(int spwf_id, const void *data, uint32_t amount, int internal_id);
JMF 0:24d3eb812fd4 197
JMF 0:24d3eb812fd4 198 /**
JMF 0:24d3eb812fd4 199 * Receives data from an open socket
JMF 0:24d3eb812fd4 200 *
JMF 0:24d3eb812fd4 201 * @param id id to receive from
JMF 0:24d3eb812fd4 202 * @param data placeholder for returned information
JMF 0:24d3eb812fd4 203 * @param amount number of bytes to be received
JMF 0:24d3eb812fd4 204 * @param datagram receive a datagram packet
JMF 0:24d3eb812fd4 205 * @return the number of bytes received
JMF 0:24d3eb812fd4 206 */
JMF 0:24d3eb812fd4 207 int32_t recv(int id, void *data, uint32_t amount, bool datagram);
JMF 0:24d3eb812fd4 208
JMF 0:24d3eb812fd4 209 /**
JMF 0:24d3eb812fd4 210 * Closes a socket
JMF 0:24d3eb812fd4 211 *
JMF 0:24d3eb812fd4 212 * @param id id of socket to close, valid only 0-4
JMF 0:24d3eb812fd4 213 * @return true only if socket is closed successfully
JMF 0:24d3eb812fd4 214 */
JMF 0:24d3eb812fd4 215 bool close(int id);
JMF 0:24d3eb812fd4 216
JMF 0:24d3eb812fd4 217 /**
JMF 0:24d3eb812fd4 218 * Allows timeout to be changed between commands
JMF 0:24d3eb812fd4 219 *
JMF 0:24d3eb812fd4 220 * @param timeout_ms timeout of the connection
JMF 0:24d3eb812fd4 221 */
JMF 0:24d3eb812fd4 222 void setTimeout(uint32_t timeout_ms);
JMF 0:24d3eb812fd4 223
JMF 0:24d3eb812fd4 224 /**
JMF 0:24d3eb812fd4 225 * Attach a function to call whenever network state has changed
JMF 0:24d3eb812fd4 226 *
JMF 0:24d3eb812fd4 227 * @param func A pointer to a void function, or 0 to set as none
JMF 0:24d3eb812fd4 228 */
JMF 0:24d3eb812fd4 229 void attach(Callback<void()> func);
JMF 0:24d3eb812fd4 230
JMF 0:24d3eb812fd4 231 /**
JMF 0:24d3eb812fd4 232 * Attach a function to call whenever network state has changed
JMF 0:24d3eb812fd4 233 *
JMF 0:24d3eb812fd4 234 * @param obj pointer to the object to call the member function on
JMF 0:24d3eb812fd4 235 * @param method pointer to the member function to call
JMF 0:24d3eb812fd4 236 */
JMF 0:24d3eb812fd4 237 template <typename T, typename M>
JMF 0:24d3eb812fd4 238 void attach(T *obj, M method) {
JMF 0:24d3eb812fd4 239 attach(Callback<void()>(obj, method));
JMF 0:24d3eb812fd4 240 }
JMF 0:24d3eb812fd4 241
JMF 0:24d3eb812fd4 242 static const char _cr_ = '\x0d'; // '\r' carriage return
JMF 0:24d3eb812fd4 243 static const char _lf_ = '\x0a'; // '\n' line feed
JMF 0:24d3eb812fd4 244
JMF 0:24d3eb812fd4 245 private:
JMF 0:24d3eb812fd4 246 UARTSerial _serial;
JMF 0:24d3eb812fd4 247 ATCmdParser _parser;
JMF 0:24d3eb812fd4 248
JMF 0:24d3eb812fd4 249 DigitalOut _wakeup;
JMF 0:24d3eb812fd4 250 DigitalOut _reset;
JMF 0:24d3eb812fd4 251 PinName _rts;
JMF 0:24d3eb812fd4 252 PinName _cts;
JMF 0:24d3eb812fd4 253
JMF 0:24d3eb812fd4 254 int _timeout;
JMF 0:24d3eb812fd4 255 bool _dbg_on;
JMF 0:24d3eb812fd4 256
JMF 0:24d3eb812fd4 257 int _pending_sockets_bitmap;
JMF 0:24d3eb812fd4 258 SpwfRealPendingPackets _pending_pkt_sizes[SPWFSA_SOCKET_COUNT];
JMF 0:24d3eb812fd4 259
JMF 0:24d3eb812fd4 260 bool _network_lost_flag;
JMF 0:24d3eb812fd4 261 SpwfSAInterface &_associated_interface;
JMF 0:24d3eb812fd4 262
JMF 0:24d3eb812fd4 263 /**
JMF 0:24d3eb812fd4 264 * Reset SPWFSAxx
JMF 0:24d3eb812fd4 265 *
JMF 0:24d3eb812fd4 266 * @return true only if SPWFSAxx resets successfully
JMF 0:24d3eb812fd4 267 */
JMF 0:24d3eb812fd4 268 bool hw_reset(void);
JMF 0:24d3eb812fd4 269 bool reset(void);
JMF 0:24d3eb812fd4 270
JMF 0:24d3eb812fd4 271 /**
JMF 0:24d3eb812fd4 272 * Check if SPWFSAxx is connected
JMF 0:24d3eb812fd4 273 *
JMF 0:24d3eb812fd4 274 * @return true only if the chip has an IP address
JMF 0:24d3eb812fd4 275 */
JMF 0:24d3eb812fd4 276 bool isConnected(void);
JMF 0:24d3eb812fd4 277
JMF 0:24d3eb812fd4 278 /**
JMF 0:24d3eb812fd4 279 * Checks if data is available
JMF 0:24d3eb812fd4 280 */
JMF 0:24d3eb812fd4 281 bool readable(void) {
JMF 0:24d3eb812fd4 282 return _serial.FileHandle::readable();
JMF 0:24d3eb812fd4 283 }
JMF 0:24d3eb812fd4 284
JMF 0:24d3eb812fd4 285 /**
JMF 0:24d3eb812fd4 286 * Checks if data can be written
JMF 0:24d3eb812fd4 287 */
JMF 0:24d3eb812fd4 288 bool writeable(void) {
JMF 0:24d3eb812fd4 289 return _serial.FileHandle::writable();
JMF 0:24d3eb812fd4 290 }
JMF 0:24d3eb812fd4 291
JMF 0:24d3eb812fd4 292 /**
JMF 0:24d3eb812fd4 293 * Try to empty RX buffer
JMF 0:24d3eb812fd4 294 * Can be used when commands fail receiving expected response to try to recover situation
JMF 0:24d3eb812fd4 295 * @note Gives no guarantee that situation improves
JMF 0:24d3eb812fd4 296 */
JMF 0:24d3eb812fd4 297 void empty_rx_buffer(void) {
JMF 0:24d3eb812fd4 298 while(readable()) _parser.getc();
JMF 0:24d3eb812fd4 299 }
JMF 0:24d3eb812fd4 300
JMF 0:24d3eb812fd4 301 /* block calling (external) callback */
JMF 0:24d3eb812fd4 302 volatile unsigned int _call_event_callback_blocked;
JMF 0:24d3eb812fd4 303 Callback<void()> _callback_func;
JMF 0:24d3eb812fd4 304
JMF 0:24d3eb812fd4 305 struct packet {
JMF 0:24d3eb812fd4 306 struct packet *next;
JMF 0:24d3eb812fd4 307 int id;
JMF 0:24d3eb812fd4 308 uint32_t len;
JMF 0:24d3eb812fd4 309 // data follows
JMF 0:24d3eb812fd4 310 } *_packets, **_packets_end;
JMF 0:24d3eb812fd4 311
JMF 0:24d3eb812fd4 312 void _packet_handler_th(void);
JMF 0:24d3eb812fd4 313 void _execute_bottom_halves(void);
JMF 0:24d3eb812fd4 314 void _network_lost_handler_th(void);
JMF 0:24d3eb812fd4 315 void _network_lost_handler_bh(void);
JMF 0:24d3eb812fd4 316 void _hard_fault_handler(void);
JMF 0:24d3eb812fd4 317 void _wifi_hwfault_handler(void);
JMF 0:24d3eb812fd4 318 void _server_gone_handler(void);
JMF 0:24d3eb812fd4 319 #if MBED_CONF_IDW0XX1_EXPANSION_BOARD == IDW04A1
JMF 0:24d3eb812fd4 320 void _skip_oob(void);
JMF 0:24d3eb812fd4 321 #endif
JMF 0:24d3eb812fd4 322 bool _wait_wifi_hw_started(void);
JMF 0:24d3eb812fd4 323 bool _wait_console_active(void);
JMF 0:24d3eb812fd4 324 int _read_len(int);
JMF 0:24d3eb812fd4 325 int _flush_in(char*, int);
JMF 0:24d3eb812fd4 326 bool _winds_off(void);
JMF 0:24d3eb812fd4 327 void _winds_on(void);
JMF 0:24d3eb812fd4 328 void _read_in_pending(void);
JMF 0:24d3eb812fd4 329 int _read_in_pkt(int spwf_id, bool close);
JMF 0:24d3eb812fd4 330 int _read_in_packet(int spwf_id, uint32_t amount);
JMF 0:24d3eb812fd4 331 void _recover_from_hard_faults(void);
JMF 0:24d3eb812fd4 332 void _free_packets(int spwf_id);
JMF 0:24d3eb812fd4 333 void _free_all_packets(void);
JMF 0:24d3eb812fd4 334 void _process_winds();
JMF 0:24d3eb812fd4 335
JMF 0:24d3eb812fd4 336 virtual int _read_in(char*, int, uint32_t) = 0;
JMF 0:24d3eb812fd4 337
JMF 0:24d3eb812fd4 338 bool _recv_delim_lf(void) {
JMF 0:24d3eb812fd4 339 return (_parser.getc() == _lf_);
JMF 0:24d3eb812fd4 340 }
JMF 0:24d3eb812fd4 341
JMF 0:24d3eb812fd4 342 bool _recv_delim_cr(void) {
JMF 0:24d3eb812fd4 343 return (_parser.getc() == _cr_);
JMF 0:24d3eb812fd4 344 }
JMF 0:24d3eb812fd4 345
JMF 0:24d3eb812fd4 346 bool _recv_delim_cr_lf(void) {
JMF 0:24d3eb812fd4 347 return _recv_delim_cr() && _recv_delim_lf();
JMF 0:24d3eb812fd4 348 }
JMF 0:24d3eb812fd4 349
JMF 0:24d3eb812fd4 350 bool _recv_ok(void) {
JMF 0:24d3eb812fd4 351 return _parser.recv(SPWFXX_RECV_OK) && _recv_delim_lf();
JMF 0:24d3eb812fd4 352 }
JMF 0:24d3eb812fd4 353
JMF 0:24d3eb812fd4 354 void _add_pending_packet_sz(int spwf_id, uint32_t size);
JMF 0:24d3eb812fd4 355 void _add_pending_pkt_size(int spwf_id, uint32_t size) {
JMF 0:24d3eb812fd4 356 _pending_pkt_sizes[spwf_id].add(size);
JMF 0:24d3eb812fd4 357 }
JMF 0:24d3eb812fd4 358
JMF 0:24d3eb812fd4 359 uint32_t _get_cumulative_size(int spwf_id) {
JMF 0:24d3eb812fd4 360 return _pending_pkt_sizes[spwf_id].cumulative();
JMF 0:24d3eb812fd4 361 }
JMF 0:24d3eb812fd4 362
JMF 0:24d3eb812fd4 363 uint32_t _remove_pending_pkt_size(int spwf_id, uint32_t size) {
JMF 0:24d3eb812fd4 364 return _pending_pkt_sizes[spwf_id].remove(size);
JMF 0:24d3eb812fd4 365 }
JMF 0:24d3eb812fd4 366
JMF 0:24d3eb812fd4 367 uint32_t _get_pending_pkt_size(int spwf_id) {
JMF 0:24d3eb812fd4 368 return _pending_pkt_sizes[spwf_id].get();
JMF 0:24d3eb812fd4 369 }
JMF 0:24d3eb812fd4 370
JMF 0:24d3eb812fd4 371 void _reset_pending_pkt_sizes(int spwf_id) {
JMF 0:24d3eb812fd4 372 _pending_pkt_sizes[spwf_id].reset();
JMF 0:24d3eb812fd4 373 }
JMF 0:24d3eb812fd4 374
JMF 0:24d3eb812fd4 375 void _set_pending_data(int spwf_id) {
JMF 0:24d3eb812fd4 376 _pending_sockets_bitmap |= (1 << spwf_id);
JMF 0:24d3eb812fd4 377 }
JMF 0:24d3eb812fd4 378
JMF 0:24d3eb812fd4 379 void _clear_pending_data(int spwf_id) {
JMF 0:24d3eb812fd4 380 _pending_sockets_bitmap &= ~(1 << spwf_id);
JMF 0:24d3eb812fd4 381 }
JMF 0:24d3eb812fd4 382
JMF 0:24d3eb812fd4 383 bool _is_data_pending(int spwf_id) {
JMF 0:24d3eb812fd4 384 return (_pending_sockets_bitmap & (1 << spwf_id)) ? true : false;
JMF 0:24d3eb812fd4 385 }
JMF 0:24d3eb812fd4 386
JMF 0:24d3eb812fd4 387 bool _is_data_pending(void) {
JMF 0:24d3eb812fd4 388 if(_pending_sockets_bitmap != 0) return true;
JMF 0:24d3eb812fd4 389 else return false;
JMF 0:24d3eb812fd4 390 }
JMF 0:24d3eb812fd4 391
JMF 0:24d3eb812fd4 392 void _packet_handler_bh(void) {
JMF 0:24d3eb812fd4 393 /* read in other eventually pending packages */
JMF 0:24d3eb812fd4 394 _read_in_pending();
JMF 0:24d3eb812fd4 395 }
JMF 0:24d3eb812fd4 396
JMF 0:24d3eb812fd4 397 /* Do not call the (external) callback in IRQ context while performing critical module operations */
JMF 0:24d3eb812fd4 398 void _event_handler(void);
JMF 0:24d3eb812fd4 399
JMF 0:24d3eb812fd4 400 void _error_handler(void);
JMF 0:24d3eb812fd4 401
JMF 0:24d3eb812fd4 402 void _call_callback(void) {
JMF 0:24d3eb812fd4 403 if((bool)_callback_func) {
JMF 0:24d3eb812fd4 404 _callback_func();
JMF 0:24d3eb812fd4 405 }
JMF 0:24d3eb812fd4 406 }
JMF 0:24d3eb812fd4 407
JMF 0:24d3eb812fd4 408 bool _is_event_callback_blocked(void) {
JMF 0:24d3eb812fd4 409 return (_call_event_callback_blocked != 0);
JMF 0:24d3eb812fd4 410 }
JMF 0:24d3eb812fd4 411
JMF 0:24d3eb812fd4 412 void _block_event_callback(void) {
JMF 0:24d3eb812fd4 413 _call_event_callback_blocked++;
JMF 0:24d3eb812fd4 414 }
JMF 0:24d3eb812fd4 415
JMF 0:24d3eb812fd4 416 void _unblock_event_callback(void) {
JMF 0:24d3eb812fd4 417 MBED_ASSERT(_call_event_callback_blocked > 0);
JMF 0:24d3eb812fd4 418 _call_event_callback_blocked--;
JMF 0:24d3eb812fd4 419 if(_call_event_callback_blocked == 0) {
JMF 0:24d3eb812fd4 420 _trigger_event_callback();
JMF 0:24d3eb812fd4 421 }
JMF 0:24d3eb812fd4 422 }
JMF 0:24d3eb812fd4 423
JMF 0:24d3eb812fd4 424 /* trigger call of (external) callback in case there is still data */
JMF 0:24d3eb812fd4 425 void _trigger_event_callback(void) {
JMF 0:24d3eb812fd4 426 MBED_ASSERT(_call_event_callback_blocked == 0);
JMF 0:24d3eb812fd4 427 /* if still data available */
JMF 0:24d3eb812fd4 428 if(readable()) {
JMF 0:24d3eb812fd4 429 _call_callback();
JMF 0:24d3eb812fd4 430 }
JMF 0:24d3eb812fd4 431 }
JMF 0:24d3eb812fd4 432
JMF 0:24d3eb812fd4 433 char _ip_buffer[16];
JMF 0:24d3eb812fd4 434 char _gateway_buffer[16];
JMF 0:24d3eb812fd4 435 char _netmask_buffer[16];
JMF 0:24d3eb812fd4 436 char _mac_buffer[18];
JMF 0:24d3eb812fd4 437
JMF 0:24d3eb812fd4 438 char _msg_buffer[256];
JMF 0:24d3eb812fd4 439
JMF 0:24d3eb812fd4 440 private:
JMF 0:24d3eb812fd4 441 friend class SPWFSA01;
JMF 0:24d3eb812fd4 442 friend class SPWFSA04;
JMF 0:24d3eb812fd4 443 friend class SpwfSAInterface;
JMF 0:24d3eb812fd4 444 };
JMF 0:24d3eb812fd4 445
JMF 0:24d3eb812fd4 446 #endif // SPWFSAXX_H