mirror of
https://github.com/espressif/esp-protocols.git
synced 2025-07-28 17:57:31 +02:00
fix(modem): Refine mode switch data->command
* netif.stop() moved after setting the transition callback * send PPP escape sequence if enabled before waiting for transition to complete * add newline character before sync() command (after the "+++") Closes https://github.com/espressif/esp-protocols/issues/692
This commit is contained in:
@ -76,4 +76,13 @@ menu "esp-modem"
|
|||||||
help
|
help
|
||||||
If enabled, APIs to add URC handler are available
|
If enabled, APIs to add URC handler are available
|
||||||
|
|
||||||
|
config ESP_MODEM_PPP_ESCAPE_BEFORE_EXIT
|
||||||
|
bool "Send escape sequence when switching PPP -> CMD"
|
||||||
|
default n
|
||||||
|
help
|
||||||
|
If enabled, the library sends a PPP escape ("+++" command)
|
||||||
|
to switch to command mode. This make switching from PPP to CMD
|
||||||
|
mode more robust for some devices (e.g. Quectel), but might cause
|
||||||
|
trouble for other devices (e.g. SIMCOM).
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
@ -77,7 +77,9 @@ public:
|
|||||||
if (set_command_mode() == command_result::OK) {
|
if (set_command_mode() == command_result::OK) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
Task::Delay(1000); // Mandatory 1s pause after escape
|
// send a newline to delimit the escape from the upcoming sync command
|
||||||
|
uint8_t delim = '\n';
|
||||||
|
dte->write(&delim, 1);
|
||||||
if (sync() == command_result::OK) {
|
if (sync() == command_result::OK) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,6 @@ namespace transitions {
|
|||||||
|
|
||||||
static bool exit_data(DTE &dte, ModuleIf &device, Netif &netif)
|
static bool exit_data(DTE &dte, ModuleIf &device, Netif &netif)
|
||||||
{
|
{
|
||||||
netif.stop();
|
|
||||||
auto signal = std::make_shared<SignalGroup>();
|
auto signal = std::make_shared<SignalGroup>();
|
||||||
std::weak_ptr<SignalGroup> weak_signal = signal;
|
std::weak_ptr<SignalGroup> weak_signal = signal;
|
||||||
dte.set_read_cb([&netif, weak_signal](uint8_t *data, size_t len) -> bool {
|
dte.set_read_cb([&netif, weak_signal](uint8_t *data, size_t len) -> bool {
|
||||||
@ -32,7 +31,7 @@ static bool exit_data(DTE &dte, ModuleIf &device, Netif &netif)
|
|||||||
if (memchr(data, '\n', len))
|
if (memchr(data, '\n', len))
|
||||||
{
|
{
|
||||||
ESP_LOG_BUFFER_HEXDUMP("esp-modem: debug_data (CMD)", data, len, ESP_LOG_DEBUG);
|
ESP_LOG_BUFFER_HEXDUMP("esp-modem: debug_data (CMD)", data, len, ESP_LOG_DEBUG);
|
||||||
const auto pass = std::list<std::string_view>({"NO CARRIER", "DISCONNECTED"});
|
const auto pass = std::list<std::string_view>({"NO CARRIER", "DISCONNECTED", "OK"});
|
||||||
std::string_view response((char *) data, len);
|
std::string_view response((char *) data, len);
|
||||||
for (auto &it : pass)
|
for (auto &it : pass)
|
||||||
if (response.find(it) != std::string::npos) {
|
if (response.find(it) != std::string::npos) {
|
||||||
@ -44,8 +43,14 @@ static bool exit_data(DTE &dte, ModuleIf &device, Netif &netif)
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
netif.stop();
|
||||||
netif.wait_until_ppp_exits();
|
netif.wait_until_ppp_exits();
|
||||||
if (!signal->wait(1, 2000)) {
|
#ifdef ESP_MODEM_PPP_ESCAPE_BEFORE_EXIT
|
||||||
|
std::array<uint8_t, 3> ppp_escape = {'+', '+', '+'};
|
||||||
|
dte.write(ppp_escape.data(), ppp_escape.size());
|
||||||
|
#endif
|
||||||
|
if (!signal->wait(1, 2000)) { // wait for any of the disconnection messages
|
||||||
|
// if no reply -> set device to command mode
|
||||||
dte.set_read_cb(nullptr);
|
dte.set_read_cb(nullptr);
|
||||||
if (!device.set_mode(modem_mode::COMMAND_MODE)) {
|
if (!device.set_mode(modem_mode::COMMAND_MODE)) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -52,7 +52,6 @@ void Netif::start()
|
|||||||
|
|
||||||
void Netif::stop()
|
void Netif::stop()
|
||||||
{
|
{
|
||||||
ppp_dte->set_read_cb(nullptr);
|
|
||||||
signal.clear(PPP_STARTED);
|
signal.clear(PPP_STARTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user