Axel Hwang / Mbed OS ProjetIOT
Committer:
axelhwang
Date:
Wed Oct 28 07:42:46 2020 +0000
Revision:
0:5738799d7a56
Push

Who changed what in which revision?

UserRevisionLine numberNew contents of line
axelhwang 0:5738799d7a56 1 /* mbed Microcontroller Library
axelhwang 0:5738799d7a56 2 * Copyright (c) 20015 ARM Limited
axelhwang 0:5738799d7a56 3 *
axelhwang 0:5738799d7a56 4 * Licensed under the Apache License, Version 2.0 (the "License");
axelhwang 0:5738799d7a56 5 * you may not use this file except in compliance with the License.
axelhwang 0:5738799d7a56 6 * You may obtain a copy of the License at
axelhwang 0:5738799d7a56 7 *
axelhwang 0:5738799d7a56 8 * http://www.apache.org/licenses/LICENSE-2.0
axelhwang 0:5738799d7a56 9 *
axelhwang 0:5738799d7a56 10 * Unless required by applicable law or agreed to in writing, software
axelhwang 0:5738799d7a56 11 * distributed under the License is distributed on an "AS IS" BASIS,
axelhwang 0:5738799d7a56 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
axelhwang 0:5738799d7a56 13 * See the License for the specific language governing permissions and
axelhwang 0:5738799d7a56 14 * limitations under the License.
axelhwang 0:5738799d7a56 15 */
axelhwang 0:5738799d7a56 16
axelhwang 0:5738799d7a56 17 /**
axelhwang 0:5738799d7a56 18 ******************************************************************************
axelhwang 0:5738799d7a56 19 * @file SpwfSAInterface.cpp
axelhwang 0:5738799d7a56 20 * @author STMicroelectronics
axelhwang 0:5738799d7a56 21 * @brief Implementation of the NetworkStack for the SPWF Device
axelhwang 0:5738799d7a56 22 ******************************************************************************
axelhwang 0:5738799d7a56 23 * @copy
axelhwang 0:5738799d7a56 24 *
axelhwang 0:5738799d7a56 25 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
axelhwang 0:5738799d7a56 26 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
axelhwang 0:5738799d7a56 27 * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
axelhwang 0:5738799d7a56 28 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
axelhwang 0:5738799d7a56 29 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
axelhwang 0:5738799d7a56 30 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
axelhwang 0:5738799d7a56 31 *
axelhwang 0:5738799d7a56 32 * <h2><center>&copy; COPYRIGHT 2016 STMicroelectronics</center></h2>
axelhwang 0:5738799d7a56 33 ******************************************************************************
axelhwang 0:5738799d7a56 34 */
axelhwang 0:5738799d7a56 35
axelhwang 0:5738799d7a56 36 #include "SpwfSAInterface.h"
axelhwang 0:5738799d7a56 37 #include "mbed_debug.h"
axelhwang 0:5738799d7a56 38
axelhwang 0:5738799d7a56 39 /**
axelhwang 0:5738799d7a56 40 * @brief SpwfSAInterface constructor
axelhwang 0:5738799d7a56 41 * @param tx: Pin USART TX
axelhwang 0:5738799d7a56 42 * rx: Pin USART RX
axelhwang 0:5738799d7a56 43 * rts: Pin USART RTS
axelhwang 0:5738799d7a56 44 * cts: Pin USART RTS
axelhwang 0:5738799d7a56 45 * debug : not used
axelhwang 0:5738799d7a56 46 * @retval none
axelhwang 0:5738799d7a56 47 */
axelhwang 0:5738799d7a56 48 SpwfSAInterface::SpwfSAInterface(PinName tx, PinName rx,
axelhwang 0:5738799d7a56 49 PinName rts, PinName cts, bool debug,
axelhwang 0:5738799d7a56 50 PinName wakeup, PinName reset)
axelhwang 0:5738799d7a56 51 : _spwf(tx, rx, rts, cts, *this, debug, wakeup, reset),
axelhwang 0:5738799d7a56 52 _dbg_on(debug)
axelhwang 0:5738799d7a56 53 {
axelhwang 0:5738799d7a56 54 inner_constructor();
axelhwang 0:5738799d7a56 55 }
axelhwang 0:5738799d7a56 56
axelhwang 0:5738799d7a56 57 /**
axelhwang 0:5738799d7a56 58 * @brief init function
axelhwang 0:5738799d7a56 59 * initializes SPWF FW and module
axelhwang 0:5738799d7a56 60 * @param none
axelhwang 0:5738799d7a56 61 * @retval error value
axelhwang 0:5738799d7a56 62 */
axelhwang 0:5738799d7a56 63 nsapi_error_t SpwfSAInterface::init(void)
axelhwang 0:5738799d7a56 64 {
axelhwang 0:5738799d7a56 65 _spwf.setTimeout(SPWF_INIT_TIMEOUT);
axelhwang 0:5738799d7a56 66
axelhwang 0:5738799d7a56 67 if(_spwf.startup(0)) {
axelhwang 0:5738799d7a56 68 return NSAPI_ERROR_OK;
axelhwang 0:5738799d7a56 69 }
axelhwang 0:5738799d7a56 70 else return NSAPI_ERROR_DEVICE_ERROR;
axelhwang 0:5738799d7a56 71 }
axelhwang 0:5738799d7a56 72
axelhwang 0:5738799d7a56 73 nsapi_error_t SpwfSAInterface::connect(void)
axelhwang 0:5738799d7a56 74 {
axelhwang 0:5738799d7a56 75 int mode;
axelhwang 0:5738799d7a56 76 char *pass_phrase = ap_pass;
axelhwang 0:5738799d7a56 77
axelhwang 0:5738799d7a56 78 switch(ap_sec)
axelhwang 0:5738799d7a56 79 {
axelhwang 0:5738799d7a56 80 case NSAPI_SECURITY_NONE:
axelhwang 0:5738799d7a56 81 mode = 0;
axelhwang 0:5738799d7a56 82 pass_phrase = NULL;
axelhwang 0:5738799d7a56 83 break;
axelhwang 0:5738799d7a56 84 case NSAPI_SECURITY_WEP:
axelhwang 0:5738799d7a56 85 mode = 1;
axelhwang 0:5738799d7a56 86 break;
axelhwang 0:5738799d7a56 87 case NSAPI_SECURITY_WPA:
axelhwang 0:5738799d7a56 88 case NSAPI_SECURITY_WPA2:
axelhwang 0:5738799d7a56 89 mode = 2;
axelhwang 0:5738799d7a56 90 break;
axelhwang 0:5738799d7a56 91 default:
axelhwang 0:5738799d7a56 92 mode = 2;
axelhwang 0:5738799d7a56 93 break;
axelhwang 0:5738799d7a56 94 }
axelhwang 0:5738799d7a56 95
axelhwang 0:5738799d7a56 96 // First: disconnect
axelhwang 0:5738799d7a56 97 if(_connected_to_network) {
axelhwang 0:5738799d7a56 98 if(!disconnect()) {
axelhwang 0:5738799d7a56 99 return NSAPI_ERROR_DEVICE_ERROR;
axelhwang 0:5738799d7a56 100 }
axelhwang 0:5738799d7a56 101 }
axelhwang 0:5738799d7a56 102
axelhwang 0:5738799d7a56 103 //initialize the device before connecting
axelhwang 0:5738799d7a56 104 if(!_isInitialized)
axelhwang 0:5738799d7a56 105 {
axelhwang 0:5738799d7a56 106 if(init() != NSAPI_ERROR_OK) return NSAPI_ERROR_DEVICE_ERROR;
axelhwang 0:5738799d7a56 107 _isInitialized=true;
axelhwang 0:5738799d7a56 108 }
axelhwang 0:5738799d7a56 109
axelhwang 0:5738799d7a56 110 // Then: (re-)connect
axelhwang 0:5738799d7a56 111 _spwf.setTimeout(SPWF_CONNECT_TIMEOUT);
axelhwang 0:5738799d7a56 112
axelhwang 0:5738799d7a56 113 if (!_spwf.connect(ap_ssid, pass_phrase, mode)) {
axelhwang 0:5738799d7a56 114 return NSAPI_ERROR_NO_CONNECTION;
axelhwang 0:5738799d7a56 115 }
axelhwang 0:5738799d7a56 116
axelhwang 0:5738799d7a56 117 if (!_spwf.getIPAddress()) {
axelhwang 0:5738799d7a56 118 return NSAPI_ERROR_DHCP_FAILURE;
axelhwang 0:5738799d7a56 119 }
axelhwang 0:5738799d7a56 120
axelhwang 0:5738799d7a56 121 _connected_to_network = true;
axelhwang 0:5738799d7a56 122 return NSAPI_ERROR_OK;
axelhwang 0:5738799d7a56 123 }
axelhwang 0:5738799d7a56 124
axelhwang 0:5738799d7a56 125 /**
axelhwang 0:5738799d7a56 126 * @brief network connect
axelhwang 0:5738799d7a56 127 * connects to Access Point
axelhwang 0:5738799d7a56 128 * @param ap: Access Point (AP) Name String
axelhwang 0:5738799d7a56 129 * pass_phrase: Password String for AP
axelhwang 0:5738799d7a56 130 * security: type of NSAPI security supported
axelhwang 0:5738799d7a56 131 * @retval NSAPI Error Type
axelhwang 0:5738799d7a56 132 */
axelhwang 0:5738799d7a56 133 nsapi_error_t SpwfSAInterface::connect(const char *ssid, const char *pass, nsapi_security_t security,
axelhwang 0:5738799d7a56 134 uint8_t channel)
axelhwang 0:5738799d7a56 135 {
axelhwang 0:5738799d7a56 136 if (channel != 0) {
axelhwang 0:5738799d7a56 137 return NSAPI_ERROR_UNSUPPORTED;
axelhwang 0:5738799d7a56 138 }
axelhwang 0:5738799d7a56 139
axelhwang 0:5738799d7a56 140 set_credentials(ssid, pass, security);
axelhwang 0:5738799d7a56 141 return connect();
axelhwang 0:5738799d7a56 142 }
axelhwang 0:5738799d7a56 143
axelhwang 0:5738799d7a56 144 /**
axelhwang 0:5738799d7a56 145 * @brief network disconnect
axelhwang 0:5738799d7a56 146 * disconnects from Access Point
axelhwang 0:5738799d7a56 147 * @param none
axelhwang 0:5738799d7a56 148 * @retval NSAPI Error Type
axelhwang 0:5738799d7a56 149 */
axelhwang 0:5738799d7a56 150 nsapi_error_t SpwfSAInterface::disconnect(void)
axelhwang 0:5738799d7a56 151 {
axelhwang 0:5738799d7a56 152 _spwf.setTimeout(SPWF_DISCONNECT_TIMEOUT);
axelhwang 0:5738799d7a56 153
axelhwang 0:5738799d7a56 154 if (!_spwf.disconnect()) {
axelhwang 0:5738799d7a56 155 return NSAPI_ERROR_DEVICE_ERROR;
axelhwang 0:5738799d7a56 156 }
axelhwang 0:5738799d7a56 157
axelhwang 0:5738799d7a56 158 _connected_to_network = false;
axelhwang 0:5738799d7a56 159 _isInitialized = false;
axelhwang 0:5738799d7a56 160
axelhwang 0:5738799d7a56 161 return NSAPI_ERROR_OK;
axelhwang 0:5738799d7a56 162 }
axelhwang 0:5738799d7a56 163
axelhwang 0:5738799d7a56 164 /**
axelhwang 0:5738799d7a56 165 * @brief Get the local IP address
axelhwang 0:5738799d7a56 166 * @param none
axelhwang 0:5738799d7a56 167 * @retval Null-terminated representation of the local IP address
axelhwang 0:5738799d7a56 168 * or null if not yet connected
axelhwang 0:5738799d7a56 169 */
axelhwang 0:5738799d7a56 170 const char *SpwfSAInterface::get_ip_address(void)
axelhwang 0:5738799d7a56 171 {
axelhwang 0:5738799d7a56 172 _spwf.setTimeout(SPWF_MISC_TIMEOUT);
axelhwang 0:5738799d7a56 173 return _spwf.getIPAddress();
axelhwang 0:5738799d7a56 174 }
axelhwang 0:5738799d7a56 175
axelhwang 0:5738799d7a56 176 /**
axelhwang 0:5738799d7a56 177 * @brief Get the MAC address
axelhwang 0:5738799d7a56 178 * @param none
axelhwang 0:5738799d7a56 179 * @retval Null-terminated representation of the MAC address
axelhwang 0:5738799d7a56 180 * or null if not yet connected
axelhwang 0:5738799d7a56 181 */
axelhwang 0:5738799d7a56 182 const char *SpwfSAInterface::get_mac_address(void)
axelhwang 0:5738799d7a56 183 {
axelhwang 0:5738799d7a56 184 _spwf.setTimeout(SPWF_MISC_TIMEOUT);
axelhwang 0:5738799d7a56 185 return _spwf.getMACAddress();
axelhwang 0:5738799d7a56 186 }
axelhwang 0:5738799d7a56 187
axelhwang 0:5738799d7a56 188 const char *SpwfSAInterface::get_gateway(void)
axelhwang 0:5738799d7a56 189 {
axelhwang 0:5738799d7a56 190 if(!_connected_to_network) return NULL;
axelhwang 0:5738799d7a56 191
axelhwang 0:5738799d7a56 192 _spwf.setTimeout(SPWF_MISC_TIMEOUT);
axelhwang 0:5738799d7a56 193 return _spwf.getGateway();
axelhwang 0:5738799d7a56 194 }
axelhwang 0:5738799d7a56 195
axelhwang 0:5738799d7a56 196 const char *SpwfSAInterface::get_netmask(void)
axelhwang 0:5738799d7a56 197 {
axelhwang 0:5738799d7a56 198 if(!_connected_to_network) return NULL;
axelhwang 0:5738799d7a56 199
axelhwang 0:5738799d7a56 200 _spwf.setTimeout(SPWF_MISC_TIMEOUT);
axelhwang 0:5738799d7a56 201 return _spwf.getNetmask();
axelhwang 0:5738799d7a56 202 }
axelhwang 0:5738799d7a56 203
axelhwang 0:5738799d7a56 204 /**
axelhwang 0:5738799d7a56 205 * @brief open a socket handle
axelhwang 0:5738799d7a56 206 * @param handle: Pointer to handle
axelhwang 0:5738799d7a56 207 * proto: TCP/UDP protocol
axelhwang 0:5738799d7a56 208 * @retval NSAPI Error Type
axelhwang 0:5738799d7a56 209 */
axelhwang 0:5738799d7a56 210 nsapi_error_t SpwfSAInterface::socket_open(void **handle, nsapi_protocol_t proto)
axelhwang 0:5738799d7a56 211 {
axelhwang 0:5738799d7a56 212 int internal_id;
axelhwang 0:5738799d7a56 213
axelhwang 0:5738799d7a56 214 for (internal_id = 0; internal_id < SPWFSA_SOCKET_COUNT; internal_id++) {
axelhwang 0:5738799d7a56 215 if (_ids[internal_id].internal_id == SPWFSA_SOCKET_COUNT) break;
axelhwang 0:5738799d7a56 216 }
axelhwang 0:5738799d7a56 217
axelhwang 0:5738799d7a56 218 if(internal_id == SPWFSA_SOCKET_COUNT) {
axelhwang 0:5738799d7a56 219 debug_if(_dbg_on, "NO Socket ID Error\r\n");
axelhwang 0:5738799d7a56 220 return NSAPI_ERROR_NO_SOCKET;
axelhwang 0:5738799d7a56 221 }
axelhwang 0:5738799d7a56 222
axelhwang 0:5738799d7a56 223 spwf_socket_t *socket = &_ids[internal_id];
axelhwang 0:5738799d7a56 224 socket->internal_id = internal_id;
axelhwang 0:5738799d7a56 225 socket->spwf_id = SPWFSA_SOCKET_COUNT;
axelhwang 0:5738799d7a56 226 socket->server_gone = false;
axelhwang 0:5738799d7a56 227 socket->no_more_data = false;
axelhwang 0:5738799d7a56 228 socket->proto = proto;
axelhwang 0:5738799d7a56 229 socket->addr = SocketAddress();
axelhwang 0:5738799d7a56 230
axelhwang 0:5738799d7a56 231 *handle = socket;
axelhwang 0:5738799d7a56 232 return NSAPI_ERROR_OK;
axelhwang 0:5738799d7a56 233 }
axelhwang 0:5738799d7a56 234
axelhwang 0:5738799d7a56 235 /**
axelhwang 0:5738799d7a56 236 * @brief connect to a remote socket
axelhwang 0:5738799d7a56 237 * @param handle: Pointer to socket handle
axelhwang 0:5738799d7a56 238 * addr: Address to connect to
axelhwang 0:5738799d7a56 239 * @retval NSAPI Error Type
axelhwang 0:5738799d7a56 240 */
axelhwang 0:5738799d7a56 241 nsapi_error_t SpwfSAInterface::socket_connect(void *handle, const SocketAddress &addr)
axelhwang 0:5738799d7a56 242 {
axelhwang 0:5738799d7a56 243 spwf_socket_t *socket = (spwf_socket_t*)handle;
axelhwang 0:5738799d7a56 244
axelhwang 0:5738799d7a56 245 MBED_ASSERT(socket->internal_id != SPWFSA_SOCKET_COUNT);
axelhwang 0:5738799d7a56 246
axelhwang 0:5738799d7a56 247 if(_socket_has_connected(socket->internal_id)) return NSAPI_ERROR_IS_CONNECTED;
axelhwang 0:5738799d7a56 248
axelhwang 0:5738799d7a56 249 _spwf.setTimeout(SPWF_OPEN_TIMEOUT);
axelhwang 0:5738799d7a56 250
axelhwang 0:5738799d7a56 251 const char *proto = (socket->proto == NSAPI_UDP) ? "u" : "t"; //"s" for secure socket?
axelhwang 0:5738799d7a56 252
axelhwang 0:5738799d7a56 253 if(addr.get_ip_version() != NSAPI_IPv4) { // IPv6 not supported (yet)
axelhwang 0:5738799d7a56 254 return NSAPI_ERROR_UNSUPPORTED;
axelhwang 0:5738799d7a56 255 }
axelhwang 0:5738799d7a56 256
axelhwang 0:5738799d7a56 257 if(!_spwf.open(proto, &socket->spwf_id, addr.get_ip_address(), addr.get_port())) {
axelhwang 0:5738799d7a56 258 return NSAPI_ERROR_DEVICE_ERROR;
axelhwang 0:5738799d7a56 259 }
axelhwang 0:5738799d7a56 260
axelhwang 0:5738799d7a56 261 /* check for the module to report a valid id */
axelhwang 0:5738799d7a56 262 MBED_ASSERT(((unsigned int)socket->spwf_id) < ((unsigned int)SPWFSA_SOCKET_COUNT));
axelhwang 0:5738799d7a56 263
axelhwang 0:5738799d7a56 264 _internal_ids[socket->spwf_id] = socket->internal_id;
axelhwang 0:5738799d7a56 265 socket->addr = addr;
axelhwang 0:5738799d7a56 266 return NSAPI_ERROR_OK;
axelhwang 0:5738799d7a56 267 }
axelhwang 0:5738799d7a56 268
axelhwang 0:5738799d7a56 269 nsapi_error_t SpwfSAInterface::socket_bind(void *handle, const SocketAddress &address)
axelhwang 0:5738799d7a56 270 {
axelhwang 0:5738799d7a56 271 return NSAPI_ERROR_UNSUPPORTED;
axelhwang 0:5738799d7a56 272 }
axelhwang 0:5738799d7a56 273
axelhwang 0:5738799d7a56 274 nsapi_error_t SpwfSAInterface::socket_listen(void *handle, int backlog)
axelhwang 0:5738799d7a56 275 {
axelhwang 0:5738799d7a56 276 return NSAPI_ERROR_UNSUPPORTED;
axelhwang 0:5738799d7a56 277 }
axelhwang 0:5738799d7a56 278
axelhwang 0:5738799d7a56 279 nsapi_error_t SpwfSAInterface::socket_accept(nsapi_socket_t server, nsapi_socket_t *handle, SocketAddress *address)
axelhwang 0:5738799d7a56 280 {
axelhwang 0:5738799d7a56 281 return NSAPI_ERROR_UNSUPPORTED;
axelhwang 0:5738799d7a56 282 }
axelhwang 0:5738799d7a56 283
axelhwang 0:5738799d7a56 284 nsapi_error_t SpwfSAInterface::socket_close(void *handle)
axelhwang 0:5738799d7a56 285 {
axelhwang 0:5738799d7a56 286 spwf_socket_t *socket = (spwf_socket_t*)handle;
axelhwang 0:5738799d7a56 287 int internal_id = socket->internal_id;
axelhwang 0:5738799d7a56 288
axelhwang 0:5738799d7a56 289 if(!_socket_is_open(internal_id)) return NSAPI_ERROR_NO_SOCKET;
axelhwang 0:5738799d7a56 290
axelhwang 0:5738799d7a56 291 if(this->_socket_has_connected(socket)) {
axelhwang 0:5738799d7a56 292 _spwf.setTimeout(SPWF_CLOSE_TIMEOUT);
axelhwang 0:5738799d7a56 293 if (!_spwf.close(socket->spwf_id)) {
axelhwang 0:5738799d7a56 294 return NSAPI_ERROR_DEVICE_ERROR;
axelhwang 0:5738799d7a56 295 }
axelhwang 0:5738799d7a56 296 _internal_ids[socket->spwf_id] = SPWFSA_SOCKET_COUNT;
axelhwang 0:5738799d7a56 297 }
axelhwang 0:5738799d7a56 298
axelhwang 0:5738799d7a56 299 _ids[internal_id].internal_id = SPWFSA_SOCKET_COUNT;
axelhwang 0:5738799d7a56 300 _ids[internal_id].spwf_id = SPWFSA_SOCKET_COUNT;
axelhwang 0:5738799d7a56 301
axelhwang 0:5738799d7a56 302 return NSAPI_ERROR_OK;
axelhwang 0:5738799d7a56 303 }
axelhwang 0:5738799d7a56 304
axelhwang 0:5738799d7a56 305 /**
axelhwang 0:5738799d7a56 306 * @brief write to a socket
axelhwang 0:5738799d7a56 307 * @param handle: Pointer to handle
axelhwang 0:5738799d7a56 308 * data: pointer to data
axelhwang 0:5738799d7a56 309 * size: size of data
axelhwang 0:5738799d7a56 310 * @retval no of bytes sent
axelhwang 0:5738799d7a56 311 */
axelhwang 0:5738799d7a56 312 nsapi_size_or_error_t SpwfSAInterface::socket_send(void *handle, const void *data, unsigned size)
axelhwang 0:5738799d7a56 313 {
axelhwang 0:5738799d7a56 314 spwf_socket_t *socket = (spwf_socket_t*)handle;
axelhwang 0:5738799d7a56 315
axelhwang 0:5738799d7a56 316 CHECK_NOT_CONNECTED_ERR();
axelhwang 0:5738799d7a56 317
axelhwang 0:5738799d7a56 318 _spwf.setTimeout(SPWF_SEND_TIMEOUT);
axelhwang 0:5738799d7a56 319
axelhwang 0:5738799d7a56 320 if(!_socket_is_still_connected(socket)) {
axelhwang 0:5738799d7a56 321 return NSAPI_ERROR_CONNECTION_LOST;
axelhwang 0:5738799d7a56 322 }
axelhwang 0:5738799d7a56 323
axelhwang 0:5738799d7a56 324 if (!_spwf.send(socket->spwf_id, data, size)) {
axelhwang 0:5738799d7a56 325 return NSAPI_ERROR_DEVICE_ERROR;
axelhwang 0:5738799d7a56 326 }
axelhwang 0:5738799d7a56 327
axelhwang 0:5738799d7a56 328 return size;
axelhwang 0:5738799d7a56 329 }
axelhwang 0:5738799d7a56 330
axelhwang 0:5738799d7a56 331 /**
axelhwang 0:5738799d7a56 332 * @brief receive data on a socket
axelhwang 0:5738799d7a56 333 * @param handle: Pointer to handle
axelhwang 0:5738799d7a56 334 * data: pointer to data
axelhwang 0:5738799d7a56 335 * size: size of data
axelhwang 0:5738799d7a56 336 * @retval no of bytes read or negative error code in case of error
axelhwang 0:5738799d7a56 337 */
axelhwang 0:5738799d7a56 338 nsapi_size_or_error_t SpwfSAInterface::socket_recv(void *handle, void *data, unsigned size)
axelhwang 0:5738799d7a56 339 {
axelhwang 0:5738799d7a56 340 spwf_socket_t *socket = (spwf_socket_t*)handle;
axelhwang 0:5738799d7a56 341
axelhwang 0:5738799d7a56 342 CHECK_NOT_CONNECTED_ERR();
axelhwang 0:5738799d7a56 343
axelhwang 0:5738799d7a56 344 if(!_socket_might_have_data(socket)) {
axelhwang 0:5738799d7a56 345 return NSAPI_ERROR_CONNECTION_LOST;
axelhwang 0:5738799d7a56 346 }
axelhwang 0:5738799d7a56 347
axelhwang 0:5738799d7a56 348 _spwf.setTimeout(SPWF_RECV_TIMEOUT);
axelhwang 0:5738799d7a56 349
axelhwang 0:5738799d7a56 350 int32_t recv = _spwf.recv(socket->spwf_id, (char*)data, (uint32_t)size);
axelhwang 0:5738799d7a56 351
axelhwang 0:5738799d7a56 352 MBED_ASSERT((recv != 0) || (size == 0));
axelhwang 0:5738799d7a56 353
axelhwang 0:5738799d7a56 354 if (recv < 0) {
axelhwang 0:5738799d7a56 355 if(!_socket_is_still_connected(socket)) {
axelhwang 0:5738799d7a56 356 socket->no_more_data = true;
axelhwang 0:5738799d7a56 357 return NSAPI_ERROR_CONNECTION_LOST;
axelhwang 0:5738799d7a56 358 }
axelhwang 0:5738799d7a56 359
axelhwang 0:5738799d7a56 360 return NSAPI_ERROR_WOULD_BLOCK;
axelhwang 0:5738799d7a56 361 }
axelhwang 0:5738799d7a56 362
axelhwang 0:5738799d7a56 363 return recv;
axelhwang 0:5738799d7a56 364 }
axelhwang 0:5738799d7a56 365
axelhwang 0:5738799d7a56 366 /**
axelhwang 0:5738799d7a56 367 * @brief send data to a udp socket
axelhwang 0:5738799d7a56 368 * @param handle: Pointer to handle
axelhwang 0:5738799d7a56 369 * addr: address of udp socket
axelhwang 0:5738799d7a56 370 * data: pointer to data
axelhwang 0:5738799d7a56 371 * size: size of data
axelhwang 0:5738799d7a56 372 * @retval no of bytes sent
axelhwang 0:5738799d7a56 373 */
axelhwang 0:5738799d7a56 374 nsapi_size_or_error_t SpwfSAInterface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size)
axelhwang 0:5738799d7a56 375 {
axelhwang 0:5738799d7a56 376 spwf_socket_t *socket = (spwf_socket_t*)handle;
axelhwang 0:5738799d7a56 377
axelhwang 0:5738799d7a56 378 CHECK_NOT_CONNECTED_ERR();
axelhwang 0:5738799d7a56 379
axelhwang 0:5738799d7a56 380 if ((this->_socket_has_connected(socket)) && (socket->addr != addr)) {
axelhwang 0:5738799d7a56 381 _spwf.setTimeout(SPWF_CLOSE_TIMEOUT);
axelhwang 0:5738799d7a56 382 if (!_spwf.close(socket->spwf_id)) {
axelhwang 0:5738799d7a56 383 return NSAPI_ERROR_DEVICE_ERROR;
axelhwang 0:5738799d7a56 384 }
axelhwang 0:5738799d7a56 385 _internal_ids[socket->spwf_id] = SPWFSA_SOCKET_COUNT;
axelhwang 0:5738799d7a56 386 socket->spwf_id = SPWFSA_SOCKET_COUNT;
axelhwang 0:5738799d7a56 387 }
axelhwang 0:5738799d7a56 388
axelhwang 0:5738799d7a56 389 _spwf.setTimeout(SPWF_CONN_SND_TIMEOUT);
axelhwang 0:5738799d7a56 390 if (!this->_socket_has_connected(socket)) {
axelhwang 0:5738799d7a56 391 nsapi_error_t err = socket_connect(socket, addr);
axelhwang 0:5738799d7a56 392 if (err < 0) {
axelhwang 0:5738799d7a56 393 return err;
axelhwang 0:5738799d7a56 394 }
axelhwang 0:5738799d7a56 395 }
axelhwang 0:5738799d7a56 396
axelhwang 0:5738799d7a56 397 return socket_send(socket, data, size);
axelhwang 0:5738799d7a56 398 }
axelhwang 0:5738799d7a56 399
axelhwang 0:5738799d7a56 400 /**
axelhwang 0:5738799d7a56 401 * @brief receive data on a udp socket
axelhwang 0:5738799d7a56 402 * @param handle: Pointer to handle
axelhwang 0:5738799d7a56 403 * addr: address of udp socket
axelhwang 0:5738799d7a56 404 * data: pointer to data
axelhwang 0:5738799d7a56 405 * size: size of data
axelhwang 0:5738799d7a56 406 * @retval no of bytes read
axelhwang 0:5738799d7a56 407 */
axelhwang 0:5738799d7a56 408 nsapi_size_or_error_t SpwfSAInterface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
axelhwang 0:5738799d7a56 409 {
axelhwang 0:5738799d7a56 410 spwf_socket_t *socket = (spwf_socket_t*)handle;
axelhwang 0:5738799d7a56 411 nsapi_error_t ret;
axelhwang 0:5738799d7a56 412
axelhwang 0:5738799d7a56 413 CHECK_NOT_CONNECTED_ERR();
axelhwang 0:5738799d7a56 414
axelhwang 0:5738799d7a56 415 ret = socket_recv(socket, data, size);
axelhwang 0:5738799d7a56 416 if (ret >= 0 && addr) {
axelhwang 0:5738799d7a56 417 *addr = socket->addr;
axelhwang 0:5738799d7a56 418 }
axelhwang 0:5738799d7a56 419
axelhwang 0:5738799d7a56 420 return ret;
axelhwang 0:5738799d7a56 421 }
axelhwang 0:5738799d7a56 422
axelhwang 0:5738799d7a56 423 /**
axelhwang 0:5738799d7a56 424 * @brief attach function/callback to the socket
axelhwang 0:5738799d7a56 425 * @param handle: Pointer to handle
axelhwang 0:5738799d7a56 426 * callback: callback function pointer
axelhwang 0:5738799d7a56 427 * data: pointer to data
axelhwang 0:5738799d7a56 428 * @retval none
axelhwang 0:5738799d7a56 429 */
axelhwang 0:5738799d7a56 430 void SpwfSAInterface::socket_attach(void *handle, void (*callback)(void *), void *data)
axelhwang 0:5738799d7a56 431 {
axelhwang 0:5738799d7a56 432 spwf_socket_t *socket = (spwf_socket_t*)handle;
axelhwang 0:5738799d7a56 433
axelhwang 0:5738799d7a56 434 if(!_socket_is_open(socket)) return; // might happen after module hard fault
axelhwang 0:5738799d7a56 435
axelhwang 0:5738799d7a56 436 _cbs[socket->internal_id].callback = callback;
axelhwang 0:5738799d7a56 437 _cbs[socket->internal_id].data = data;
axelhwang 0:5738799d7a56 438 }
axelhwang 0:5738799d7a56 439
axelhwang 0:5738799d7a56 440 void SpwfSAInterface::event(void) {
axelhwang 0:5738799d7a56 441 for (int internal_id = 0; internal_id < SPWFSA_SOCKET_COUNT; internal_id++) {
axelhwang 0:5738799d7a56 442 if (_cbs[internal_id].callback && (_ids[internal_id].internal_id != SPWFSA_SOCKET_COUNT)) {
axelhwang 0:5738799d7a56 443 _cbs[internal_id].callback(_cbs[internal_id].data);
axelhwang 0:5738799d7a56 444 }
axelhwang 0:5738799d7a56 445 }
axelhwang 0:5738799d7a56 446 }
axelhwang 0:5738799d7a56 447
axelhwang 0:5738799d7a56 448 nsapi_error_t SpwfSAInterface::set_credentials(const char *ssid, const char *pass, nsapi_security_t security)
axelhwang 0:5738799d7a56 449 {
axelhwang 0:5738799d7a56 450 memset(ap_ssid, 0, sizeof(ap_ssid));
axelhwang 0:5738799d7a56 451 strncpy(ap_ssid, ssid, sizeof(ap_ssid));
axelhwang 0:5738799d7a56 452
axelhwang 0:5738799d7a56 453 memset(ap_pass, 0, sizeof(ap_pass));
axelhwang 0:5738799d7a56 454 strncpy(ap_pass, pass, sizeof(ap_pass));
axelhwang 0:5738799d7a56 455
axelhwang 0:5738799d7a56 456 ap_sec = security;
axelhwang 0:5738799d7a56 457
axelhwang 0:5738799d7a56 458 return NSAPI_ERROR_OK;
axelhwang 0:5738799d7a56 459 }
axelhwang 0:5738799d7a56 460
axelhwang 0:5738799d7a56 461 nsapi_error_t SpwfSAInterface::set_channel(uint8_t channel)
axelhwang 0:5738799d7a56 462 {
axelhwang 0:5738799d7a56 463 return NSAPI_ERROR_UNSUPPORTED;
axelhwang 0:5738799d7a56 464 }
axelhwang 0:5738799d7a56 465
axelhwang 0:5738799d7a56 466 int8_t SpwfSAInterface::get_rssi(void)
axelhwang 0:5738799d7a56 467 {
axelhwang 0:5738799d7a56 468 if(!_connected_to_network) return 0;
axelhwang 0:5738799d7a56 469
axelhwang 0:5738799d7a56 470 _spwf.setTimeout(SPWF_MISC_TIMEOUT);
axelhwang 0:5738799d7a56 471 return _spwf.getRssi();
axelhwang 0:5738799d7a56 472 }
axelhwang 0:5738799d7a56 473
axelhwang 0:5738799d7a56 474 nsapi_size_or_error_t SpwfSAInterface::scan(WiFiAccessPoint *res, unsigned count)
axelhwang 0:5738799d7a56 475 {
axelhwang 0:5738799d7a56 476 nsapi_size_or_error_t ret;
axelhwang 0:5738799d7a56 477
axelhwang 0:5738799d7a56 478 //initialize the device before scanning
axelhwang 0:5738799d7a56 479 if(!_isInitialized)
axelhwang 0:5738799d7a56 480 {
axelhwang 0:5738799d7a56 481 if(init() != NSAPI_ERROR_OK) return NSAPI_ERROR_DEVICE_ERROR;
axelhwang 0:5738799d7a56 482 }
axelhwang 0:5738799d7a56 483
axelhwang 0:5738799d7a56 484 _spwf.setTimeout(SPWF_SCAN_TIMEOUT);
axelhwang 0:5738799d7a56 485 ret = _spwf.scan(res, count);
axelhwang 0:5738799d7a56 486
axelhwang 0:5738799d7a56 487 //de-initialize the device after scanning
axelhwang 0:5738799d7a56 488 if(!_isInitialized)
axelhwang 0:5738799d7a56 489 {
axelhwang 0:5738799d7a56 490 nsapi_error_t err = disconnect();
axelhwang 0:5738799d7a56 491 if(err != NSAPI_ERROR_OK) return err;
axelhwang 0:5738799d7a56 492 }
axelhwang 0:5738799d7a56 493
axelhwang 0:5738799d7a56 494 return ret;
axelhwang 0:5738799d7a56 495 }