X-NUCLEO-IDW01M1 Wi-Fi expansion board mbed OS 2 ("Classic") library. mbed OS 5 library also available (see below).

Dependencies:   SPWF01SA

Dependents:   SpwfInterface_NSAPI_Testsv2 Nucleo_read_a0_thingspace Nucleo_read_a0_thingspace_mems Cayenne-X-NUCLEO-IDW01M1 ... more

Fork of X_NUCLEO_IDW01M1v2 by ST Expansion SW Team

Introduction

X_NUCLEO_IDW01M1 is a mbed library for the Wi-Fi expansion board X-NUCLEO-IDW01M1 compatible with STM32 Nucleo.

The software can be used for building Wi-Fi applications with the SPWF01SA module. It is an implementation of the NetworkSocketAPI library from mbed OS 2 ("Classic").
mbed OS 5 library can instead be found at this link.

Firmware Library

The X_NUCLEO_IDW01M1 library comes with a sample application (HelloWorld_IDW01M1v2) and a NSAPI test suite application (SpwfInterface_NSAPI_Testsv2).

This library is only supported on NUCLEO platforms and any platforms with Arduino connector. However connection to arduino needs to be done manually using 4 wires for Vdd, Gnd, Rx and Tx. Example applications have more specific details on exact connections to be used.

The features of the library are :

  • Supports mbed OS 2 ("Classic") NetworkSocketAPI
  • Supports both client sockets
  • Configuration of USART pins to be used

Class SpwfSAInterface is intended to represent the X-NUCLEO-IDW01M1 expansion board with the SPWF module.

The expansion board is basically featuring the component:

  1. a SPWF01SA Serial-to-Wi-Fi module

Example Applications

NSAPI Test Suite

