Skip to content

Commit 0418c61

Browse files
author
Veijo Pesonen
authored
Merge pull request #68 from ARMmbed/cleanup_at_cmd_timeouts
Cleanup AT cmd timeouts. Free corrupted packages in package handler.
2 parents 4189a3c + 209155c commit 0418c61

File tree

3 files changed

+53
-65
lines changed

3 files changed

+53
-65
lines changed

ESP8266/ESP8266.cpp

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,8 @@
2020

2121
#include <cstring>
2222

23-
24-
#define TRACE_GROUP "Wifi"
2523
#define ESP8266_DEFAULT_BAUD_RATE 115200
2624

27-
2825
ESP8266::ESP8266(PinName tx, PinName rx, bool debug)
2926
: _serial(tx, rx, ESP8266_DEFAULT_BAUD_RATE),
3027
_parser(&_serial),
@@ -76,10 +73,12 @@ bool ESP8266::startup(int mode)
7673
}
7774

7875
_smutex.lock();
76+
setTimeout(ESP8266_CONNECT_TIMEOUT);
7977
bool done = _parser.send("AT+CWMODE_CUR=%d", mode)
8078
&& _parser.recv("OK\n")
8179
&&_parser.send("AT+CIPMUX=1")
8280
&& _parser.recv("OK\n");
81+
setTimeout(); //Restore default
8382
_smutex.unlock();
8483

