http

Committer:
reeml3
Date:
Mon Apr 15 18:12:24 2019 +0000
Revision:
1:ce6ccd14af4c
Parent:
0:a49e37a83a7a
http

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DuaaAbusharkh 0:a49e37a83a7a 1 /* ESP8266 implementation of NetworkInterfaceAPI
DuaaAbusharkh 0:a49e37a83a7a 2 * Copyright (c) 2015 ARM Limited
DuaaAbusharkh 0:a49e37a83a7a 3 *
DuaaAbusharkh 0:a49e37a83a7a 4 * Licensed under the Apache License, Version 2.0 (the "License");
DuaaAbusharkh 0:a49e37a83a7a 5 * you may not use this file except in compliance with the License.
DuaaAbusharkh 0:a49e37a83a7a 6 * You may obtain a copy of the License at
DuaaAbusharkh 0:a49e37a83a7a 7 *
DuaaAbusharkh 0:a49e37a83a7a 8 * http://www.apache.org/licenses/LICENSE-2.0
DuaaAbusharkh 0:a49e37a83a7a 9 *
DuaaAbusharkh 0:a49e37a83a7a 10 * Unless required by applicable law or agreed to in writing, software
DuaaAbusharkh 0:a49e37a83a7a 11 * distributed under the License is distributed on an "AS IS" BASIS,
DuaaAbusharkh 0:a49e37a83a7a 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
DuaaAbusharkh 0:a49e37a83a7a 13 * See the License for the specific language governing permissions and
DuaaAbusharkh 0:a49e37a83a7a 14 * limitations under the License.
DuaaAbusharkh 0:a49e37a83a7a 15 */
DuaaAbusharkh 0:a49e37a83a7a 16
DuaaAbusharkh 0:a49e37a83a7a 17 #include <string.h>
DuaaAbusharkh 0:a49e37a83a7a 18 #include "ESP8266Interface.h"
DuaaAbusharkh 0:a49e37a83a7a 19 #include "mbed_debug.h"
DuaaAbusharkh 0:a49e37a83a7a 20
DuaaAbusharkh 0:a49e37a83a7a 21 // Various timeouts for different ESP8266 operations
DuaaAbusharkh 0:a49e37a83a7a 22 #define ESP8266_CONNECT_TIMEOUT 15000
DuaaAbusharkh 0:a49e37a83a7a 23 #define ESP8266_SEND_TIMEOUT 500
DuaaAbusharkh 0:a49e37a83a7a 24 #define ESP8266_RECV_TIMEOUT 0
DuaaAbusharkh 0:a49e37a83a7a 25 #define ESP8266_MISC_TIMEOUT 500
DuaaAbusharkh 0:a49e37a83a7a 26
DuaaAbusharkh 0:a49e37a83a7a 27 // Firmware version
DuaaAbusharkh 0:a49e37a83a7a 28 #define ESP8266_VERSION 2
DuaaAbusharkh 0:a49e37a83a7a 29
DuaaAbusharkh 0:a49e37a83a7a 30 // ESP8266Interface implementation
DuaaAbusharkh 0:a49e37a83a7a 31 ESP8266Interface::ESP8266Interface(PinName tx, PinName rx, bool debug)
DuaaAbusharkh 0:a49e37a83a7a 32 : _esp(tx, rx, debug)
DuaaAbusharkh 0:a49e37a83a7a 33 {
DuaaAbusharkh 0:a49e37a83a7a 34 memset(_ids, 0, sizeof(_ids));
DuaaAbusharkh 0:a49e37a83a7a 35 memset(_cbs, 0, sizeof(_cbs));
DuaaAbusharkh 0:a49e37a83a7a 36
DuaaAbusharkh 0:a49e37a83a7a 37 _esp.attach(this, &ESP8266Interface::event);
DuaaAbusharkh 0:a49e37a83a7a 38 }
DuaaAbusharkh 0:a49e37a83a7a 39
DuaaAbusharkh 0:a49e37a83a7a 40 int ESP8266Interface::connect(const char *ssid, const char *pass, nsapi_security_t security,
DuaaAbusharkh 0:a49e37a83a7a 41 uint8_t channel)
DuaaAbusharkh 0:a49e37a83a7a 42 {
DuaaAbusharkh 0:a49e37a83a7a 43 if (channel != 0) {
DuaaAbusharkh 0:a49e37a83a7a 44 return NSAPI_ERROR_UNSUPPORTED;
DuaaAbusharkh 0:a49e37a83a7a 45 }
DuaaAbusharkh 0:a49e37a83a7a 46
DuaaAbusharkh 0:a49e37a83a7a 47 set_credentials(ssid, pass, security);
DuaaAbusharkh 0:a49e37a83a7a 48 return connect();
DuaaAbusharkh 0:a49e37a83a7a 49 }
DuaaAbusharkh 0:a49e37a83a7a 50
DuaaAbusharkh 0:a49e37a83a7a 51 int ESP8266Interface::connect()
DuaaAbusharkh 0:a49e37a83a7a 52 {
DuaaAbusharkh 0:a49e37a83a7a 53 _esp.setTimeout(ESP8266_CONNECT_TIMEOUT);
DuaaAbusharkh 0:a49e37a83a7a 54
DuaaAbusharkh 0:a49e37a83a7a 55 if (!_esp.reset()) {
DuaaAbusharkh 0:a49e37a83a7a 56 return NSAPI_ERROR_DEVICE_ERROR;
DuaaAbusharkh 0:a49e37a83a7a 57 }
DuaaAbusharkh 0:a49e37a83a7a 58
DuaaAbusharkh 0:a49e37a83a7a 59 _esp.setTimeout(ESP8266_MISC_TIMEOUT);
DuaaAbusharkh 0:a49e37a83a7a 60
DuaaAbusharkh 0:a49e37a83a7a 61 if (_esp.get_firmware_version() != ESP8266_VERSION) {
DuaaAbusharkh 0:a49e37a83a7a 62 debug("ESP8266: ERROR: Firmware incompatible with this driver.\
DuaaAbusharkh 0:a49e37a83a7a 63 \r\nUpdate to v%d - https://developer.mbed.org/teams/ESP8266/wiki/Firmware-Update\r\n",ESP8266_VERSION);
DuaaAbusharkh 0:a49e37a83a7a 64 return NSAPI_ERROR_DEVICE_ERROR;
DuaaAbusharkh 0:a49e37a83a7a 65 }
DuaaAbusharkh 0:a49e37a83a7a 66
DuaaAbusharkh 0:a49e37a83a7a 67 _esp.setTimeout(ESP8266_CONNECT_TIMEOUT);
DuaaAbusharkh 0:a49e37a83a7a 68
DuaaAbusharkh 0:a49e37a83a7a 69 if (!_esp.startup(3)) {
DuaaAbusharkh 0:a49e37a83a7a 70 return NSAPI_ERROR_DEVICE_ERROR;
DuaaAbusharkh 0:a49e37a83a7a 71 }
DuaaAbusharkh 0:a49e37a83a7a 72
DuaaAbusharkh 0:a49e37a83a7a 73 if (!_esp.dhcp(true, 1)) {
DuaaAbusharkh 0:a49e37a83a7a 74 return NSAPI_ERROR_DHCP_FAILURE;
DuaaAbusharkh 0:a49e37a83a7a 75 }
DuaaAbusharkh 0:a49e37a83a7a 76
DuaaAbusharkh 0:a49e37a83a7a 77 if (!_esp.connect(ap_ssid, ap_pass)) {
DuaaAbusharkh 0:a49e37a83a7a 78 return NSAPI_ERROR_NO_CONNECTION;
DuaaAbusharkh 0:a49e37a83a7a 79 }
DuaaAbusharkh 0:a49e37a83a7a 80
DuaaAbusharkh 0:a49e37a83a7a 81 if (!_esp.getIPAddress()) {
DuaaAbusharkh 0:a49e37a83a7a 82 return NSAPI_ERROR_DHCP_FAILURE;
DuaaAbusharkh 0:a49e37a83a7a 83 }
DuaaAbusharkh 0:a49e37a83a7a 84
DuaaAbusharkh 0:a49e37a83a7a 85 return NSAPI_ERROR_OK;
DuaaAbusharkh 0:a49e37a83a7a 86 }
DuaaAbusharkh 0:a49e37a83a7a 87
DuaaAbusharkh 0:a49e37a83a7a 88 int ESP8266Interface::set_credentials(const char *ssid, const char *pass, nsapi_security_t security)
DuaaAbusharkh 0:a49e37a83a7a 89 {
DuaaAbusharkh 0:a49e37a83a7a 90 memset(ap_ssid, 0, sizeof(ap_ssid));
DuaaAbusharkh 0:a49e37a83a7a 91 strncpy(ap_ssid, ssid, sizeof(ap_ssid));
DuaaAbusharkh 0:a49e37a83a7a 92
DuaaAbusharkh 0:a49e37a83a7a 93 memset(ap_pass, 0, sizeof(ap_pass));
DuaaAbusharkh 0:a49e37a83a7a 94 strncpy(ap_pass, pass, sizeof(ap_pass));
DuaaAbusharkh 0:a49e37a83a7a 95
DuaaAbusharkh 0:a49e37a83a7a 96 ap_sec = security;
DuaaAbusharkh 0:a49e37a83a7a 97
DuaaAbusharkh 0:a49e37a83a7a 98 return 0;
DuaaAbusharkh 0:a49e37a83a7a 99 }
DuaaAbusharkh 0:a49e37a83a7a 100
DuaaAbusharkh 0:a49e37a83a7a 101 int ESP8266Interface::set_channel(uint8_t channel)
DuaaAbusharkh 0:a49e37a83a7a 102 {
DuaaAbusharkh 0:a49e37a83a7a 103 return NSAPI_ERROR_UNSUPPORTED;
DuaaAbusharkh 0:a49e37a83a7a 104 }
DuaaAbusharkh 0:a49e37a83a7a 105
DuaaAbusharkh 0:a49e37a83a7a 106
DuaaAbusharkh 0:a49e37a83a7a 107 int ESP8266Interface::disconnect()
DuaaAbusharkh 0:a49e37a83a7a 108 {
DuaaAbusharkh 0:a49e37a83a7a 109 _esp.setTimeout(ESP8266_MISC_TIMEOUT);
DuaaAbusharkh 0:a49e37a83a7a 110
DuaaAbusharkh 0:a49e37a83a7a 111 if (!_esp.disconnect()) {
DuaaAbusharkh 0:a49e37a83a7a 112 return NSAPI_ERROR_DEVICE_ERROR;
DuaaAbusharkh 0:a49e37a83a7a 113 }
DuaaAbusharkh 0:a49e37a83a7a 114
DuaaAbusharkh 0:a49e37a83a7a 115 return NSAPI_ERROR_OK;
DuaaAbusharkh 0:a49e37a83a7a 116 }
DuaaAbusharkh 0:a49e37a83a7a 117
DuaaAbusharkh 0:a49e37a83a7a 118 const char *ESP8266Interface::get_ip_address()
DuaaAbusharkh 0:a49e37a83a7a 119 {
DuaaAbusharkh 0:a49e37a83a7a 120 return _esp.getIPAddress();
DuaaAbusharkh 0:a49e37a83a7a 121 }
DuaaAbusharkh 0:a49e37a83a7a 122
DuaaAbusharkh 0:a49e37a83a7a 123 const char *ESP8266Interface::get_mac_address()
DuaaAbusharkh 0:a49e37a83a7a 124 {
DuaaAbusharkh 0:a49e37a83a7a 125 return _esp.getMACAddress();
DuaaAbusharkh 0:a49e37a83a7a 126 }
DuaaAbusharkh 0:a49e37a83a7a 127
DuaaAbusharkh 0:a49e37a83a7a 128 const char *ESP8266Interface::get_gateway()
DuaaAbusharkh 0:a49e37a83a7a 129 {
DuaaAbusharkh 0:a49e37a83a7a 130 return _esp.getGateway();
DuaaAbusharkh 0:a49e37a83a7a 131 }
DuaaAbusharkh 0:a49e37a83a7a 132
DuaaAbusharkh 0:a49e37a83a7a 133 const char *ESP8266Interface::get_netmask()
DuaaAbusharkh 0:a49e37a83a7a 134 {
DuaaAbusharkh 0:a49e37a83a7a 135 return _esp.getNetmask();
DuaaAbusharkh 0:a49e37a83a7a 136 }
DuaaAbusharkh 0:a49e37a83a7a 137
DuaaAbusharkh 0:a49e37a83a7a 138 int8_t ESP8266Interface::get_rssi()
DuaaAbusharkh 0:a49e37a83a7a 139 {
DuaaAbusharkh 0:a49e37a83a7a 140 return _esp.getRSSI();
DuaaAbusharkh 0:a49e37a83a7a 141 }
DuaaAbusharkh 0:a49e37a83a7a 142
DuaaAbusharkh 0:a49e37a83a7a 143 int ESP8266Interface::scan(WiFiAccessPoint *res, unsigned count)
DuaaAbusharkh 0:a49e37a83a7a 144 {
DuaaAbusharkh 0:a49e37a83a7a 145 return _esp.scan(res, count);
DuaaAbusharkh 0:a49e37a83a7a 146 }
DuaaAbusharkh 0:a49e37a83a7a 147
DuaaAbusharkh 0:a49e37a83a7a 148 struct esp8266_socket {
DuaaAbusharkh 0:a49e37a83a7a 149 int id;
DuaaAbusharkh 0:a49e37a83a7a 150 nsapi_protocol_t proto;
DuaaAbusharkh 0:a49e37a83a7a 151 bool connected;
DuaaAbusharkh 0:a49e37a83a7a 152 SocketAddress addr;
DuaaAbusharkh 0:a49e37a83a7a 153 };
DuaaAbusharkh 0:a49e37a83a7a 154
DuaaAbusharkh 0:a49e37a83a7a 155 int ESP8266Interface::socket_open(void **handle, nsapi_protocol_t proto)
DuaaAbusharkh 0:a49e37a83a7a 156 {
DuaaAbusharkh 0:a49e37a83a7a 157 // Look for an unused socket
DuaaAbusharkh 0:a49e37a83a7a 158 int id = -1;
DuaaAbusharkh 0:a49e37a83a7a 159
DuaaAbusharkh 0:a49e37a83a7a 160 for (int i = 0; i < ESP8266_SOCKET_COUNT; i++) {
DuaaAbusharkh 0:a49e37a83a7a 161 if (!_ids[i]) {
DuaaAbusharkh 0:a49e37a83a7a 162 id = i;
DuaaAbusharkh 0:a49e37a83a7a 163 _ids[i] = true;
DuaaAbusharkh 0:a49e37a83a7a 164 break;
DuaaAbusharkh 0:a49e37a83a7a 165 }
DuaaAbusharkh 0:a49e37a83a7a 166 }
DuaaAbusharkh 0:a49e37a83a7a 167
DuaaAbusharkh 0:a49e37a83a7a 168 if (id == -1) {
DuaaAbusharkh 0:a49e37a83a7a 169 return NSAPI_ERROR_NO_SOCKET;
DuaaAbusharkh 0:a49e37a83a7a 170 }
DuaaAbusharkh 0:a49e37a83a7a 171
DuaaAbusharkh 0:a49e37a83a7a 172 struct esp8266_socket *socket = new struct esp8266_socket;
DuaaAbusharkh 0:a49e37a83a7a 173 if (!socket) {
DuaaAbusharkh 0:a49e37a83a7a 174 return NSAPI_ERROR_NO_SOCKET;
DuaaAbusharkh 0:a49e37a83a7a 175 }
DuaaAbusharkh 0:a49e37a83a7a 176
DuaaAbusharkh 0:a49e37a83a7a 177 socket->id = id;
DuaaAbusharkh 0:a49e37a83a7a 178 socket->proto = proto;
DuaaAbusharkh 0:a49e37a83a7a 179 socket->connected = false;
DuaaAbusharkh 0:a49e37a83a7a 180 *handle = socket;
DuaaAbusharkh 0:a49e37a83a7a 181 return 0;
DuaaAbusharkh 0:a49e37a83a7a 182 }
DuaaAbusharkh 0:a49e37a83a7a 183
DuaaAbusharkh 0:a49e37a83a7a 184 int ESP8266Interface::socket_close(void *handle)
DuaaAbusharkh 0:a49e37a83a7a 185 {
DuaaAbusharkh 0:a49e37a83a7a 186 struct esp8266_socket *socket = (struct esp8266_socket *)handle;
DuaaAbusharkh 0:a49e37a83a7a 187 int err = 0;
DuaaAbusharkh 0:a49e37a83a7a 188 _esp.setTimeout(ESP8266_MISC_TIMEOUT);
DuaaAbusharkh 0:a49e37a83a7a 189
DuaaAbusharkh 0:a49e37a83a7a 190 if (socket->connected && !_esp.close(socket->id)) {
DuaaAbusharkh 0:a49e37a83a7a 191 err = NSAPI_ERROR_DEVICE_ERROR;
DuaaAbusharkh 0:a49e37a83a7a 192 }
DuaaAbusharkh 0:a49e37a83a7a 193
DuaaAbusharkh 0:a49e37a83a7a 194 socket->connected = false;
DuaaAbusharkh 0:a49e37a83a7a 195 _ids[socket->id] = false;
DuaaAbusharkh 0:a49e37a83a7a 196 delete socket;
DuaaAbusharkh 0:a49e37a83a7a 197 return err;
DuaaAbusharkh 0:a49e37a83a7a 198 }
DuaaAbusharkh 0:a49e37a83a7a 199
DuaaAbusharkh 0:a49e37a83a7a 200 int ESP8266Interface::socket_bind(void *handle, const SocketAddress &address)
DuaaAbusharkh 0:a49e37a83a7a 201 {
DuaaAbusharkh 0:a49e37a83a7a 202 return NSAPI_ERROR_UNSUPPORTED;
DuaaAbusharkh 0:a49e37a83a7a 203 }
DuaaAbusharkh 0:a49e37a83a7a 204
DuaaAbusharkh 0:a49e37a83a7a 205 int ESP8266Interface::socket_listen(void *handle, int backlog)
DuaaAbusharkh 0:a49e37a83a7a 206 {
DuaaAbusharkh 0:a49e37a83a7a 207 return NSAPI_ERROR_UNSUPPORTED;
DuaaAbusharkh 0:a49e37a83a7a 208 }
DuaaAbusharkh 0:a49e37a83a7a 209
DuaaAbusharkh 0:a49e37a83a7a 210 int ESP8266Interface::socket_connect(void *handle, const SocketAddress &addr)
DuaaAbusharkh 0:a49e37a83a7a 211 {
DuaaAbusharkh 0:a49e37a83a7a 212 struct esp8266_socket *socket = (struct esp8266_socket *)handle;
DuaaAbusharkh 0:a49e37a83a7a 213 _esp.setTimeout(ESP8266_MISC_TIMEOUT);
DuaaAbusharkh 0:a49e37a83a7a 214
DuaaAbusharkh 0:a49e37a83a7a 215 const char *proto = (socket->proto == NSAPI_UDP) ? "UDP" : "TCP";
DuaaAbusharkh 0:a49e37a83a7a 216 if (!_esp.open(proto, socket->id, addr.get_ip_address(), addr.get_port())) {
DuaaAbusharkh 0:a49e37a83a7a 217 return NSAPI_ERROR_DEVICE_ERROR;
DuaaAbusharkh 0:a49e37a83a7a 218 }
DuaaAbusharkh 0:a49e37a83a7a 219
DuaaAbusharkh 0:a49e37a83a7a 220 socket->connected = true;
DuaaAbusharkh 0:a49e37a83a7a 221 return 0;
DuaaAbusharkh 0:a49e37a83a7a 222 }
DuaaAbusharkh 0:a49e37a83a7a 223
DuaaAbusharkh 0:a49e37a83a7a 224 int ESP8266Interface::socket_accept(void *server, void **socket, SocketAddress *addr)
DuaaAbusharkh 0:a49e37a83a7a 225 {
DuaaAbusharkh 0:a49e37a83a7a 226 return NSAPI_ERROR_UNSUPPORTED;
DuaaAbusharkh 0:a49e37a83a7a 227 }
DuaaAbusharkh 0:a49e37a83a7a 228
DuaaAbusharkh 0:a49e37a83a7a 229 int ESP8266Interface::socket_send(void *handle, const void *data, unsigned size)
DuaaAbusharkh 0:a49e37a83a7a 230 {
DuaaAbusharkh 0:a49e37a83a7a 231 struct esp8266_socket *socket = (struct esp8266_socket *)handle;
DuaaAbusharkh 0:a49e37a83a7a 232 _esp.setTimeout(ESP8266_SEND_TIMEOUT);
DuaaAbusharkh 0:a49e37a83a7a 233
DuaaAbusharkh 0:a49e37a83a7a 234 if (!_esp.send(socket->id, data, size)) {
DuaaAbusharkh 0:a49e37a83a7a 235 return NSAPI_ERROR_DEVICE_ERROR;
DuaaAbusharkh 0:a49e37a83a7a 236 }
DuaaAbusharkh 0:a49e37a83a7a 237
DuaaAbusharkh 0:a49e37a83a7a 238 return size;
DuaaAbusharkh 0:a49e37a83a7a 239 }
DuaaAbusharkh 0:a49e37a83a7a 240
DuaaAbusharkh 0:a49e37a83a7a 241 int ESP8266Interface::socket_recv(void *handle, void *data, unsigned size)
DuaaAbusharkh 0:a49e37a83a7a 242 {
DuaaAbusharkh 0:a49e37a83a7a 243 struct esp8266_socket *socket = (struct esp8266_socket *)handle;
DuaaAbusharkh 0:a49e37a83a7a 244 _esp.setTimeout(ESP8266_RECV_TIMEOUT);
DuaaAbusharkh 0:a49e37a83a7a 245
DuaaAbusharkh 0:a49e37a83a7a 246 int32_t recv = _esp.recv(socket->id, data, size);
DuaaAbusharkh 0:a49e37a83a7a 247 if (recv < 0) {
DuaaAbusharkh 0:a49e37a83a7a 248 return NSAPI_ERROR_WOULD_BLOCK;
DuaaAbusharkh 0:a49e37a83a7a 249 }
DuaaAbusharkh 0:a49e37a83a7a 250
DuaaAbusharkh 0:a49e37a83a7a 251 return recv;
DuaaAbusharkh 0:a49e37a83a7a 252 }
DuaaAbusharkh 0:a49e37a83a7a 253
DuaaAbusharkh 0:a49e37a83a7a 254 int ESP8266Interface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size)
DuaaAbusharkh 0:a49e37a83a7a 255 {
DuaaAbusharkh 0:a49e37a83a7a 256 struct esp8266_socket *socket = (struct esp8266_socket *)handle;
DuaaAbusharkh 0:a49e37a83a7a 257
DuaaAbusharkh 0:a49e37a83a7a 258 if (socket->connected && socket->addr != addr) {
DuaaAbusharkh 0:a49e37a83a7a 259 _esp.setTimeout(ESP8266_MISC_TIMEOUT);
DuaaAbusharkh 0:a49e37a83a7a 260 if (!_esp.close(socket->id)) {
DuaaAbusharkh 0:a49e37a83a7a 261 return NSAPI_ERROR_DEVICE_ERROR;
DuaaAbusharkh 0:a49e37a83a7a 262 }
DuaaAbusharkh 0:a49e37a83a7a 263 socket->connected = false;
DuaaAbusharkh 0:a49e37a83a7a 264 }
DuaaAbusharkh 0:a49e37a83a7a 265
DuaaAbusharkh 0:a49e37a83a7a 266 if (!socket->connected) {
DuaaAbusharkh 0:a49e37a83a7a 267 int err = socket_connect(socket, addr);
DuaaAbusharkh 0:a49e37a83a7a 268 if (err < 0) {
DuaaAbusharkh 0:a49e37a83a7a 269 return err;
DuaaAbusharkh 0:a49e37a83a7a 270 }
DuaaAbusharkh 0:a49e37a83a7a 271 socket->addr = addr;
DuaaAbusharkh 0:a49e37a83a7a 272 }
DuaaAbusharkh 0:a49e37a83a7a 273
DuaaAbusharkh 0:a49e37a83a7a 274 return socket_send(socket, data, size);
DuaaAbusharkh 0:a49e37a83a7a 275 }
DuaaAbusharkh 0:a49e37a83a7a 276
DuaaAbusharkh 0:a49e37a83a7a 277 int ESP8266Interface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
DuaaAbusharkh 0:a49e37a83a7a 278 {
DuaaAbusharkh 0:a49e37a83a7a 279 struct esp8266_socket *socket = (struct esp8266_socket *)handle;
DuaaAbusharkh 0:a49e37a83a7a 280 int ret = socket_recv(socket, data, size);
DuaaAbusharkh 0:a49e37a83a7a 281 if (ret >= 0 && addr) {
DuaaAbusharkh 0:a49e37a83a7a 282 *addr = socket->addr;
DuaaAbusharkh 0:a49e37a83a7a 283 }
DuaaAbusharkh 0:a49e37a83a7a 284
DuaaAbusharkh 0:a49e37a83a7a 285 return ret;
DuaaAbusharkh 0:a49e37a83a7a 286 }
DuaaAbusharkh 0:a49e37a83a7a 287
DuaaAbusharkh 0:a49e37a83a7a 288 void ESP8266Interface::socket_attach(void *handle, void (*callback)(void *), void *data)
DuaaAbusharkh 0:a49e37a83a7a 289 {
DuaaAbusharkh 0:a49e37a83a7a 290 struct esp8266_socket *socket = (struct esp8266_socket *)handle;
DuaaAbusharkh 0:a49e37a83a7a 291 _cbs[socket->id].callback = callback;
DuaaAbusharkh 0:a49e37a83a7a 292 _cbs[socket->id].data = data;
DuaaAbusharkh 0:a49e37a83a7a 293 }
DuaaAbusharkh 0:a49e37a83a7a 294
DuaaAbusharkh 0:a49e37a83a7a 295 void ESP8266Interface::event() {
DuaaAbusharkh 0:a49e37a83a7a 296 for (int i = 0; i < ESP8266_SOCKET_COUNT; i++) {
DuaaAbusharkh 0:a49e37a83a7a 297 if (_cbs[i].callback) {
DuaaAbusharkh 0:a49e37a83a7a 298 _cbs[i].callback(_cbs[i].data);
DuaaAbusharkh 0:a49e37a83a7a 299 }
DuaaAbusharkh 0:a49e37a83a7a 300 }
DuaaAbusharkh 0:a49e37a83a7a 301 }