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 /* ESP8266 Example
MACRUM 0:119624335925 2 * Copyright (c) 2015 ARM Limited
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 "ESP8266.h"
MACRUM 0:119624335925 18 #include "mbed_debug.h"
MACRUM 0:119624335925 19 #include "nsapi_types.h"
MACRUM 0:119624335925 20
MACRUM 0:119624335925 21 #include <cstring>
MACRUM 0:119624335925 22
MACRUM 0:119624335925 23 #define ESP8266_DEFAULT_BAUD_RATE 115200
MACRUM 0:119624335925 24
MACRUM 0:119624335925 25 ESP8266::ESP8266(PinName tx, PinName rx, bool debug)
MACRUM 0:119624335925 26 : _serial(tx, rx, ESP8266_DEFAULT_BAUD_RATE),
MACRUM 0:119624335925 27 _parser(&_serial),
MACRUM 0:119624335925 28 _packets(0),
MACRUM 0:119624335925 29 _packets_end(&_packets),
MACRUM 0:119624335925 30 _connect_error(0),
MACRUM 0:119624335925 31 _fail(false),
MACRUM 0:119624335925 32 _socket_open()
MACRUM 0:119624335925 33 {
MACRUM 0:119624335925 34 _serial.set_baud( ESP8266_DEFAULT_BAUD_RATE );
MACRUM 0:119624335925 35 _parser.debug_on(debug);
MACRUM 0:119624335925 36 _parser.set_delimiter("\r\n");
MACRUM 0:119624335925 37 _parser.oob("+IPD", callback(this, &ESP8266::_packet_handler));
MACRUM 0:119624335925 38 //Note: espressif at command document says that this should be +CWJAP_CUR:<error code>
MACRUM 0:119624335925 39 //but seems that at least current version is not sending it
MACRUM 0:119624335925 40 //https://www.espressif.com/sites/default/files/documentation/4a-esp8266_at_instruction_set_en.pdf
MACRUM 0:119624335925 41 //Also seems that ERROR is not sent, but FAIL instead
MACRUM 0:119624335925 42 _parser.oob("+CWJAP:", callback(this, &ESP8266::_connect_error_handler));
MACRUM 0:119624335925 43 _parser.oob("0,CLOSED", callback(this, &ESP8266::_oob_socket0_closed_handler));
MACRUM 0:119624335925 44 _parser.oob("1,CLOSED", callback(this, &ESP8266::_oob_socket1_closed_handler));
MACRUM 0:119624335925 45 _parser.oob("2,CLOSED", callback(this, &ESP8266::_oob_socket2_closed_handler));
MACRUM 0:119624335925 46 _parser.oob("3,CLOSED", callback(this, &ESP8266::_oob_socket3_closed_handler));
MACRUM 0:119624335925 47 _parser.oob("4,CLOSED", callback(this, &ESP8266::_oob_socket4_closed_handler));
MACRUM 0:119624335925 48 }
MACRUM 0:119624335925 49
MACRUM 0:119624335925 50 int ESP8266::get_firmware_version()
MACRUM 0:119624335925 51 {
MACRUM 0:119624335925 52 int version;
MACRUM 0:119624335925 53
MACRUM 0:119624335925 54 _smutex.lock();
MACRUM 0:119624335925 55 bool done = _parser.send("AT+GMR")
MACRUM 0:119624335925 56 && _parser.recv("SDK version:%d", &version)
MACRUM 0:119624335925 57 && _parser.recv("OK\n");
MACRUM 0:119624335925 58 _smutex.unlock();
MACRUM 0:119624335925 59
MACRUM 0:119624335925 60 if(done) {
MACRUM 0:119624335925 61 return version;
MACRUM 0:119624335925 62 } else {
MACRUM 0:119624335925 63 // Older firmware versions do not prefix the version with "SDK version: "
MACRUM 0:119624335925 64 return -1;
MACRUM 0:119624335925 65 }
MACRUM 0:119624335925 66 }
MACRUM 0:119624335925 67
MACRUM 0:119624335925 68 bool ESP8266::startup(int mode)
MACRUM 0:119624335925 69 {
MACRUM 0:119624335925 70 if (!(mode == WIFIMODE_STATION || mode == WIFIMODE_SOFTAP
MACRUM 0:119624335925 71 || mode == WIFIMODE_STATION_SOFTAP)) {
MACRUM 0:119624335925 72 return false;
MACRUM 0:119624335925 73 }
MACRUM 0:119624335925 74
MACRUM 0:119624335925 75 _smutex.lock();
MACRUM 0:119624335925 76 setTimeout(ESP8266_CONNECT_TIMEOUT);
MACRUM 0:119624335925 77 bool done = _parser.send("AT+CWMODE_CUR=%d", mode)
MACRUM 0:119624335925 78 && _parser.recv("OK\n")
MACRUM 0:119624335925 79 &&_parser.send("AT+CIPMUX=1")
MACRUM 0:119624335925 80 && _parser.recv("OK\n");
MACRUM 0:119624335925 81 setTimeout(); //Restore default
MACRUM 0:119624335925 82 _smutex.unlock();
MACRUM 0:119624335925 83
MACRUM 0:119624335925 84 return done;
MACRUM 0:119624335925 85 }
MACRUM 0:119624335925 86
MACRUM 0:119624335925 87 bool ESP8266::reset(void)
MACRUM 0:119624335925 88 {
MACRUM 0:119624335925 89 _smutex.lock();
MACRUM 0:119624335925 90 setTimeout(ESP8266_CONNECT_TIMEOUT);
MACRUM 0:119624335925 91
MACRUM 0:119624335925 92 for (int i = 0; i < 2; i++) {
MACRUM 0:119624335925 93 if (_parser.send("AT+RST")
MACRUM 0:119624335925 94 && _parser.recv("OK\n")
MACRUM 0:119624335925 95 && _parser.recv("ready")) {
MACRUM 0:119624335925 96 _smutex.unlock();
MACRUM 0:119624335925 97 return true;
MACRUM 0:119624335925 98 }
MACRUM 0:119624335925 99 }
MACRUM 0:119624335925 100 setTimeout();
MACRUM 0:119624335925 101 _smutex.unlock();
MACRUM 0:119624335925 102
MACRUM 0:119624335925 103 return false;
MACRUM 0:119624335925 104 }
MACRUM 0:119624335925 105
MACRUM 0:119624335925 106 bool ESP8266::dhcp(bool enabled, int mode)
MACRUM 0:119624335925 107 {
MACRUM 0:119624335925 108 //only 3 valid modes
MACRUM 0:119624335925 109 if (mode < 0 || mode > 2) {
MACRUM 0:119624335925 110 return false;
MACRUM 0:119624335925 111 }
MACRUM 0:119624335925 112
MACRUM 0:119624335925 113 _smutex.lock();
MACRUM 0:119624335925 114 bool done = _parser.send("AT+CWDHCP_CUR=%d,%d", mode, enabled?1:0)
MACRUM 0:119624335925 115 && _parser.recv("OK\n");
MACRUM 0:119624335925 116 _smutex.unlock();
MACRUM 0:119624335925 117
MACRUM 0:119624335925 118 return done;
MACRUM 0:119624335925 119 }
MACRUM 0:119624335925 120
MACRUM 0:119624335925 121 nsapi_error_t ESP8266::connect(const char *ap, const char *passPhrase)
MACRUM 0:119624335925 122 {
MACRUM 0:119624335925 123 _smutex.lock();
MACRUM 0:119624335925 124 setTimeout(ESP8266_CONNECT_TIMEOUT);
MACRUM 0:119624335925 125
MACRUM 0:119624335925 126 _parser.send("AT+CWJAP_CUR=\"%s\",\"%s\"", ap, passPhrase);
MACRUM 0:119624335925 127 if (!_parser.recv("OK\n")) {
MACRUM 0:119624335925 128 if (_fail) {
MACRUM 0:119624335925 129 _smutex.unlock();
MACRUM 0:119624335925 130 nsapi_error_t ret;
MACRUM 0:119624335925 131 if (_connect_error == 1)
MACRUM 0:119624335925 132 ret = NSAPI_ERROR_CONNECTION_TIMEOUT;
MACRUM 0:119624335925 133 else if (_connect_error == 2)
MACRUM 0:119624335925 134 ret = NSAPI_ERROR_AUTH_FAILURE;
MACRUM 0:119624335925 135 else if (_connect_error == 3)
MACRUM 0:119624335925 136 ret = NSAPI_ERROR_NO_SSID;
MACRUM 0:119624335925 137 else
MACRUM 0:119624335925 138 ret = NSAPI_ERROR_NO_CONNECTION;
MACRUM 0:119624335925 139
MACRUM 0:119624335925 140 _fail = false;
MACRUM 0:119624335925 141 _connect_error = 0;
MACRUM 0:119624335925 142 return ret;
MACRUM 0:119624335925 143 }
MACRUM 0:119624335925 144 }
MACRUM 0:119624335925 145 setTimeout();
MACRUM 0:119624335925 146 _smutex.unlock();
MACRUM 0:119624335925 147
MACRUM 0:119624335925 148 return NSAPI_ERROR_OK;
MACRUM 0:119624335925 149 }
MACRUM 0:119624335925 150
MACRUM 0:119624335925 151 bool ESP8266::disconnect(void)
MACRUM 0:119624335925 152 {
MACRUM 0:119624335925 153 _smutex.lock();
MACRUM 0:119624335925 154 bool done = _parser.send("AT+CWQAP") && _parser.recv("OK\n");
MACRUM 0:119624335925 155 _smutex.unlock();
MACRUM 0:119624335925 156
MACRUM 0:119624335925 157 return done;
MACRUM 0:119624335925 158 }
MACRUM 0:119624335925 159
MACRUM 0:119624335925 160 const char *ESP8266::getIPAddress(void)
MACRUM 0:119624335925 161 {
MACRUM 0:119624335925 162 _smutex.lock();
MACRUM 0:119624335925 163 setTimeout(ESP8266_CONNECT_TIMEOUT);
MACRUM 0:119624335925 164 if (!(_parser.send("AT+CIFSR")
MACRUM 0:119624335925 165 && _parser.recv("+CIFSR:STAIP,\"%15[^\"]\"", _ip_buffer)
MACRUM 0:119624335925 166 && _parser.recv("OK\n"))) {
MACRUM 0:119624335925 167 _smutex.unlock();
MACRUM 0:119624335925 168 return 0;
MACRUM 0:119624335925 169 }
MACRUM 0:119624335925 170 setTimeout();
MACRUM 0:119624335925 171 _smutex.unlock();
MACRUM 0:119624335925 172
MACRUM 0:119624335925 173 return _ip_buffer;
MACRUM 0:119624335925 174 }
MACRUM 0:119624335925 175
MACRUM 0:119624335925 176 const char *ESP8266::getMACAddress(void)
MACRUM 0:119624335925 177 {
MACRUM 0:119624335925 178 _smutex.lock();
MACRUM 0:119624335925 179 if (!(_parser.send("AT+CIFSR")
MACRUM 0:119624335925 180 && _parser.recv("+CIFSR:STAMAC,\"%17[^\"]\"", _mac_buffer)
MACRUM 0:119624335925 181 && _parser.recv("OK\n"))) {
MACRUM 0:119624335925 182 _smutex.unlock();
MACRUM 0:119624335925 183 return 0;
MACRUM 0:119624335925 184 }
MACRUM 0:119624335925 185 _smutex.unlock();
MACRUM 0:119624335925 186
MACRUM 0:119624335925 187 return _mac_buffer;
MACRUM 0:119624335925 188 }
MACRUM 0:119624335925 189
MACRUM 0:119624335925 190 const char *ESP8266::getGateway()
MACRUM 0:119624335925 191 {
MACRUM 0:119624335925 192 _smutex.lock();
MACRUM 0:119624335925 193 if (!(_parser.send("AT+CIPSTA_CUR?")
MACRUM 0:119624335925 194 && _parser.recv("+CIPSTA_CUR:gateway:\"%15[^\"]\"", _gateway_buffer)
MACRUM 0:119624335925 195 && _parser.recv("OK\n"))) {
MACRUM 0:119624335925 196 _smutex.unlock();
MACRUM 0:119624335925 197 return 0;
MACRUM 0:119624335925 198 }
MACRUM 0:119624335925 199 _smutex.unlock();
MACRUM 0:119624335925 200
MACRUM 0:119624335925 201 return _gateway_buffer;
MACRUM 0:119624335925 202 }
MACRUM 0:119624335925 203
MACRUM 0:119624335925 204 const char *ESP8266::getNetmask()
MACRUM 0:119624335925 205 {
MACRUM 0:119624335925 206 _smutex.lock();
MACRUM 0:119624335925 207 if (!(_parser.send("AT+CIPSTA_CUR?")
MACRUM 0:119624335925 208 && _parser.recv("+CIPSTA_CUR:netmask:\"%15[^\"]\"", _netmask_buffer)
MACRUM 0:119624335925 209 && _parser.recv("OK\n"))) {
MACRUM 0:119624335925 210 _smutex.unlock();
MACRUM 0:119624335925 211 return 0;
MACRUM 0:119624335925 212 }
MACRUM 0:119624335925 213 _smutex.unlock();
MACRUM 0:119624335925 214
MACRUM 0:119624335925 215 return _netmask_buffer;
MACRUM 0:119624335925 216 }
MACRUM 0:119624335925 217
MACRUM 0:119624335925 218 int8_t ESP8266::getRSSI()
MACRUM 0:119624335925 219 {
MACRUM 0:119624335925 220 int8_t rssi;
MACRUM 0:119624335925 221 char bssid[18];
MACRUM 0:119624335925 222
MACRUM 0:119624335925 223 _smutex.lock();
MACRUM 0:119624335925 224 setTimeout(ESP8266_CONNECT_TIMEOUT);
MACRUM 0:119624335925 225 if (!(_parser.send("AT+CWJAP_CUR?")
MACRUM 0:119624335925 226 && _parser.recv("+CWJAP_CUR:\"%*[^\"]\",\"%17[^\"]\"", bssid)
MACRUM 0:119624335925 227 && _parser.recv("OK\n"))) {
MACRUM 0:119624335925 228 _smutex.unlock();
MACRUM 0:119624335925 229 return 0;
MACRUM 0:119624335925 230 }
MACRUM 0:119624335925 231 setTimeout();
MACRUM 0:119624335925 232 _smutex.unlock();
MACRUM 0:119624335925 233
MACRUM 0:119624335925 234 _smutex.lock();
MACRUM 0:119624335925 235 setTimeout(ESP8266_CONNECT_TIMEOUT);
MACRUM 0:119624335925 236 if (!(_parser.send("AT+CWLAP=\"\",\"%s\",", bssid)
MACRUM 0:119624335925 237 && _parser.recv("+CWLAP:(%*d,\"%*[^\"]\",%hhd,", &rssi)
MACRUM 0:119624335925 238 && _parser.recv("OK\n"))) {
MACRUM 0:119624335925 239 _smutex.unlock();
MACRUM 0:119624335925 240 return 0;
MACRUM 0:119624335925 241 }
MACRUM 0:119624335925 242 setTimeout();
MACRUM 0:119624335925 243 _smutex.unlock();
MACRUM 0:119624335925 244
MACRUM 0:119624335925 245 return rssi;
MACRUM 0:119624335925 246 }
MACRUM 0:119624335925 247
MACRUM 0:119624335925 248 int ESP8266::scan(WiFiAccessPoint *res, unsigned limit)
MACRUM 0:119624335925 249 {
MACRUM 0:119624335925 250 unsigned cnt = 0;
MACRUM 0:119624335925 251 nsapi_wifi_ap_t ap;
MACRUM 0:119624335925 252
MACRUM 0:119624335925 253 _smutex.lock();
MACRUM 0:119624335925 254 setTimeout(ESP8266_CONNECT_TIMEOUT);
MACRUM 0:119624335925 255
MACRUM 0:119624335925 256 if (!_parser.send("AT+CWLAP")) {
MACRUM 0:119624335925 257 _smutex.unlock();
MACRUM 0:119624335925 258 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:119624335925 259 }
MACRUM 0:119624335925 260
MACRUM 0:119624335925 261 while (recv_ap(&ap)) {
MACRUM 0:119624335925 262 if (cnt < limit) {
MACRUM 0:119624335925 263 res[cnt] = WiFiAccessPoint(ap);
MACRUM 0:119624335925 264 }
MACRUM 0:119624335925 265
MACRUM 0:119624335925 266 cnt++;
MACRUM 0:119624335925 267 if (limit != 0 && cnt >= limit) {
MACRUM 0:119624335925 268 break;
MACRUM 0:119624335925 269 }
MACRUM 0:119624335925 270 }
MACRUM 0:119624335925 271 setTimeout();
MACRUM 0:119624335925 272 _smutex.unlock();
MACRUM 0:119624335925 273
MACRUM 0:119624335925 274 return cnt;
MACRUM 0:119624335925 275 }
MACRUM 0:119624335925 276
MACRUM 0:119624335925 277 bool ESP8266::open_udp(int id, const char* addr, int port, int local_port)
MACRUM 0:119624335925 278 {
MACRUM 0:119624335925 279 static const char *type = "UDP";
MACRUM 0:119624335925 280 bool done = false;
MACRUM 0:119624335925 281
MACRUM 0:119624335925 282 if (id >= SOCKET_COUNT || _socket_open[id]) {
MACRUM 0:119624335925 283 return false;
MACRUM 0:119624335925 284 }
MACRUM 0:119624335925 285
MACRUM 0:119624335925 286 _smutex.lock();
MACRUM 0:119624335925 287 if(local_port) {
MACRUM 0:119624335925 288 done = _parser.send("AT+CIPSTART=%d,\"%s\",\"%s\",%d,%d", id, type, addr, port, local_port)
MACRUM 0:119624335925 289 && _parser.recv("OK\n");
MACRUM 0:119624335925 290 } else {
MACRUM 0:119624335925 291 done = _parser.send("AT+CIPSTART=%d,\"%s\",\"%s\",%d", id, type, addr, port)
MACRUM 0:119624335925 292 && _parser.recv("OK\n");
MACRUM 0:119624335925 293 }
MACRUM 0:119624335925 294
MACRUM 0:119624335925 295 if (done) {
MACRUM 0:119624335925 296 _socket_open[id] = 1;
MACRUM 0:119624335925 297 }
MACRUM 0:119624335925 298
MACRUM 0:119624335925 299 _smutex.unlock();
MACRUM 0:119624335925 300
MACRUM 0:119624335925 301 return done;
MACRUM 0:119624335925 302 }
MACRUM 0:119624335925 303
MACRUM 0:119624335925 304 bool ESP8266::open_tcp(int id, const char* addr, int port, int keepalive)
MACRUM 0:119624335925 305 {
MACRUM 0:119624335925 306 static const char *type = "TCP";
MACRUM 0:119624335925 307 bool done = false;
MACRUM 0:119624335925 308
MACRUM 0:119624335925 309 if (id >= SOCKET_COUNT || _socket_open[id]) {
MACRUM 0:119624335925 310 return false;
MACRUM 0:119624335925 311 }
MACRUM 0:119624335925 312
MACRUM 0:119624335925 313 _smutex.lock();
MACRUM 0:119624335925 314 if(keepalive) {
MACRUM 0:119624335925 315 done = _parser.send("AT+CIPSTART=%d,\"%s\",\"%s\",%d,%d", id, type, addr, port, keepalive)
MACRUM 0:119624335925 316 && _parser.recv("OK\n");
MACRUM 0:119624335925 317 } else {
MACRUM 0:119624335925 318 done = _parser.send("AT+CIPSTART=%d,\"%s\",\"%s\",%d", id, type, addr, port)
MACRUM 0:119624335925 319 && _parser.recv("OK\n");
MACRUM 0:119624335925 320 }
MACRUM 0:119624335925 321
MACRUM 0:119624335925 322 if (done) {
MACRUM 0:119624335925 323 _socket_open[id] = 1;
MACRUM 0:119624335925 324 }
MACRUM 0:119624335925 325
MACRUM 0:119624335925 326 _smutex.unlock();
MACRUM 0:119624335925 327
MACRUM 0:119624335925 328 return done;
MACRUM 0:119624335925 329 }
MACRUM 0:119624335925 330
MACRUM 0:119624335925 331 bool ESP8266::dns_lookup(const char* name, char* ip)
MACRUM 0:119624335925 332 {
MACRUM 0:119624335925 333 _smutex.lock();
MACRUM 0:119624335925 334 bool done = _parser.send("AT+CIPDOMAIN=\"%s\"", name) && _parser.recv("+CIPDOMAIN:%s%*[\r]%*[\n]", ip);
MACRUM 0:119624335925 335 _smutex.unlock();
MACRUM 0:119624335925 336
MACRUM 0:119624335925 337 return done;
MACRUM 0:119624335925 338 }
MACRUM 0:119624335925 339
MACRUM 0:119624335925 340 nsapi_error_t ESP8266::send(int id, const void *data, uint32_t amount)
MACRUM 0:119624335925 341 {
MACRUM 0:119624335925 342 //May take a second try if device is busy
MACRUM 0:119624335925 343 for (unsigned i = 0; i < 2; i++) {
MACRUM 0:119624335925 344 _smutex.lock();
MACRUM 0:119624335925 345 setTimeout(ESP8266_SEND_TIMEOUT);
MACRUM 0:119624335925 346 if (_parser.send("AT+CIPSEND=%d,%lu", id, amount)
MACRUM 0:119624335925 347 && _parser.recv(">")
MACRUM 0:119624335925 348 && _parser.write((char*)data, (int)amount) >= 0) {
MACRUM 0:119624335925 349 while (_parser.process_oob()); // multiple sends in a row require this
MACRUM 0:119624335925 350 _smutex.unlock();
MACRUM 0:119624335925 351 return NSAPI_ERROR_OK;
MACRUM 0:119624335925 352 }
MACRUM 0:119624335925 353 setTimeout();
MACRUM 0:119624335925 354 _smutex.unlock();
MACRUM 0:119624335925 355 }
MACRUM 0:119624335925 356
MACRUM 0:119624335925 357 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:119624335925 358 }
MACRUM 0:119624335925 359
MACRUM 0:119624335925 360 void ESP8266::_packet_handler()
MACRUM 0:119624335925 361 {
MACRUM 0:119624335925 362 int id;
MACRUM 0:119624335925 363 int amount;
MACRUM 0:119624335925 364
MACRUM 0:119624335925 365 // parse out the packet
MACRUM 0:119624335925 366 if (!_parser.recv(",%d,%d:", &id, &amount)) {
MACRUM 0:119624335925 367 return;
MACRUM 0:119624335925 368 }
MACRUM 0:119624335925 369
MACRUM 0:119624335925 370 struct packet *packet = (struct packet*)malloc(
MACRUM 0:119624335925 371 sizeof(struct packet) + amount);
MACRUM 0:119624335925 372 if (!packet) {
MACRUM 0:119624335925 373 debug("Could not allocate memory for RX data\n");
MACRUM 0:119624335925 374 return;
MACRUM 0:119624335925 375 }
MACRUM 0:119624335925 376
MACRUM 0:119624335925 377 packet->id = id;
MACRUM 0:119624335925 378 packet->len = amount;
MACRUM 0:119624335925 379 packet->next = 0;
MACRUM 0:119624335925 380
MACRUM 0:119624335925 381 if (_parser.read((char*)(packet + 1), amount) < amount) {
MACRUM 0:119624335925 382 free(packet);
MACRUM 0:119624335925 383 return;
MACRUM 0:119624335925 384 }
MACRUM 0:119624335925 385
MACRUM 0:119624335925 386 // append to packet list
MACRUM 0:119624335925 387 *_packets_end = packet;
MACRUM 0:119624335925 388 _packets_end = &packet->next;
MACRUM 0:119624335925 389 }
MACRUM 0:119624335925 390
MACRUM 0:119624335925 391 int32_t ESP8266::recv_tcp(int id, void *data, uint32_t amount)
MACRUM 0:119624335925 392 {
MACRUM 0:119624335925 393 _smutex.lock();
MACRUM 0:119624335925 394 setTimeout(ESP8266_RECV_TIMEOUT);
MACRUM 0:119624335925 395
MACRUM 0:119624335925 396 // Poll for inbound packets
MACRUM 0:119624335925 397 while (_parser.process_oob()) {
MACRUM 0:119624335925 398 }
MACRUM 0:119624335925 399
MACRUM 0:119624335925 400 setTimeout();
MACRUM 0:119624335925 401
MACRUM 0:119624335925 402 // check if any packets are ready for us
MACRUM 0:119624335925 403 for (struct packet **p = &_packets; *p; p = &(*p)->next) {
MACRUM 0:119624335925 404 if ((*p)->id == id) {
MACRUM 0:119624335925 405 struct packet *q = *p;
MACRUM 0:119624335925 406
MACRUM 0:119624335925 407 if (q->len <= amount) { // Return and remove full packet
MACRUM 0:119624335925 408 memcpy(data, q+1, q->len);
MACRUM 0:119624335925 409
MACRUM 0:119624335925 410 if (_packets_end == &(*p)->next) {
MACRUM 0:119624335925 411 _packets_end = p;
MACRUM 0:119624335925 412 }
MACRUM 0:119624335925 413 *p = (*p)->next;
MACRUM 0:119624335925 414 _smutex.unlock();
MACRUM 0:119624335925 415
MACRUM 0:119624335925 416 uint32_t len = q->len;
MACRUM 0:119624335925 417 free(q);
MACRUM 0:119624335925 418 return len;
MACRUM 0:119624335925 419 } else { // return only partial packet
MACRUM 0:119624335925 420 memcpy(data, q+1, amount);
MACRUM 0:119624335925 421
MACRUM 0:119624335925 422 q->len -= amount;
MACRUM 0:119624335925 423 memmove(q+1, (uint8_t*)(q+1) + amount, q->len);
MACRUM 0:119624335925 424
MACRUM 0:119624335925 425 _smutex.unlock();
MACRUM 0:119624335925 426 return amount;
MACRUM 0:119624335925 427 }
MACRUM 0:119624335925 428 }
MACRUM 0:119624335925 429 }
MACRUM 0:119624335925 430 if(!_socket_open[id]) {
MACRUM 0:119624335925 431 _smutex.unlock();
MACRUM 0:119624335925 432 return 0;
MACRUM 0:119624335925 433 }
MACRUM 0:119624335925 434 _smutex.unlock();
MACRUM 0:119624335925 435
MACRUM 0:119624335925 436 return NSAPI_ERROR_WOULD_BLOCK;
MACRUM 0:119624335925 437 }
MACRUM 0:119624335925 438
MACRUM 0:119624335925 439 int32_t ESP8266::recv_udp(int id, void *data, uint32_t amount)
MACRUM 0:119624335925 440 {
MACRUM 0:119624335925 441 _smutex.lock();
MACRUM 0:119624335925 442 setTimeout(ESP8266_RECV_TIMEOUT);
MACRUM 0:119624335925 443
MACRUM 0:119624335925 444 // Poll for inbound packets
MACRUM 0:119624335925 445 while (_parser.process_oob()) {
MACRUM 0:119624335925 446 }
MACRUM 0:119624335925 447
MACRUM 0:119624335925 448 setTimeout();
MACRUM 0:119624335925 449
MACRUM 0:119624335925 450 // check if any packets are ready for us
MACRUM 0:119624335925 451 for (struct packet **p = &_packets; *p; p = &(*p)->next) {
MACRUM 0:119624335925 452 if ((*p)->id == id) {
MACRUM 0:119624335925 453 struct packet *q = *p;
MACRUM 0:119624335925 454
MACRUM 0:119624335925 455 // Return and remove packet (truncated if necessary)
MACRUM 0:119624335925 456 uint32_t len = q->len < amount ? q->len : amount;
MACRUM 0:119624335925 457 memcpy(data, q+1, len);
MACRUM 0:119624335925 458
MACRUM 0:119624335925 459 if (_packets_end == &(*p)->next) {
MACRUM 0:119624335925 460 _packets_end = p;
MACRUM 0:119624335925 461 }
MACRUM 0:119624335925 462 *p = (*p)->next;
MACRUM 0:119624335925 463 _smutex.unlock();
MACRUM 0:119624335925 464
MACRUM 0:119624335925 465 free(q);
MACRUM 0:119624335925 466 return len;
MACRUM 0:119624335925 467 }
MACRUM 0:119624335925 468 }
MACRUM 0:119624335925 469 _smutex.unlock();
MACRUM 0:119624335925 470
MACRUM 0:119624335925 471 return NSAPI_ERROR_WOULD_BLOCK;
MACRUM 0:119624335925 472 }
MACRUM 0:119624335925 473
MACRUM 0:119624335925 474 bool ESP8266::close(int id)
MACRUM 0:119624335925 475 {
MACRUM 0:119624335925 476 //May take a second try if device is busy
MACRUM 0:119624335925 477 for (unsigned i = 0; i < 2; i++) {
MACRUM 0:119624335925 478 _smutex.lock();
MACRUM 0:119624335925 479 if (_parser.send("AT+CIPCLOSE=%d", id) && _parser.recv("OK\n")) {
MACRUM 0:119624335925 480 if (!_socket_open[id]) { // recv(processing OOBs) needs to be done first
MACRUM 0:119624335925 481 _smutex.unlock();
MACRUM 0:119624335925 482 return true;
MACRUM 0:119624335925 483 }
MACRUM 0:119624335925 484 }
MACRUM 0:119624335925 485 _smutex.unlock();
MACRUM 0:119624335925 486 }
MACRUM 0:119624335925 487
MACRUM 0:119624335925 488 return false;
MACRUM 0:119624335925 489 }
MACRUM 0:119624335925 490
MACRUM 0:119624335925 491 void ESP8266::setTimeout(uint32_t timeout_ms)
MACRUM 0:119624335925 492 {
MACRUM 0:119624335925 493 _parser.set_timeout(timeout_ms);
MACRUM 0:119624335925 494 }
MACRUM 0:119624335925 495
MACRUM 0:119624335925 496 bool ESP8266::readable()
MACRUM 0:119624335925 497 {
MACRUM 0:119624335925 498 return _serial.FileHandle::readable();
MACRUM 0:119624335925 499 }
MACRUM 0:119624335925 500
MACRUM 0:119624335925 501 bool ESP8266::writeable()
MACRUM 0:119624335925 502 {
MACRUM 0:119624335925 503 return _serial.FileHandle::writable();
MACRUM 0:119624335925 504 }
MACRUM 0:119624335925 505
MACRUM 0:119624335925 506 void ESP8266::attach(Callback<void()> func)
MACRUM 0:119624335925 507 {
MACRUM 0:119624335925 508 _serial.sigio(func);
MACRUM 0:119624335925 509 }
MACRUM 0:119624335925 510
MACRUM 0:119624335925 511 bool ESP8266::recv_ap(nsapi_wifi_ap_t *ap)
MACRUM 0:119624335925 512 {
MACRUM 0:119624335925 513 int sec;
MACRUM 0:119624335925 514 int dummy;
MACRUM 0:119624335925 515 bool ret = _parser.recv("+CWLAP:(%d,\"%32[^\"]\",%hhd,\"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx\",%hhu,%d,%d)\n",
MACRUM 0:119624335925 516 &sec,
MACRUM 0:119624335925 517 ap->ssid,
MACRUM 0:119624335925 518 &ap->rssi,
MACRUM 0:119624335925 519 &ap->bssid[0], &ap->bssid[1], &ap->bssid[2], &ap->bssid[3], &ap->bssid[4], &ap->bssid[5],
MACRUM 0:119624335925 520 &ap->channel,
MACRUM 0:119624335925 521 &dummy,
MACRUM 0:119624335925 522 &dummy);
MACRUM 0:119624335925 523
MACRUM 0:119624335925 524 ap->security = sec < 5 ? (nsapi_security_t)sec : NSAPI_SECURITY_UNKNOWN;
MACRUM 0:119624335925 525
MACRUM 0:119624335925 526 return ret;
MACRUM 0:119624335925 527 }
MACRUM 0:119624335925 528
MACRUM 0:119624335925 529 void ESP8266::_connect_error_handler()
MACRUM 0:119624335925 530 {
MACRUM 0:119624335925 531 _fail = false;
MACRUM 0:119624335925 532 _connect_error = 0;
MACRUM 0:119624335925 533
MACRUM 0:119624335925 534 if (_parser.recv("%d", &_connect_error) && _parser.recv("FAIL")) {
MACRUM 0:119624335925 535 _fail = true;
MACRUM 0:119624335925 536 _parser.abort();
MACRUM 0:119624335925 537 }
MACRUM 0:119624335925 538 }
MACRUM 0:119624335925 539
MACRUM 0:119624335925 540 void ESP8266::_oob_socket0_closed_handler()
MACRUM 0:119624335925 541 {
MACRUM 0:119624335925 542 _socket_open[0] = 0;
MACRUM 0:119624335925 543 }
MACRUM 0:119624335925 544
MACRUM 0:119624335925 545 void ESP8266::_oob_socket1_closed_handler()
MACRUM 0:119624335925 546 {
MACRUM 0:119624335925 547 _socket_open[1] = 0;
MACRUM 0:119624335925 548 }
MACRUM 0:119624335925 549
MACRUM 0:119624335925 550 void ESP8266::_oob_socket2_closed_handler()
MACRUM 0:119624335925 551 {
MACRUM 0:119624335925 552 _socket_open[2] = 0;
MACRUM 0:119624335925 553 }
MACRUM 0:119624335925 554
MACRUM 0:119624335925 555 void ESP8266::_oob_socket3_closed_handler()
MACRUM 0:119624335925 556 {
MACRUM 0:119624335925 557 _socket_open[3] = 0;
MACRUM 0:119624335925 558 }
MACRUM 0:119624335925 559
MACRUM 0:119624335925 560 void ESP8266::_oob_socket4_closed_handler()
MACRUM 0:119624335925 561 {
MACRUM 0:119624335925 562 _socket_open[4] = 0;
MACRUM 0:119624335925 563 }
MACRUM 0:119624335925 564
MACRUM 0:119624335925 565 int8_t ESP8266::get_default_wifi_mode()
MACRUM 0:119624335925 566 {
MACRUM 0:119624335925 567 int8_t mode;
MACRUM 0:119624335925 568
MACRUM 0:119624335925 569 _smutex.lock();
MACRUM 0:119624335925 570 if (_parser.send("AT+CWMODE_DEF?")
MACRUM 0:119624335925 571 && _parser.recv("+CWMODE_DEF:%hhd", &mode)
MACRUM 0:119624335925 572 && _parser.recv("OK\n")) {
MACRUM 0:119624335925 573 _smutex.unlock();
MACRUM 0:119624335925 574 return mode;
MACRUM 0:119624335925 575 }
MACRUM 0:119624335925 576 _smutex.unlock();
MACRUM 0:119624335925 577
MACRUM 0:119624335925 578 return 0;
MACRUM 0:119624335925 579 }
MACRUM 0:119624335925 580
MACRUM 0:119624335925 581 bool ESP8266::set_default_wifi_mode(const int8_t mode)
MACRUM 0:119624335925 582 {
MACRUM 0:119624335925 583 _smutex.lock();
MACRUM 0:119624335925 584 bool done = _parser.send("AT+CWMODE_DEF=%hhd", mode)
MACRUM 0:119624335925 585 && _parser.recv("OK\n");
MACRUM 0:119624335925 586 _smutex.unlock();
MACRUM 0:119624335925 587
MACRUM 0:119624335925 588 return done;
MACRUM 0:119624335925 589 }