mirror of https://github.com/ARMmbed/mbed-os.git
busy s... fix (ONME-4352)
oob handling added for OK in busy scenario Fixed spellcheck error trace added for okpull/11817/head
parent
8c673ba597
commit
d5fdcfdab8
|
@ -626,6 +626,7 @@ nsapi_error_t ESP8266::send(int id, const void *data, uint32_t amount)
|
||||||
}
|
}
|
||||||
|
|
||||||
_smutex.lock();
|
_smutex.lock();
|
||||||
|
RETRY:
|
||||||
set_timeout(ESP8266_SEND_TIMEOUT);
|
set_timeout(ESP8266_SEND_TIMEOUT);
|
||||||
_busy = false;
|
_busy = false;
|
||||||
_error = false;
|
_error = false;
|
||||||
|
@ -634,11 +635,25 @@ nsapi_error_t ESP8266::send(int id, const void *data, uint32_t amount)
|
||||||
goto END;
|
goto END;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//We might receive "busy s/p..." and "OK" from modem, so we need to check that also
|
||||||
|
_ok_received = false;
|
||||||
|
_parser.oob("OK", callback(this, &ESP8266::_oob_ok_received));
|
||||||
|
|
||||||
if (!_parser.recv(">")) {
|
if (!_parser.recv(">")) {
|
||||||
|
_parser.remove_oob("OK");
|
||||||
|
if (_busy) {
|
||||||
|
if (_ok_received) {
|
||||||
|
goto RETRY;
|
||||||
|
} else if (_parser.recv("OK")) {
|
||||||
|
goto RETRY;
|
||||||
|
}
|
||||||
|
}
|
||||||
tr_debug("send(): Didn't get \">\"");
|
tr_debug("send(): Didn't get \">\"");
|
||||||
ret = NSAPI_ERROR_WOULD_BLOCK;
|
ret = NSAPI_ERROR_WOULD_BLOCK;
|
||||||
goto END;
|
goto END;
|
||||||
}
|
}
|
||||||
|
_ok_received = false;
|
||||||
|
_parser.remove_oob("OK");
|
||||||
|
|
||||||
if (_parser.write((char *)data, (int)amount) >= 0 && _parser.recv("SEND OK")) {
|
if (_parser.write((char *)data, (int)amount) >= 0 && _parser.recv("SEND OK")) {
|
||||||
ret = NSAPI_ERROR_OK;
|
ret = NSAPI_ERROR_OK;
|
||||||
|
@ -1071,7 +1086,6 @@ void ESP8266::_oob_busy()
|
||||||
"ESP8266::_oob_busy() AT timeout\n");
|
"ESP8266::_oob_busy() AT timeout\n");
|
||||||
}
|
}
|
||||||
_busy = true;
|
_busy = true;
|
||||||
_parser.abort();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ESP8266::_oob_tcp_data_hdlr()
|
void ESP8266::_oob_tcp_data_hdlr()
|
||||||
|
@ -1205,6 +1219,12 @@ void ESP8266::_oob_connection_status()
|
||||||
_conn_stat_cb();
|
_conn_stat_cb();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ESP8266::_oob_ok_received()
|
||||||
|
{
|
||||||
|
tr_debug("_oob_ok_received called");
|
||||||
|
_ok_received = true;
|
||||||
|
}
|
||||||
|
|
||||||
int8_t ESP8266::default_wifi_mode()
|
int8_t ESP8266::default_wifi_mode()
|
||||||
{
|
{
|
||||||
int8_t mode;
|
int8_t mode;
|
||||||
|
|
|
@ -469,6 +469,7 @@ private:
|
||||||
void _oob_tcp_data_hdlr();
|
void _oob_tcp_data_hdlr();
|
||||||
void _oob_ready();
|
void _oob_ready();
|
||||||
void _oob_scan_results();
|
void _oob_scan_results();
|
||||||
|
void _oob_ok_received();
|
||||||
|
|
||||||
// OOB state variables
|
// OOB state variables
|
||||||
int _connect_error;
|
int _connect_error;
|
||||||
|
@ -479,6 +480,7 @@ private:
|
||||||
bool _error;
|
bool _error;
|
||||||
bool _busy;
|
bool _busy;
|
||||||
bool _reset_done;
|
bool _reset_done;
|
||||||
|
bool _ok_received;
|
||||||
|
|
||||||
// Modem's address info
|
// Modem's address info
|
||||||
char _ip_buffer[16];
|
char _ip_buffer[16];
|
||||||
|
|
|
@ -311,6 +311,12 @@ public:
|
||||||
*/
|
*/
|
||||||
void oob(const char *prefix, mbed::Callback<void()> func);
|
void oob(const char *prefix, mbed::Callback<void()> func);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief remove_oob Removes oob callback handler
|
||||||
|
* @param prefix Prefix to identify oob to be removed.
|
||||||
|
*/
|
||||||
|
void remove_oob(const char *prefix);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flushes the underlying stream
|
* Flushes the underlying stream
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -362,6 +362,25 @@ void ATCmdParser::oob(const char *prefix, Callback<void()> cb)
|
||||||
_oobs = oob;
|
_oobs = oob;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ATCmdParser::remove_oob(const char *prefix)
|
||||||
|
{
|
||||||
|
struct oob *prev = NULL;
|
||||||
|
struct oob *oob = _oobs;
|
||||||
|
while (oob) {
|
||||||
|
if (memcmp(oob->prefix, prefix, strlen(prefix)) == 0) {
|
||||||
|
if (prev) {
|
||||||
|
prev->next = oob->next;
|
||||||
|
} else {
|
||||||
|
_oobs = oob->next;
|
||||||
|
}
|
||||||
|
delete oob;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
prev = oob;
|
||||||
|
oob = oob->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ATCmdParser::abort()
|
void ATCmdParser::abort()
|
||||||
{
|
{
|
||||||
_aborted = true;
|
_aborted = true;
|
||||||
|
|
Loading…
Reference in New Issue