8584
return done;
@@ -88,6 +87,8 @@ bool ESP8266::startup(int mode)
8887
bool ESP8266::reset(void)
8988
{
9089
_smutex.lock();
90+
setTimeout(ESP8266_CONNECT_TIMEOUT);
91+
9192
for (int i = 0; i < 2; i++) {
9293
if (_parser.send("AT+RST")
9394
&& _parser.recv("OK\n")
@@ -96,6 +97,7 @@ bool ESP8266::reset(void)
9697
return true;
9798
}
9899
}
100+
setTimeout();
99101
_smutex.unlock();
100102

101103
return false;
@@ -119,6 +121,8 @@ bool ESP8266::dhcp(bool enabled, int mode)
119121
nsapi_error_t ESP8266::connect(const char *ap, const char *passPhrase)
120122
{
121123
_smutex.lock();
124+
setTimeout(ESP8266_CONNECT_TIMEOUT);
125+
122126
_parser.send("AT+CWJAP_CUR=\"%s\",\"%s\"", ap, passPhrase);
123127
if (!_parser.recv("OK\n")) {
124128
if (_fail) {
@@ -138,6 +142,7 @@ nsapi_error_t ESP8266::connect(const char *ap, const char *passPhrase)
138142
return ret;
139143
}
140144
}
145+
setTimeout();
141146
_smutex.unlock();
142147

143148
return NSAPI_ERROR_OK;
@@ -155,12 +160,14 @@ bool ESP8266::disconnect(void)
155160
const char *ESP8266::getIPAddress(void)
156161
{
157162
_smutex.lock();
163+
setTimeout(ESP8266_CONNECT_TIMEOUT);
158164
if (!(_parser.send("AT+CIFSR")
159165
&& _parser.recv("+CIFSR:STAIP,\"%15[^\"]\"", _ip_buffer)
160166
&& _parser.recv("OK\n"))) {
161167
_smutex.unlock();
162168
return 0;
163169
}
170+
setTimeout();
164171
_smutex.unlock();
165172

166173
return _ip_buffer;
@@ -214,21 +221,25 @@ int8_t ESP8266::getRSSI()
214221
char bssid[18];
215222

216223
_smutex.lock();
217-
if (!(_parser.send("AT+CWJAP_CUR?")
224+
setTimeout(ESP8266_CONNECT_TIMEOUT);
225+
if (!(_parser.send("AT+CWJAP_CUR?")
218226
&& _parser.recv("+CWJAP_CUR:\"%*[^\"]\",\"%17[^\"]\"", bssid)
219227
&& _parser.recv("OK\n"))) {
220228
_smutex.unlock();
221229
return 0;
222230
}
231+
setTimeout();
223232
_smutex.unlock();
224233

225234
_smutex.lock();
235+
setTimeout(ESP8266_CONNECT_TIMEOUT);
226236
if (!(_parser.send("AT+CWLAP=\"\",\"%s\",", bssid)
227237
&& _parser.recv("+CWLAP:(%*d,\"%*[^\"]\",%hhd,", &rssi)
228238
&& _parser.recv("OK\n"))) {
229239
_smutex.unlock();
230240
return 0;
231241
}
242+
setTimeout();
232243
_smutex.unlock();
233244

234245
return rssi;
@@ -240,6 +251,8 @@ int ESP8266::scan(WiFiAccessPoint *res, unsigned limit)
240251
nsapi_wifi_ap_t ap;
241252

242253
_smutex.lock();
254+
setTimeout(ESP8266_CONNECT_TIMEOUT);
255+
243256
if (!_parser.send("AT+CWLAP")) {
244257
_smutex.unlock();
245258
return NSAPI_ERROR_DEVICE_ERROR;
@@ -255,6 +268,7 @@ int ESP8266::scan(WiFiAccessPoint *res, unsigned limit)
255268
break;
256269
}
257270
}
271+
setTimeout();
258272
_smutex.unlock();
259273

260274
return cnt;
@@ -297,7 +311,6 @@ bool ESP8266::open_tcp(int id, const char* addr, int port, int keepalive)
297311
}
298312

299313
_smutex.lock();
300-
301314
if(keepalive) {
302315
done = _parser.send("AT+CIPSTART=%d,\"%s\",\"%s\",%d,%d", id, type, addr, port, keepalive)
303316
&& _parser.recv("OK\n");
@@ -329,13 +342,15 @@ nsapi_error_t ESP8266::send(int id, const void *data, uint32_t amount)
329342
//May take a second try if device is busy
330343
for (unsigned i = 0; i < 2; i++) {
331344
_smutex.lock();
345+
setTimeout(ESP8266_SEND_TIMEOUT);
332346
if (_parser.send("AT+CIPSEND=%d,%lu", id, amount)
333347
&& _parser.recv(">")
334348
&& _parser.write((char*)data, (int)amount) >= 0) {
335349
while (_parser.process_oob()); // multiple sends in a row require this
336350
_smutex.unlock();
337351
return NSAPI_ERROR_OK;
338352
}
353+
setTimeout();
339354
_smutex.unlock();
340355
}
341356

@@ -345,10 +360,10 @@ nsapi_error_t ESP8266::send(int id, const void *data, uint32_t amount)
345360
void ESP8266::_packet_handler()
346361
{
347362
int id;
348-
uint32_t amount;
363+
int amount;
349364

350365
// parse out the packet
351-
if (!_parser.recv(",%d,%lu:", &id, &amount)) {
366+
if (!_parser.recv(",%d,%d:", &id, &amount)) {
352367
return;
353368
}
354369

@@ -363,7 +378,7 @@ void ESP8266::_packet_handler()
363378
packet->len = amount;
364379
packet->next = 0;
365380

366-
if (!(_parser.read((char*)(packet + 1), amount))) {
381+
if (_parser.read((char*)(packet + 1), amount) < amount) {
367382
free(packet);
368383
return;
369384
}
@@ -376,10 +391,14 @@ void ESP8266::_packet_handler()
376391
int32_t ESP8266::recv_tcp(int id, void *data, uint32_t amount)
377392
{
378393
_smutex.lock();
394+
setTimeout(ESP8266_RECV_TIMEOUT);
395+
379396
// Poll for inbound packets
380397
while (_parser.process_oob()) {
381398
}
382399

400+
setTimeout();
401+
383402
// check if any packets are ready for us
384403
for (struct packet **p = &_packets; *p; p = &(*p)->next) {
385404
if ((*p)->id == id) {
@@ -412,7 +431,6 @@ int32_t ESP8266::recv_tcp(int id, void *data, uint32_t amount)
412431
_smutex.unlock();
413432
return 0;
414433
}
415-
416434
_smutex.unlock();
417435

418436
return NSAPI_ERROR_WOULD_BLOCK;
@@ -421,10 +439,14 @@ int32_t ESP8266::recv_tcp(int id, void *data, uint32_t amount)
421439
int32_t ESP8266::recv_udp(int id, void *data, uint32_t amount)
422440
{
423441
_smutex.lock();
442+
setTimeout(ESP8266_RECV_TIMEOUT);
443+
424444
// Poll for inbound packets
425445
while (_parser.process_oob()) {
426446
}
427447

448+
setTimeout();
449+
428450
// check if any packets are ready for us
429451
for (struct packet **p = &_packets; *p; p = &(*p)->next) {
430452
if ((*p)->id == id) {
@@ -444,7 +466,6 @@ int32_t ESP8266::recv_udp(int id, void *data, uint32_t amount)
444466
return len;
445467
}
446468
}
447-
448469
_smutex.unlock();
449470

450471
return NSAPI_ERROR_WOULD_BLOCK;

ESP8266/ESP8266.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,20 @@
2121
#include "nsapi_types.h"
2222
#include "rtos.h"
2323

24+
// Various timeouts for different ESP8266 operations
25+
#ifndef ESP8266_CONNECT_TIMEOUT
26+
#define ESP8266_CONNECT_TIMEOUT 15000
27+
#endif
28+
#ifndef ESP8266_SEND_TIMEOUT
29+
#define ESP8266_SEND_TIMEOUT 500
30+
#endif
31+
#ifndef ESP8266_RECV_TIMEOUT
32+
#define ESP8266_RECV_TIMEOUT 500
33+
#endif
34+
#ifndef ESP8266_MISC_TIMEOUT
35+
#define ESP8266_MISC_TIMEOUT 500
36+
#endif
37+
2438
/** ESP8266Interface class.
2539
This is an interface to a ESP8266 radio.
2640
*/
@@ -196,7 +210,7 @@ class ESP8266
196210
*
197211
* @param timeout_ms timeout of the connection
198212
*/
199-
void setTimeout(uint32_t timeout_ms);
213+
void setTimeout(uint32_t timeout_ms=ESP8266_MISC_TIMEOUT);
200214

201215
/**
202216
* Checks if data is available

0 commit comments

Comments
 (0)