Committer:
mapellil
Date:
Tue Nov 22 14:38:43 2016 +0000
Revision:
13:0368732b5b9d
Parent:
9:4cd89586b370
Child:
14:4ec13009341c
Added constructor with reset and wakup gpio exposed.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mridup 0:907910bfb0b5 1 /* mbed Microcontroller Library
mridup 0:907910bfb0b5 2 * Copyright (c) 20015 ARM Limited
mridup 0:907910bfb0b5 3 *
mridup 0:907910bfb0b5 4 * Licensed under the Apache License, Version 2.0 (the "License");
mridup 0:907910bfb0b5 5 * you may not use this file except in compliance with the License.
mridup 0:907910bfb0b5 6 * You may obtain a copy of the License at
mridup 0:907910bfb0b5 7 *
mridup 0:907910bfb0b5 8 * http://www.apache.org/licenses/LICENSE-2.0
mridup 0:907910bfb0b5 9 *
mridup 0:907910bfb0b5 10 * Unless required by applicable law or agreed to in writing, software
mridup 0:907910bfb0b5 11 * distributed under the License is distributed on an "AS IS" BASIS,
mridup 0:907910bfb0b5 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mridup 0:907910bfb0b5 13 * See the License for the specific language governing permissions and
mridup 0:907910bfb0b5 14 * limitations under the License.
mridup 0:907910bfb0b5 15 */
mridup 0:907910bfb0b5 16
mridup 0:907910bfb0b5 17 /**
mridup 0:907910bfb0b5 18 ******************************************************************************
mridup 0:907910bfb0b5 19 * @file SpwfInterface.cpp
mridup 0:907910bfb0b5 20 * @author STMicroelectronics
mridup 0:907910bfb0b5 21 * @brief Implementation of the NetworkStack for the SPWF Device
mridup 0:907910bfb0b5 22 ******************************************************************************
mridup 0:907910bfb0b5 23 * @copy
mridup 0:907910bfb0b5 24 *
mridup 0:907910bfb0b5 25 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
mridup 0:907910bfb0b5 26 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
mridup 0:907910bfb0b5 27 * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
mridup 0:907910bfb0b5 28 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
mridup 0:907910bfb0b5 29 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
mridup 0:907910bfb0b5 30 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
mridup 0:907910bfb0b5 31 *
mridup 0:907910bfb0b5 32 * <h2><center>&copy; COPYRIGHT 2016 STMicroelectronics</center></h2>
mridup 0:907910bfb0b5 33 ******************************************************************************
mridup 0:907910bfb0b5 34 */
mridup 0:907910bfb0b5 35
mridup 0:907910bfb0b5 36 #include "SpwfInterface.h"
mridup 0:907910bfb0b5 37
mridup 0:907910bfb0b5 38 // Various timeouts for different SPWF operations
mridup 0:907910bfb0b5 39 #define SPWF_CONNECT_TIMEOUT 20000
mridup 0:907910bfb0b5 40 #define SPWF_SEND_TIMEOUT 500
mridup 9:4cd89586b370 41 #define SPWF_RECV_TIMEOUT 500
mridup 0:907910bfb0b5 42 #define SPWF_MISC_TIMEOUT 15000
mridup 0:907910bfb0b5 43
mridup 0:907910bfb0b5 44 /** spwf_socket class
mridup 0:907910bfb0b5 45 * Implementation of SPWF socket structure
mridup 0:907910bfb0b5 46 */
mridup 0:907910bfb0b5 47 struct spwf_socket {
mridup 0:907910bfb0b5 48 int id;
mridup 0:907910bfb0b5 49 int server_port;
mridup 0:907910bfb0b5 50 nsapi_protocol_t proto;
mridup 0:907910bfb0b5 51 bool connected;
mridup 0:907910bfb0b5 52 };
mridup 0:907910bfb0b5 53
mridup 0:907910bfb0b5 54
mridup 0:907910bfb0b5 55 /**
mridup 0:907910bfb0b5 56 * @brief SpwfSAInterface constructor
mridup 0:907910bfb0b5 57 * @param tx: Pin USART TX
mridup 0:907910bfb0b5 58 * rx: Pin USART RX
mridup 0:907910bfb0b5 59 * rst: reset pin for Spwf module
mridup 0:907910bfb0b5 60 * wkup: reset pin for Spwf module
mridup 0:907910bfb0b5 61 * rts: Pin USART RTS
mridup 0:907910bfb0b5 62 * debug : not used
mridup 0:907910bfb0b5 63 * @retval none
mridup 0:907910bfb0b5 64 */
mapellil 13:0368732b5b9d 65 SpwfSAInterface::SpwfSAInterface(PinName tx, PinName rx, bool debug)
mapellil 13:0368732b5b9d 66 : _spwf(tx, rx, PC_12, PC_8, debug)
mapellil 13:0368732b5b9d 67 {
mapellil 13:0368732b5b9d 68 memset(_ids, 0, sizeof(_ids));
mapellil 13:0368732b5b9d 69 isInitialized = false;
mapellil 13:0368732b5b9d 70 isListening = false;
mapellil 13:0368732b5b9d 71 }
mapellil 13:0368732b5b9d 72
mapellil 13:0368732b5b9d 73 SpwfSAInterface::SpwfSAInterface(PinName tx, PinName rx, PinName reset, PinName wakeup, bool debug)
mapellil 13:0368732b5b9d 74 : _spwf(tx, rx, reset, wakeup, debug)
mridup 0:907910bfb0b5 75 {
mridup 0:907910bfb0b5 76 memset(_ids, 0, sizeof(_ids));
mridup 0:907910bfb0b5 77 isInitialized = false;
mridup 0:907910bfb0b5 78 isListening = false;
mapellil 13:0368732b5b9d 79 }
mridup 0:907910bfb0b5 80
mridup 0:907910bfb0b5 81 /**
mridup 0:907910bfb0b5 82 * @brief SpwfSAInterface destructor
mridup 0:907910bfb0b5 83 * @param none
mridup 0:907910bfb0b5 84 * @retval none
mridup 0:907910bfb0b5 85 */
mridup 0:907910bfb0b5 86 SpwfSAInterface::~SpwfSAInterface()
mridup 0:907910bfb0b5 87 {
mridup 0:907910bfb0b5 88 }
mridup 0:907910bfb0b5 89
mridup 0:907910bfb0b5 90 /**
mridup 0:907910bfb0b5 91 * @brief init function
mridup 0:907910bfb0b5 92 initializes SPWF FW and module
mridup 0:907910bfb0b5 93 * @param none
mridup 0:907910bfb0b5 94 * @retval error value
mridup 0:907910bfb0b5 95 */
mridup 0:907910bfb0b5 96 int SpwfSAInterface::init(void)
mridup 0:907910bfb0b5 97 {
mridup 1:fd7b3df18dd7 98 if(_spwf.startup(0)) {
mridup 1:fd7b3df18dd7 99 isInitialized=true;
mridup 1:fd7b3df18dd7 100 return true;
mridup 1:fd7b3df18dd7 101 }
mridup 1:fd7b3df18dd7 102 else return NSAPI_ERROR_DEVICE_ERROR;
mridup 0:907910bfb0b5 103 }
mridup 0:907910bfb0b5 104
mridup 0:907910bfb0b5 105 /**
mridup 0:907910bfb0b5 106 * @brief network connect
mridup 0:907910bfb0b5 107 connects to Access Point
mridup 0:907910bfb0b5 108 * @param ap: Access Point (AP) Name String
mridup 0:907910bfb0b5 109 * pass_phrase: Password String for AP
mridup 0:907910bfb0b5 110 * security: type of NSAPI security supported
mridup 0:907910bfb0b5 111 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 112 */
mridup 0:907910bfb0b5 113 int SpwfSAInterface::connect(const char *ap,
mridup 0:907910bfb0b5 114 const char *pass_phrase,
mridup 0:907910bfb0b5 115 nsapi_security_t security)
mridup 0:907910bfb0b5 116 {
mridup 0:907910bfb0b5 117 int mode;
mridup 0:907910bfb0b5 118
mridup 0:907910bfb0b5 119 //initialize the device before connecting
mridup 0:907910bfb0b5 120 if(!isInitialized)
mridup 0:907910bfb0b5 121 {
mridup 1:fd7b3df18dd7 122 if(!init())
mridup 1:fd7b3df18dd7 123 return NSAPI_ERROR_DEVICE_ERROR;
mridup 0:907910bfb0b5 124 }
mapellil 13:0368732b5b9d 125
mridup 0:907910bfb0b5 126 switch(security)
mridup 0:907910bfb0b5 127 {
mridup 0:907910bfb0b5 128 case NSAPI_SECURITY_NONE:
mridup 0:907910bfb0b5 129 mode = 0;
mridup 0:907910bfb0b5 130 pass_phrase = NULL;
mridup 0:907910bfb0b5 131 break;
mridup 0:907910bfb0b5 132 case NSAPI_SECURITY_WEP:
mridup 0:907910bfb0b5 133 mode = 1;
mridup 0:907910bfb0b5 134 break;
mridup 0:907910bfb0b5 135 case NSAPI_SECURITY_WPA:
mridup 0:907910bfb0b5 136 case NSAPI_SECURITY_WPA2:
mridup 0:907910bfb0b5 137 mode = 2;
mridup 0:907910bfb0b5 138 break;
mridup 0:907910bfb0b5 139 default:
mridup 0:907910bfb0b5 140 mode = 2;
mridup 0:907910bfb0b5 141 break;
mridup 0:907910bfb0b5 142 }
mridup 0:907910bfb0b5 143 return (_spwf.connect((char*)ap, (char*)pass_phrase, mode));
mridup 0:907910bfb0b5 144 }
mridup 0:907910bfb0b5 145
mridup 0:907910bfb0b5 146 /**
mridup 0:907910bfb0b5 147 * @brief network disconnect
mridup 0:907910bfb0b5 148 disconnects from Access Point
mridup 0:907910bfb0b5 149 * @param none
mridup 0:907910bfb0b5 150 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 151 */
mridup 0:907910bfb0b5 152 int SpwfSAInterface::disconnect()
mridup 0:907910bfb0b5 153 {
mridup 0:907910bfb0b5 154 return (_spwf.disconnect());
mridup 0:907910bfb0b5 155 }
mridup 0:907910bfb0b5 156
mridup 0:907910bfb0b5 157 /**
mridup 0:907910bfb0b5 158 * @brief Get the local IP address
mridup 0:907910bfb0b5 159 * @param none
mridup 0:907910bfb0b5 160 * @retval Null-terminated representation of the local IP address
mridup 0:907910bfb0b5 161 * or null if not yet connected
mridup 0:907910bfb0b5 162 */
mridup 0:907910bfb0b5 163 const char *SpwfSAInterface::get_ip_address()
mridup 0:907910bfb0b5 164 {
mridup 0:907910bfb0b5 165 return _spwf.getIPAddress();
mridup 0:907910bfb0b5 166 }
mridup 0:907910bfb0b5 167
mridup 0:907910bfb0b5 168 /**
mridup 0:907910bfb0b5 169 * @brief Get the MAC address
mridup 0:907910bfb0b5 170 * @param none
mridup 0:907910bfb0b5 171 * @retval Null-terminated representation of the MAC address
mridup 0:907910bfb0b5 172 * or null if not yet connected
mridup 0:907910bfb0b5 173 */
mridup 0:907910bfb0b5 174 const char *SpwfSAInterface::get_mac_address()
mridup 0:907910bfb0b5 175 {
mridup 0:907910bfb0b5 176 return _spwf.getMACAddress();
mridup 0:907910bfb0b5 177 }
mridup 0:907910bfb0b5 178
mridup 0:907910bfb0b5 179 /**
mridup 0:907910bfb0b5 180 * @brief open a socket handle
mridup 0:907910bfb0b5 181 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 182 * proto: TCP/UDP protocol
mridup 0:907910bfb0b5 183 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 184 */
mridup 0:907910bfb0b5 185 int SpwfSAInterface::socket_open(void **handle, nsapi_protocol_t proto)
mridup 0:907910bfb0b5 186 {
mridup 0:907910bfb0b5 187 int id = -1;
mridup 0:907910bfb0b5 188
mapellil 13:0368732b5b9d 189 struct spwf_socket *socket = new struct spwf_socket;
mridup 0:907910bfb0b5 190 if (!socket) {
mridup 0:907910bfb0b5 191 return NSAPI_ERROR_NO_SOCKET;
mridup 0:907910bfb0b5 192 }
mridup 0:907910bfb0b5 193
mridup 0:907910bfb0b5 194 socket->id = id;
mridup 0:907910bfb0b5 195 socket->server_port = id;
mridup 0:907910bfb0b5 196 socket->proto = proto;
mridup 0:907910bfb0b5 197 socket->connected = false;
mridup 0:907910bfb0b5 198 *handle = socket;
mridup 0:907910bfb0b5 199 return 0;
mridup 0:907910bfb0b5 200 }
mridup 0:907910bfb0b5 201
mridup 0:907910bfb0b5 202 /**
mridup 0:907910bfb0b5 203 * @brief connect to a remote socket
mridup 0:907910bfb0b5 204 * @param handle: Pointer to socket handle
mridup 0:907910bfb0b5 205 * addr: Address to connect to
mridup 0:907910bfb0b5 206 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 207 */
mridup 0:907910bfb0b5 208 int SpwfSAInterface::socket_connect(void *handle, const SocketAddress &addr)
mridup 0:907910bfb0b5 209 {
mridup 0:907910bfb0b5 210 int sock_id = 99;
mridup 0:907910bfb0b5 211 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 0:907910bfb0b5 212
mridup 0:907910bfb0b5 213 const char *proto = (socket->proto == NSAPI_UDP) ? "u" : "t";//"s" for secure socket?
mridup 0:907910bfb0b5 214
mridup 1:fd7b3df18dd7 215 if (!_spwf.open(proto, &sock_id, addr.get_ip_address(), addr.get_port())) {;//sock ID is allocated NOW
mridup 1:fd7b3df18dd7 216 return NSAPI_ERROR_DEVICE_ERROR;
mridup 1:fd7b3df18dd7 217 }
mridup 0:907910bfb0b5 218
mridup 0:907910bfb0b5 219 //TODO: Maintain a socket table to map socket ID to host & port
mridup 0:907910bfb0b5 220 //TODO: lookup on client table to see if already socket is allocated to same host/port
mridup 0:907910bfb0b5 221 //multimap <char *, vector <uint16_t> > ::iterator i = c_table.find((char*)ip);
mridup 0:907910bfb0b5 222
mridup 0:907910bfb0b5 223 if(sock_id <= SPWFSA_SOCKET_COUNT)
mridup 0:907910bfb0b5 224 {
mridup 0:907910bfb0b5 225 socket->id = sock_id;//the socket ID of this Socket instance
mridup 0:907910bfb0b5 226 _ids[socket->id] = true;
mridup 0:907910bfb0b5 227 socket->connected = true;
mridup 0:907910bfb0b5 228 }
mridup 0:907910bfb0b5 229 else
mridup 0:907910bfb0b5 230 return NSAPI_ERROR_NO_SOCKET;
mridup 0:907910bfb0b5 231
mridup 0:907910bfb0b5 232 return 0;
mridup 0:907910bfb0b5 233 }
mridup 0:907910bfb0b5 234
mridup 0:907910bfb0b5 235 /**
mridup 0:907910bfb0b5 236 * @brief bind to a port number and address
mridup 0:907910bfb0b5 237 * @param handle: Pointer to socket handle
mridup 0:907910bfb0b5 238 * proto: address to bind to
mridup 0:907910bfb0b5 239 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 240 */
mridup 0:907910bfb0b5 241 int SpwfSAInterface::socket_bind(void *handle, const SocketAddress &address)
mridup 0:907910bfb0b5 242 {
mridup 0:907910bfb0b5 243 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 0:907910bfb0b5 244 socket->server_port = address.get_port();
mridup 0:907910bfb0b5 245 return 0;
mridup 0:907910bfb0b5 246 }
mridup 0:907910bfb0b5 247
mridup 0:907910bfb0b5 248 /**
mridup 0:907910bfb0b5 249 * @brief start listening on a port and address
mridup 0:907910bfb0b5 250 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 251 * backlog: not used (always value is 1)
mridup 0:907910bfb0b5 252 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 253 */
mridup 0:907910bfb0b5 254 int SpwfSAInterface::socket_listen(void *handle, int backlog)
mridup 0:907910bfb0b5 255 {
mridup 0:907910bfb0b5 256 return NSAPI_ERROR_UNSUPPORTED;
mridup 0:907910bfb0b5 257 }
mridup 0:907910bfb0b5 258
mridup 0:907910bfb0b5 259 /**
mridup 0:907910bfb0b5 260 * @brief accept connections from remote sockets
mridup 0:907910bfb0b5 261 * @param handle: Pointer to handle of client socket (connecting)
mridup 0:907910bfb0b5 262 * proto: handle of server socket which will accept connections
mridup 0:907910bfb0b5 263 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 264 */
mridup 0:907910bfb0b5 265 int SpwfSAInterface::socket_accept(void **handle, void *server)
mridup 0:907910bfb0b5 266 {
mridup 0:907910bfb0b5 267 return NSAPI_ERROR_UNSUPPORTED;
mridup 0:907910bfb0b5 268 }
mridup 0:907910bfb0b5 269
mridup 0:907910bfb0b5 270 /**
mridup 0:907910bfb0b5 271 * @brief close a socket
mridup 0:907910bfb0b5 272 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 273 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 274 */
mridup 0:907910bfb0b5 275 int SpwfSAInterface::socket_close(void *handle)
mridup 0:907910bfb0b5 276 {
mridup 0:907910bfb0b5 277 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 0:907910bfb0b5 278 int err = 0;
mridup 0:907910bfb0b5 279
mridup 0:907910bfb0b5 280 if(socket->id!=-1)
mridup 0:907910bfb0b5 281 {
mridup 1:fd7b3df18dd7 282 if (_spwf.close(socket->id)) {
mridup 1:fd7b3df18dd7 283 if(socket->id==SERVER_SOCKET_NO)
mridup 1:fd7b3df18dd7 284 isListening = false;
mridup 1:fd7b3df18dd7 285 else
mridup 1:fd7b3df18dd7 286 _ids[socket->id] = false;
mridup 0:907910bfb0b5 287 }
mridup 1:fd7b3df18dd7 288 else err = NSAPI_ERROR_DEVICE_ERROR;
mridup 0:907910bfb0b5 289 }
mridup 0:907910bfb0b5 290
mridup 0:907910bfb0b5 291 delete socket;
mridup 0:907910bfb0b5 292 return err;
mridup 0:907910bfb0b5 293 }
mridup 0:907910bfb0b5 294
mridup 0:907910bfb0b5 295 /**
mridup 0:907910bfb0b5 296 * @brief write to a socket
mridup 0:907910bfb0b5 297 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 298 * data: pointer to data
mridup 0:907910bfb0b5 299 * size: size of data
mridup 0:907910bfb0b5 300 * @retval no of bytes sent
mridup 0:907910bfb0b5 301 */
mridup 0:907910bfb0b5 302 int SpwfSAInterface::socket_send(void *handle, const void *data, unsigned size)
mridup 0:907910bfb0b5 303 {
mridup 0:907910bfb0b5 304 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 3:4c2cbca19031 305 //int err;
mridup 0:907910bfb0b5 306
mridup 1:fd7b3df18dd7 307 /*if(socket->id==SERVER_SOCKET_NO)
mridup 0:907910bfb0b5 308 {
mridup 0:907910bfb0b5 309 if(socket->server_port==-1 || !isListening)
mridup 0:907910bfb0b5 310 return NSAPI_ERROR_NO_SOCKET; //server socket not bound or not listening
mridup 0:907910bfb0b5 311
mridup 1:fd7b3df18dd7 312 err = _spwf.socket_server_write((uint16_t)size, (char*)data);
mridup 0:907910bfb0b5 313 }
mridup 0:907910bfb0b5 314 else
mridup 3:4c2cbca19031 315 {
mridup 1:fd7b3df18dd7 316 err = _spwf.send(socket->id, (char*)data, (uint32_t)size);
mridup 3:4c2cbca19031 317 }*/
mridup 3:4c2cbca19031 318 if (!_spwf.send(socket->id, (char*)data, (uint32_t)size)) {
mridup 3:4c2cbca19031 319 return NSAPI_ERROR_DEVICE_ERROR;
mridup 3:4c2cbca19031 320 }
mridup 3:4c2cbca19031 321
mridup 3:4c2cbca19031 322 return size;
mridup 0:907910bfb0b5 323 }
mridup 0:907910bfb0b5 324
mridup 0:907910bfb0b5 325 /**
mridup 0:907910bfb0b5 326 * @brief receive data on a socket
mridup 0:907910bfb0b5 327 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 328 * data: pointer to data
mridup 0:907910bfb0b5 329 * size: size of data
mridup 0:907910bfb0b5 330 * @retval no of bytes read
mridup 0:907910bfb0b5 331 */
mridup 0:907910bfb0b5 332 int SpwfSAInterface::socket_recv(void *handle, void *data, unsigned size)
mridup 0:907910bfb0b5 333 {
mridup 0:907910bfb0b5 334 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 0:907910bfb0b5 335 int32_t recv;
mridup 0:907910bfb0b5 336
mridup 0:907910bfb0b5 337 //CHECK:Receive for both Client and Server Sockets same?
mridup 1:fd7b3df18dd7 338 recv = _spwf.recv(socket->id, (char*)data, (uint32_t)size);
mridup 1:fd7b3df18dd7 339 if (recv < 0) {
mridup 5:8ee8698d19e3 340 //wait_ms(1);//delay of 1ms <for F4>??
mridup 5:8ee8698d19e3 341 //printf(".");
mridup 5:8ee8698d19e3 342 if (recv == -1) return NSAPI_ERROR_WOULD_BLOCK;//send this if we want to block call (else timeout will happen)
mapellil 13:0368732b5b9d 343 else if (recv == -2)return NSAPI_ERROR_DEVICE_ERROR;
mapellil 13:0368732b5b9d 344 else if (recv == -3)return NSAPI_ERROR_NO_CONNECTION;
mridup 1:fd7b3df18dd7 345 }
mapellil 13:0368732b5b9d 346 return recv;
mridup 0:907910bfb0b5 347 }
mridup 0:907910bfb0b5 348
mridup 0:907910bfb0b5 349 /**
mridup 0:907910bfb0b5 350 * @brief send data to a udp socket
mridup 0:907910bfb0b5 351 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 352 * addr: address of udp socket
mridup 0:907910bfb0b5 353 * data: pointer to data
mridup 0:907910bfb0b5 354 * size: size of data
mridup 0:907910bfb0b5 355 * @retval no of bytes sent
mridup 0:907910bfb0b5 356 */
mridup 0:907910bfb0b5 357 int SpwfSAInterface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size)
mridup 0:907910bfb0b5 358 {
mridup 0:907910bfb0b5 359 struct spwf_socket *socket = (struct spwf_socket *)handle;
mapellil 13:0368732b5b9d 360 if (!socket->connected) {
mridup 0:907910bfb0b5 361 int err = socket_connect(socket, addr);
mridup 0:907910bfb0b5 362 if (err < 0) {
mridup 0:907910bfb0b5 363 return err;
mridup 0:907910bfb0b5 364 }
mridup 0:907910bfb0b5 365 }
mridup 0:907910bfb0b5 366
mridup 0:907910bfb0b5 367 return socket_send(socket, data, size);
mridup 0:907910bfb0b5 368 }
mridup 0:907910bfb0b5 369
mridup 0:907910bfb0b5 370 /**
mridup 0:907910bfb0b5 371 * @brief receive data on a udp socket
mridup 0:907910bfb0b5 372 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 373 * addr: address of udp socket
mridup 0:907910bfb0b5 374 * data: pointer to data
mridup 0:907910bfb0b5 375 * size: size of data
mridup 0:907910bfb0b5 376 * @retval no of bytes read
mridup 0:907910bfb0b5 377 */
mridup 0:907910bfb0b5 378 int SpwfSAInterface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
mridup 0:907910bfb0b5 379 {
mridup 0:907910bfb0b5 380 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 0:907910bfb0b5 381 return socket_recv(socket, data, size);
mridup 0:907910bfb0b5 382 }
mridup 0:907910bfb0b5 383
mridup 0:907910bfb0b5 384 /**
mridup 0:907910bfb0b5 385 * @brief attach function/callback to the socket
mridup 0:907910bfb0b5 386 * Not used
mridup 0:907910bfb0b5 387 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 388 * callback: callback function pointer
mridup 0:907910bfb0b5 389 * data: pointer to data
mridup 0:907910bfb0b5 390 * @retval none
mridup 0:907910bfb0b5 391 */
mridup 0:907910bfb0b5 392 void SpwfSAInterface::socket_attach(void *handle, void (*callback)(void *), void *data)
mridup 0:907910bfb0b5 393 {
mridup 0:907910bfb0b5 394 //No implementation yet
mridup 0:907910bfb0b5 395 }
mridup 0:907910bfb0b5 396
mridup 0:907910bfb0b5 397 /**
mridup 0:907910bfb0b5 398 * @brief utility debug function for printing to serial terminal
mridup 0:907910bfb0b5 399 * @param string: Pointer to data
mridup 0:907910bfb0b5 400 * @retval none
mridup 0:907910bfb0b5 401 */
mridup 0:907910bfb0b5 402 void SpwfSAInterface::debug(const char * string)
mridup 0:907910bfb0b5 403 {
mridup 0:907910bfb0b5 404 //_spwf.debug_print(string);
mridup 0:907910bfb0b5 405 }
mapellil 13:0368732b5b9d 406
mapellil 13:0368732b5b9d 407 /**
mapellil 13:0368732b5b9d 408 * @brief Set the socket options
mapellil 13:0368732b5b9d 409 * Not used
mapellil 13:0368732b5b9d 410 * @param handle: Pointer to handle
mapellil 13:0368732b5b9d 411 * level: SOL_SOCKET
mapellil 13:0368732b5b9d 412 * optname: option name
mapellil 13:0368732b5b9d 413 * optval: pointer to option value
mapellil 13:0368732b5b9d 414 * optlen: option length
mapellil 13:0368732b5b9d 415 @retval NSAPI Error Type
mapellil 13:0368732b5b9d 416 */
mapellil 13:0368732b5b9d 417 int SpwfSAInterface::setsockopt(void *handle, int level, int optname, const void *optval, unsigned optlen)
mapellil 13:0368732b5b9d 418 {
mapellil 13:0368732b5b9d 419 // struct spwf_socket *socket = (struct spwf_socket *)handle;
mapellil 13:0368732b5b9d 420
mapellil 13:0368732b5b9d 421 switch (optname) {
mapellil 13:0368732b5b9d 422 case NSAPI_REUSEADDR: /*!< Allow bind to reuse local addresses */
mapellil 13:0368732b5b9d 423 case NSAPI_KEEPALIVE: /*!< Enables sending of keepalive messages */
mapellil 13:0368732b5b9d 424 case NSAPI_LINGER: /*!< Keeps close from returning until queues empty */
mapellil 13:0368732b5b9d 425 case NSAPI_SNDBUF: /*!< Sets send buffer size */
mapellil 13:0368732b5b9d 426 case NSAPI_RCVBUF: /*!< Sets recv buffer size */
mapellil 13:0368732b5b9d 427 default:
mapellil 13:0368732b5b9d 428 printf("SpwfSAInterface::setsockopt> ERROR!!!! Unknown optname: %d \r\n", optname);
mapellil 13:0368732b5b9d 429 return -1;
mapellil 13:0368732b5b9d 430 }
mapellil 13:0368732b5b9d 431 return NSAPI_ERROR_UNSUPPORTED;
mapellil 13:0368732b5b9d 432 }
mapellil 13:0368732b5b9d 433
mapellil 13:0368732b5b9d 434 /**
mapellil 13:0368732b5b9d 435 * @brief Get the socket options
mapellil 13:0368732b5b9d 436 * Not used
mapellil 13:0368732b5b9d 437 * @param handle: Pointer to handle
mapellil 13:0368732b5b9d 438 * level: SOL_SOCKET
mapellil 13:0368732b5b9d 439 * optname: option name
mapellil 13:0368732b5b9d 440 * optval: pointer to option value
mapellil 13:0368732b5b9d 441 * optlen: pointer to option length
mapellil 13:0368732b5b9d 442 @retval NSAPI Error Type
mapellil 13:0368732b5b9d 443 */
mapellil 13:0368732b5b9d 444 int SpwfSAInterface::getsockopt(void *handle, int level, int optname, void *optval, unsigned *optlen)
mapellil 13:0368732b5b9d 445 {
mapellil 13:0368732b5b9d 446 return NSAPI_ERROR_UNSUPPORTED;
mapellil 13:0368732b5b9d 447 }