mayuresh bharmoria / Mbed OS mbed-os-example-wifi
Committer:
mayur098
Date:
Thu Jun 21 17:50:21 2018 +0000
Revision:
0:8f8e8f3cbd1c
first commit;

Who changed what in which revision?

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