iowfehu;gdbjwHJAOPIHO?L

Fork of X_NUCLEO_IDW01M1 by ST

Committer:
mridup
Date:
Tue May 24 07:18:35 2016 +0000
Revision:
15:225d5d3c4f84
Parent:
14:af04fe9ca955
Child:
16:156be7b55904
connect settings to support WPA/WPA2, WEP and No-Auth.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mridup 14:af04fe9ca955 1 /* SpwfSAInterface implementation of NetworkStack
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 15:225d5d3c4f84 105 WiFi_Priv_Mode mode;
mridup 15:225d5d3c4f84 106
mridup 3:fd9d20c4d3f0 107 //initialize the device before connecting
mridup 3:fd9d20c4d3f0 108 if(!isInitialized)
mridup 3:fd9d20c4d3f0 109 {
mridup 3:fd9d20c4d3f0 110 if(init()==0)
mridup 3:fd9d20c4d3f0 111 isInitialized=true;
mridup 5:c83ffd44f40a 112 else return NSAPI_ERROR_DEVICE_ERROR;
mridup 3:fd9d20c4d3f0 113 }
mridup 3:fd9d20c4d3f0 114
mridup 15:225d5d3c4f84 115 _spwf.setTimeout(SPWF_CONNECT_TIMEOUT);
mridup 0:dc55f40eb04f 116
mridup 15:225d5d3c4f84 117 switch(security)
mridup 15:225d5d3c4f84 118 {
mridup 15:225d5d3c4f84 119 case NSAPI_SECURITY_NONE:
mridup 15:225d5d3c4f84 120 mode = (WiFi_Priv_Mode) None;
mridup 15:225d5d3c4f84 121 pass_phrase = NULL;
mridup 15:225d5d3c4f84 122 break;
mridup 15:225d5d3c4f84 123 case NSAPI_SECURITY_WEP:
mridup 15:225d5d3c4f84 124 mode = (WiFi_Priv_Mode) WEP;
mridup 15:225d5d3c4f84 125 break;
mridup 15:225d5d3c4f84 126 case NSAPI_SECURITY_WPA:
mridup 15:225d5d3c4f84 127 case NSAPI_SECURITY_WPA2:
mridup 15:225d5d3c4f84 128 mode = (WiFi_Priv_Mode) WPA_Personal;
mridup 15:225d5d3c4f84 129 break;
mridup 15:225d5d3c4f84 130 default:
mridup 15:225d5d3c4f84 131 mode = (WiFi_Priv_Mode) WPA_Personal;
mridup 15:225d5d3c4f84 132 break;
mridup 15:225d5d3c4f84 133 }
mridup 0:dc55f40eb04f 134
mridup 12:3799f8475c8a 135 return (_spwf.connect((char*)ap, (char*)pass_phrase, mode));
mridup 0:dc55f40eb04f 136 }
mridup 12:3799f8475c8a 137
mridup 12:3799f8475c8a 138 /**
mridup 12:3799f8475c8a 139 * @brief network disconnect
mridup 12:3799f8475c8a 140 disconnects from Access Point
mridup 12:3799f8475c8a 141 * @param none
mridup 12:3799f8475c8a 142 * @retval NSAPI Error Type
mridup 12:3799f8475c8a 143 */
mridup 5:c83ffd44f40a 144 int SpwfSAInterface::disconnect()
mridup 5:c83ffd44f40a 145 {
mridup 0:dc55f40eb04f 146 return (_spwf.disconnect());
mridup 0:dc55f40eb04f 147 }
mridup 12:3799f8475c8a 148
mridup 12:3799f8475c8a 149 /**
mridup 12:3799f8475c8a 150 * @brief Get the local IP address
mridup 12:3799f8475c8a 151 * @param none
mridup 12:3799f8475c8a 152 * @retval Null-terminated representation of the local IP address
mridup 12:3799f8475c8a 153 * or null if not yet connected
mridup 12:3799f8475c8a 154 */
mridup 5:c83ffd44f40a 155 const char *SpwfSAInterface::get_ip_address()
mridup 0:dc55f40eb04f 156 {
mridup 0:dc55f40eb04f 157 return _spwf.getIPAddress();
mridup 0:dc55f40eb04f 158 }
mridup 12:3799f8475c8a 159
mridup 12:3799f8475c8a 160 /**
mridup 12:3799f8475c8a 161 * @brief Get the MAC address
mridup 12:3799f8475c8a 162 * @param none
mridup 12:3799f8475c8a 163 * @retval Null-terminated representation of the MAC address
mridup 12:3799f8475c8a 164 * or null if not yet connected
mridup 12:3799f8475c8a 165 */
mridup 5:c83ffd44f40a 166 const char *SpwfSAInterface::get_mac_address()
mridup 0:dc55f40eb04f 167 {
mridup 0:dc55f40eb04f 168 return _spwf.getMACAddress();
mridup 0:dc55f40eb04f 169 }
mridup 0:dc55f40eb04f 170
mridup 12:3799f8475c8a 171 /**
mridup 12:3799f8475c8a 172 * @brief open a socket handle
mridup 12:3799f8475c8a 173 * @param handle: Pointer to handle
mridup 12:3799f8475c8a 174 * proto: TCP/UDP protocol
mridup 12:3799f8475c8a 175 * @retval NSAPI Error Type
mridup 12:3799f8475c8a 176 */
mridup 5:c83ffd44f40a 177 int SpwfSAInterface::socket_open(void **handle, nsapi_protocol_t proto)
mridup 0:dc55f40eb04f 178 {
mridup 5:c83ffd44f40a 179 int id = -1;
mridup 5:c83ffd44f40a 180
mridup 5:c83ffd44f40a 181 struct spwf_socket *socket = new struct spwf_socket;
mridup 5:c83ffd44f40a 182 if (!socket) {
mridup 5:c83ffd44f40a 183 return NSAPI_ERROR_NO_SOCKET;
mridup 5:c83ffd44f40a 184 }
mridup 5:c83ffd44f40a 185
mridup 5:c83ffd44f40a 186 socket->id = id;
mridup 6:e7a3fca2df10 187 socket->server_port = id;
mridup 5:c83ffd44f40a 188 socket->proto = proto;
mridup 5:c83ffd44f40a 189 socket->connected = false;
mridup 5:c83ffd44f40a 190 *handle = socket;
mridup 5:c83ffd44f40a 191 return 0;
mridup 0:dc55f40eb04f 192 }
mridup 5:c83ffd44f40a 193
mridup 12:3799f8475c8a 194 /**
mridup 12:3799f8475c8a 195 * @brief connect to a remote socket
mridup 12:3799f8475c8a 196 * @param handle: Pointer to socket handle
mridup 12:3799f8475c8a 197 * addr: Address to connect to
mridup 12:3799f8475c8a 198 * @retval NSAPI Error Type
mridup 12:3799f8475c8a 199 */
mridup 5:c83ffd44f40a 200 int SpwfSAInterface::socket_connect(void *handle, const SocketAddress &addr)
mridup 5:c83ffd44f40a 201 {
mridup 6:e7a3fca2df10 202 uint8_t sock_id = 99;
mridup 5:c83ffd44f40a 203 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 5:c83ffd44f40a 204
mridup 5:c83ffd44f40a 205 const char *proto = (socket->proto == NSAPI_UDP) ? "u" : "t";//"s" for secure socket?
mridup 0:dc55f40eb04f 206
mridup 5:c83ffd44f40a 207 _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 208
mridup 0:dc55f40eb04f 209 //TODO: Maintain a socket table to map socket ID to host & port
mridup 0:dc55f40eb04f 210 //TODO: lookup on client table to see if already socket is allocated to same host/port
mridup 0:dc55f40eb04f 211 //multimap <char *, vector <uint16_t> > ::iterator i = c_table.find((char*)ip);
mridup 0:dc55f40eb04f 212
mridup 0:dc55f40eb04f 213 if(sock_id <= SPWFSA_SOCKET_COUNT)
mridup 0:dc55f40eb04f 214 {
mridup 5:c83ffd44f40a 215 socket->id = sock_id;//the socket ID of this Socket instance
mridup 5:c83ffd44f40a 216 _ids[socket->id] = true;
mridup 5:c83ffd44f40a 217 socket->connected = true;
mridup 0:dc55f40eb04f 218 }
mridup 0:dc55f40eb04f 219 else
mridup 5:c83ffd44f40a 220 return NSAPI_ERROR_NO_SOCKET;
mridup 0:dc55f40eb04f 221
mridup 12:3799f8475c8a 222 return 0;
mridup 0:dc55f40eb04f 223 }
mridup 5:c83ffd44f40a 224
mridup 12:3799f8475c8a 225 /**
mridup 12:3799f8475c8a 226 * @brief bind to a port number and address
mridup 12:3799f8475c8a 227 * @param handle: Pointer to socket handle
mridup 12:3799f8475c8a 228 * proto: address to bind to
mridup 12:3799f8475c8a 229 * @retval NSAPI Error Type
mridup 12:3799f8475c8a 230 */
mridup 5:c83ffd44f40a 231 int SpwfSAInterface::socket_bind(void *handle, const SocketAddress &address)
mridup 5:c83ffd44f40a 232 {
mridup 7:0fdd186a7d90 233 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 6:e7a3fca2df10 234 socket->server_port = address.get_port();
mridup 6:e7a3fca2df10 235 return 0;
mridup 5:c83ffd44f40a 236 }
mridup 5:c83ffd44f40a 237
mridup 12:3799f8475c8a 238 /**
mridup 12:3799f8475c8a 239 * @brief start listening on a port and address
mridup 12:3799f8475c8a 240 * @param handle: Pointer to handle
mridup 12:3799f8475c8a 241 * backlog: not used (always value is 1)
mridup 12:3799f8475c8a 242 * @retval NSAPI Error Type
mridup 12:3799f8475c8a 243 */
mridup 5:c83ffd44f40a 244 int SpwfSAInterface::socket_listen(void *handle, int backlog)
mridup 0:dc55f40eb04f 245 {
mridup 6:e7a3fca2df10 246 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 6:e7a3fca2df10 247 int err;
mridup 6:e7a3fca2df10 248
mridup 6:e7a3fca2df10 249 if(socket->server_port==-1 || isListening)
mridup 6:e7a3fca2df10 250 return NSAPI_ERROR_NO_SOCKET; //server socket not bound or already listening
mridup 6:e7a3fca2df10 251
mridup 6:e7a3fca2df10 252 const char *proto = (socket->proto == NSAPI_UDP) ? "u" : "t";
mridup 6:e7a3fca2df10 253
mridup 6:e7a3fca2df10 254 err = _spwf.socket_server_open((uint32_t)socket->server_port, (uint8_t *)proto);
mridup 6:e7a3fca2df10 255
mridup 6:e7a3fca2df10 256 if(err==0)
mridup 6:e7a3fca2df10 257 {
mridup 7:0fdd186a7d90 258 socket->id = SERVER_SOCKET_NO;//Special socket ID number for Server Socket
mridup 6:e7a3fca2df10 259 isListening = true;
mridup 6:e7a3fca2df10 260 }
mridup 6:e7a3fca2df10 261 else
mridup 6:e7a3fca2df10 262 return NSAPI_ERROR_DEVICE_ERROR;
mridup 6:e7a3fca2df10 263
mridup 6:e7a3fca2df10 264 return err;
mridup 5:c83ffd44f40a 265 }
mridup 5:c83ffd44f40a 266
mridup 12:3799f8475c8a 267 /**
mridup 12:3799f8475c8a 268 * @brief accept connections from remote sockets
mridup 12:3799f8475c8a 269 * @param handle: Pointer to handle of client socket (connecting)
mridup 12:3799f8475c8a 270 * proto: handle of server socket which will accept connections
mridup 12:3799f8475c8a 271 * @retval NSAPI Error Type
mridup 12:3799f8475c8a 272 */
mridup 5:c83ffd44f40a 273 int SpwfSAInterface::socket_accept(void **handle, void *server)
mridup 5:c83ffd44f40a 274 {
mridup 6:e7a3fca2df10 275 struct spwf_socket *server_socket = (struct spwf_socket *)server;
mridup 6:e7a3fca2df10 276
mridup 6:e7a3fca2df10 277 if(server_socket->server_port==-1 || !isListening)
mridup 6:e7a3fca2df10 278 return NSAPI_ERROR_NO_SOCKET; //server socket not bound or not listening
mridup 6:e7a3fca2df10 279
mridup 7:0fdd186a7d90 280 if(_spwf.get_wait_for_incoming_client())
mridup 7:0fdd186a7d90 281 {
mridup 7:0fdd186a7d90 282 server_socket->connected = true;
mridup 7:0fdd186a7d90 283 struct spwf_socket *socket = new struct spwf_socket;//create new network socket
mridup 7:0fdd186a7d90 284 if (!socket) {
mridup 7:0fdd186a7d90 285 return NSAPI_ERROR_NO_SOCKET;
mridup 7:0fdd186a7d90 286 }
mridup 7:0fdd186a7d90 287
mridup 7:0fdd186a7d90 288 memset(socket, 0, sizeof (struct spwf_socket));
mridup 11:67a8c3499caf 289
mridup 7:0fdd186a7d90 290 socket->id = server_socket->id;
mridup 7:0fdd186a7d90 291 socket->server_port = server_socket->server_port;
mridup 7:0fdd186a7d90 292 socket->proto = server_socket->proto;
mridup 7:0fdd186a7d90 293 socket->connected = true;
mridup 7:0fdd186a7d90 294
mridup 7:0fdd186a7d90 295 *handle = socket;
mridup 7:0fdd186a7d90 296 socket = 0;
mridup 12:3799f8475c8a 297 _spwf.set_wait_for_incoming_client(false);
mridup 7:0fdd186a7d90 298 wait_ms(50);//CHECK:TODO:Why do we need this?
mridup 7:0fdd186a7d90 299 return 0;
mridup 7:0fdd186a7d90 300 }
mridup 7:0fdd186a7d90 301 return NSAPI_ERROR_WOULD_BLOCK;
mridup 5:c83ffd44f40a 302 }
mridup 5:c83ffd44f40a 303
mridup 12:3799f8475c8a 304 /**
mridup 12:3799f8475c8a 305 * @brief close a socket
mridup 12:3799f8475c8a 306 * @param handle: Pointer to handle
mridup 12:3799f8475c8a 307 * @retval NSAPI Error Type
mridup 12:3799f8475c8a 308 */
mridup 5:c83ffd44f40a 309 int SpwfSAInterface::socket_close(void *handle)
mridup 5:c83ffd44f40a 310 {
mridup 5:c83ffd44f40a 311 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 5:c83ffd44f40a 312 int err = 0;
mridup 7:0fdd186a7d90 313 _spwf.setTimeout(SPWF_MISC_TIMEOUT);
mridup 0:dc55f40eb04f 314
mridup 5:c83ffd44f40a 315 if(socket->id!=-1)
mridup 5:c83ffd44f40a 316 {
mridup 6:e7a3fca2df10 317 if(socket->id==SERVER_SOCKET_NO)
mridup 6:e7a3fca2df10 318 {
mridup 6:e7a3fca2df10 319 if (_spwf.socket_server_close()==-1) {
mridup 6:e7a3fca2df10 320 err = NSAPI_ERROR_DEVICE_ERROR;
mridup 6:e7a3fca2df10 321 }
mridup 6:e7a3fca2df10 322 isListening = false;
mridup 5:c83ffd44f40a 323 }
mridup 6:e7a3fca2df10 324 else
mridup 6:e7a3fca2df10 325 {
mridup 6:e7a3fca2df10 326 if (_spwf.socket_client_close(socket->id)==-1) {
mridup 6:e7a3fca2df10 327 err = NSAPI_ERROR_DEVICE_ERROR;
mridup 6:e7a3fca2df10 328 }
mridup 6:e7a3fca2df10 329 _ids[socket->id] = false;
mridup 6:e7a3fca2df10 330 }
mridup 5:c83ffd44f40a 331 }
mridup 5:c83ffd44f40a 332
mridup 5:c83ffd44f40a 333 delete socket;
mridup 0:dc55f40eb04f 334 return err;
mridup 0:dc55f40eb04f 335 }
mridup 5:c83ffd44f40a 336
mridup 12:3799f8475c8a 337 /**
mridup 12:3799f8475c8a 338 * @brief write to a socket
mridup 12:3799f8475c8a 339 * @param handle: Pointer to handle
mridup 12:3799f8475c8a 340 * data: pointer to data
mridup 12:3799f8475c8a 341 * size: size of data
mridup 12:3799f8475c8a 342 * @retval no of bytes sent
mridup 12:3799f8475c8a 343 */
mridup 5:c83ffd44f40a 344 int SpwfSAInterface::socket_send(void *handle, const void *data, unsigned size)
mridup 5:c83ffd44f40a 345 {
mridup 5:c83ffd44f40a 346 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 5:c83ffd44f40a 347 int err;
mridup 0:dc55f40eb04f 348
mridup 6:e7a3fca2df10 349 if(socket->id==SERVER_SOCKET_NO)
mridup 6:e7a3fca2df10 350 {
mridup 7:0fdd186a7d90 351 if(socket->server_port==-1 || !isListening)
mridup 7:0fdd186a7d90 352 return NSAPI_ERROR_NO_SOCKET; //server socket not bound or not listening
mridup 7:0fdd186a7d90 353
mridup 6:e7a3fca2df10 354 err = _spwf.socket_server_write((uint16_t)size, (char*)data);
mridup 6:e7a3fca2df10 355 }
mridup 6:e7a3fca2df10 356 else
mridup 6:e7a3fca2df10 357 {
mridup 6:e7a3fca2df10 358 err = _spwf.socket_client_write((uint8_t)socket->id, (uint16_t)size, (char*)data);
mridup 6:e7a3fca2df10 359 }
mridup 0:dc55f40eb04f 360
mridup 0:dc55f40eb04f 361 return err;
mridup 0:dc55f40eb04f 362 }
mridup 0:dc55f40eb04f 363
mridup 12:3799f8475c8a 364 /**
mridup 12:3799f8475c8a 365 * @brief receive data on a socket
mridup 12:3799f8475c8a 366 * @param handle: Pointer to handle
mridup 12:3799f8475c8a 367 * data: pointer to data
mridup 12:3799f8475c8a 368 * size: size of data
mridup 12:3799f8475c8a 369 * @retval no of bytes read
mridup 12:3799f8475c8a 370 */
mridup 5:c83ffd44f40a 371 int SpwfSAInterface::socket_recv(void *handle, void *data, unsigned size)
mridup 0:dc55f40eb04f 372 {
mridup 5:c83ffd44f40a 373 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 0:dc55f40eb04f 374 int32_t recv;
mridup 0:dc55f40eb04f 375
mridup 5:c83ffd44f40a 376 _spwf.setTimeout(SPWF_RECV_TIMEOUT);
mridup 0:dc55f40eb04f 377
mridup 6:e7a3fca2df10 378 //CHECK:Receive for both Client and Server Sockets same?
mridup 5:c83ffd44f40a 379 recv = _spwf.socket_client_recv((uint8_t)socket->id, (uint16_t)size, (char*)data);
mridup 5:c83ffd44f40a 380 if (recv < 0) {
mridup 5:c83ffd44f40a 381 return NSAPI_ERROR_WOULD_BLOCK;
mridup 5:c83ffd44f40a 382 }
mridup 0:dc55f40eb04f 383 return recv;
mridup 0:dc55f40eb04f 384
mridup 0:dc55f40eb04f 385 }
mridup 0:dc55f40eb04f 386
mridup 12:3799f8475c8a 387 /**
mridup 12:3799f8475c8a 388 * @brief send data to a udp socket
mridup 12:3799f8475c8a 389 * @param handle: Pointer to handle
mridup 12:3799f8475c8a 390 * addr: address of udp socket
mridup 12:3799f8475c8a 391 * data: pointer to data
mridup 12:3799f8475c8a 392 * size: size of data
mridup 12:3799f8475c8a 393 * @retval no of bytes sent
mridup 12:3799f8475c8a 394 */
mridup 5:c83ffd44f40a 395 int SpwfSAInterface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size)
mridup 5:c83ffd44f40a 396 {
mridup 5:c83ffd44f40a 397 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 5:c83ffd44f40a 398 if (!socket->connected) {
mridup 5:c83ffd44f40a 399 int err = socket_connect(socket, addr);
mridup 5:c83ffd44f40a 400 if (err < 0) {
mridup 5:c83ffd44f40a 401 return err;
mridup 5:c83ffd44f40a 402 }
mridup 5:c83ffd44f40a 403 }
mridup 5:c83ffd44f40a 404
mridup 5:c83ffd44f40a 405 return socket_send(socket, data, size);
mridup 5:c83ffd44f40a 406 }
mridup 5:c83ffd44f40a 407
mridup 12:3799f8475c8a 408 /**
mridup 12:3799f8475c8a 409 * @brief receive data on a udp socket
mridup 12:3799f8475c8a 410 * @param handle: Pointer to handle
mridup 12:3799f8475c8a 411 * addr: address of udp socket
mridup 12:3799f8475c8a 412 * data: pointer to data
mridup 12:3799f8475c8a 413 * size: size of data
mridup 12:3799f8475c8a 414 * @retval no of bytes read
mridup 12:3799f8475c8a 415 */
mridup 5:c83ffd44f40a 416 int SpwfSAInterface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
mridup 5:c83ffd44f40a 417 {
mridup 5:c83ffd44f40a 418 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 5:c83ffd44f40a 419 return socket_recv(socket, data, size);
mridup 5:c83ffd44f40a 420 }
mridup 5:c83ffd44f40a 421
mridup 12:3799f8475c8a 422 /**
mridup 12:3799f8475c8a 423 * @brief attach function/callback to the socket
mridup 12:3799f8475c8a 424 * Not used
mridup 12:3799f8475c8a 425 * @param handle: Pointer to handle
mridup 12:3799f8475c8a 426 * callback: callback function pointer
mridup 12:3799f8475c8a 427 * data: pointer to data
mridup 12:3799f8475c8a 428 * @retval none
mridup 12:3799f8475c8a 429 */
mridup 5:c83ffd44f40a 430 void SpwfSAInterface::socket_attach(void *handle, void (*callback)(void *), void *data)
mridup 5:c83ffd44f40a 431 {
mridup 5:c83ffd44f40a 432 //No implementation yet
mridup 5:c83ffd44f40a 433 }
mridup 5:c83ffd44f40a 434
mridup 12:3799f8475c8a 435 /**
mridup 12:3799f8475c8a 436 * @brief utility debug function for printing to serial terminal
mridup 12:3799f8475c8a 437 * @param string: Pointer to data
mridup 12:3799f8475c8a 438 * @retval none
mridup 12:3799f8475c8a 439 */
mridup 0:dc55f40eb04f 440 void SpwfSAInterface::debug(const char * string)
mridup 0:dc55f40eb04f 441 {
mridup 0:dc55f40eb04f 442 _spwf.debug_print(string);
mridup 0:dc55f40eb04f 443 }