Mbed Cloud example program for workshop in W27 2018.

Dependencies:   MMA7660 LM75B

Committer:
MACRUM
Date:
Sat Jun 30 01:40:30 2018 +0000
Revision:
0:119624335925
Initial commit

Who changed what in which revision?

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