Updates and additions required by mbed-os 5.2.2

Dependencies:   SPWF01SA-lapi-1

Dependents:   x-nucleo-iks01a1-test x-nucleo-iks01a1-test

Fork of X_NUCLEO_IDW01M1v2 by ST

Committer:
lapi
Date:
Sun Nov 20 20:39:17 2016 +0000
Revision:
14:aadc322f10db
Parent:
13:3d28a8c18182
Updates and additions required by mbed-os 5.2.2

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"
lapi 13:3d28a8c18182 37 #include <string.h>
mridup 0:907910bfb0b5 38
mridup 0:907910bfb0b5 39 // Various timeouts for different SPWF operations
mridup 0:907910bfb0b5 40 #define SPWF_CONNECT_TIMEOUT 20000
mridup 0:907910bfb0b5 41 #define SPWF_SEND_TIMEOUT 500
mridup 9:4cd89586b370 42 #define SPWF_RECV_TIMEOUT 500
mridup 0:907910bfb0b5 43 #define SPWF_MISC_TIMEOUT 15000
mridup 0:907910bfb0b5 44
mridup 0:907910bfb0b5 45 /** spwf_socket class
mridup 0:907910bfb0b5 46 * Implementation of SPWF socket structure
mridup 0:907910bfb0b5 47 */
mridup 0:907910bfb0b5 48 struct spwf_socket {
mridup 0:907910bfb0b5 49 int id;
mridup 0:907910bfb0b5 50 int server_port;
mridup 0:907910bfb0b5 51 nsapi_protocol_t proto;
mridup 0:907910bfb0b5 52 bool connected;
mridup 0:907910bfb0b5 53 };
mridup 0:907910bfb0b5 54
mridup 0:907910bfb0b5 55
mridup 0:907910bfb0b5 56 /**
mridup 0:907910bfb0b5 57 * @brief SpwfSAInterface constructor
mridup 0:907910bfb0b5 58 * @param tx: Pin USART TX
mridup 0:907910bfb0b5 59 * rx: Pin USART RX
mridup 0:907910bfb0b5 60 * rst: reset pin for Spwf module
mridup 0:907910bfb0b5 61 * wkup: reset pin for Spwf module
mridup 0:907910bfb0b5 62 * rts: Pin USART RTS
mridup 0:907910bfb0b5 63 * debug : not used
mridup 0:907910bfb0b5 64 * @retval none
mridup 0:907910bfb0b5 65 */
mridup 0:907910bfb0b5 66 SpwfSAInterface::SpwfSAInterface(PinName tx, PinName rx, bool debug)
lapi 13:3d28a8c18182 67 : _spwf(tx, rx, debug), _ssid(0), _pass(0), _channel(0)
mridup 0:907910bfb0b5 68 {
mridup 0:907910bfb0b5 69 memset(_ids, 0, sizeof(_ids));
mridup 0:907910bfb0b5 70 isInitialized = false;
mridup 0:907910bfb0b5 71 isListening = false;
mridup 0:907910bfb0b5 72 }
mridup 0:907910bfb0b5 73
mridup 0:907910bfb0b5 74 /**
mridup 0:907910bfb0b5 75 * @brief SpwfSAInterface destructor
mridup 0:907910bfb0b5 76 * @param none
mridup 0:907910bfb0b5 77 * @retval none
mridup 0:907910bfb0b5 78 */
mridup 0:907910bfb0b5 79 SpwfSAInterface::~SpwfSAInterface()
mridup 0:907910bfb0b5 80 {
mridup 0:907910bfb0b5 81 }
mridup 0:907910bfb0b5 82
mridup 0:907910bfb0b5 83 /**
lapi 13:3d28a8c18182 84 * @brief Get the RSSI of the last packet
lapi 13:3d28a8c18182 85 * @param none
lapi 13:3d28a8c18182 86 * @retval RSSI of the last packet (dBm)
lapi 13:3d28a8c18182 87 */
lapi 13:3d28a8c18182 88 int8_t SpwfSAInterface::get_rssi()
lapi 13:3d28a8c18182 89 {
lapi 13:3d28a8c18182 90 return _spwf.getRSSI();
lapi 13:3d28a8c18182 91 }
lapi 13:3d28a8c18182 92
lapi 13:3d28a8c18182 93 /**
mridup 0:907910bfb0b5 94 * @brief init function
mridup 0:907910bfb0b5 95 initializes SPWF FW and module
mridup 0:907910bfb0b5 96 * @param none
mridup 0:907910bfb0b5 97 * @retval error value
mridup 0:907910bfb0b5 98 */
mridup 0:907910bfb0b5 99 int SpwfSAInterface::init(void)
mridup 0:907910bfb0b5 100 {
mridup 0:907910bfb0b5 101 _spwf.setTimeout(SPWF_MISC_TIMEOUT);
mridup 1:fd7b3df18dd7 102 if(_spwf.startup(0)) {
mridup 1:fd7b3df18dd7 103 isInitialized=true;
lapi 13:3d28a8c18182 104 return NSAPI_ERROR_OK;
mridup 1:fd7b3df18dd7 105 }
mridup 1:fd7b3df18dd7 106 else return NSAPI_ERROR_DEVICE_ERROR;
mridup 0:907910bfb0b5 107 }
mridup 0:907910bfb0b5 108
lapi 13:3d28a8c18182 109 nsapi_error_t SpwfSAInterface::set_credentials(
lapi 13:3d28a8c18182 110 const char *ssid, const char *pass, nsapi_security_t security) {
lapi 13:3d28a8c18182 111 _ssid = ssid; // TODO! Copy of the string preferred!
lapi 13:3d28a8c18182 112 _pass = pass;
lapi 13:3d28a8c18182 113 _security = security;
lapi 13:3d28a8c18182 114 return NSAPI_ERROR_OK;
lapi 13:3d28a8c18182 115
lapi 13:3d28a8c18182 116 }
lapi 13:3d28a8c18182 117
mridup 0:907910bfb0b5 118 /**
mridup 0:907910bfb0b5 119 * @brief network connect
mridup 0:907910bfb0b5 120 connects to Access Point
mridup 0:907910bfb0b5 121 * @param ap: Access Point (AP) Name String
mridup 0:907910bfb0b5 122 * pass_phrase: Password String for AP
mridup 0:907910bfb0b5 123 * security: type of NSAPI security supported
lapi 13:3d28a8c18182 124 * channel: the WiFi channel number
mridup 0:907910bfb0b5 125 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 126 */
lapi 13:3d28a8c18182 127 nsapi_error_t SpwfSAInterface::connect(const char *ap,
mridup 0:907910bfb0b5 128 const char *pass_phrase,
lapi 13:3d28a8c18182 129 nsapi_security_t security,
lapi 13:3d28a8c18182 130 uint8_t channel)
mridup 0:907910bfb0b5 131 {
mridup 0:907910bfb0b5 132 int mode;
mridup 0:907910bfb0b5 133
mridup 0:907910bfb0b5 134 //initialize the device before connecting
mridup 0:907910bfb0b5 135 if(!isInitialized)
mridup 0:907910bfb0b5 136 {
lapi 13:3d28a8c18182 137 if (init() != NSAPI_ERROR_OK)
mridup 1:fd7b3df18dd7 138 return NSAPI_ERROR_DEVICE_ERROR;
mridup 0:907910bfb0b5 139 }
mridup 2:610672ed2e9f 140
mridup 0:907910bfb0b5 141 _spwf.setTimeout(SPWF_CONNECT_TIMEOUT);
mridup 0:907910bfb0b5 142
mridup 0:907910bfb0b5 143 switch(security)
mridup 0:907910bfb0b5 144 {
mridup 0:907910bfb0b5 145 case NSAPI_SECURITY_NONE:
mridup 0:907910bfb0b5 146 mode = 0;
mridup 0:907910bfb0b5 147 pass_phrase = NULL;
mridup 0:907910bfb0b5 148 break;
mridup 0:907910bfb0b5 149 case NSAPI_SECURITY_WEP:
mridup 0:907910bfb0b5 150 mode = 1;
mridup 0:907910bfb0b5 151 break;
mridup 0:907910bfb0b5 152 case NSAPI_SECURITY_WPA:
mridup 0:907910bfb0b5 153 case NSAPI_SECURITY_WPA2:
mridup 0:907910bfb0b5 154 mode = 2;
mridup 0:907910bfb0b5 155 break;
mridup 0:907910bfb0b5 156 default:
mridup 0:907910bfb0b5 157 mode = 2;
mridup 0:907910bfb0b5 158 break;
mridup 0:907910bfb0b5 159 }
lapi 13:3d28a8c18182 160 if (_spwf.connect((char*)ap, (char*)pass_phrase, mode, channel)) {
lapi 13:3d28a8c18182 161 return NSAPI_ERROR_NO_CONNECTION;
lapi 13:3d28a8c18182 162 } else {
lapi 13:3d28a8c18182 163 return NSAPI_ERROR_OK;
lapi 13:3d28a8c18182 164 }
mridup 0:907910bfb0b5 165 }
mridup 0:907910bfb0b5 166
mridup 0:907910bfb0b5 167 /**
mridup 0:907910bfb0b5 168 * @brief network disconnect
mridup 0:907910bfb0b5 169 disconnects from Access Point
mridup 0:907910bfb0b5 170 * @param none
mridup 0:907910bfb0b5 171 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 172 */
mridup 0:907910bfb0b5 173 int SpwfSAInterface::disconnect()
mridup 0:907910bfb0b5 174 {
mridup 0:907910bfb0b5 175 return (_spwf.disconnect());
mridup 0:907910bfb0b5 176 }
mridup 0:907910bfb0b5 177
mridup 0:907910bfb0b5 178 /**
mridup 0:907910bfb0b5 179 * @brief Get the local IP address
mridup 0:907910bfb0b5 180 * @param none
mridup 0:907910bfb0b5 181 * @retval Null-terminated representation of the local IP address
mridup 0:907910bfb0b5 182 * or null if not yet connected
mridup 0:907910bfb0b5 183 */
mridup 0:907910bfb0b5 184 const char *SpwfSAInterface::get_ip_address()
mridup 0:907910bfb0b5 185 {
mridup 0:907910bfb0b5 186 return _spwf.getIPAddress();
mridup 0:907910bfb0b5 187 }
mridup 0:907910bfb0b5 188
mridup 0:907910bfb0b5 189 /**
mridup 0:907910bfb0b5 190 * @brief Get the MAC address
mridup 0:907910bfb0b5 191 * @param none
mridup 0:907910bfb0b5 192 * @retval Null-terminated representation of the MAC address
mridup 0:907910bfb0b5 193 * or null if not yet connected
mridup 0:907910bfb0b5 194 */
mridup 0:907910bfb0b5 195 const char *SpwfSAInterface::get_mac_address()
mridup 0:907910bfb0b5 196 {
mridup 0:907910bfb0b5 197 return _spwf.getMACAddress();
mridup 0:907910bfb0b5 198 }
mridup 0:907910bfb0b5 199
mridup 0:907910bfb0b5 200 /**
mridup 0:907910bfb0b5 201 * @brief open a socket handle
mridup 0:907910bfb0b5 202 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 203 * proto: TCP/UDP protocol
mridup 0:907910bfb0b5 204 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 205 */
mridup 0:907910bfb0b5 206 int SpwfSAInterface::socket_open(void **handle, nsapi_protocol_t proto)
mridup 0:907910bfb0b5 207 {
mridup 0:907910bfb0b5 208 int id = -1;
mridup 0:907910bfb0b5 209
mridup 0:907910bfb0b5 210 struct spwf_socket *socket = new struct spwf_socket;
mridup 0:907910bfb0b5 211 if (!socket) {
mridup 0:907910bfb0b5 212 return NSAPI_ERROR_NO_SOCKET;
mridup 0:907910bfb0b5 213 }
mridup 0:907910bfb0b5 214
mridup 0:907910bfb0b5 215 socket->id = id;
mridup 0:907910bfb0b5 216 socket->server_port = id;
mridup 0:907910bfb0b5 217 socket->proto = proto;
mridup 0:907910bfb0b5 218 socket->connected = false;
mridup 0:907910bfb0b5 219 *handle = socket;
mridup 0:907910bfb0b5 220 return 0;
mridup 0:907910bfb0b5 221 }
mridup 0:907910bfb0b5 222
mridup 0:907910bfb0b5 223 /**
mridup 0:907910bfb0b5 224 * @brief connect to a remote socket
mridup 0:907910bfb0b5 225 * @param handle: Pointer to socket handle
mridup 0:907910bfb0b5 226 * addr: Address to connect to
mridup 0:907910bfb0b5 227 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 228 */
mridup 0:907910bfb0b5 229 int SpwfSAInterface::socket_connect(void *handle, const SocketAddress &addr)
mridup 0:907910bfb0b5 230 {
mridup 0:907910bfb0b5 231 int sock_id = 99;
mridup 0:907910bfb0b5 232 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 0:907910bfb0b5 233
mridup 0:907910bfb0b5 234 const char *proto = (socket->proto == NSAPI_UDP) ? "u" : "t";//"s" for secure socket?
mridup 0:907910bfb0b5 235
mridup 1:fd7b3df18dd7 236 if (!_spwf.open(proto, &sock_id, addr.get_ip_address(), addr.get_port())) {;//sock ID is allocated NOW
mridup 1:fd7b3df18dd7 237 return NSAPI_ERROR_DEVICE_ERROR;
mridup 1:fd7b3df18dd7 238 }
mridup 0:907910bfb0b5 239
mridup 0:907910bfb0b5 240 //TODO: Maintain a socket table to map socket ID to host & port
mridup 0:907910bfb0b5 241 //TODO: lookup on client table to see if already socket is allocated to same host/port
mridup 0:907910bfb0b5 242 //multimap <char *, vector <uint16_t> > ::iterator i = c_table.find((char*)ip);
mridup 0:907910bfb0b5 243
mridup 0:907910bfb0b5 244 if(sock_id <= SPWFSA_SOCKET_COUNT)
mridup 0:907910bfb0b5 245 {
mridup 0:907910bfb0b5 246 socket->id = sock_id;//the socket ID of this Socket instance
mridup 0:907910bfb0b5 247 _ids[socket->id] = true;
mridup 0:907910bfb0b5 248 socket->connected = true;
mridup 0:907910bfb0b5 249 }
mridup 0:907910bfb0b5 250 else
mridup 0:907910bfb0b5 251 return NSAPI_ERROR_NO_SOCKET;
mridup 0:907910bfb0b5 252
mridup 0:907910bfb0b5 253 return 0;
mridup 0:907910bfb0b5 254 }
mridup 0:907910bfb0b5 255
mridup 0:907910bfb0b5 256 /**
mridup 0:907910bfb0b5 257 * @brief bind to a port number and address
mridup 0:907910bfb0b5 258 * @param handle: Pointer to socket handle
mridup 0:907910bfb0b5 259 * proto: address to bind to
mridup 0:907910bfb0b5 260 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 261 */
mridup 0:907910bfb0b5 262 int SpwfSAInterface::socket_bind(void *handle, const SocketAddress &address)
mridup 0:907910bfb0b5 263 {
mridup 0:907910bfb0b5 264 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 0:907910bfb0b5 265 socket->server_port = address.get_port();
mridup 0:907910bfb0b5 266 return 0;
mridup 0:907910bfb0b5 267 }
mridup 0:907910bfb0b5 268
mridup 0:907910bfb0b5 269 /**
mridup 0:907910bfb0b5 270 * @brief start listening on a port and address
mridup 0:907910bfb0b5 271 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 272 * backlog: not used (always value is 1)
mridup 0:907910bfb0b5 273 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 274 */
mridup 0:907910bfb0b5 275 int SpwfSAInterface::socket_listen(void *handle, int backlog)
mridup 0:907910bfb0b5 276 {
mridup 0:907910bfb0b5 277 return NSAPI_ERROR_UNSUPPORTED;
mridup 0:907910bfb0b5 278 }
mridup 0:907910bfb0b5 279
mridup 0:907910bfb0b5 280 /**
mridup 0:907910bfb0b5 281 * @brief accept connections from remote sockets
mridup 0:907910bfb0b5 282 * @param handle: Pointer to handle of client socket (connecting)
mridup 0:907910bfb0b5 283 * proto: handle of server socket which will accept connections
mridup 0:907910bfb0b5 284 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 285 */
lapi 13:3d28a8c18182 286 nsapi_error_t SpwfSAInterface::socket_accept(nsapi_socket_t server,
lapi 13:3d28a8c18182 287 nsapi_socket_t *handle, SocketAddress *address)
mridup 0:907910bfb0b5 288 {
mridup 0:907910bfb0b5 289 return NSAPI_ERROR_UNSUPPORTED;
mridup 0:907910bfb0b5 290 }
mridup 0:907910bfb0b5 291
mridup 0:907910bfb0b5 292 /**
mridup 0:907910bfb0b5 293 * @brief close a socket
mridup 0:907910bfb0b5 294 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 295 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 296 */
mridup 0:907910bfb0b5 297 int SpwfSAInterface::socket_close(void *handle)
mridup 0:907910bfb0b5 298 {
mridup 0:907910bfb0b5 299 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 0:907910bfb0b5 300 int err = 0;
mridup 0:907910bfb0b5 301 _spwf.setTimeout(SPWF_MISC_TIMEOUT);
mridup 0:907910bfb0b5 302
mridup 0:907910bfb0b5 303 if(socket->id!=-1)
mridup 0:907910bfb0b5 304 {
mridup 1:fd7b3df18dd7 305 if (_spwf.close(socket->id)) {
mridup 1:fd7b3df18dd7 306 if(socket->id==SERVER_SOCKET_NO)
mridup 1:fd7b3df18dd7 307 isListening = false;
mridup 1:fd7b3df18dd7 308 else
mridup 1:fd7b3df18dd7 309 _ids[socket->id] = false;
mridup 0:907910bfb0b5 310 }
mridup 1:fd7b3df18dd7 311 else err = NSAPI_ERROR_DEVICE_ERROR;
mridup 0:907910bfb0b5 312 }
mridup 0:907910bfb0b5 313
mridup 0:907910bfb0b5 314 delete socket;
mridup 0:907910bfb0b5 315 return err;
mridup 0:907910bfb0b5 316 }
mridup 0:907910bfb0b5 317
mridup 0:907910bfb0b5 318 /**
mridup 0:907910bfb0b5 319 * @brief write to a socket
mridup 0:907910bfb0b5 320 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 321 * data: pointer to data
mridup 0:907910bfb0b5 322 * size: size of data
mridup 0:907910bfb0b5 323 * @retval no of bytes sent
mridup 0:907910bfb0b5 324 */
mridup 0:907910bfb0b5 325 int SpwfSAInterface::socket_send(void *handle, const void *data, unsigned size)
mridup 0:907910bfb0b5 326 {
mridup 0:907910bfb0b5 327 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 3:4c2cbca19031 328 //int err;
mridup 0:907910bfb0b5 329
mridup 1:fd7b3df18dd7 330 /*if(socket->id==SERVER_SOCKET_NO)
mridup 0:907910bfb0b5 331 {
mridup 0:907910bfb0b5 332 if(socket->server_port==-1 || !isListening)
mridup 0:907910bfb0b5 333 return NSAPI_ERROR_NO_SOCKET; //server socket not bound or not listening
mridup 0:907910bfb0b5 334
mridup 1:fd7b3df18dd7 335 err = _spwf.socket_server_write((uint16_t)size, (char*)data);
mridup 0:907910bfb0b5 336 }
mridup 0:907910bfb0b5 337 else
mridup 3:4c2cbca19031 338 {
mridup 1:fd7b3df18dd7 339 err = _spwf.send(socket->id, (char*)data, (uint32_t)size);
mridup 3:4c2cbca19031 340 }*/
mridup 3:4c2cbca19031 341 if (!_spwf.send(socket->id, (char*)data, (uint32_t)size)) {
mridup 3:4c2cbca19031 342 return NSAPI_ERROR_DEVICE_ERROR;
mridup 3:4c2cbca19031 343 }
mridup 3:4c2cbca19031 344
mridup 3:4c2cbca19031 345 return size;
mridup 0:907910bfb0b5 346 }
mridup 0:907910bfb0b5 347
mridup 0:907910bfb0b5 348 /**
mridup 0:907910bfb0b5 349 * @brief receive data on a socket
mridup 0:907910bfb0b5 350 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 351 * data: pointer to data
mridup 0:907910bfb0b5 352 * size: size of data
mridup 0:907910bfb0b5 353 * @retval no of bytes read
mridup 0:907910bfb0b5 354 */
mridup 0:907910bfb0b5 355 int SpwfSAInterface::socket_recv(void *handle, void *data, unsigned size)
mridup 0:907910bfb0b5 356 {
mridup 0:907910bfb0b5 357 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 0:907910bfb0b5 358 int32_t recv;
mridup 0:907910bfb0b5 359
mridup 0:907910bfb0b5 360 _spwf.setTimeout(SPWF_RECV_TIMEOUT);
mridup 0:907910bfb0b5 361
mridup 0:907910bfb0b5 362 //CHECK:Receive for both Client and Server Sockets same?
mridup 1:fd7b3df18dd7 363 recv = _spwf.recv(socket->id, (char*)data, (uint32_t)size);
mridup 1:fd7b3df18dd7 364 if (recv < 0) {
mridup 5:8ee8698d19e3 365 //wait_ms(1);//delay of 1ms <for F4>??
mridup 5:8ee8698d19e3 366 //printf(".");
mridup 5:8ee8698d19e3 367 if (recv == -1) return NSAPI_ERROR_WOULD_BLOCK;//send this if we want to block call (else timeout will happen)
mridup 5:8ee8698d19e3 368 else return NSAPI_ERROR_DEVICE_ERROR;
mridup 1:fd7b3df18dd7 369 }
mridup 5:8ee8698d19e3 370
mridup 0:907910bfb0b5 371 return recv;
mridup 0:907910bfb0b5 372
mridup 0:907910bfb0b5 373 }
mridup 0:907910bfb0b5 374
mridup 0:907910bfb0b5 375 /**
mridup 0:907910bfb0b5 376 * @brief send data to a udp socket
mridup 0:907910bfb0b5 377 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 378 * addr: address of udp socket
mridup 0:907910bfb0b5 379 * data: pointer to data
mridup 0:907910bfb0b5 380 * size: size of data
mridup 0:907910bfb0b5 381 * @retval no of bytes sent
mridup 0:907910bfb0b5 382 */
mridup 0:907910bfb0b5 383 int SpwfSAInterface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size)
mridup 0:907910bfb0b5 384 {
mridup 0:907910bfb0b5 385 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 0:907910bfb0b5 386 if (!socket->connected) {
mridup 0:907910bfb0b5 387 int err = socket_connect(socket, addr);
mridup 0:907910bfb0b5 388 if (err < 0) {
mridup 0:907910bfb0b5 389 return err;
mridup 0:907910bfb0b5 390 }
mridup 0:907910bfb0b5 391 }
mridup 0:907910bfb0b5 392
mridup 0:907910bfb0b5 393 return socket_send(socket, data, size);
mridup 0:907910bfb0b5 394 }
mridup 0:907910bfb0b5 395
mridup 0:907910bfb0b5 396 /**
mridup 0:907910bfb0b5 397 * @brief receive data on a udp socket
mridup 0:907910bfb0b5 398 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 399 * addr: address of udp socket
mridup 0:907910bfb0b5 400 * data: pointer to data
mridup 0:907910bfb0b5 401 * size: size of data
mridup 0:907910bfb0b5 402 * @retval no of bytes read
mridup 0:907910bfb0b5 403 */
mridup 0:907910bfb0b5 404 int SpwfSAInterface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
mridup 0:907910bfb0b5 405 {
mridup 0:907910bfb0b5 406 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 0:907910bfb0b5 407 return socket_recv(socket, data, size);
mridup 0:907910bfb0b5 408 }
mridup 0:907910bfb0b5 409
mridup 0:907910bfb0b5 410 /**
mridup 0:907910bfb0b5 411 * @brief attach function/callback to the socket
mridup 0:907910bfb0b5 412 * Not used
mridup 0:907910bfb0b5 413 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 414 * callback: callback function pointer
mridup 0:907910bfb0b5 415 * data: pointer to data
mridup 0:907910bfb0b5 416 * @retval none
mridup 0:907910bfb0b5 417 */
mridup 0:907910bfb0b5 418 void SpwfSAInterface::socket_attach(void *handle, void (*callback)(void *), void *data)
mridup 0:907910bfb0b5 419 {
mridup 0:907910bfb0b5 420 //No implementation yet
mridup 0:907910bfb0b5 421 }
mridup 0:907910bfb0b5 422
mridup 0:907910bfb0b5 423 /**
mridup 0:907910bfb0b5 424 * @brief utility debug function for printing to serial terminal
mridup 0:907910bfb0b5 425 * @param string: Pointer to data
mridup 0:907910bfb0b5 426 * @retval none
mridup 0:907910bfb0b5 427 */
mridup 0:907910bfb0b5 428 void SpwfSAInterface::debug(const char * string)
mridup 0:907910bfb0b5 429 {
mridup 0:907910bfb0b5 430 //_spwf.debug_print(string);
mridup 0:907910bfb0b5 431 }