Jim Flynn / Mbed OS wifi_Example

Dependencies:   X_NUCLEO_IKS01A2 mbed-http

Committer:
JMF
Date:
Wed Sep 05 14:28:24 2018 +0000
Revision:
0:24d3eb812fd4
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JMF 0:24d3eb812fd4 1 /* ISM43362 implementation of NetworkInterfaceAPI
JMF 0:24d3eb812fd4 2 * Copyright (c) STMicroelectronics 2018
JMF 0:24d3eb812fd4 3 *
JMF 0:24d3eb812fd4 4 * Licensed under the Apache License, Version 2.0 (the "License");
JMF 0:24d3eb812fd4 5 * you may not use this file except in compliance with the License.
JMF 0:24d3eb812fd4 6 * You may obtain a copy of the License at
JMF 0:24d3eb812fd4 7 *
JMF 0:24d3eb812fd4 8 * http://www.apache.org/licenses/LICENSE-2.0
JMF 0:24d3eb812fd4 9 *
JMF 0:24d3eb812fd4 10 * Unless required by applicable law or agreed to in writing, software
JMF 0:24d3eb812fd4 11 * distributed under the License is distributed on an "AS IS" BASIS,
JMF 0:24d3eb812fd4 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
JMF 0:24d3eb812fd4 13 * See the License for the specific language governing permissions and
JMF 0:24d3eb812fd4 14 * limitations under the License.
JMF 0:24d3eb812fd4 15 */
JMF 0:24d3eb812fd4 16
JMF 0:24d3eb812fd4 17 #include <string.h>
JMF 0:24d3eb812fd4 18 #include "ISM43362Interface.h"
JMF 0:24d3eb812fd4 19 #include "mbed_debug.h"
JMF 0:24d3eb812fd4 20
JMF 0:24d3eb812fd4 21 // Product ID,FW Revision,API Revision,Stack Revision,RTOS Revision,CPU Clock,Product Name
JMF 0:24d3eb812fd4 22 #define LATEST_FW_VERSION_NUMBER "C3.5.2.5" // ISM43362-M3G-L44-SPI,C3.5.2.5.STM,v3.5.2,v1.4.0.rc1,v8.2.1,120000000,Inventek eS-WiFi
JMF 0:24d3eb812fd4 23
JMF 0:24d3eb812fd4 24 // activate / de-activate debug
JMF 0:24d3eb812fd4 25 #define ism_interface_debug 0
JMF 0:24d3eb812fd4 26
JMF 0:24d3eb812fd4 27 #define MIN(a,b) (((a)<(b))?(a):(b))
JMF 0:24d3eb812fd4 28
JMF 0:24d3eb812fd4 29 // ISM43362Interface implementation
JMF 0:24d3eb812fd4 30 ISM43362Interface::ISM43362Interface(bool debug)
JMF 0:24d3eb812fd4 31 : _ism(MBED_CONF_ISM43362_WIFI_MOSI, MBED_CONF_ISM43362_WIFI_MISO, MBED_CONF_ISM43362_WIFI_SCLK, MBED_CONF_ISM43362_WIFI_NSS, MBED_CONF_ISM43362_WIFI_RESET, MBED_CONF_ISM43362_WIFI_DATAREADY, MBED_CONF_ISM43362_WIFI_WAKEUP, debug)
JMF 0:24d3eb812fd4 32 {
JMF 0:24d3eb812fd4 33 _ism_debug = ism_interface_debug || debug;
JMF 0:24d3eb812fd4 34 memset(_ids, 0, sizeof(_ids));
JMF 0:24d3eb812fd4 35 memset(_socket_obj, 0, sizeof(_socket_obj));
JMF 0:24d3eb812fd4 36 memset(_cbs, 0, sizeof(_cbs));
JMF 0:24d3eb812fd4 37 memset(ap_ssid, 0, sizeof(ap_ssid));
JMF 0:24d3eb812fd4 38 memset(ap_pass, 0, sizeof(ap_pass));
JMF 0:24d3eb812fd4 39 ap_sec = ISM_SECURITY_UNKNOWN;
JMF 0:24d3eb812fd4 40
JMF 0:24d3eb812fd4 41 thread_read_socket.start(callback(this, &ISM43362Interface::socket_check_read));
JMF 0:24d3eb812fd4 42
JMF 0:24d3eb812fd4 43 _mutex.lock();
JMF 0:24d3eb812fd4 44
JMF 0:24d3eb812fd4 45 // Check all supported firmware versions
JMF 0:24d3eb812fd4 46 _FwVersion = _ism.get_firmware_version();
JMF 0:24d3eb812fd4 47
JMF 0:24d3eb812fd4 48 if (!_FwVersion) {
JMF 0:24d3eb812fd4 49 error("ISM43362Interface: ERROR cannot read firmware version\r\n");
JMF 0:24d3eb812fd4 50 }
JMF 0:24d3eb812fd4 51
JMF 0:24d3eb812fd4 52 debug_if(_ism_debug, "ISM43362Interface: read_version = %lu\r\n", _FwVersion);
JMF 0:24d3eb812fd4 53 /* FW Revision should be with format "CX.X.X.X" with X as a single digit */
JMF 0:24d3eb812fd4 54 if ( (_FwVersion < 1000) || (_FwVersion > 9999) ) {
JMF 0:24d3eb812fd4 55 debug_if(_ism_debug, "ISM43362Interface: read_version issue\r\n");
JMF 0:24d3eb812fd4 56 }
JMF 0:24d3eb812fd4 57
JMF 0:24d3eb812fd4 58 #if TARGET_DISCO_L475VG_IOT01A
JMF 0:24d3eb812fd4 59 if (_FwVersion < ParseNumber(LATEST_FW_VERSION_NUMBER, NULL)) {
JMF 0:24d3eb812fd4 60 debug_if(_ism_debug, "ISM43362Interface: please update FW\r\n");
JMF 0:24d3eb812fd4 61 }
JMF 0:24d3eb812fd4 62 #endif
JMF 0:24d3eb812fd4 63
JMF 0:24d3eb812fd4 64 _mutex.unlock();
JMF 0:24d3eb812fd4 65 }
JMF 0:24d3eb812fd4 66
JMF 0:24d3eb812fd4 67 int ISM43362Interface::connect(const char *ssid, const char *pass, nsapi_security_t security,
JMF 0:24d3eb812fd4 68 uint8_t channel)
JMF 0:24d3eb812fd4 69 {
JMF 0:24d3eb812fd4 70 if (channel != 0) {
JMF 0:24d3eb812fd4 71 return NSAPI_ERROR_UNSUPPORTED;
JMF 0:24d3eb812fd4 72 }
JMF 0:24d3eb812fd4 73
JMF 0:24d3eb812fd4 74 nsapi_error_t credentials_status = set_credentials(ssid, pass, security);
JMF 0:24d3eb812fd4 75 if (credentials_status) {
JMF 0:24d3eb812fd4 76 return credentials_status;
JMF 0:24d3eb812fd4 77 }
JMF 0:24d3eb812fd4 78
JMF 0:24d3eb812fd4 79 return connect();
JMF 0:24d3eb812fd4 80 }
JMF 0:24d3eb812fd4 81
JMF 0:24d3eb812fd4 82 int ISM43362Interface::connect()
JMF 0:24d3eb812fd4 83 {
JMF 0:24d3eb812fd4 84 if (strlen(ap_ssid) == 0) {
JMF 0:24d3eb812fd4 85 return NSAPI_ERROR_NO_SSID;
JMF 0:24d3eb812fd4 86 }
JMF 0:24d3eb812fd4 87
JMF 0:24d3eb812fd4 88 _mutex.lock();
JMF 0:24d3eb812fd4 89
JMF 0:24d3eb812fd4 90 if (!_ism.dhcp(true)) {
JMF 0:24d3eb812fd4 91 _mutex.unlock();
JMF 0:24d3eb812fd4 92 return NSAPI_ERROR_DHCP_FAILURE;
JMF 0:24d3eb812fd4 93 }
JMF 0:24d3eb812fd4 94
JMF 0:24d3eb812fd4 95 int connect_status = _ism.connect(ap_ssid, ap_pass, ap_sec);
JMF 0:24d3eb812fd4 96 debug_if(_ism_debug, "ISM43362Interface: connect_status %d\n", connect_status);
JMF 0:24d3eb812fd4 97
JMF 0:24d3eb812fd4 98 if (connect_status != NSAPI_ERROR_OK) {
JMF 0:24d3eb812fd4 99 _mutex.unlock();
JMF 0:24d3eb812fd4 100 return connect_status;
JMF 0:24d3eb812fd4 101 }
JMF 0:24d3eb812fd4 102
JMF 0:24d3eb812fd4 103 if (!_ism.getIPAddress()) {
JMF 0:24d3eb812fd4 104 _mutex.unlock();
JMF 0:24d3eb812fd4 105 return NSAPI_ERROR_DHCP_FAILURE;
JMF 0:24d3eb812fd4 106 }
JMF 0:24d3eb812fd4 107
JMF 0:24d3eb812fd4 108 _mutex.unlock();
JMF 0:24d3eb812fd4 109
JMF 0:24d3eb812fd4 110 return NSAPI_ERROR_OK;
JMF 0:24d3eb812fd4 111 }
JMF 0:24d3eb812fd4 112
JMF 0:24d3eb812fd4 113 nsapi_error_t ISM43362Interface::gethostbyname(const char *name, SocketAddress *address, nsapi_version_t version)
JMF 0:24d3eb812fd4 114 {
JMF 0:24d3eb812fd4 115 if (strlen(name) == 0) {
JMF 0:24d3eb812fd4 116 return NSAPI_ERROR_NO_SOCKET;
JMF 0:24d3eb812fd4 117 }
JMF 0:24d3eb812fd4 118
JMF 0:24d3eb812fd4 119 _mutex.lock();
JMF 0:24d3eb812fd4 120 if (address->set_ip_address(name)) {
JMF 0:24d3eb812fd4 121 if (version != NSAPI_UNSPEC && address->get_ip_version() != version) {
JMF 0:24d3eb812fd4 122 _mutex.unlock();
JMF 0:24d3eb812fd4 123 return NSAPI_ERROR_DNS_FAILURE;
JMF 0:24d3eb812fd4 124 }
JMF 0:24d3eb812fd4 125
JMF 0:24d3eb812fd4 126 _mutex.unlock();
JMF 0:24d3eb812fd4 127 return NSAPI_ERROR_OK;
JMF 0:24d3eb812fd4 128 }
JMF 0:24d3eb812fd4 129
JMF 0:24d3eb812fd4 130 char *ipbuff = new char[NSAPI_IP_SIZE];
JMF 0:24d3eb812fd4 131 int ret = 0;
JMF 0:24d3eb812fd4 132 if (!_ism.dns_lookup(name, ipbuff)) {
JMF 0:24d3eb812fd4 133 ret = NSAPI_ERROR_DEVICE_ERROR;
JMF 0:24d3eb812fd4 134 } else {
JMF 0:24d3eb812fd4 135 address->set_ip_address(ipbuff);
JMF 0:24d3eb812fd4 136 }
JMF 0:24d3eb812fd4 137 _mutex.unlock();
JMF 0:24d3eb812fd4 138
JMF 0:24d3eb812fd4 139 delete[] ipbuff;
JMF 0:24d3eb812fd4 140
JMF 0:24d3eb812fd4 141 return ret;
JMF 0:24d3eb812fd4 142 }
JMF 0:24d3eb812fd4 143
JMF 0:24d3eb812fd4 144 int ISM43362Interface::set_credentials(const char *ssid, const char *pass, nsapi_security_t security)
JMF 0:24d3eb812fd4 145 {
JMF 0:24d3eb812fd4 146 if ((strlen(ssid) == 0) || (strlen(ssid) > 32)) {
JMF 0:24d3eb812fd4 147 return NSAPI_ERROR_PARAMETER;
JMF 0:24d3eb812fd4 148 }
JMF 0:24d3eb812fd4 149
JMF 0:24d3eb812fd4 150 if ((security != NSAPI_SECURITY_NONE) && (strcmp(pass, "") == 0)) {
JMF 0:24d3eb812fd4 151 return NSAPI_ERROR_PARAMETER;
JMF 0:24d3eb812fd4 152 }
JMF 0:24d3eb812fd4 153
JMF 0:24d3eb812fd4 154 if (strlen(pass) > 63) {
JMF 0:24d3eb812fd4 155 return NSAPI_ERROR_PARAMETER;
JMF 0:24d3eb812fd4 156 }
JMF 0:24d3eb812fd4 157
JMF 0:24d3eb812fd4 158 _mutex.lock();
JMF 0:24d3eb812fd4 159 memset(ap_ssid, 0, sizeof(ap_ssid));
JMF 0:24d3eb812fd4 160 strncpy(ap_ssid, ssid, sizeof(ap_ssid));
JMF 0:24d3eb812fd4 161
JMF 0:24d3eb812fd4 162 memset(ap_pass, 0, sizeof(ap_pass));
JMF 0:24d3eb812fd4 163 strncpy(ap_pass, pass, sizeof(ap_pass));
JMF 0:24d3eb812fd4 164
JMF 0:24d3eb812fd4 165 switch (security) {
JMF 0:24d3eb812fd4 166 case NSAPI_SECURITY_NONE:
JMF 0:24d3eb812fd4 167 ap_sec = ISM_SECURITY_NONE;
JMF 0:24d3eb812fd4 168 break;
JMF 0:24d3eb812fd4 169 case NSAPI_SECURITY_WEP:
JMF 0:24d3eb812fd4 170 ap_sec = ISM_SECURITY_WEP;
JMF 0:24d3eb812fd4 171 break;
JMF 0:24d3eb812fd4 172 case NSAPI_SECURITY_WPA:
JMF 0:24d3eb812fd4 173 ap_sec = ISM_SECURITY_WPA;
JMF 0:24d3eb812fd4 174 break;
JMF 0:24d3eb812fd4 175 case NSAPI_SECURITY_WPA2:
JMF 0:24d3eb812fd4 176 ap_sec = ISM_SECURITY_WPA2;
JMF 0:24d3eb812fd4 177 break;
JMF 0:24d3eb812fd4 178 case NSAPI_SECURITY_WPA_WPA2:
JMF 0:24d3eb812fd4 179 ap_sec = ISM_SECURITY_WPA_WPA2;
JMF 0:24d3eb812fd4 180 break;
JMF 0:24d3eb812fd4 181 default:
JMF 0:24d3eb812fd4 182 ap_sec = ISM_SECURITY_UNKNOWN;
JMF 0:24d3eb812fd4 183 break;
JMF 0:24d3eb812fd4 184 }
JMF 0:24d3eb812fd4 185 _mutex.unlock();
JMF 0:24d3eb812fd4 186
JMF 0:24d3eb812fd4 187 return NSAPI_ERROR_OK;
JMF 0:24d3eb812fd4 188 }
JMF 0:24d3eb812fd4 189
JMF 0:24d3eb812fd4 190 int ISM43362Interface::set_channel(uint8_t channel)
JMF 0:24d3eb812fd4 191 {
JMF 0:24d3eb812fd4 192 return NSAPI_ERROR_UNSUPPORTED;
JMF 0:24d3eb812fd4 193 }
JMF 0:24d3eb812fd4 194
JMF 0:24d3eb812fd4 195 int ISM43362Interface::disconnect()
JMF 0:24d3eb812fd4 196 {
JMF 0:24d3eb812fd4 197 _mutex.lock();
JMF 0:24d3eb812fd4 198
JMF 0:24d3eb812fd4 199 if (!_ism.disconnect()) {
JMF 0:24d3eb812fd4 200 _mutex.unlock();
JMF 0:24d3eb812fd4 201 return NSAPI_ERROR_DEVICE_ERROR;
JMF 0:24d3eb812fd4 202 }
JMF 0:24d3eb812fd4 203
JMF 0:24d3eb812fd4 204 _mutex.unlock();
JMF 0:24d3eb812fd4 205
JMF 0:24d3eb812fd4 206 return NSAPI_ERROR_OK;
JMF 0:24d3eb812fd4 207 }
JMF 0:24d3eb812fd4 208
JMF 0:24d3eb812fd4 209 const char *ISM43362Interface::get_ip_address()
JMF 0:24d3eb812fd4 210 {
JMF 0:24d3eb812fd4 211 _mutex.lock();
JMF 0:24d3eb812fd4 212 const char *ret = _ism.getIPAddress();
JMF 0:24d3eb812fd4 213 _mutex.unlock();
JMF 0:24d3eb812fd4 214 return ret;
JMF 0:24d3eb812fd4 215 }
JMF 0:24d3eb812fd4 216
JMF 0:24d3eb812fd4 217 const char *ISM43362Interface::get_mac_address()
JMF 0:24d3eb812fd4 218 {
JMF 0:24d3eb812fd4 219 _mutex.lock();
JMF 0:24d3eb812fd4 220 const char *ret = _ism.getMACAddress();
JMF 0:24d3eb812fd4 221 _mutex.unlock();
JMF 0:24d3eb812fd4 222 return ret;
JMF 0:24d3eb812fd4 223 }
JMF 0:24d3eb812fd4 224
JMF 0:24d3eb812fd4 225 const char *ISM43362Interface::get_gateway()
JMF 0:24d3eb812fd4 226 {
JMF 0:24d3eb812fd4 227 _mutex.lock();
JMF 0:24d3eb812fd4 228 const char *ret = _ism.getGateway();
JMF 0:24d3eb812fd4 229 _mutex.unlock();
JMF 0:24d3eb812fd4 230 return ret;
JMF 0:24d3eb812fd4 231 }
JMF 0:24d3eb812fd4 232
JMF 0:24d3eb812fd4 233 const char *ISM43362Interface::get_netmask()
JMF 0:24d3eb812fd4 234 {
JMF 0:24d3eb812fd4 235 _mutex.lock();
JMF 0:24d3eb812fd4 236 const char *ret = _ism.getNetmask();
JMF 0:24d3eb812fd4 237 _mutex.unlock();
JMF 0:24d3eb812fd4 238 return ret;
JMF 0:24d3eb812fd4 239 }
JMF 0:24d3eb812fd4 240
JMF 0:24d3eb812fd4 241 int8_t ISM43362Interface::get_rssi()
JMF 0:24d3eb812fd4 242 {
JMF 0:24d3eb812fd4 243 _mutex.lock();
JMF 0:24d3eb812fd4 244 int8_t ret = _ism.getRSSI();
JMF 0:24d3eb812fd4 245 _mutex.unlock();
JMF 0:24d3eb812fd4 246 return ret;
JMF 0:24d3eb812fd4 247 }
JMF 0:24d3eb812fd4 248
JMF 0:24d3eb812fd4 249 int ISM43362Interface::scan(WiFiAccessPoint *res, unsigned count)
JMF 0:24d3eb812fd4 250 {
JMF 0:24d3eb812fd4 251 _mutex.lock();
JMF 0:24d3eb812fd4 252 int ret = _ism.scan(res, count);
JMF 0:24d3eb812fd4 253 _mutex.unlock();
JMF 0:24d3eb812fd4 254 return ret;
JMF 0:24d3eb812fd4 255 }
JMF 0:24d3eb812fd4 256
JMF 0:24d3eb812fd4 257 struct ISM43362_socket {
JMF 0:24d3eb812fd4 258 int id;
JMF 0:24d3eb812fd4 259 nsapi_protocol_t proto;
JMF 0:24d3eb812fd4 260 volatile bool connected;
JMF 0:24d3eb812fd4 261 SocketAddress addr;
JMF 0:24d3eb812fd4 262 char read_data[1400];
JMF 0:24d3eb812fd4 263 volatile uint32_t read_data_size;
JMF 0:24d3eb812fd4 264 };
JMF 0:24d3eb812fd4 265
JMF 0:24d3eb812fd4 266 int ISM43362Interface::socket_open(void **handle, nsapi_protocol_t proto)
JMF 0:24d3eb812fd4 267 {
JMF 0:24d3eb812fd4 268 // Look for an unused socket
JMF 0:24d3eb812fd4 269 int id = -1;
JMF 0:24d3eb812fd4 270 for (int i = 0; i < ISM43362_SOCKET_COUNT; i++) {
JMF 0:24d3eb812fd4 271 if (!_ids[i]) {
JMF 0:24d3eb812fd4 272 id = i;
JMF 0:24d3eb812fd4 273 _ids[i] = true;
JMF 0:24d3eb812fd4 274 break;
JMF 0:24d3eb812fd4 275 }
JMF 0:24d3eb812fd4 276 }
JMF 0:24d3eb812fd4 277
JMF 0:24d3eb812fd4 278 if (id == -1) {
JMF 0:24d3eb812fd4 279 return NSAPI_ERROR_NO_SOCKET;
JMF 0:24d3eb812fd4 280 }
JMF 0:24d3eb812fd4 281 _mutex.lock();
JMF 0:24d3eb812fd4 282 struct ISM43362_socket *socket = new struct ISM43362_socket;
JMF 0:24d3eb812fd4 283 if (!socket) {
JMF 0:24d3eb812fd4 284 _mutex.unlock();
JMF 0:24d3eb812fd4 285 return NSAPI_ERROR_NO_SOCKET;
JMF 0:24d3eb812fd4 286 }
JMF 0:24d3eb812fd4 287 socket->id = id;
JMF 0:24d3eb812fd4 288 debug_if(_ism_debug, "ISM43362Interface: socket_open, id=%d\n", socket->id);
JMF 0:24d3eb812fd4 289 memset(socket->read_data, 0, sizeof(socket->read_data));
JMF 0:24d3eb812fd4 290 socket->addr = 0;
JMF 0:24d3eb812fd4 291 socket->read_data_size = 0;
JMF 0:24d3eb812fd4 292 socket->proto = proto;
JMF 0:24d3eb812fd4 293 socket->connected = false;
JMF 0:24d3eb812fd4 294 *handle = socket;
JMF 0:24d3eb812fd4 295 _mutex.unlock();
JMF 0:24d3eb812fd4 296
JMF 0:24d3eb812fd4 297 return 0;
JMF 0:24d3eb812fd4 298 }
JMF 0:24d3eb812fd4 299
JMF 0:24d3eb812fd4 300 int ISM43362Interface::socket_close(void *handle)
JMF 0:24d3eb812fd4 301 {
JMF 0:24d3eb812fd4 302 _mutex.lock();
JMF 0:24d3eb812fd4 303 struct ISM43362_socket *socket = (struct ISM43362_socket *)handle;
JMF 0:24d3eb812fd4 304 debug_if(_ism_debug, "ISM43362Interface: socket_close, id=%d\n", socket->id);
JMF 0:24d3eb812fd4 305 int err = 0;
JMF 0:24d3eb812fd4 306
JMF 0:24d3eb812fd4 307 if (!_ism.close(socket->id)) {
JMF 0:24d3eb812fd4 308 err = NSAPI_ERROR_DEVICE_ERROR;
JMF 0:24d3eb812fd4 309 }
JMF 0:24d3eb812fd4 310
JMF 0:24d3eb812fd4 311 socket->connected = false;
JMF 0:24d3eb812fd4 312 _ids[socket->id] = false;
JMF 0:24d3eb812fd4 313 _socket_obj[socket->id] = 0;
JMF 0:24d3eb812fd4 314 _mutex.unlock();
JMF 0:24d3eb812fd4 315 delete socket;
JMF 0:24d3eb812fd4 316 return err;
JMF 0:24d3eb812fd4 317 }
JMF 0:24d3eb812fd4 318
JMF 0:24d3eb812fd4 319 int ISM43362Interface::socket_bind(void *handle, const SocketAddress &address)
JMF 0:24d3eb812fd4 320 {
JMF 0:24d3eb812fd4 321 return NSAPI_ERROR_UNSUPPORTED;
JMF 0:24d3eb812fd4 322 }
JMF 0:24d3eb812fd4 323
JMF 0:24d3eb812fd4 324 int ISM43362Interface::socket_listen(void *handle, int backlog)
JMF 0:24d3eb812fd4 325 {
JMF 0:24d3eb812fd4 326 return NSAPI_ERROR_UNSUPPORTED;
JMF 0:24d3eb812fd4 327 }
JMF 0:24d3eb812fd4 328
JMF 0:24d3eb812fd4 329 int ISM43362Interface::socket_connect(void *handle, const SocketAddress &addr)
JMF 0:24d3eb812fd4 330 {
JMF 0:24d3eb812fd4 331 _mutex.lock();
JMF 0:24d3eb812fd4 332 int ret = socket_connect_nolock(handle, addr);
JMF 0:24d3eb812fd4 333 _mutex.unlock();
JMF 0:24d3eb812fd4 334 return ret;
JMF 0:24d3eb812fd4 335 }
JMF 0:24d3eb812fd4 336
JMF 0:24d3eb812fd4 337 int ISM43362Interface::socket_connect_nolock(void *handle, const SocketAddress &addr)
JMF 0:24d3eb812fd4 338 {
JMF 0:24d3eb812fd4 339 struct ISM43362_socket *socket = (struct ISM43362_socket *)handle;
JMF 0:24d3eb812fd4 340 const char *proto = (socket->proto == NSAPI_UDP) ? "1" : "0";
JMF 0:24d3eb812fd4 341 if (!_ism.open(proto, socket->id, addr.get_ip_address(), addr.get_port())) {
JMF 0:24d3eb812fd4 342 return NSAPI_ERROR_DEVICE_ERROR;
JMF 0:24d3eb812fd4 343 }
JMF 0:24d3eb812fd4 344 _ids[socket->id] = true;
JMF 0:24d3eb812fd4 345 _socket_obj[socket->id] = (uint32_t)socket;
JMF 0:24d3eb812fd4 346 socket->connected = true;
JMF 0:24d3eb812fd4 347 return 0;
JMF 0:24d3eb812fd4 348
JMF 0:24d3eb812fd4 349 }
JMF 0:24d3eb812fd4 350
JMF 0:24d3eb812fd4 351
JMF 0:24d3eb812fd4 352
JMF 0:24d3eb812fd4 353 void ISM43362Interface::socket_check_read()
JMF 0:24d3eb812fd4 354 {
JMF 0:24d3eb812fd4 355 while (1) {
JMF 0:24d3eb812fd4 356 for (int i = 0; i < ISM43362_SOCKET_COUNT; i++) {
JMF 0:24d3eb812fd4 357 _mutex.lock();
JMF 0:24d3eb812fd4 358 if (_socket_obj[i] != 0) {
JMF 0:24d3eb812fd4 359 struct ISM43362_socket *socket = (struct ISM43362_socket *)_socket_obj[i];
JMF 0:24d3eb812fd4 360 /* Check if there is something to read for this socket. But if it */
JMF 0:24d3eb812fd4 361 /* has already been read : don't read again */
JMF 0:24d3eb812fd4 362 if ((socket->connected) && (socket->read_data_size == 0) && _cbs[socket->id].callback) {
JMF 0:24d3eb812fd4 363 /* if no callback is set, no need to read ?*/
JMF 0:24d3eb812fd4 364 int read_amount = _ism.check_recv_status(socket->id, socket->read_data);
JMF 0:24d3eb812fd4 365 // debug_if(_ism_debug, "ISM43362Interface socket_check_read: i %d read_amount %d \r\n", i, read_amount);
JMF 0:24d3eb812fd4 366 if (read_amount > 0) {
JMF 0:24d3eb812fd4 367 socket->read_data_size = read_amount;
JMF 0:24d3eb812fd4 368 } else if (read_amount < 0) {
JMF 0:24d3eb812fd4 369 /* Mark donw connection has been lost or closed */
JMF 0:24d3eb812fd4 370 debug_if(_ism_debug, "ISM43362Interface socket_check_read: i %d closed\r\n", i, read_amount);
JMF 0:24d3eb812fd4 371 socket->connected = false;
JMF 0:24d3eb812fd4 372 }
JMF 0:24d3eb812fd4 373 if (read_amount != 0) {
JMF 0:24d3eb812fd4 374 /* There is something to read in this socket*/
JMF 0:24d3eb812fd4 375 if (_cbs[socket->id].callback) {
JMF 0:24d3eb812fd4 376 _cbs[socket->id].callback(_cbs[socket->id].data);
JMF 0:24d3eb812fd4 377 }
JMF 0:24d3eb812fd4 378 }
JMF 0:24d3eb812fd4 379 }
JMF 0:24d3eb812fd4 380 }
JMF 0:24d3eb812fd4 381 _mutex.unlock();
JMF 0:24d3eb812fd4 382 }
JMF 0:24d3eb812fd4 383 wait_ms(50);
JMF 0:24d3eb812fd4 384 }
JMF 0:24d3eb812fd4 385 }
JMF 0:24d3eb812fd4 386
JMF 0:24d3eb812fd4 387 int ISM43362Interface::socket_accept(void *server, void **socket, SocketAddress *addr)
JMF 0:24d3eb812fd4 388 {
JMF 0:24d3eb812fd4 389 return NSAPI_ERROR_UNSUPPORTED;
JMF 0:24d3eb812fd4 390 }
JMF 0:24d3eb812fd4 391
JMF 0:24d3eb812fd4 392 int ISM43362Interface::socket_send(void *handle, const void *data, unsigned size)
JMF 0:24d3eb812fd4 393 {
JMF 0:24d3eb812fd4 394 _mutex.lock();
JMF 0:24d3eb812fd4 395 int ret = socket_send_nolock(handle, data, size);
JMF 0:24d3eb812fd4 396 _mutex.unlock();
JMF 0:24d3eb812fd4 397 return ret;
JMF 0:24d3eb812fd4 398 }
JMF 0:24d3eb812fd4 399
JMF 0:24d3eb812fd4 400 /* CAREFULL LOCK must be taken before callling this function */
JMF 0:24d3eb812fd4 401 int ISM43362Interface::socket_send_nolock(void *handle, const void *data, unsigned size)
JMF 0:24d3eb812fd4 402 {
JMF 0:24d3eb812fd4 403 struct ISM43362_socket *socket = (struct ISM43362_socket *)handle;
JMF 0:24d3eb812fd4 404
JMF 0:24d3eb812fd4 405 if (size > ES_WIFI_MAX_TX_PACKET_SIZE) {
JMF 0:24d3eb812fd4 406 size = ES_WIFI_MAX_TX_PACKET_SIZE;
JMF 0:24d3eb812fd4 407 }
JMF 0:24d3eb812fd4 408
JMF 0:24d3eb812fd4 409 if (!_ism.send(socket->id, data, size)) {
JMF 0:24d3eb812fd4 410 debug_if(_ism_debug, "ISM43362Interface: socket_send ERROR\r\n");
JMF 0:24d3eb812fd4 411 return NSAPI_ERROR_DEVICE_ERROR; // or WOULD_BLOCK ?
JMF 0:24d3eb812fd4 412 }
JMF 0:24d3eb812fd4 413
JMF 0:24d3eb812fd4 414 return size;
JMF 0:24d3eb812fd4 415 }
JMF 0:24d3eb812fd4 416
JMF 0:24d3eb812fd4 417 int ISM43362Interface::socket_recv(void *handle, void *data, unsigned size)
JMF 0:24d3eb812fd4 418 {
JMF 0:24d3eb812fd4 419 _mutex.lock();
JMF 0:24d3eb812fd4 420 unsigned recv = 0;
JMF 0:24d3eb812fd4 421 struct ISM43362_socket *socket = (struct ISM43362_socket *)handle;
JMF 0:24d3eb812fd4 422 char *ptr = (char *)data;
JMF 0:24d3eb812fd4 423
JMF 0:24d3eb812fd4 424 // debug_if(_ism_debug, "ISM43362Interface socket_recv: req=%d read_data_size=%d connected %d\r\n", size, socket->read_data_size, socket->connected);
JMF 0:24d3eb812fd4 425
JMF 0:24d3eb812fd4 426 if (!socket->connected) {
JMF 0:24d3eb812fd4 427 _mutex.unlock();
JMF 0:24d3eb812fd4 428 return NSAPI_ERROR_CONNECTION_LOST;
JMF 0:24d3eb812fd4 429 }
JMF 0:24d3eb812fd4 430
JMF 0:24d3eb812fd4 431 if (socket->read_data_size == 0) {
JMF 0:24d3eb812fd4 432 /* if no callback is set, no need to read ?*/
JMF 0:24d3eb812fd4 433 int read_amount = _ism.check_recv_status(socket->id, socket->read_data);
JMF 0:24d3eb812fd4 434 if (read_amount > 0) {
JMF 0:24d3eb812fd4 435 socket->read_data_size = read_amount;
JMF 0:24d3eb812fd4 436 } else if (read_amount < 0) {
JMF 0:24d3eb812fd4 437 socket->connected = false;
JMF 0:24d3eb812fd4 438 debug_if(_ism_debug, "ISM43362Interface socket_recv: socket closed\r\n");
JMF 0:24d3eb812fd4 439 _mutex.unlock();
JMF 0:24d3eb812fd4 440 return NSAPI_ERROR_CONNECTION_LOST;
JMF 0:24d3eb812fd4 441 }
JMF 0:24d3eb812fd4 442 }
JMF 0:24d3eb812fd4 443
JMF 0:24d3eb812fd4 444 if (socket->read_data_size != 0) {
JMF 0:24d3eb812fd4 445 // debug_if(_ism_debug, "ISM43362Interface socket_recv: read_data_size=%d\r\n", socket->read_data_size);
JMF 0:24d3eb812fd4 446 uint32_t i = 0;
JMF 0:24d3eb812fd4 447 while ((i < socket->read_data_size) && (i < size)) {
JMF 0:24d3eb812fd4 448 *ptr++ = socket->read_data[i];
JMF 0:24d3eb812fd4 449 i++;
JMF 0:24d3eb812fd4 450 }
JMF 0:24d3eb812fd4 451
JMF 0:24d3eb812fd4 452 recv += i;
JMF 0:24d3eb812fd4 453
JMF 0:24d3eb812fd4 454 if (i >= socket->read_data_size) {
JMF 0:24d3eb812fd4 455 /* All the storeed data has been read, reset buffer */
JMF 0:24d3eb812fd4 456 memset(socket->read_data, 0, sizeof(socket->read_data));
JMF 0:24d3eb812fd4 457 socket->read_data_size = 0;
JMF 0:24d3eb812fd4 458 // debug_if(_ism_debug, "ISM43362Interface: Socket_recv buffer reset\r\n");
JMF 0:24d3eb812fd4 459 } else {
JMF 0:24d3eb812fd4 460 /* In case there is remaining data in buffer, update socket content
JMF 0:24d3eb812fd4 461 * For now by shift copy of all data (not very efficient to be
JMF 0:24d3eb812fd4 462 * revised */
JMF 0:24d3eb812fd4 463 while (i < socket->read_data_size) {
JMF 0:24d3eb812fd4 464 socket->read_data[i - size] = socket->read_data[i];
JMF 0:24d3eb812fd4 465 i++;
JMF 0:24d3eb812fd4 466 }
JMF 0:24d3eb812fd4 467
JMF 0:24d3eb812fd4 468 socket->read_data_size -= size;
JMF 0:24d3eb812fd4 469 }
JMF 0:24d3eb812fd4 470 }
JMF 0:24d3eb812fd4 471 // else {
JMF 0:24d3eb812fd4 472 // debug_if(_ism_debug, "ISM43362Interface socket_recv: Nothing in buffer\r\n");
JMF 0:24d3eb812fd4 473 // }
JMF 0:24d3eb812fd4 474
JMF 0:24d3eb812fd4 475 _mutex.unlock();
JMF 0:24d3eb812fd4 476
JMF 0:24d3eb812fd4 477 if (recv > 0) {
JMF 0:24d3eb812fd4 478 debug_if(_ism_debug, "ISM43362Interface socket_recv: recv=%d\r\n", recv);
JMF 0:24d3eb812fd4 479 return recv;
JMF 0:24d3eb812fd4 480 } else {
JMF 0:24d3eb812fd4 481 debug_if(_ism_debug, "ISM43362Interface socket_recv: returns WOULD BLOCK\r\n");
JMF 0:24d3eb812fd4 482 return NSAPI_ERROR_WOULD_BLOCK;
JMF 0:24d3eb812fd4 483 }
JMF 0:24d3eb812fd4 484 }
JMF 0:24d3eb812fd4 485
JMF 0:24d3eb812fd4 486 int ISM43362Interface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size)
JMF 0:24d3eb812fd4 487 {
JMF 0:24d3eb812fd4 488 _mutex.lock();
JMF 0:24d3eb812fd4 489 struct ISM43362_socket *socket = (struct ISM43362_socket *)handle;
JMF 0:24d3eb812fd4 490
JMF 0:24d3eb812fd4 491 if (socket->connected && socket->addr != addr) {
JMF 0:24d3eb812fd4 492 if (!_ism.close(socket->id)) {
JMF 0:24d3eb812fd4 493 debug_if(_ism_debug, "ISM43362Interface: socket_sendto ERROR\r\n");
JMF 0:24d3eb812fd4 494 _mutex.unlock();
JMF 0:24d3eb812fd4 495 return NSAPI_ERROR_DEVICE_ERROR;
JMF 0:24d3eb812fd4 496 }
JMF 0:24d3eb812fd4 497 socket->connected = false;
JMF 0:24d3eb812fd4 498 _ids[socket->id] = false;
JMF 0:24d3eb812fd4 499 _socket_obj[socket->id] = 0;
JMF 0:24d3eb812fd4 500 }
JMF 0:24d3eb812fd4 501
JMF 0:24d3eb812fd4 502 if (!socket->connected) {
JMF 0:24d3eb812fd4 503 int err = socket_connect_nolock(socket, addr);
JMF 0:24d3eb812fd4 504 if (err < 0) {
JMF 0:24d3eb812fd4 505 _mutex.unlock();
JMF 0:24d3eb812fd4 506 return err;
JMF 0:24d3eb812fd4 507 }
JMF 0:24d3eb812fd4 508 socket->addr = addr;
JMF 0:24d3eb812fd4 509 }
JMF 0:24d3eb812fd4 510
JMF 0:24d3eb812fd4 511 int ret = socket_send_nolock(socket, data, size);
JMF 0:24d3eb812fd4 512
JMF 0:24d3eb812fd4 513 _mutex.unlock();
JMF 0:24d3eb812fd4 514
JMF 0:24d3eb812fd4 515 return ret;
JMF 0:24d3eb812fd4 516 }
JMF 0:24d3eb812fd4 517
JMF 0:24d3eb812fd4 518 int ISM43362Interface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
JMF 0:24d3eb812fd4 519 {
JMF 0:24d3eb812fd4 520 int ret = socket_recv(handle, data, size);
JMF 0:24d3eb812fd4 521 _mutex.lock();
JMF 0:24d3eb812fd4 522 if ((ret >= 0) && addr) {
JMF 0:24d3eb812fd4 523 struct ISM43362_socket *socket = (struct ISM43362_socket *)handle;
JMF 0:24d3eb812fd4 524 *addr = socket->addr;
JMF 0:24d3eb812fd4 525 }
JMF 0:24d3eb812fd4 526 _mutex.unlock();
JMF 0:24d3eb812fd4 527 return ret;
JMF 0:24d3eb812fd4 528 }
JMF 0:24d3eb812fd4 529
JMF 0:24d3eb812fd4 530 void ISM43362Interface::socket_attach(void *handle, void (*cb)(void *), void *data)
JMF 0:24d3eb812fd4 531 {
JMF 0:24d3eb812fd4 532 _mutex.lock();
JMF 0:24d3eb812fd4 533 struct ISM43362_socket *socket = (struct ISM43362_socket *)handle;
JMF 0:24d3eb812fd4 534 _cbs[socket->id].callback = cb;
JMF 0:24d3eb812fd4 535 _cbs[socket->id].data = data;
JMF 0:24d3eb812fd4 536 _mutex.unlock();
JMF 0:24d3eb812fd4 537 }
JMF 0:24d3eb812fd4 538
JMF 0:24d3eb812fd4 539 void ISM43362Interface::event()
JMF 0:24d3eb812fd4 540 {
JMF 0:24d3eb812fd4 541 for (int i = 0; i < ISM43362_SOCKET_COUNT; i++) {
JMF 0:24d3eb812fd4 542 if (_cbs[i].callback) {
JMF 0:24d3eb812fd4 543 _cbs[i].callback(_cbs[i].data);
JMF 0:24d3eb812fd4 544 }
JMF 0:24d3eb812fd4 545 }
JMF 0:24d3eb812fd4 546 }
JMF 0:24d3eb812fd4 547
JMF 0:24d3eb812fd4 548 #if MBED_CONF_ISM43362_PROVIDE_DEFAULT
JMF 0:24d3eb812fd4 549
JMF 0:24d3eb812fd4 550 WiFiInterface *WiFiInterface::get_default_instance() {
JMF 0:24d3eb812fd4 551 static ISM43362Interface ism;
JMF 0:24d3eb812fd4 552 return &ism;
JMF 0:24d3eb812fd4 553 }
JMF 0:24d3eb812fd4 554
JMF 0:24d3eb812fd4 555 #endif