iowfehu;gdbjwHJAOPIHO?L

Fork of X_NUCLEO_IDW01M1 by ST

Committer:
mridup
Date:
Sat May 14 08:38:54 2016 +0000
Revision:
13:cdcc13d78252
Parent:
12:3799f8475c8a
Child:
14:af04fe9ca955
headers and comments added

Who changed what in which revision?

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