Mbed Cloud example program for workshop in W27 2018.

Dependencies:   MMA7660 LM75B

Committer:
MACRUM
Date:
Sat Jun 30 01:40:30 2018 +0000
Revision:
0:119624335925
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MACRUM 0:119624335925 1 /* mbed Microcontroller Library
MACRUM 0:119624335925 2 * Copyright (c) 20015 ARM Limited
MACRUM 0:119624335925 3 *
MACRUM 0:119624335925 4 * Licensed under the Apache License, Version 2.0 (the "License");
MACRUM 0:119624335925 5 * you may not use this file except in compliance with the License.
MACRUM 0:119624335925 6 * You may obtain a copy of the License at
MACRUM 0:119624335925 7 *
MACRUM 0:119624335925 8 * http://www.apache.org/licenses/LICENSE-2.0
MACRUM 0:119624335925 9 *
MACRUM 0:119624335925 10 * Unless required by applicable law or agreed to in writing, software
MACRUM 0:119624335925 11 * distributed under the License is distributed on an "AS IS" BASIS,
MACRUM 0:119624335925 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
MACRUM 0:119624335925 13 * See the License for the specific language governing permissions and
MACRUM 0:119624335925 14 * limitations under the License.
MACRUM 0:119624335925 15 */
MACRUM 0:119624335925 16
MACRUM 0:119624335925 17 /**
MACRUM 0:119624335925 18 ******************************************************************************
MACRUM 0:119624335925 19 * @file SpwfSAInterface.cpp
MACRUM 0:119624335925 20 * @author STMicroelectronics
MACRUM 0:119624335925 21 * @brief Implementation of the NetworkStack for the SPWF Device
MACRUM 0:119624335925 22 ******************************************************************************
MACRUM 0:119624335925 23 * @copy
MACRUM 0:119624335925 24 *
MACRUM 0:119624335925 25 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
MACRUM 0:119624335925 26 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
MACRUM 0:119624335925 27 * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
MACRUM 0:119624335925 28 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
MACRUM 0:119624335925 29 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
MACRUM 0:119624335925 30 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
MACRUM 0:119624335925 31 *
MACRUM 0:119624335925 32 * <h2><center>&copy; COPYRIGHT 2016 STMicroelectronics</center></h2>
MACRUM 0:119624335925 33 ******************************************************************************
MACRUM 0:119624335925 34 */
MACRUM 0:119624335925 35
MACRUM 0:119624335925 36 #include "SpwfSAInterface.h"
MACRUM 0:119624335925 37 #include "mbed_debug.h"
MACRUM 0:119624335925 38 #include "BlockExecuter.h"
MACRUM 0:119624335925 39
MACRUM 0:119624335925 40 #if MBED_CONF_RTOS_PRESENT
MACRUM 0:119624335925 41 static Mutex _spwf_mutex; // assuming a recursive mutex
MACRUM 0:119624335925 42 static void _spwf_lock() {
MACRUM 0:119624335925 43 (void)(_spwf_mutex.lock());
MACRUM 0:119624335925 44 }
MACRUM 0:119624335925 45 static Callback<void()> _callback_spwf_lock(&_spwf_lock);
MACRUM 0:119624335925 46
MACRUM 0:119624335925 47 static void _spwf_unlock() {
MACRUM 0:119624335925 48 (void)(_spwf_mutex.unlock());
MACRUM 0:119624335925 49 }
MACRUM 0:119624335925 50 static Callback<void()> _callback_spwf_unlock(&_spwf_unlock);
MACRUM 0:119624335925 51
MACRUM 0:119624335925 52 #define SYNC_HANDLER \
MACRUM 0:119624335925 53 BlockExecuter sync_handler(_callback_spwf_unlock, _callback_spwf_lock)
MACRUM 0:119624335925 54 #else
MACRUM 0:119624335925 55 #define SYNC_HANDLER
MACRUM 0:119624335925 56 #endif
MACRUM 0:119624335925 57
MACRUM 0:119624335925 58
MACRUM 0:119624335925 59 SpwfSAInterface::SpwfSAInterface(PinName tx, PinName rx,
MACRUM 0:119624335925 60 PinName rts, PinName cts, bool debug,
MACRUM 0:119624335925 61 PinName wakeup, PinName reset)
MACRUM 0:119624335925 62 : _spwf(tx, rx, rts, cts, *this, debug, wakeup, reset),
MACRUM 0:119624335925 63 _dbg_on(debug)
MACRUM 0:119624335925 64 {
MACRUM 0:119624335925 65 inner_constructor();
MACRUM 0:119624335925 66 reset_credentials();
MACRUM 0:119624335925 67 }
MACRUM 0:119624335925 68
MACRUM 0:119624335925 69 nsapi_error_t SpwfSAInterface::init(void)
MACRUM 0:119624335925 70 {
MACRUM 0:119624335925 71 _spwf.setTimeout(SPWF_INIT_TIMEOUT);
MACRUM 0:119624335925 72
MACRUM 0:119624335925 73 if(_spwf.startup(0)) {
MACRUM 0:119624335925 74 return NSAPI_ERROR_OK;
MACRUM 0:119624335925 75 }
MACRUM 0:119624335925 76 else return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:119624335925 77 }
MACRUM 0:119624335925 78
MACRUM 0:119624335925 79 nsapi_error_t SpwfSAInterface::connect(void)
MACRUM 0:119624335925 80 {
MACRUM 0:119624335925 81 int mode;
MACRUM 0:119624335925 82 char *pass_phrase = ap_pass;
MACRUM 0:119624335925 83 SYNC_HANDLER;
MACRUM 0:119624335925 84
MACRUM 0:119624335925 85 // check for valid SSID
MACRUM 0:119624335925 86 if(ap_ssid[0] == '\0') {
MACRUM 0:119624335925 87 return NSAPI_ERROR_PARAMETER;
MACRUM 0:119624335925 88 }
MACRUM 0:119624335925 89
MACRUM 0:119624335925 90 switch(ap_sec)
MACRUM 0:119624335925 91 {
MACRUM 0:119624335925 92 case NSAPI_SECURITY_NONE:
MACRUM 0:119624335925 93 mode = 0;
MACRUM 0:119624335925 94 pass_phrase = NULL;
MACRUM 0:119624335925 95 break;
MACRUM 0:119624335925 96 case NSAPI_SECURITY_WEP:
MACRUM 0:119624335925 97 mode = 1;
MACRUM 0:119624335925 98 break;
MACRUM 0:119624335925 99 case NSAPI_SECURITY_WPA:
MACRUM 0:119624335925 100 case NSAPI_SECURITY_WPA2:
MACRUM 0:119624335925 101 mode = 2;
MACRUM 0:119624335925 102 break;
MACRUM 0:119624335925 103 default:
MACRUM 0:119624335925 104 mode = 2;
MACRUM 0:119624335925 105 break;
MACRUM 0:119624335925 106 }
MACRUM 0:119624335925 107
MACRUM 0:119624335925 108 // First: disconnect
MACRUM 0:119624335925 109 if(_connected_to_network) {
MACRUM 0:119624335925 110 if(!disconnect()) {
MACRUM 0:119624335925 111 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:119624335925 112 }
MACRUM 0:119624335925 113 }
MACRUM 0:119624335925 114
MACRUM 0:119624335925 115 //initialize the device before connecting
MACRUM 0:119624335925 116 if(!_isInitialized)
MACRUM 0:119624335925 117 {
MACRUM 0:119624335925 118 if(init() != NSAPI_ERROR_OK) return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:119624335925 119 _isInitialized=true;
MACRUM 0:119624335925 120 }
MACRUM 0:119624335925 121
MACRUM 0:119624335925 122 // Then: (re-)connect
MACRUM 0:119624335925 123 _spwf.setTimeout(SPWF_CONNECT_TIMEOUT);
MACRUM 0:119624335925 124
MACRUM 0:119624335925 125 if (!_spwf.connect(ap_ssid, pass_phrase, mode)) {
MACRUM 0:119624335925 126 return NSAPI_ERROR_AUTH_FAILURE;
MACRUM 0:119624335925 127 }
MACRUM 0:119624335925 128
MACRUM 0:119624335925 129 if (!_spwf.getIPAddress()) {
MACRUM 0:119624335925 130 return NSAPI_ERROR_DHCP_FAILURE;
MACRUM 0:119624335925 131 }
MACRUM 0:119624335925 132
MACRUM 0:119624335925 133 _connected_to_network = true;
MACRUM 0:119624335925 134 return NSAPI_ERROR_OK;
MACRUM 0:119624335925 135 }
MACRUM 0:119624335925 136
MACRUM 0:119624335925 137 nsapi_error_t SpwfSAInterface::connect(const char *ssid, const char *pass, nsapi_security_t security,
MACRUM 0:119624335925 138 uint8_t channel)
MACRUM 0:119624335925 139 {
MACRUM 0:119624335925 140 nsapi_error_t ret;
MACRUM 0:119624335925 141 SYNC_HANDLER;
MACRUM 0:119624335925 142
MACRUM 0:119624335925 143 if (channel != 0) {
MACRUM 0:119624335925 144 return NSAPI_ERROR_UNSUPPORTED;
MACRUM 0:119624335925 145 }
MACRUM 0:119624335925 146
MACRUM 0:119624335925 147 ret = set_credentials(ssid, pass, security);
MACRUM 0:119624335925 148 if(ret != NSAPI_ERROR_OK) return ret;
MACRUM 0:119624335925 149
MACRUM 0:119624335925 150 return connect();
MACRUM 0:119624335925 151 }
MACRUM 0:119624335925 152
MACRUM 0:119624335925 153 nsapi_error_t SpwfSAInterface::disconnect(void)
MACRUM 0:119624335925 154 {
MACRUM 0:119624335925 155 SYNC_HANDLER;
MACRUM 0:119624335925 156
MACRUM 0:119624335925 157 _spwf.setTimeout(SPWF_DISCONNECT_TIMEOUT);
MACRUM 0:119624335925 158
MACRUM 0:119624335925 159 if (!_spwf.disconnect()) {
MACRUM 0:119624335925 160 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:119624335925 161 }
MACRUM 0:119624335925 162
MACRUM 0:119624335925 163 return NSAPI_ERROR_OK;
MACRUM 0:119624335925 164 }
MACRUM 0:119624335925 165
MACRUM 0:119624335925 166 const char *SpwfSAInterface::get_ip_address(void)
MACRUM 0:119624335925 167 {
MACRUM 0:119624335925 168 SYNC_HANDLER;
MACRUM 0:119624335925 169
MACRUM 0:119624335925 170 _spwf.setTimeout(SPWF_MISC_TIMEOUT);
MACRUM 0:119624335925 171 return _spwf.getIPAddress();
MACRUM 0:119624335925 172 }
MACRUM 0:119624335925 173
MACRUM 0:119624335925 174 const char *SpwfSAInterface::get_mac_address(void)
MACRUM 0:119624335925 175 {
MACRUM 0:119624335925 176 SYNC_HANDLER;
MACRUM 0:119624335925 177
MACRUM 0:119624335925 178 _spwf.setTimeout(SPWF_MISC_TIMEOUT);
MACRUM 0:119624335925 179 return _spwf.getMACAddress();
MACRUM 0:119624335925 180 }
MACRUM 0:119624335925 181
MACRUM 0:119624335925 182 const char *SpwfSAInterface::get_gateway(void)
MACRUM 0:119624335925 183 {
MACRUM 0:119624335925 184 SYNC_HANDLER;
MACRUM 0:119624335925 185
MACRUM 0:119624335925 186 if(!_connected_to_network) return NULL;
MACRUM 0:119624335925 187
MACRUM 0:119624335925 188 _spwf.setTimeout(SPWF_MISC_TIMEOUT);
MACRUM 0:119624335925 189 return _spwf.getGateway();
MACRUM 0:119624335925 190 }
MACRUM 0:119624335925 191
MACRUM 0:119624335925 192 const char *SpwfSAInterface::get_netmask(void)
MACRUM 0:119624335925 193 {
MACRUM 0:119624335925 194 SYNC_HANDLER;
MACRUM 0:119624335925 195
MACRUM 0:119624335925 196 if(!_connected_to_network) return NULL;
MACRUM 0:119624335925 197
MACRUM 0:119624335925 198 _spwf.setTimeout(SPWF_MISC_TIMEOUT);
MACRUM 0:119624335925 199 return _spwf.getNetmask();
MACRUM 0:119624335925 200 }
MACRUM 0:119624335925 201
MACRUM 0:119624335925 202 nsapi_error_t SpwfSAInterface::socket_open(void **handle, nsapi_protocol_t proto)
MACRUM 0:119624335925 203 {
MACRUM 0:119624335925 204 int internal_id;
MACRUM 0:119624335925 205 SYNC_HANDLER;
MACRUM 0:119624335925 206
MACRUM 0:119624335925 207 for (internal_id = 0; internal_id < SPWFSA_SOCKET_COUNT; internal_id++) {
MACRUM 0:119624335925 208 if(_ids[internal_id].internal_id == SPWFSA_SOCKET_COUNT) break;
MACRUM 0:119624335925 209 }
MACRUM 0:119624335925 210
MACRUM 0:119624335925 211 if(internal_id == SPWFSA_SOCKET_COUNT) {
MACRUM 0:119624335925 212 debug_if(_dbg_on, "NO Socket ID Error\r\n");
MACRUM 0:119624335925 213 return NSAPI_ERROR_NO_SOCKET;
MACRUM 0:119624335925 214 }
MACRUM 0:119624335925 215
MACRUM 0:119624335925 216 spwf_socket_t *socket = &_ids[internal_id];
MACRUM 0:119624335925 217 socket->internal_id = internal_id;
MACRUM 0:119624335925 218 socket->spwf_id = SPWFSA_SOCKET_COUNT;
MACRUM 0:119624335925 219 socket->server_gone = false;
MACRUM 0:119624335925 220 socket->no_more_data = false;
MACRUM 0:119624335925 221 socket->proto = proto;
MACRUM 0:119624335925 222 socket->addr = SocketAddress();
MACRUM 0:119624335925 223
MACRUM 0:119624335925 224 *handle = socket;
MACRUM 0:119624335925 225 return NSAPI_ERROR_OK;
MACRUM 0:119624335925 226 }
MACRUM 0:119624335925 227
MACRUM 0:119624335925 228 nsapi_error_t SpwfSAInterface::socket_connect(void *handle, const SocketAddress &addr)
MACRUM 0:119624335925 229 {
MACRUM 0:119624335925 230 spwf_socket_t *socket = (spwf_socket_t*)handle;
MACRUM 0:119624335925 231 SYNC_HANDLER;
MACRUM 0:119624335925 232
MACRUM 0:119624335925 233 MBED_ASSERT(((unsigned int)socket->internal_id) < ((unsigned int)SPWFSA_SOCKET_COUNT));
MACRUM 0:119624335925 234
MACRUM 0:119624335925 235 if(_socket_has_connected(socket->internal_id)) {
MACRUM 0:119624335925 236 return NSAPI_ERROR_IS_CONNECTED;
MACRUM 0:119624335925 237 }
MACRUM 0:119624335925 238
MACRUM 0:119624335925 239 _spwf.setTimeout(SPWF_OPEN_TIMEOUT);
MACRUM 0:119624335925 240
MACRUM 0:119624335925 241 const char *proto = (socket->proto == NSAPI_UDP) ? "u" : "t"; //"s" for secure socket?
MACRUM 0:119624335925 242
MACRUM 0:119624335925 243 if(addr.get_ip_version() != NSAPI_IPv4) { // IPv6 not supported (yet)
MACRUM 0:119624335925 244 return NSAPI_ERROR_UNSUPPORTED;
MACRUM 0:119624335925 245 }
MACRUM 0:119624335925 246
MACRUM 0:119624335925 247 {
MACRUM 0:119624335925 248 BlockExecuter netsock_wa_obj(Callback<void()>(&_spwf, &SPWFSAxx::_unblock_event_callback),
MACRUM 0:119624335925 249 Callback<void()>(&_spwf, &SPWFSAxx::_block_event_callback)); /* disable calling (external) callback in IRQ context */
MACRUM 0:119624335925 250
MACRUM 0:119624335925 251 /* block asynchronous indications */
MACRUM 0:119624335925 252 if(!_spwf._winds_off()) {
MACRUM 0:119624335925 253 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:119624335925 254 }
MACRUM 0:119624335925 255
MACRUM 0:119624335925 256 {
MACRUM 0:119624335925 257 BlockExecuter bh_handler(Callback<void()>(&_spwf, &SPWFSAxx::_execute_bottom_halves));
MACRUM 0:119624335925 258 {
MACRUM 0:119624335925 259 BlockExecuter winds_enabler(Callback<void()>(&_spwf, &SPWFSAxx::_winds_on));
MACRUM 0:119624335925 260
MACRUM 0:119624335925 261 if(!_spwf.open(proto, &socket->spwf_id, addr.get_ip_address(), addr.get_port())) {
MACRUM 0:119624335925 262 MBED_ASSERT(_spwf._call_event_callback_blocked == 1);
MACRUM 0:119624335925 263
MACRUM 0:119624335925 264 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:119624335925 265 }
MACRUM 0:119624335925 266
MACRUM 0:119624335925 267 /* check for the module to report a valid id */
MACRUM 0:119624335925 268 MBED_ASSERT(((unsigned int)socket->spwf_id) < ((unsigned int)SPWFSA_SOCKET_COUNT));
MACRUM 0:119624335925 269
MACRUM 0:119624335925 270 _internal_ids[socket->spwf_id] = socket->internal_id;
MACRUM 0:119624335925 271 socket->addr = addr;
MACRUM 0:119624335925 272
MACRUM 0:119624335925 273 MBED_ASSERT(_spwf._call_event_callback_blocked == 1);
MACRUM 0:119624335925 274
MACRUM 0:119624335925 275 return NSAPI_ERROR_OK;
MACRUM 0:119624335925 276 }
MACRUM 0:119624335925 277 }
MACRUM 0:119624335925 278 }
MACRUM 0:119624335925 279 }
MACRUM 0:119624335925 280
MACRUM 0:119624335925 281 nsapi_error_t SpwfSAInterface::socket_bind(void *handle, const SocketAddress &address)
MACRUM 0:119624335925 282 {
MACRUM 0:119624335925 283 return NSAPI_ERROR_UNSUPPORTED;
MACRUM 0:119624335925 284 }
MACRUM 0:119624335925 285
MACRUM 0:119624335925 286 nsapi_error_t SpwfSAInterface::socket_listen(void *handle, int backlog)
MACRUM 0:119624335925 287 {
MACRUM 0:119624335925 288 return NSAPI_ERROR_UNSUPPORTED;
MACRUM 0:119624335925 289 }
MACRUM 0:119624335925 290
MACRUM 0:119624335925 291 nsapi_error_t SpwfSAInterface::socket_accept(nsapi_socket_t server, nsapi_socket_t *handle, SocketAddress *address)
MACRUM 0:119624335925 292 {
MACRUM 0:119624335925 293 return NSAPI_ERROR_UNSUPPORTED;
MACRUM 0:119624335925 294 }
MACRUM 0:119624335925 295
MACRUM 0:119624335925 296 nsapi_error_t SpwfSAInterface::socket_close(void *handle)
MACRUM 0:119624335925 297 {
MACRUM 0:119624335925 298 spwf_socket_t *socket = (spwf_socket_t*)handle;
MACRUM 0:119624335925 299 int internal_id = socket->internal_id;
MACRUM 0:119624335925 300 SYNC_HANDLER;
MACRUM 0:119624335925 301
MACRUM 0:119624335925 302 if(!_socket_is_open(internal_id)) return NSAPI_ERROR_NO_SOCKET;
MACRUM 0:119624335925 303
MACRUM 0:119624335925 304 if(_socket_has_connected(socket)) {
MACRUM 0:119624335925 305 _spwf.setTimeout(SPWF_CLOSE_TIMEOUT);
MACRUM 0:119624335925 306 if (!_spwf.close(socket->spwf_id)) {
MACRUM 0:119624335925 307 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:119624335925 308 }
MACRUM 0:119624335925 309 _internal_ids[socket->spwf_id] = SPWFSA_SOCKET_COUNT;
MACRUM 0:119624335925 310 }
MACRUM 0:119624335925 311
MACRUM 0:119624335925 312 _ids[internal_id].internal_id = SPWFSA_SOCKET_COUNT;
MACRUM 0:119624335925 313 _ids[internal_id].spwf_id = SPWFSA_SOCKET_COUNT;
MACRUM 0:119624335925 314
MACRUM 0:119624335925 315 return NSAPI_ERROR_OK;
MACRUM 0:119624335925 316 }
MACRUM 0:119624335925 317
MACRUM 0:119624335925 318 nsapi_size_or_error_t SpwfSAInterface::socket_send(void *handle, const void *data, unsigned size)
MACRUM 0:119624335925 319 {
MACRUM 0:119624335925 320 spwf_socket_t *socket = (spwf_socket_t*)handle;
MACRUM 0:119624335925 321 SYNC_HANDLER;
MACRUM 0:119624335925 322
MACRUM 0:119624335925 323 CHECK_NOT_CONNECTED_ERR();
MACRUM 0:119624335925 324
MACRUM 0:119624335925 325 _spwf.setTimeout(SPWF_SEND_TIMEOUT);
MACRUM 0:119624335925 326 return _spwf.send(socket->spwf_id, data, size, socket->internal_id);
MACRUM 0:119624335925 327 }
MACRUM 0:119624335925 328
MACRUM 0:119624335925 329 nsapi_size_or_error_t SpwfSAInterface::socket_recv(void *handle, void *data, unsigned size)
MACRUM 0:119624335925 330 {
MACRUM 0:119624335925 331 SYNC_HANDLER;
MACRUM 0:119624335925 332
MACRUM 0:119624335925 333 return _socket_recv(handle, data, size, false);
MACRUM 0:119624335925 334 }
MACRUM 0:119624335925 335
MACRUM 0:119624335925 336 nsapi_size_or_error_t SpwfSAInterface::_socket_recv(void *handle, void *data, unsigned size, bool datagram)
MACRUM 0:119624335925 337 {
MACRUM 0:119624335925 338 spwf_socket_t *socket = (spwf_socket_t*)handle;
MACRUM 0:119624335925 339
MACRUM 0:119624335925 340 CHECK_NOT_CONNECTED_ERR();
MACRUM 0:119624335925 341
MACRUM 0:119624335925 342 if(!_socket_has_connected(socket)) {
MACRUM 0:119624335925 343 return NSAPI_ERROR_WOULD_BLOCK;
MACRUM 0:119624335925 344 } else if(socket->no_more_data) {
MACRUM 0:119624335925 345 return 0;
MACRUM 0:119624335925 346 }
MACRUM 0:119624335925 347
MACRUM 0:119624335925 348 _spwf.setTimeout(SPWF_RECV_TIMEOUT);
MACRUM 0:119624335925 349
MACRUM 0:119624335925 350 int32_t recv = _spwf.recv(socket->spwf_id, (char*)data, (uint32_t)size, datagram);
MACRUM 0:119624335925 351
MACRUM 0:119624335925 352 MBED_ASSERT(!_spwf._is_event_callback_blocked());
MACRUM 0:119624335925 353 MBED_ASSERT((recv != 0) || (size == 0));
MACRUM 0:119624335925 354
MACRUM 0:119624335925 355 if (recv < 0) {
MACRUM 0:119624335925 356 if(!_socket_is_still_connected(socket)) {
MACRUM 0:119624335925 357 socket->no_more_data = true;
MACRUM 0:119624335925 358 return 0;
MACRUM 0:119624335925 359 }
MACRUM 0:119624335925 360
MACRUM 0:119624335925 361 return NSAPI_ERROR_WOULD_BLOCK;
MACRUM 0:119624335925 362 }
MACRUM 0:119624335925 363
MACRUM 0:119624335925 364 return recv;
MACRUM 0:119624335925 365 }
MACRUM 0:119624335925 366
MACRUM 0:119624335925 367 nsapi_size_or_error_t SpwfSAInterface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size)
MACRUM 0:119624335925 368 {
MACRUM 0:119624335925 369 spwf_socket_t *socket = (spwf_socket_t*)handle;
MACRUM 0:119624335925 370 SYNC_HANDLER;
MACRUM 0:119624335925 371
MACRUM 0:119624335925 372 CHECK_NOT_CONNECTED_ERR();
MACRUM 0:119624335925 373
MACRUM 0:119624335925 374 if ((_socket_has_connected(socket)) && (socket->addr != addr)) {
MACRUM 0:119624335925 375 _spwf.setTimeout(SPWF_CLOSE_TIMEOUT);
MACRUM 0:119624335925 376 if (!_spwf.close(socket->spwf_id)) {
MACRUM 0:119624335925 377 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:119624335925 378 }
MACRUM 0:119624335925 379 _internal_ids[socket->spwf_id] = SPWFSA_SOCKET_COUNT;
MACRUM 0:119624335925 380 socket->spwf_id = SPWFSA_SOCKET_COUNT;
MACRUM 0:119624335925 381 }
MACRUM 0:119624335925 382
MACRUM 0:119624335925 383 _spwf.setTimeout(SPWF_CONN_SND_TIMEOUT);
MACRUM 0:119624335925 384 if (!_socket_has_connected(socket)) {
MACRUM 0:119624335925 385 nsapi_error_t err = socket_connect(socket, addr);
MACRUM 0:119624335925 386 if (err < 0) {
MACRUM 0:119624335925 387 return err;
MACRUM 0:119624335925 388 }
MACRUM 0:119624335925 389 }
MACRUM 0:119624335925 390
MACRUM 0:119624335925 391 return socket_send(socket, data, size);
MACRUM 0:119624335925 392 }
MACRUM 0:119624335925 393
MACRUM 0:119624335925 394 nsapi_size_or_error_t SpwfSAInterface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
MACRUM 0:119624335925 395 {
MACRUM 0:119624335925 396 spwf_socket_t *socket = (spwf_socket_t*)handle;
MACRUM 0:119624335925 397 nsapi_error_t ret;
MACRUM 0:119624335925 398 SYNC_HANDLER;
MACRUM 0:119624335925 399
MACRUM 0:119624335925 400 ret = _socket_recv(socket, data, size, true);
MACRUM 0:119624335925 401 if (ret >= 0 && addr) {
MACRUM 0:119624335925 402 *addr = socket->addr;
MACRUM 0:119624335925 403 }
MACRUM 0:119624335925 404
MACRUM 0:119624335925 405 return ret;
MACRUM 0:119624335925 406 }
MACRUM 0:119624335925 407
MACRUM 0:119624335925 408 void SpwfSAInterface::socket_attach(void *handle, void (*callback)(void *), void *data)
MACRUM 0:119624335925 409 {
MACRUM 0:119624335925 410 spwf_socket_t *socket = (spwf_socket_t*)handle;
MACRUM 0:119624335925 411 SYNC_HANDLER;
MACRUM 0:119624335925 412
MACRUM 0:119624335925 413 if(!_socket_is_open(socket)) return; // might happen e.g. after module hard fault or voluntary disconnection
MACRUM 0:119624335925 414
MACRUM 0:119624335925 415 _cbs[socket->internal_id].callback = callback;
MACRUM 0:119624335925 416 _cbs[socket->internal_id].data = data;
MACRUM 0:119624335925 417 }
MACRUM 0:119624335925 418
MACRUM 0:119624335925 419 void SpwfSAInterface::event(void) {
MACRUM 0:119624335925 420 for (int internal_id = 0; internal_id < SPWFSA_SOCKET_COUNT; internal_id++) {
MACRUM 0:119624335925 421 if (_cbs[internal_id].callback && (_ids[internal_id].internal_id != SPWFSA_SOCKET_COUNT)) {
MACRUM 0:119624335925 422 _cbs[internal_id].callback(_cbs[internal_id].data);
MACRUM 0:119624335925 423 }
MACRUM 0:119624335925 424 }
MACRUM 0:119624335925 425 }
MACRUM 0:119624335925 426
MACRUM 0:119624335925 427 nsapi_error_t SpwfSAInterface::set_credentials(const char *ssid, const char *pass, nsapi_security_t security)
MACRUM 0:119624335925 428 {
MACRUM 0:119624335925 429 SYNC_HANDLER;
MACRUM 0:119624335925 430
MACRUM 0:119624335925 431 if((ssid == NULL) || (strlen(ssid) == 0)) {
MACRUM 0:119624335925 432 return NSAPI_ERROR_PARAMETER;
MACRUM 0:119624335925 433 }
MACRUM 0:119624335925 434
MACRUM 0:119624335925 435 if((pass != NULL) && (strlen(pass) > 0)) {
MACRUM 0:119624335925 436 if(strlen(pass) < sizeof(ap_pass)) {
MACRUM 0:119624335925 437 if(security == NSAPI_SECURITY_NONE) {
MACRUM 0:119624335925 438 return NSAPI_ERROR_PARAMETER;
MACRUM 0:119624335925 439 }
MACRUM 0:119624335925 440 } else {
MACRUM 0:119624335925 441 return NSAPI_ERROR_PARAMETER;
MACRUM 0:119624335925 442 }
MACRUM 0:119624335925 443 } else if(security != NSAPI_SECURITY_NONE) {
MACRUM 0:119624335925 444 return NSAPI_ERROR_PARAMETER;
MACRUM 0:119624335925 445 }
MACRUM 0:119624335925 446
MACRUM 0:119624335925 447 reset_credentials();
MACRUM 0:119624335925 448
MACRUM 0:119624335925 449 ap_sec = security;
MACRUM 0:119624335925 450 strncpy(ap_ssid, ssid, sizeof(ap_ssid) - 1);
MACRUM 0:119624335925 451 strncpy(ap_pass, pass, sizeof(ap_pass) - 1);
MACRUM 0:119624335925 452
MACRUM 0:119624335925 453 return NSAPI_ERROR_OK;
MACRUM 0:119624335925 454 }
MACRUM 0:119624335925 455
MACRUM 0:119624335925 456 nsapi_error_t SpwfSAInterface::set_channel(uint8_t channel)
MACRUM 0:119624335925 457 {
MACRUM 0:119624335925 458 return NSAPI_ERROR_UNSUPPORTED;
MACRUM 0:119624335925 459 }
MACRUM 0:119624335925 460
MACRUM 0:119624335925 461 int8_t SpwfSAInterface::get_rssi(void)
MACRUM 0:119624335925 462 {
MACRUM 0:119624335925 463 SYNC_HANDLER;
MACRUM 0:119624335925 464
MACRUM 0:119624335925 465 if(!_connected_to_network) return 0;
MACRUM 0:119624335925 466
MACRUM 0:119624335925 467 _spwf.setTimeout(SPWF_MISC_TIMEOUT);
MACRUM 0:119624335925 468 return _spwf.getRssi();
MACRUM 0:119624335925 469 }
MACRUM 0:119624335925 470
MACRUM 0:119624335925 471 nsapi_size_or_error_t SpwfSAInterface::scan(WiFiAccessPoint *res, unsigned count)
MACRUM 0:119624335925 472 {
MACRUM 0:119624335925 473 SYNC_HANDLER;
MACRUM 0:119624335925 474
MACRUM 0:119624335925 475 nsapi_size_or_error_t ret;
MACRUM 0:119624335925 476
MACRUM 0:119624335925 477 //initialize the device before scanning
MACRUM 0:119624335925 478 if(!_isInitialized)
MACRUM 0:119624335925 479 {
MACRUM 0:119624335925 480 if(init() != NSAPI_ERROR_OK) return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:119624335925 481 }
MACRUM 0:119624335925 482
MACRUM 0:119624335925 483 _spwf.setTimeout(SPWF_SCAN_TIMEOUT);
MACRUM 0:119624335925 484
MACRUM 0:119624335925 485 {
MACRUM 0:119624335925 486 BlockExecuter netsock_wa_obj(Callback<void()>(&_spwf, &SPWFSAxx::_unblock_event_callback),
MACRUM 0:119624335925 487 Callback<void()>(&_spwf, &SPWFSAxx::_block_event_callback)); /* disable calling (external) callback in IRQ context */
MACRUM 0:119624335925 488
MACRUM 0:119624335925 489 /* block asynchronous indications */
MACRUM 0:119624335925 490 if(!_spwf._winds_off()) {
MACRUM 0:119624335925 491 MBED_ASSERT(_spwf._call_event_callback_blocked == 1);
MACRUM 0:119624335925 492
MACRUM 0:119624335925 493 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:119624335925 494 }
MACRUM 0:119624335925 495
MACRUM 0:119624335925 496 ret = _spwf.scan(res, count);
MACRUM 0:119624335925 497
MACRUM 0:119624335925 498 /* unblock asynchronous indications */
MACRUM 0:119624335925 499 _spwf._winds_on();
MACRUM 0:119624335925 500 }
MACRUM 0:119624335925 501
MACRUM 0:119624335925 502 MBED_ASSERT(!_spwf._is_event_callback_blocked());
MACRUM 0:119624335925 503
MACRUM 0:119624335925 504 //de-initialize the device after scanning
MACRUM 0:119624335925 505 if(!_isInitialized)
MACRUM 0:119624335925 506 {
MACRUM 0:119624335925 507 nsapi_error_t err = disconnect();
MACRUM 0:119624335925 508 if(err != NSAPI_ERROR_OK) return err;
MACRUM 0:119624335925 509 }
MACRUM 0:119624335925 510
MACRUM 0:119624335925 511 return ret;
MACRUM 0:119624335925 512 }