Skip to content

Commit 93cb2ca

Browse files
committed
fix(modem): Fixed mode transitions between any state and UNDEF
Closes espressif#320
1 parent 7c5a832 commit 93cb2ca

File tree

3 files changed

+28
-8
lines changed

3 files changed

+28
-8
lines changed

components/esp_modem/examples/modem_console/main/modem_console_main.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,9 @@ extern "C" void app_main(void)
235235
if (c->get_count_of(&SetModeArgs::mode)) {
236236
auto mode = c->get_string_of(&SetModeArgs::mode);
237237
modem_mode dev_mode;
238-
if (mode == "CMUX1") {
238+
if (mode == "UNDEF") {
239+
dev_mode = esp_modem::modem_mode::UNDEF;
240+
} else if (mode == "CMUX1") {
239241
dev_mode = esp_modem::modem_mode::CMUX_MANUAL_MODE;
240242
} else if (mode == "CMUX2") {
241243
dev_mode = esp_modem::modem_mode::CMUX_MANUAL_EXIT;

components/esp_modem/src/esp_modem_dce.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -96,6 +96,11 @@ bool DCE_Mode::set_unsafe(DTE *dte, ModuleIf *device, Netif &netif, modem_mode m
9696
{
9797
switch (m) {
9898
case modem_mode::UNDEF:
99+
if (!dte->set_mode(m)) {
100+
return false;
101+
}
102+
mode = m;
103+
return true;
99104
case modem_mode::DUAL_MODE: // Only DTE can be in Dual mode
100105
break;
101106
case modem_mode::COMMAND_MODE:
@@ -151,7 +156,7 @@ bool DCE_Mode::set_unsafe(DTE *dte, ModuleIf *device, Netif &netif, modem_mode m
151156
mode = modem_mode::CMUX_MANUAL_MODE;
152157
return true;
153158
case modem_mode::CMUX_MANUAL_EXIT:
154-
if (mode != modem_mode::CMUX_MANUAL_MODE) {
159+
if (mode != modem_mode::CMUX_MANUAL_MODE && mode != modem_mode::UNDEF) {
155160
return false;
156161
}
157162
if (!dte->set_mode(m)) {
@@ -160,20 +165,20 @@ bool DCE_Mode::set_unsafe(DTE *dte, ModuleIf *device, Netif &netif, modem_mode m
160165
mode = modem_mode::COMMAND_MODE;
161166
return true;
162167
case modem_mode::CMUX_MANUAL_SWAP:
163-
if (mode != modem_mode::CMUX_MANUAL_MODE) {
168+
if (mode != modem_mode::CMUX_MANUAL_MODE && mode != modem_mode::UNDEF) {
164169
return false;
165170
}
166171
if (!dte->set_mode(m)) {
167172
return false;
168173
}
169174
return true;
170175
case modem_mode::CMUX_MANUAL_DATA:
171-
if (mode != modem_mode::CMUX_MANUAL_MODE) {
176+
if (mode != modem_mode::CMUX_MANUAL_MODE && mode != modem_mode::UNDEF) {
172177
return false;
173178
}
174179
return transitions::enter_data(*dte, *device, netif);
175180
case modem_mode::CMUX_MANUAL_COMMAND:
176-
if (mode != modem_mode::CMUX_MANUAL_MODE) {
181+
if (mode != modem_mode::CMUX_MANUAL_MODE && mode != modem_mode::UNDEF) {
177182
return false;
178183
}
179184
return transitions::exit_data(*dte, *device, netif);

components/esp_modem/src/esp_modem_dte.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,14 @@ command_result DTE::command(const std::string &cmd, got_line_cb got_line, uint32
151151

152152
bool DTE::exit_cmux()
153153
{
154+
if (!cmux_term) {
155+
return false;
156+
}
154157
if (!cmux_term->deinit()) {
155158
return false;
156159
}
157160
exit_cmux_internal();
161+
cmux_term.reset();
158162
return true;
159163
}
160164

@@ -174,6 +178,10 @@ void DTE::exit_cmux_internal()
174178

175179
bool DTE::setup_cmux()
176180
{
181+
if (cmux_term) {
182+
ESP_LOGE("esp_modem_dte", "Cannot setup_cmux(), cmux_term already exists");
183+
return false;
184+
}
177185
cmux_term = std::make_shared<CMux>(primary_term, std::move(buffer));
178186
if (cmux_term == nullptr) {
179187
return false;
@@ -198,6 +206,11 @@ bool DTE::setup_cmux()
198206

199207
bool DTE::set_mode(modem_mode m)
200208
{
209+
// transitions (any) -> UNDEF
210+
if (m == modem_mode::UNDEF) {
211+
mode = m;
212+
return true;
213+
}
201214
// transitions (COMMAND|UNDEF) -> CMUX
202215
if (m == modem_mode::CMUX_MODE) {
203216
if (mode == modem_mode::UNDEF || mode == modem_mode::COMMAND_MODE) {
@@ -246,7 +259,7 @@ bool DTE::set_mode(modem_mode m)
246259
return false;
247260
}
248261
// manual CMUX transitions: Exit CMUX
249-
if (m == modem_mode::CMUX_MANUAL_EXIT && mode == modem_mode::CMUX_MANUAL_MODE) {
262+
if (m == modem_mode::CMUX_MANUAL_EXIT && (mode == modem_mode::CMUX_MANUAL_MODE || mode == modem_mode::UNDEF)) {
250263
if (exit_cmux()) {
251264
mode = modem_mode::COMMAND_MODE;
252265
return true;
@@ -255,7 +268,7 @@ bool DTE::set_mode(modem_mode m)
255268
return false;
256269
}
257270
// manual CMUX transitions: Swap terminals
258-
if (m == modem_mode::CMUX_MANUAL_SWAP && mode == modem_mode::CMUX_MANUAL_MODE) {
271+
if (m == modem_mode::CMUX_MANUAL_SWAP && (mode == modem_mode::CMUX_MANUAL_MODE || mode == modem_mode::UNDEF)) {
259272
secondary_term.swap(primary_term);
260273
set_command_callbacks();
261274
return true;

0 commit comments

Comments
 (0)