Extending the X_NUCLEO_IDW01M1 to allow configuration of the board as an access point

Dependents:   X_NUCLEO_IDW01M1_AP_Test

Fork of X_NUCLEO_IDW01M1 by ST

Committer:
scsims
Date:
Wed Jun 22 14:53:11 2016 +0000
Revision:
19:9ab60b80872e
Parent:
18:b265b3b696f1
Child:
22:a1276b7d3b2d
Removed (and put guards around) printf's

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mridup 17:2c47c2aab4a4 1 /* mbed Microcontroller Library
mridup 17:2c47c2aab4a4 2 * Copyright (c) 20015 ARM Limited
mridup 17:2c47c2aab4a4 3 *
mridup 17:2c47c2aab4a4 4 * Licensed under the Apache License, Version 2.0 (the "License");
mridup 17:2c47c2aab4a4 5 * you may not use this file except in compliance with the License.
mridup 17:2c47c2aab4a4 6 * You may obtain a copy of the License at
mridup 17:2c47c2aab4a4 7 *
mridup 17:2c47c2aab4a4 8 * http://www.apache.org/licenses/LICENSE-2.0
mridup 17:2c47c2aab4a4 9 *
mridup 17:2c47c2aab4a4 10 * Unless required by applicable law or agreed to in writing, software
mridup 17:2c47c2aab4a4 11 * distributed under the License is distributed on an "AS IS" BASIS,
mridup 17:2c47c2aab4a4 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mridup 17:2c47c2aab4a4 13 * See the License for the specific language governing permissions and
mridup 17:2c47c2aab4a4 14 * limitations under the License.
mridup 17:2c47c2aab4a4 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 16:156be7b55904 44 /** spwf_socket class
mridup 16:156be7b55904 45 * Implementation of SPWF socket structure
mridup 16:156be7b55904 46 */
mridup 5:c83ffd44f40a 47 struct spwf_socket {
mridup 5:c83ffd44f40a 48 int id;
mridup 6:e7a3fca2df10 49 int server_port;
mridup 5:c83ffd44f40a 50 nsapi_protocol_t proto;
mridup 5:c83ffd44f40a 51 bool connected;
mridup 5:c83ffd44f40a 52 };
mridup 0:dc55f40eb04f 53
mridup 11:67a8c3499caf 54
mridup 11:67a8c3499caf 55 /**
mridup 11:67a8c3499caf 56 * @brief SpwfSAInterface constructor
mridup 11:67a8c3499caf 57 * @param tx: Pin USART TX
mridup 11:67a8c3499caf 58 * rx: Pin USART RX
mridup 11:67a8c3499caf 59 * rst: reset pin for Spwf module
mridup 11:67a8c3499caf 60 * wkup: reset pin for Spwf module
mridup 11:67a8c3499caf 61 * rts: Pin USART RTS
mridup 11:67a8c3499caf 62 * debug : not used
mridup 11:67a8c3499caf 63 * @retval none
mridup 11:67a8c3499caf 64 */
mridup 0:dc55f40eb04f 65 SpwfSAInterface::SpwfSAInterface(PinName tx, PinName rx, PinName rst, PinName wkup, PinName rts, bool debug)
mridup 0:dc55f40eb04f 66 : _spwf(tx, rx, rst, wkup, rts)
mridup 0:dc55f40eb04f 67 {
mridup 0:dc55f40eb04f 68 memset(_ids, 0, sizeof(_ids));
mridup 3:fd9d20c4d3f0 69 isInitialized = false;
mridup 6:e7a3fca2df10 70 isListening = false;
mridup 0:dc55f40eb04f 71 }
mridup 12:3799f8475c8a 72
mridup 12:3799f8475c8a 73 /**
mridup 12:3799f8475c8a 74 * @brief SpwfSAInterface destructor
mridup 12:3799f8475c8a 75 * @param none
mridup 12:3799f8475c8a 76 * @retval none
mridup 12:3799f8475c8a 77 */
mridup 0:dc55f40eb04f 78 SpwfSAInterface::~SpwfSAInterface()
mridup 0:dc55f40eb04f 79 {
mridup 0:dc55f40eb04f 80 }
mridup 0:dc55f40eb04f 81
mridup 12:3799f8475c8a 82 /**
mridup 12:3799f8475c8a 83 * @brief init function
mridup 12:3799f8475c8a 84 initializes SPWF FW and module
mridup 12:3799f8475c8a 85 * @param none
mridup 12:3799f8475c8a 86 * @retval error value
mridup 12:3799f8475c8a 87 */
mridup 5:c83ffd44f40a 88 int SpwfSAInterface::init(void)
mridup 0:dc55f40eb04f 89 {
mridup 0:dc55f40eb04f 90 _spwf.setTimeout(SPWF_MISC_TIMEOUT);
mridup 0:dc55f40eb04f 91 return (_spwf.init());
mridup 0:dc55f40eb04f 92 }
mridup 0:dc55f40eb04f 93
scsims 18:b265b3b696f1 94 /**
scsims 18:b265b3b696f1 95 * @brief Setup as an access point
scsims 18:b265b3b696f1 96 * @param ap: SSID to set the access point up with (1-32 characters)
scsims 18:b265b3b696f1 97 * @param pass_phrase: Password/key of the access point to set up (currently only Open AP is supported, this param is ignored)
scsims 18:b265b3b696f1 98 * @param security: type of NSAPI security supported (currently only Open AP is supported)
scsims 18:b265b3b696f1 99 * @param channelNum: Channel for the AP to operate on 1-14 (depending on region)
scsims 18:b265b3b696f1 100 * @retval NSAPI Error Type
scsims 18:b265b3b696f1 101 */
scsims 18:b265b3b696f1 102 int SpwfSAInterface::start_access_point(
scsims 18:b265b3b696f1 103 const char *ap,
scsims 18:b265b3b696f1 104 const char *pass_phrase,
scsims 18:b265b3b696f1 105 nsapi_security_t security,
scsims 18:b265b3b696f1 106 int channel_num,
scsims 18:b265b3b696f1 107 unsigned int data_rates)
scsims 18:b265b3b696f1 108 {
scsims 18:b265b3b696f1 109 WiFi_Priv_Mode mode = convert_security(security);
scsims 18:b265b3b696f1 110
scsims 18:b265b3b696f1 111 // Check for valid channel_num
scsims 18:b265b3b696f1 112 if (channel_num < 1 || channel_num > 14)
scsims 18:b265b3b696f1 113 {
scsims 19:9ab60b80872e 114 #if DEBUG_PRINT
scsims 18:b265b3b696f1 115 printf("channel_num must be between 1 and 14\n");
scsims 19:9ab60b80872e 116 #endif
scsims 18:b265b3b696f1 117 return NSAPI_ERROR_PARAMETER;
scsims 18:b265b3b696f1 118 }
scsims 18:b265b3b696f1 119
scsims 18:b265b3b696f1 120 // Verify that the access point is between 1-32
scsims 18:b265b3b696f1 121 if ((NULL == ap && mode != None) || strlen(ap) < 1 || strlen(ap) > 32)
scsims 18:b265b3b696f1 122 {
scsims 19:9ab60b80872e 123 #if DEBUG_PRINT
scsims 18:b265b3b696f1 124 printf("ap length must be between 1 and 32\n");
scsims 19:9ab60b80872e 125 #endif
scsims 18:b265b3b696f1 126 return NSAPI_ERROR_PARAMETER;
scsims 18:b265b3b696f1 127 }
scsims 18:b265b3b696f1 128
scsims 18:b265b3b696f1 129 //initialize the device before starting the AP
scsims 18:b265b3b696f1 130 if(!isInitialized)
scsims 18:b265b3b696f1 131 {
scsims 18:b265b3b696f1 132 if(init()==0)
scsims 18:b265b3b696f1 133 isInitialized=true;
scsims 18:b265b3b696f1 134 else return NSAPI_ERROR_DEVICE_ERROR;
scsims 18:b265b3b696f1 135 }
scsims 18:b265b3b696f1 136
scsims 18:b265b3b696f1 137 _spwf.setTimeout(SPWF_CONNECT_TIMEOUT);
scsims 18:b265b3b696f1 138
scsims 18:b265b3b696f1 139 switch (mode)
scsims 18:b265b3b696f1 140 {
scsims 18:b265b3b696f1 141 // case WEP:
scsims 18:b265b3b696f1 142 // {
scsims 18:b265b3b696f1 143 // break;
scsims 18:b265b3b696f1 144 // }
scsims 18:b265b3b696f1 145 // case WPA_Personal:
scsims 18:b265b3b696f1 146 // {
scsims 18:b265b3b696f1 147 // break;
scsims 18:b265b3b696f1 148 // }
scsims 18:b265b3b696f1 149 default:
scsims 18:b265b3b696f1 150 {
scsims 19:9ab60b80872e 151 #if DEBUG_PRINT
scsims 18:b265b3b696f1 152 printf("Assuming open wifi access point\n");
scsims 19:9ab60b80872e 153 #endif
scsims 18:b265b3b696f1 154 mode = None;
scsims 18:b265b3b696f1 155 pass_phrase = NULL;
scsims 18:b265b3b696f1 156 }
scsims 18:b265b3b696f1 157 }
scsims 18:b265b3b696f1 158
scsims 18:b265b3b696f1 159 return (_spwf.start_access_point((char*)ap, (char*)pass_phrase, mode, channel_num, data_rates));
scsims 18:b265b3b696f1 160 }
scsims 18:b265b3b696f1 161
scsims 18:b265b3b696f1 162 WiFi_Priv_Mode SpwfSAInterface::convert_security(int security)
scsims 18:b265b3b696f1 163 {
scsims 18:b265b3b696f1 164 switch(security)
scsims 18:b265b3b696f1 165 {
scsims 18:b265b3b696f1 166 case NSAPI_SECURITY_NONE:
scsims 18:b265b3b696f1 167 return (WiFi_Priv_Mode) None;
scsims 18:b265b3b696f1 168 case NSAPI_SECURITY_WEP:
scsims 18:b265b3b696f1 169 return (WiFi_Priv_Mode) WEP;
scsims 18:b265b3b696f1 170 case NSAPI_SECURITY_WPA:
scsims 18:b265b3b696f1 171 case NSAPI_SECURITY_WPA2:
scsims 18:b265b3b696f1 172 return (WiFi_Priv_Mode) WPA_Personal;
scsims 18:b265b3b696f1 173 default:
scsims 18:b265b3b696f1 174 return (WiFi_Priv_Mode) WPA_Personal;
scsims 18:b265b3b696f1 175 }
scsims 18:b265b3b696f1 176 }
scsims 18:b265b3b696f1 177
mridup 12:3799f8475c8a 178 /**
mridup 12:3799f8475c8a 179 * @brief network connect
mridup 12:3799f8475c8a 180 connects to Access Point
mridup 12:3799f8475c8a 181 * @param ap: Access Point (AP) Name String
mridup 12:3799f8475c8a 182 * pass_phrase: Password String for AP
mridup 12:3799f8475c8a 183 * security: type of NSAPI security supported
mridup 12:3799f8475c8a 184 * @retval NSAPI Error Type
mridup 12:3799f8475c8a 185 */
mridup 5:c83ffd44f40a 186 int SpwfSAInterface::connect(
mridup 0:dc55f40eb04f 187 const char *ap,
mridup 0:dc55f40eb04f 188 const char *pass_phrase,
mridup 5:c83ffd44f40a 189 nsapi_security_t security)
mridup 0:dc55f40eb04f 190 {
mridup 15:225d5d3c4f84 191 WiFi_Priv_Mode mode;
mridup 15:225d5d3c4f84 192
mridup 3:fd9d20c4d3f0 193 //initialize the device before connecting
mridup 3:fd9d20c4d3f0 194 if(!isInitialized)
mridup 3:fd9d20c4d3f0 195 {
mridup 3:fd9d20c4d3f0 196 if(init()==0)
mridup 3:fd9d20c4d3f0 197 isInitialized=true;
mridup 5:c83ffd44f40a 198 else return NSAPI_ERROR_DEVICE_ERROR;
mridup 3:fd9d20c4d3f0 199 }
mridup 3:fd9d20c4d3f0 200
mridup 15:225d5d3c4f84 201 _spwf.setTimeout(SPWF_CONNECT_TIMEOUT);
scsims 18:b265b3b696f1 202
scsims 18:b265b3b696f1 203 mode = convert_security(security);
scsims 18:b265b3b696f1 204 if ((WiFi_Priv_Mode) None == mode)
mridup 15:225d5d3c4f84 205 {
scsims 18:b265b3b696f1 206 pass_phrase = NULL;
mridup 15:225d5d3c4f84 207 }
mridup 0:dc55f40eb04f 208
mridup 12:3799f8475c8a 209 return (_spwf.connect((char*)ap, (char*)pass_phrase, mode));
mridup 0:dc55f40eb04f 210 }
mridup 12:3799f8475c8a 211
mridup 12:3799f8475c8a 212 /**
mridup 12:3799f8475c8a 213 * @brief network disconnect
mridup 12:3799f8475c8a 214 disconnects from Access Point
mridup 12:3799f8475c8a 215 * @param none
mridup 12:3799f8475c8a 216 * @retval NSAPI Error Type
mridup 12:3799f8475c8a 217 */
mridup 5:c83ffd44f40a 218 int SpwfSAInterface::disconnect()
mridup 5:c83ffd44f40a 219 {
mridup 0:dc55f40eb04f 220 return (_spwf.disconnect());
mridup 0:dc55f40eb04f 221 }
mridup 12:3799f8475c8a 222
mridup 12:3799f8475c8a 223 /**
mridup 12:3799f8475c8a 224 * @brief Get the local IP address
mridup 12:3799f8475c8a 225 * @param none
mridup 12:3799f8475c8a 226 * @retval Null-terminated representation of the local IP address
mridup 12:3799f8475c8a 227 * or null if not yet connected
mridup 12:3799f8475c8a 228 */
mridup 5:c83ffd44f40a 229 const char *SpwfSAInterface::get_ip_address()
mridup 0:dc55f40eb04f 230 {
mridup 0:dc55f40eb04f 231 return _spwf.getIPAddress();
mridup 0:dc55f40eb04f 232 }
mridup 12:3799f8475c8a 233
mridup 12:3799f8475c8a 234 /**
mridup 12:3799f8475c8a 235 * @brief Get the MAC address
mridup 12:3799f8475c8a 236 * @param none
mridup 12:3799f8475c8a 237 * @retval Null-terminated representation of the MAC address
mridup 12:3799f8475c8a 238 * or null if not yet connected
mridup 12:3799f8475c8a 239 */
mridup 5:c83ffd44f40a 240 const char *SpwfSAInterface::get_mac_address()
mridup 0:dc55f40eb04f 241 {
mridup 0:dc55f40eb04f 242 return _spwf.getMACAddress();
mridup 0:dc55f40eb04f 243 }
mridup 0:dc55f40eb04f 244
mridup 12:3799f8475c8a 245 /**
mridup 12:3799f8475c8a 246 * @brief open a socket handle
mridup 12:3799f8475c8a 247 * @param handle: Pointer to handle
mridup 12:3799f8475c8a 248 * proto: TCP/UDP protocol
mridup 12:3799f8475c8a 249 * @retval NSAPI Error Type
mridup 12:3799f8475c8a 250 */
mridup 5:c83ffd44f40a 251 int SpwfSAInterface::socket_open(void **handle, nsapi_protocol_t proto)
mridup 0:dc55f40eb04f 252 {
mridup 5:c83ffd44f40a 253 int id = -1;
mridup 5:c83ffd44f40a 254
mridup 5:c83ffd44f40a 255 struct spwf_socket *socket = new struct spwf_socket;
mridup 5:c83ffd44f40a 256 if (!socket) {
mridup 5:c83ffd44f40a 257 return NSAPI_ERROR_NO_SOCKET;
mridup 5:c83ffd44f40a 258 }
mridup 5:c83ffd44f40a 259
mridup 5:c83ffd44f40a 260 socket->id = id;
mridup 6:e7a3fca2df10 261 socket->server_port = id;
mridup 5:c83ffd44f40a 262 socket->proto = proto;
mridup 5:c83ffd44f40a 263 socket->connected = false;
mridup 5:c83ffd44f40a 264 *handle = socket;
mridup 5:c83ffd44f40a 265 return 0;
mridup 0:dc55f40eb04f 266 }
mridup 5:c83ffd44f40a 267
mridup 12:3799f8475c8a 268 /**
mridup 12:3799f8475c8a 269 * @brief connect to a remote socket
mridup 12:3799f8475c8a 270 * @param handle: Pointer to socket handle
mridup 12:3799f8475c8a 271 * addr: Address to connect to
mridup 12:3799f8475c8a 272 * @retval NSAPI Error Type
mridup 12:3799f8475c8a 273 */
mridup 5:c83ffd44f40a 274 int SpwfSAInterface::socket_connect(void *handle, const SocketAddress &addr)
mridup 5:c83ffd44f40a 275 {
mridup 6:e7a3fca2df10 276 uint8_t sock_id = 99;
mridup 5:c83ffd44f40a 277 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 5:c83ffd44f40a 278
mridup 5:c83ffd44f40a 279 const char *proto = (socket->proto == NSAPI_UDP) ? "u" : "t";//"s" for secure socket?
mridup 0:dc55f40eb04f 280
mridup 5:c83ffd44f40a 281 _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 282
mridup 0:dc55f40eb04f 283 //TODO: Maintain a socket table to map socket ID to host & port
mridup 0:dc55f40eb04f 284 //TODO: lookup on client table to see if already socket is allocated to same host/port
mridup 0:dc55f40eb04f 285 //multimap <char *, vector <uint16_t> > ::iterator i = c_table.find((char*)ip);
mridup 0:dc55f40eb04f 286
mridup 0:dc55f40eb04f 287 if(sock_id <= SPWFSA_SOCKET_COUNT)
mridup 0:dc55f40eb04f 288 {
mridup 5:c83ffd44f40a 289 socket->id = sock_id;//the socket ID of this Socket instance
mridup 5:c83ffd44f40a 290 _ids[socket->id] = true;
mridup 5:c83ffd44f40a 291 socket->connected = true;
mridup 0:dc55f40eb04f 292 }
mridup 0:dc55f40eb04f 293 else
mridup 5:c83ffd44f40a 294 return NSAPI_ERROR_NO_SOCKET;
mridup 0:dc55f40eb04f 295
mridup 12:3799f8475c8a 296 return 0;
mridup 0:dc55f40eb04f 297 }
mridup 5:c83ffd44f40a 298
mridup 12:3799f8475c8a 299 /**
mridup 12:3799f8475c8a 300 * @brief bind to a port number and address
mridup 12:3799f8475c8a 301 * @param handle: Pointer to socket handle
mridup 12:3799f8475c8a 302 * proto: address to bind to
mridup 12:3799f8475c8a 303 * @retval NSAPI Error Type
mridup 12:3799f8475c8a 304 */
mridup 5:c83ffd44f40a 305 int SpwfSAInterface::socket_bind(void *handle, const SocketAddress &address)
mridup 5:c83ffd44f40a 306 {
mridup 7:0fdd186a7d90 307 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 6:e7a3fca2df10 308 socket->server_port = address.get_port();
mridup 6:e7a3fca2df10 309 return 0;
mridup 5:c83ffd44f40a 310 }
mridup 5:c83ffd44f40a 311
mridup 12:3799f8475c8a 312 /**
mridup 12:3799f8475c8a 313 * @brief start listening on a port and address
mridup 12:3799f8475c8a 314 * @param handle: Pointer to handle
mridup 12:3799f8475c8a 315 * backlog: not used (always value is 1)
mridup 12:3799f8475c8a 316 * @retval NSAPI Error Type
mridup 12:3799f8475c8a 317 */
mridup 5:c83ffd44f40a 318 int SpwfSAInterface::socket_listen(void *handle, int backlog)
mridup 0:dc55f40eb04f 319 {
mridup 6:e7a3fca2df10 320 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 6:e7a3fca2df10 321 int err;
mridup 6:e7a3fca2df10 322
mridup 6:e7a3fca2df10 323 if(socket->server_port==-1 || isListening)
mridup 6:e7a3fca2df10 324 return NSAPI_ERROR_NO_SOCKET; //server socket not bound or already listening
mridup 6:e7a3fca2df10 325
mridup 6:e7a3fca2df10 326 const char *proto = (socket->proto == NSAPI_UDP) ? "u" : "t";
mridup 6:e7a3fca2df10 327
mridup 6:e7a3fca2df10 328 err = _spwf.socket_server_open((uint32_t)socket->server_port, (uint8_t *)proto);
mridup 6:e7a3fca2df10 329
mridup 6:e7a3fca2df10 330 if(err==0)
mridup 6:e7a3fca2df10 331 {
mridup 7:0fdd186a7d90 332 socket->id = SERVER_SOCKET_NO;//Special socket ID number for Server Socket
mridup 6:e7a3fca2df10 333 isListening = true;
mridup 6:e7a3fca2df10 334 }
mridup 6:e7a3fca2df10 335 else
mridup 6:e7a3fca2df10 336 return NSAPI_ERROR_DEVICE_ERROR;
mridup 6:e7a3fca2df10 337
mridup 6:e7a3fca2df10 338 return err;
mridup 5:c83ffd44f40a 339 }
mridup 5:c83ffd44f40a 340
mridup 12:3799f8475c8a 341 /**
mridup 12:3799f8475c8a 342 * @brief accept connections from remote sockets
mridup 12:3799f8475c8a 343 * @param handle: Pointer to handle of client socket (connecting)
mridup 12:3799f8475c8a 344 * proto: handle of server socket which will accept connections
mridup 12:3799f8475c8a 345 * @retval NSAPI Error Type
mridup 12:3799f8475c8a 346 */
mridup 5:c83ffd44f40a 347 int SpwfSAInterface::socket_accept(void **handle, void *server)
mridup 5:c83ffd44f40a 348 {
mridup 6:e7a3fca2df10 349 struct spwf_socket *server_socket = (struct spwf_socket *)server;
mridup 6:e7a3fca2df10 350
mridup 6:e7a3fca2df10 351 if(server_socket->server_port==-1 || !isListening)
mridup 6:e7a3fca2df10 352 return NSAPI_ERROR_NO_SOCKET; //server socket not bound or not listening
mridup 6:e7a3fca2df10 353
mridup 7:0fdd186a7d90 354 if(_spwf.get_wait_for_incoming_client())
mridup 7:0fdd186a7d90 355 {
mridup 7:0fdd186a7d90 356 server_socket->connected = true;
mridup 7:0fdd186a7d90 357 struct spwf_socket *socket = new struct spwf_socket;//create new network socket
mridup 7:0fdd186a7d90 358 if (!socket) {
mridup 7:0fdd186a7d90 359 return NSAPI_ERROR_NO_SOCKET;
mridup 7:0fdd186a7d90 360 }
mridup 7:0fdd186a7d90 361
mridup 7:0fdd186a7d90 362 memset(socket, 0, sizeof (struct spwf_socket));
mridup 11:67a8c3499caf 363
mridup 7:0fdd186a7d90 364 socket->id = server_socket->id;
mridup 7:0fdd186a7d90 365 socket->server_port = server_socket->server_port;
mridup 7:0fdd186a7d90 366 socket->proto = server_socket->proto;
mridup 7:0fdd186a7d90 367 socket->connected = true;
mridup 7:0fdd186a7d90 368
mridup 7:0fdd186a7d90 369 *handle = socket;
mridup 7:0fdd186a7d90 370 socket = 0;
mridup 12:3799f8475c8a 371 _spwf.set_wait_for_incoming_client(false);
mridup 7:0fdd186a7d90 372 wait_ms(50);//CHECK:TODO:Why do we need this?
mridup 7:0fdd186a7d90 373 return 0;
mridup 7:0fdd186a7d90 374 }
mridup 7:0fdd186a7d90 375 return NSAPI_ERROR_WOULD_BLOCK;
mridup 5:c83ffd44f40a 376 }
mridup 5:c83ffd44f40a 377
mridup 12:3799f8475c8a 378 /**
mridup 12:3799f8475c8a 379 * @brief close a socket
mridup 12:3799f8475c8a 380 * @param handle: Pointer to handle
mridup 12:3799f8475c8a 381 * @retval NSAPI Error Type
mridup 12:3799f8475c8a 382 */
mridup 5:c83ffd44f40a 383 int SpwfSAInterface::socket_close(void *handle)
mridup 5:c83ffd44f40a 384 {
mridup 5:c83ffd44f40a 385 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 5:c83ffd44f40a 386 int err = 0;
mridup 7:0fdd186a7d90 387 _spwf.setTimeout(SPWF_MISC_TIMEOUT);
mridup 0:dc55f40eb04f 388
mridup 5:c83ffd44f40a 389 if(socket->id!=-1)
mridup 5:c83ffd44f40a 390 {
mridup 6:e7a3fca2df10 391 if(socket->id==SERVER_SOCKET_NO)
mridup 6:e7a3fca2df10 392 {
mridup 6:e7a3fca2df10 393 if (_spwf.socket_server_close()==-1) {
mridup 6:e7a3fca2df10 394 err = NSAPI_ERROR_DEVICE_ERROR;
mridup 6:e7a3fca2df10 395 }
mridup 6:e7a3fca2df10 396 isListening = false;
mridup 5:c83ffd44f40a 397 }
mridup 6:e7a3fca2df10 398 else
mridup 6:e7a3fca2df10 399 {
mridup 6:e7a3fca2df10 400 if (_spwf.socket_client_close(socket->id)==-1) {
mridup 6:e7a3fca2df10 401 err = NSAPI_ERROR_DEVICE_ERROR;
mridup 6:e7a3fca2df10 402 }
mridup 6:e7a3fca2df10 403 _ids[socket->id] = false;
mridup 6:e7a3fca2df10 404 }
mridup 5:c83ffd44f40a 405 }
mridup 5:c83ffd44f40a 406
mridup 5:c83ffd44f40a 407 delete socket;
mridup 0:dc55f40eb04f 408 return err;
mridup 0:dc55f40eb04f 409 }
mridup 5:c83ffd44f40a 410
mridup 12:3799f8475c8a 411 /**
mridup 12:3799f8475c8a 412 * @brief write to a socket
mridup 12:3799f8475c8a 413 * @param handle: Pointer to handle
mridup 12:3799f8475c8a 414 * data: pointer to data
mridup 12:3799f8475c8a 415 * size: size of data
mridup 12:3799f8475c8a 416 * @retval no of bytes sent
mridup 12:3799f8475c8a 417 */
mridup 5:c83ffd44f40a 418 int SpwfSAInterface::socket_send(void *handle, const void *data, unsigned size)
mridup 5:c83ffd44f40a 419 {
mridup 5:c83ffd44f40a 420 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 5:c83ffd44f40a 421 int err;
mridup 0:dc55f40eb04f 422
mridup 6:e7a3fca2df10 423 if(socket->id==SERVER_SOCKET_NO)
mridup 6:e7a3fca2df10 424 {
mridup 7:0fdd186a7d90 425 if(socket->server_port==-1 || !isListening)
mridup 7:0fdd186a7d90 426 return NSAPI_ERROR_NO_SOCKET; //server socket not bound or not listening
mridup 7:0fdd186a7d90 427
mridup 6:e7a3fca2df10 428 err = _spwf.socket_server_write((uint16_t)size, (char*)data);
mridup 6:e7a3fca2df10 429 }
mridup 6:e7a3fca2df10 430 else
mridup 6:e7a3fca2df10 431 {
mridup 6:e7a3fca2df10 432 err = _spwf.socket_client_write((uint8_t)socket->id, (uint16_t)size, (char*)data);
mridup 6:e7a3fca2df10 433 }
mridup 0:dc55f40eb04f 434
mridup 0:dc55f40eb04f 435 return err;
mridup 0:dc55f40eb04f 436 }
mridup 0:dc55f40eb04f 437
mridup 12:3799f8475c8a 438 /**
mridup 12:3799f8475c8a 439 * @brief receive data on a socket
mridup 12:3799f8475c8a 440 * @param handle: Pointer to handle
mridup 12:3799f8475c8a 441 * data: pointer to data
mridup 12:3799f8475c8a 442 * size: size of data
mridup 12:3799f8475c8a 443 * @retval no of bytes read
mridup 12:3799f8475c8a 444 */
mridup 5:c83ffd44f40a 445 int SpwfSAInterface::socket_recv(void *handle, void *data, unsigned size)
mridup 0:dc55f40eb04f 446 {
mridup 5:c83ffd44f40a 447 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 0:dc55f40eb04f 448 int32_t recv;
mridup 0:dc55f40eb04f 449
mridup 5:c83ffd44f40a 450 _spwf.setTimeout(SPWF_RECV_TIMEOUT);
mridup 0:dc55f40eb04f 451
mridup 6:e7a3fca2df10 452 //CHECK:Receive for both Client and Server Sockets same?
mridup 5:c83ffd44f40a 453 recv = _spwf.socket_client_recv((uint8_t)socket->id, (uint16_t)size, (char*)data);
mridup 5:c83ffd44f40a 454 if (recv < 0) {
mridup 5:c83ffd44f40a 455 return NSAPI_ERROR_WOULD_BLOCK;
mridup 5:c83ffd44f40a 456 }
mridup 0:dc55f40eb04f 457 return recv;
mridup 0:dc55f40eb04f 458
mridup 0:dc55f40eb04f 459 }
mridup 0:dc55f40eb04f 460
mridup 12:3799f8475c8a 461 /**
mridup 12:3799f8475c8a 462 * @brief send data to a udp socket
mridup 12:3799f8475c8a 463 * @param handle: Pointer to handle
mridup 12:3799f8475c8a 464 * addr: address of udp socket
mridup 12:3799f8475c8a 465 * data: pointer to data
mridup 12:3799f8475c8a 466 * size: size of data
mridup 12:3799f8475c8a 467 * @retval no of bytes sent
mridup 12:3799f8475c8a 468 */
mridup 5:c83ffd44f40a 469 int SpwfSAInterface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size)
mridup 5:c83ffd44f40a 470 {
mridup 5:c83ffd44f40a 471 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 5:c83ffd44f40a 472 if (!socket->connected) {
mridup 5:c83ffd44f40a 473 int err = socket_connect(socket, addr);
mridup 5:c83ffd44f40a 474 if (err < 0) {
mridup 5:c83ffd44f40a 475 return err;
mridup 5:c83ffd44f40a 476 }
mridup 5:c83ffd44f40a 477 }
mridup 5:c83ffd44f40a 478
mridup 5:c83ffd44f40a 479 return socket_send(socket, data, size);
mridup 5:c83ffd44f40a 480 }
mridup 5:c83ffd44f40a 481
mridup 12:3799f8475c8a 482 /**
mridup 12:3799f8475c8a 483 * @brief receive data on a udp socket
mridup 12:3799f8475c8a 484 * @param handle: Pointer to handle
mridup 12:3799f8475c8a 485 * addr: address of udp socket
mridup 12:3799f8475c8a 486 * data: pointer to data
mridup 12:3799f8475c8a 487 * size: size of data
mridup 12:3799f8475c8a 488 * @retval no of bytes read
mridup 12:3799f8475c8a 489 */
mridup 5:c83ffd44f40a 490 int SpwfSAInterface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
mridup 5:c83ffd44f40a 491 {
mridup 5:c83ffd44f40a 492 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 5:c83ffd44f40a 493 return socket_recv(socket, data, size);
mridup 5:c83ffd44f40a 494 }
mridup 5:c83ffd44f40a 495
mridup 12:3799f8475c8a 496 /**
mridup 12:3799f8475c8a 497 * @brief attach function/callback to the socket
mridup 12:3799f8475c8a 498 * Not used
mridup 12:3799f8475c8a 499 * @param handle: Pointer to handle
mridup 12:3799f8475c8a 500 * callback: callback function pointer
mridup 12:3799f8475c8a 501 * data: pointer to data
mridup 12:3799f8475c8a 502 * @retval none
mridup 12:3799f8475c8a 503 */
mridup 5:c83ffd44f40a 504 void SpwfSAInterface::socket_attach(void *handle, void (*callback)(void *), void *data)
mridup 5:c83ffd44f40a 505 {
mridup 5:c83ffd44f40a 506 //No implementation yet
mridup 5:c83ffd44f40a 507 }
mridup 5:c83ffd44f40a 508
mridup 12:3799f8475c8a 509 /**
mridup 12:3799f8475c8a 510 * @brief utility debug function for printing to serial terminal
mridup 12:3799f8475c8a 511 * @param string: Pointer to data
mridup 12:3799f8475c8a 512 * @retval none
mridup 12:3799f8475c8a 513 */
mridup 0:dc55f40eb04f 514 void SpwfSAInterface::debug(const char * string)
mridup 0:dc55f40eb04f 515 {
mridup 0:dc55f40eb04f 516 _spwf.debug_print(string);
mridup 0:dc55f40eb04f 517 }