diff --git a/components/esp_modem/include/cxx_include/esp_modem_dce_module.hpp b/components/esp_modem/include/cxx_include/esp_modem_dce_module.hpp index 628d2e877..72f141ec8 100644 --- a/components/esp_modem/include/cxx_include/esp_modem_dce_module.hpp +++ b/components/esp_modem/include/cxx_include/esp_modem_dce_module.hpp @@ -79,8 +79,17 @@ public: } return true; } else if (mode == modem_mode::COMMAND_MODE) { - Task::Delay(1000); // Mandatory 1s pause - return set_command_mode() == command_result::OK; + Task::Delay(1000); // Mandatory 1s pause before + int retry = 0; + while (retry++ < 3) { + if (set_command_mode() == command_result::OK) + return true; + Task::Delay(1000); // Mandatory 1s pause after escape + if (sync() == command_result::OK) + return true; + Task::Delay(1000); // Mandatory 1s pause before escape + } + return false; } else if (mode == modem_mode::CMUX_MODE) { return set_cmux() == command_result::OK; } diff --git a/components/esp_modem/src/esp_modem_dce.cpp b/components/esp_modem/src/esp_modem_dce.cpp index 197851135..735c5c2ee 100644 --- a/components/esp_modem/src/esp_modem_dce.cpp +++ b/components/esp_modem/src/esp_modem_dce.cpp @@ -12,7 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include #include +#include #include "cxx_include/esp_modem_dte.hpp" #include "cxx_include/esp_modem_dce.hpp" @@ -27,24 +29,41 @@ bool DCE_Mode::set(DTE *dte, ModuleIf *device, Netif &netif, modem_mode m) case modem_mode::UNDEF: break; case modem_mode::COMMAND_MODE: - if (mode == modem_mode::COMMAND_MODE) { - return false; + { + if (mode == modem_mode::COMMAND_MODE) { + return false; + } + netif.stop(); + SignalGroup signal; + dte->set_read_cb([&](uint8_t *data, size_t len) -> bool { + if (memchr(data, '\n', len)) { + ESP_LOG_BUFFER_HEXDUMP("esp-modem: debug_data", data, len, ESP_LOG_DEBUG); + const auto pass = std::list({"NO CARRIER", "DISCONNECTED"}); + std::string_view response((char *) data, len); + for (auto &it : pass) + if (response.find(it) != std::string::npos) { + signal.set(1); + return true; + } + } + return false; + }); + netif.wait_until_ppp_exits(); + if (!signal.wait(1, 2000)) { + if (!device->set_mode(modem_mode::COMMAND_MODE)) { + mode = modem_mode::UNDEF; + return false; + } + } + dte->set_read_cb(nullptr); + if (!dte->set_mode(modem_mode::COMMAND_MODE)) { + mode = modem_mode::UNDEF; + return false; + } + mode = m; + return true; } - netif.stop(); - if (!device->set_mode(modem_mode::COMMAND_MODE)) { - return false; - } - dte->set_read_cb([&](uint8_t *data, size_t len) -> bool { - ESP_LOG_BUFFER_HEXDUMP("esp-modem: debug_data", data, len, ESP_LOG_INFO); - return false; - }); - netif.wait_until_ppp_exits(); - dte->set_read_cb(nullptr); - if (!dte->set_mode(modem_mode::COMMAND_MODE)) { - return false; - } - mode = m; - return true; + break; case modem_mode::DATA_MODE: if (mode == modem_mode::DATA_MODE) { return false;