25
25
#include " PinNames.h"
26
26
#include " platform/Callback.h"
27
27
#include " platform/mbed_error.h"
28
+ #include " rtos/Kernel.h"
28
29
29
30
#define TRACE_GROUP " ESPA" // ESP8266 AT layer
30
31
@@ -51,6 +52,8 @@ ESP8266::ESP8266(PinName tx, PinName rx, bool debug, PinName rts, PinName cts)
51
52
_sock_already(false ),
52
53
_closed(false ),
53
54
_busy(false ),
55
+ _reset_check(_rmutex),
56
+ _reset_done(false ),
54
57
_conn_status(NSAPI_STATUS_DISCONNECTED)
55
58
{
56
59
_serial.set_baud (ESP8266_DEFAULT_BAUD_RATE);
@@ -71,6 +74,7 @@ ESP8266::ESP8266(PinName tx, PinName rx, bool debug, PinName rts, PinName cts)
71
74
_parser.oob (" UNLINK" , callback (this , &ESP8266::_oob_socket_close_err));
72
75
_parser.oob (" ALREADY CONNECTED" , callback (this , &ESP8266::_oob_conn_already));
73
76
_parser.oob (" ERROR" , callback (this , &ESP8266::_oob_err));
77
+ _parser.oob (" ready" , callback (this , &ESP8266::_oob_reset));
74
78
// Don't expect to find anything about the watchdog reset in official documentation
75
79
// https://techtutorialsx.com/2017/01/21/esp8266-watchdog-functions/
76
80
_parser.oob (" wdt reset" , callback (this , &ESP8266::_oob_watchdog_reset));
@@ -234,20 +238,31 @@ bool ESP8266::startup(int mode)
234
238
235
239
bool ESP8266::reset (void )
236
240
{
241
+ static const int ESP8266_BOOTTIME = 10000 ; // [ms]
237
242
bool done = false ;
238
243
239
244
_smutex.lock ();
240
- set_timeout (ESP8266_CONNECT_TIMEOUT);
241
245
242
- for (int i = 0 ; i < 2 ; i++) {
243
- if (_parser.send (" AT+RST" )
244
- && _parser.recv (" OK\n " )
245
- && _parser.recv (" ready" )) {
246
- done = true ;
247
- break ;
248
- }
246
+ unsigned long int start_time = rtos::Kernel::get_ms_count ();
247
+ _reset_done = false ;
248
+ set_timeout (ESP8266_RECV_TIMEOUT);
249
+ if (!_parser.send (" AT+RST" ) || !_parser.recv (" OK\n " )) {
250
+ tr_debug (" reset(): AT+RST failed or no response" );
251
+ goto EXIT;
249
252
}
250
253
254
+ _rmutex.lock ();
255
+ while ((rtos::Kernel::get_ms_count () - start_time < ESP8266_BOOTTIME) && !_reset_done) {
256
+ _process_oob (ESP8266_RECV_TIMEOUT, true ); // UART mutex claimed -> need to check for OOBs ourselves
257
+ _reset_check.wait_for (100 ); // Arbitrary relatively short delay
258
+ }
259
+
260
+ done = _reset_done;
261
+ _rmutex.unlock ();
262
+
263
+ tr_debug (" reset(): done: %s" , done ? " OK" : " FAIL" );
264
+
265
+ EXIT:
251
266
_clear_socket_packets (ESP8266_ALL_SOCKET_IDS);
252
267
set_timeout ();
253
268
_smutex.unlock ();
@@ -963,6 +978,25 @@ void ESP8266::_oob_watchdog_reset()
963
978
" _oob_watchdog_reset() modem watchdog reset triggered\n " );
964
979
}
965
980
981
+ void ESP8266::_oob_reset ()
982
+ {
983
+
984
+ _rmutex.lock ();
985
+ _reset_done = true ;
986
+ _reset_check.notify_all ();
987
+ _rmutex.unlock ();
988
+
989
+ for (int i = 0 ; i < SOCKET_COUNT; i++) {
990
+ _sock_i[i].open = false ;
991
+ }
992
+
993
+ // Makes possible to reinitialize
994
+ _conn_status = NSAPI_STATUS_ERROR_UNSUPPORTED;
995
+ _conn_stat_cb ();
996
+
997
+ tr_debug (" _oob_reset(): reset detected" );
998
+ }
999
+
966
1000
void ESP8266::_oob_busy ()
967
1001
{
968
1002
char status[5 ];
0 commit comments