diff --git a/components/esp_modem/examples/modem_console/main/modem_console_main.cpp b/components/esp_modem/examples/modem_console/main/modem_console_main.cpp index 249d0061456..b703d99137f 100644 --- a/components/esp_modem/examples/modem_console/main/modem_console_main.cpp +++ b/components/esp_modem/examples/modem_console/main/modem_console_main.cpp @@ -235,7 +235,9 @@ extern "C" void app_main(void) if (c->get_count_of(&SetModeArgs::mode)) { auto mode = c->get_string_of(&SetModeArgs::mode); modem_mode dev_mode; - if (mode == "CMUX1") { + if (mode == "UNDEF") { + dev_mode = esp_modem::modem_mode::UNDEF; + } else if (mode == "CMUX1") { dev_mode = esp_modem::modem_mode::CMUX_MANUAL_MODE; } else if (mode == "CMUX2") { dev_mode = esp_modem::modem_mode::CMUX_MANUAL_EXIT; diff --git a/components/esp_modem/src/esp_modem_dce.cpp b/components/esp_modem/src/esp_modem_dce.cpp index 4397302c38b..55c51f0cdc4 100644 --- a/components/esp_modem/src/esp_modem_dce.cpp +++ b/components/esp_modem/src/esp_modem_dce.cpp @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -96,6 +96,11 @@ bool DCE_Mode::set_unsafe(DTE *dte, ModuleIf *device, Netif &netif, modem_mode m { switch (m) { case modem_mode::UNDEF: + if (!dte->set_mode(m)) { + return false; + } + mode = m; + return true; case modem_mode::DUAL_MODE: // Only DTE can be in Dual mode break; case modem_mode::COMMAND_MODE: @@ -151,7 +156,7 @@ bool DCE_Mode::set_unsafe(DTE *dte, ModuleIf *device, Netif &netif, modem_mode m mode = modem_mode::CMUX_MANUAL_MODE; return true; case modem_mode::CMUX_MANUAL_EXIT: - if (mode != modem_mode::CMUX_MANUAL_MODE) { + if (mode != modem_mode::CMUX_MANUAL_MODE && mode != modem_mode::UNDEF) { return false; } if (!dte->set_mode(m)) { @@ -160,7 +165,7 @@ bool DCE_Mode::set_unsafe(DTE *dte, ModuleIf *device, Netif &netif, modem_mode m mode = modem_mode::COMMAND_MODE; return true; case modem_mode::CMUX_MANUAL_SWAP: - if (mode != modem_mode::CMUX_MANUAL_MODE) { + if (mode != modem_mode::CMUX_MANUAL_MODE && mode != modem_mode::UNDEF) { return false; } if (!dte->set_mode(m)) { @@ -168,12 +173,12 @@ bool DCE_Mode::set_unsafe(DTE *dte, ModuleIf *device, Netif &netif, modem_mode m } return true; case modem_mode::CMUX_MANUAL_DATA: - if (mode != modem_mode::CMUX_MANUAL_MODE) { + if (mode != modem_mode::CMUX_MANUAL_MODE && mode != modem_mode::UNDEF) { return false; } return transitions::enter_data(*dte, *device, netif); case modem_mode::CMUX_MANUAL_COMMAND: - if (mode != modem_mode::CMUX_MANUAL_MODE) { + if (mode != modem_mode::CMUX_MANUAL_MODE && mode != modem_mode::UNDEF) { return false; } return transitions::exit_data(*dte, *device, netif); diff --git a/components/esp_modem/src/esp_modem_dte.cpp b/components/esp_modem/src/esp_modem_dte.cpp index 08b8af3a7e6..51b4a518adc 100644 --- a/components/esp_modem/src/esp_modem_dte.cpp +++ b/components/esp_modem/src/esp_modem_dte.cpp @@ -151,10 +151,14 @@ command_result DTE::command(const std::string &cmd, got_line_cb got_line, uint32 bool DTE::exit_cmux() { + if (!cmux_term) { + return false; + } if (!cmux_term->deinit()) { return false; } exit_cmux_internal(); + cmux_term = nullptr; return true; } @@ -174,6 +178,9 @@ void DTE::exit_cmux_internal() bool DTE::setup_cmux() { + if (cmux_term) { + return false; + } cmux_term = std::make_shared(primary_term, std::move(buffer)); if (cmux_term == nullptr) { return false; @@ -198,6 +205,11 @@ bool DTE::setup_cmux() bool DTE::set_mode(modem_mode m) { + // transitions (any) -> UNDEF + if (m == modem_mode::UNDEF) { + mode = m; + return true; + } // transitions (COMMAND|UNDEF) -> CMUX if (m == modem_mode::CMUX_MODE) { if (mode == modem_mode::UNDEF || mode == modem_mode::COMMAND_MODE) { @@ -246,7 +258,7 @@ bool DTE::set_mode(modem_mode m) return false; } // manual CMUX transitions: Exit CMUX - if (m == modem_mode::CMUX_MANUAL_EXIT && mode == modem_mode::CMUX_MANUAL_MODE) { + if (m == modem_mode::CMUX_MANUAL_EXIT && (mode == modem_mode::CMUX_MANUAL_MODE || mode == modem_mode::UNDEF)) { if (exit_cmux()) { mode = modem_mode::COMMAND_MODE; return true; @@ -255,7 +267,7 @@ bool DTE::set_mode(modem_mode m) return false; } // manual CMUX transitions: Swap terminals - if (m == modem_mode::CMUX_MANUAL_SWAP && mode == modem_mode::CMUX_MANUAL_MODE) { + if (m == modem_mode::CMUX_MANUAL_SWAP && (mode == modem_mode::CMUX_MANUAL_MODE || mode == modem_mode::UNDEF)) { secondary_term.swap(primary_term); set_command_callbacks(); return true;