Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of X_NUCLEO_IDW01M1 by
SPWFInterface.cpp@13:cdcc13d78252, 2016-05-14 (annotated)
- 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?
User | Revision | Line number | New 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>© 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 | } |