iowfehu;gdbjwHJAOPIHO?L

Fork of X_NUCLEO_IDW01M1 by ST

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