Simulated product dispenser

Dependencies:   HTS221

Fork of mbed-cloud-workshop-connect-HTS221 by Jim Carver

Committer:
JimCarver
Date:
Thu Oct 25 14:00:12 2018 +0000
Revision:
4:e518dde96e59
Parent:
0:6b753f761943
Simulated dispenser

Who changed what in which revision?

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