Disco-L475VG-IOT / wifi-ism43362
Committer:
marcel1691
Date:
Wed Oct 03 14:03:01 2018 +0000
Revision:
0:62e55edab701
WiFi ISM43363

Who changed what in which revision?

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