Color Oled(SSD1331) connect to STMicroelectronics Nucleo-F466

Dependencies:   ssd1331

Committer:
kadonotakashi
Date:
Thu Oct 11 02:27:46 2018 +0000
Revision:
3:f3764f852aa8
Parent:
0:8fdf9a60065b
Nucreo 446 + SSD1331 test version;

Who changed what in which revision?

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