20
20
21
21
#include < cstring>
22
22
23
-
24
- #define TRACE_GROUP " Wifi"
25
23
#define ESP8266_DEFAULT_BAUD_RATE 115200
26
24
27
-
28
25
ESP8266::ESP8266 (PinName tx, PinName rx, bool debug)
29
26
: _serial(tx, rx, ESP8266_DEFAULT_BAUD_RATE),
30
27
_parser(&_serial),
@@ -76,10 +73,12 @@ bool ESP8266::startup(int mode)
76
73
}
77
74
78
75
_smutex.lock ();
76
+ setTimeout (ESP8266_CONNECT_TIMEOUT);
79
77
bool done = _parser.send (" AT+CWMODE_CUR=%d" , mode)
80
78
&& _parser.recv (" OK\n " )
81
79
&&_parser.send (" AT+CIPMUX=1" )
82
80
&& _parser.recv (" OK\n " );
81
+ setTimeout (); // Restore default
83
82
_smutex.unlock ();
84
83
85
84
return done;
@@ -88,6 +87,8 @@ bool ESP8266::startup(int mode)
88
87
bool ESP8266::reset (void )
89
88
{
90
89
_smutex.lock ();
90
+ setTimeout (ESP8266_CONNECT_TIMEOUT);
91
+
91
92
for (int i = 0 ; i < 2 ; i++) {
92
93
if (_parser.send (" AT+RST" )
93
94
&& _parser.recv (" OK\n " )
@@ -96,6 +97,7 @@ bool ESP8266::reset(void)
96
97
return true ;
97
98
}
98
99
}
100
+ setTimeout ();
99
101
_smutex.unlock ();
100
102
101
103
return false ;
@@ -119,6 +121,8 @@ bool ESP8266::dhcp(bool enabled, int mode)
119
121
nsapi_error_t ESP8266::connect (const char *ap, const char *passPhrase)
120
122
{
121
123
_smutex.lock ();
124
+ setTimeout (ESP8266_CONNECT_TIMEOUT);
125
+
122
126
_parser.send (" AT+CWJAP_CUR=\" %s\" ,\" %s\" " , ap, passPhrase);
123
127
if (!_parser.recv (" OK\n " )) {
124
128
if (_fail) {
@@ -138,6 +142,7 @@ nsapi_error_t ESP8266::connect(const char *ap, const char *passPhrase)
138
142
return ret;
139
143
}
140
144
}
145
+ setTimeout ();
141
146
_smutex.unlock ();
142
147
143
148
return NSAPI_ERROR_OK;
@@ -155,12 +160,14 @@ bool ESP8266::disconnect(void)
155
160
const char *ESP8266::getIPAddress (void )
156
161
{
157
162
_smutex.lock ();
163
+ setTimeout (ESP8266_CONNECT_TIMEOUT);
158
164
if (!(_parser.send (" AT+CIFSR" )
159
165
&& _parser.recv (" +CIFSR:STAIP,\" %15[^\" ]\" " , _ip_buffer)
160
166
&& _parser.recv (" OK\n " ))) {
161
167
_smutex.unlock ();
162
168
return 0 ;
163
169
}
170
+ setTimeout ();
164
171
_smutex.unlock ();
165
172
166
173
return _ip_buffer;
@@ -214,21 +221,25 @@ int8_t ESP8266::getRSSI()
214
221
char bssid[18 ];
215
222
216
223
_smutex.lock ();
217
- if (!(_parser.send (" AT+CWJAP_CUR?" )
224
+ setTimeout (ESP8266_CONNECT_TIMEOUT);
225
+ if (!(_parser.send (" AT+CWJAP_CUR?" )
218
226
&& _parser.recv (" +CWJAP_CUR:\" %*[^\" ]\" ,\" %17[^\" ]\" " , bssid)
219
227
&& _parser.recv (" OK\n " ))) {
220
228
_smutex.unlock ();
221
229
return 0 ;
222
230
}
231
+ setTimeout ();
223
232
_smutex.unlock ();
224
233
225
234
_smutex.lock ();
235
+ setTimeout (ESP8266_CONNECT_TIMEOUT);
226
236
if (!(_parser.send (" AT+CWLAP=\"\" ,\" %s\" ," , bssid)
227
237
&& _parser.recv (" +CWLAP:(%*d,\" %*[^\" ]\" ,%hhd," , &rssi)
228
238
&& _parser.recv (" OK\n " ))) {
229
239
_smutex.unlock ();
230
240
return 0 ;
231
241
}
242
+ setTimeout ();
232
243
_smutex.unlock ();
233
244
234
245
return rssi;
@@ -240,6 +251,8 @@ int ESP8266::scan(WiFiAccessPoint *res, unsigned limit)
240
251
nsapi_wifi_ap_t ap;
241
252
242
253
_smutex.lock ();
254
+ setTimeout (ESP8266_CONNECT_TIMEOUT);
255
+
243
256
if (!_parser.send (" AT+CWLAP" )) {
244
257
_smutex.unlock ();
245
258
return NSAPI_ERROR_DEVICE_ERROR;
@@ -255,6 +268,7 @@ int ESP8266::scan(WiFiAccessPoint *res, unsigned limit)
255
268
break ;
256
269
}
257
270
}
271
+ setTimeout ();
258
272
_smutex.unlock ();
259
273
260
274
return cnt;
@@ -297,7 +311,6 @@ bool ESP8266::open_tcp(int id, const char* addr, int port, int keepalive)
297
311
}
298
312
299
313
_smutex.lock ();
300
-
301
314
if (keepalive) {
302
315
done = _parser.send (" AT+CIPSTART=%d,\" %s\" ,\" %s\" ,%d,%d" , id, type, addr, port, keepalive)
303
316
&& _parser.recv (" OK\n " );
@@ -329,13 +342,15 @@ nsapi_error_t ESP8266::send(int id, const void *data, uint32_t amount)
329
342
// May take a second try if device is busy
330
343
for (unsigned i = 0 ; i < 2 ; i++) {
331
344
_smutex.lock ();
345
+ setTimeout (ESP8266_SEND_TIMEOUT);
332
346
if (_parser.send (" AT+CIPSEND=%d,%lu" , id, amount)
333
347
&& _parser.recv (" >" )
334
348
&& _parser.write ((char *)data, (int )amount) >= 0 ) {
335
349
while (_parser.process_oob ()); // multiple sends in a row require this
336
350
_smutex.unlock ();
337
351
return NSAPI_ERROR_OK;
338
352
}
353
+ setTimeout ();
339
354
_smutex.unlock ();
340
355
}
341
356
@@ -345,10 +360,10 @@ nsapi_error_t ESP8266::send(int id, const void *data, uint32_t amount)
345
360
void ESP8266::_packet_handler ()
346
361
{
347
362
int id;
348
- uint32_t amount;
363
+ int amount;
349
364
350
365
// parse out the packet
351
- if (!_parser.recv (" ,%d,%lu :" , &id, &amount)) {
366
+ if (!_parser.recv (" ,%d,%d :" , &id, &amount)) {
352
367
return ;
353
368
}
354
369
@@ -363,7 +378,7 @@ void ESP8266::_packet_handler()
363
378
packet->len = amount;
364
379
packet->next = 0 ;
365
380
366
- if (!( _parser.read ((char *)(packet + 1 ), amount)) ) {
381
+ if (_parser.read ((char *)(packet + 1 ), amount) < amount ) {
367
382
free (packet);
368
383
return ;
369
384
}
@@ -376,10 +391,14 @@ void ESP8266::_packet_handler()
376
391
int32_t ESP8266::recv_tcp (int id, void *data, uint32_t amount)
377
392
{
378
393
_smutex.lock ();
394
+ setTimeout (ESP8266_RECV_TIMEOUT);
395
+
379
396
// Poll for inbound packets
380
397
while (_parser.process_oob ()) {
381
398
}
382
399
400
+ setTimeout ();
401
+
383
402
// check if any packets are ready for us
384
403
for (struct packet **p = &_packets; *p; p = &(*p)->next ) {
385
404
if ((*p)->id == id) {
@@ -412,7 +431,6 @@ int32_t ESP8266::recv_tcp(int id, void *data, uint32_t amount)
412
431
_smutex.unlock ();
413
432
return 0 ;
414
433
}
415
-
416
434
_smutex.unlock ();
417
435
418
436
return NSAPI_ERROR_WOULD_BLOCK;
@@ -421,10 +439,14 @@ int32_t ESP8266::recv_tcp(int id, void *data, uint32_t amount)
421
439
int32_t ESP8266::recv_udp (int id, void *data, uint32_t amount)
422
440
{
423
441
_smutex.lock ();
442
+ setTimeout (ESP8266_RECV_TIMEOUT);
443
+
424
444
// Poll for inbound packets
425
445
while (_parser.process_oob ()) {
426
446
}
427
447
448
+ setTimeout ();
449
+
428
450
// check if any packets are ready for us
429
451
for (struct packet **p = &_packets; *p; p = &(*p)->next ) {
430
452
if ((*p)->id == id) {
@@ -444,7 +466,6 @@ int32_t ESP8266::recv_udp(int id, void *data, uint32_t amount)
444
466
return len;
445
467
}
446
468
}
447
-
448
469
_smutex.unlock ();
449
470
450
471
return NSAPI_ERROR_WOULD_BLOCK;
0 commit comments