test

Dependents:   mbed-os-example-blinky-1stDevDemo

Committer:
karen801
Date:
Wed May 23 14:37:10 2018 +0000
Revision:
0:79ce2b184a43
Initial commit

Who changed what in which revision?

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