From 18f196fa1e9dbc834f0baae86ce44f1606442bb3 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Fri, 6 Dec 2024 09:29:35 +0100 Subject: [PATCH] feat(modem): Add mode detection to the example --- .../pppos_client/main/pppos_client_main.c | 20 +++++++++-- .../pppos_client/sdkconfig.ci.sim800_c3 | 1 + .../include/cxx_include/esp_modem_dce.hpp | 8 ++++- .../esp_modem/include/esp_modem_c_api_types.h | 3 ++ components/esp_modem/src/esp_modem_c_api.cpp | 33 +++++++++++++++++++ 5 files changed, 62 insertions(+), 3 deletions(-) diff --git a/components/esp_modem/examples/pppos_client/main/pppos_client_main.c b/components/esp_modem/examples/pppos_client/main/pppos_client_main.c index b128844f6..7c0212eef 100644 --- a/components/esp_modem/examples/pppos_client/main/pppos_client_main.c +++ b/components/esp_modem/examples/pppos_client/main/pppos_client_main.c @@ -177,7 +177,7 @@ void app_main(void) dte_config.uart_config.rx_buffer_size = CONFIG_EXAMPLE_MODEM_UART_RX_BUFFER_SIZE; dte_config.uart_config.tx_buffer_size = CONFIG_EXAMPLE_MODEM_UART_TX_BUFFER_SIZE; dte_config.uart_config.event_queue_size = CONFIG_EXAMPLE_MODEM_UART_EVENT_QUEUE_SIZE; - dte_config.task_stack_size = CONFIG_EXAMPLE_MODEM_UART_EVENT_TASK_STACK_SIZE; + dte_config.task_stack_size = CONFIG_EXAMPLE_MODEM_UART_EVENT_TASK_STACK_SIZE * 2; dte_config.task_priority = CONFIG_EXAMPLE_MODEM_UART_EVENT_TASK_PRIORITY; dte_config.dte_buffer_size = CONFIG_EXAMPLE_MODEM_UART_RX_BUFFER_SIZE / 2; @@ -248,6 +248,22 @@ void app_main(void) xEventGroupClearBits(event_group, CONNECT_BIT | GOT_DATA_BIT | USB_DISCONNECTED_BIT); + esp_err_t err = esp_modem_set_mode(dce, ESP_MODEM_MODE_DETECT); + if (err != ESP_OK) { + ESP_LOGE(TAG, "esp_modem_set_mode(ESP_MODEM_MODE_DETECT) failed with %d", err); + return; + } + ESP_LOGI(TAG, "Mode detected!"); + esp_modem_dce_mode_t mode = esp_modem_get_mode(dce); + ESP_LOGI(TAG, "Current mode is : %d", mode); + if (mode != ESP_MODEM_MODE_COMMAND) { + err = esp_modem_set_mode(dce, ESP_MODEM_MODE_COMMAND); + if (err != ESP_OK) { + ESP_LOGE(TAG, "esp_modem_set_mode(ESP_MODEM_MODE_COMMAND) failed with %d", err); + return; + } + } + /* Run the modem demo app */ #if CONFIG_EXAMPLE_NEED_SIM_PIN == 1 // check if PIN needed @@ -262,7 +278,7 @@ void app_main(void) #endif int rssi, ber; - esp_err_t err = esp_modem_get_signal_quality(dce, &rssi, &ber); + err = esp_modem_get_signal_quality(dce, &rssi, &ber); if (err != ESP_OK) { ESP_LOGE(TAG, "esp_modem_get_signal_quality failed with %d %s", err, esp_err_to_name(err)); return; diff --git a/components/esp_modem/examples/pppos_client/sdkconfig.ci.sim800_c3 b/components/esp_modem/examples/pppos_client/sdkconfig.ci.sim800_c3 index a7832bc0a..a537afeb2 100644 --- a/components/esp_modem/examples/pppos_client/sdkconfig.ci.sim800_c3 +++ b/components/esp_modem/examples/pppos_client/sdkconfig.ci.sim800_c3 @@ -14,3 +14,4 @@ CONFIG_EXAMPLE_MQTT_TEST_TOPIC="/ci/esp-modem/pppos-client" CONFIG_EXAMPLE_PAUSE_NETIF_TO_CHECK_SIGNAL=y CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT=y CONFIG_ESP32_PANIC_PRINT_HALT=y +CONFIG_LOG_DEFAULT_LEVEL_DEBUG=y diff --git a/components/esp_modem/include/cxx_include/esp_modem_dce.hpp b/components/esp_modem/include/cxx_include/esp_modem_dce.hpp index 25ca1e411..06f050729 100644 --- a/components/esp_modem/include/cxx_include/esp_modem_dce.hpp +++ b/components/esp_modem/include/cxx_include/esp_modem_dce.hpp @@ -91,6 +91,11 @@ public: return mode.set(dte.get(), device.get(), netif, m); } + modem_mode get_mode() + { + return mode.get(); + } + bool recover() { return dte->recover(); @@ -109,11 +114,12 @@ public: * @param force true to ignore command failures and continue * @return command_result of the underlying commands */ - command_result pause_netif(bool do_pause, bool force = false) + command_result pause_netif(bool do_pause, bool force = false, int delay = 1000) { command_result result; if (do_pause) { netif.pause(); + Task::Delay(delay); // Mandatory 1s pause before dte->set_command_callbacks(); result = device->set_command_mode(); } else { diff --git a/components/esp_modem/include/esp_modem_c_api_types.h b/components/esp_modem/include/esp_modem_c_api_types.h index d3d9718d6..b82e929b6 100644 --- a/components/esp_modem/include/esp_modem_c_api_types.h +++ b/components/esp_modem/include/esp_modem_c_api_types.h @@ -45,6 +45,8 @@ typedef enum esp_modem_dce_mode { ESP_MODEM_MODE_CMUX_MANUAL_SWAP, /**< Swap terminals in CMUX manual mode */ ESP_MODEM_MODE_CMUX_MANUAL_DATA, /**< Set DATA mode in CMUX manual mode */ ESP_MODEM_MODE_CMUX_MANUAL_COMMAND, /**< Set COMMAND mode in CMUX manual mode */ + ESP_MODEM_MODE_DETECT, /**< Detect the mode and resume it (if sucessfully detected) */ + ESP_MODEM_MODE_UNDEF, } esp_modem_dce_mode_t; /** @@ -171,6 +173,7 @@ esp_err_t esp_modem_set_urc(esp_modem_dce_t *dce, esp_err_t(*got_line_cb)(uint8_ */ esp_err_t esp_modem_pause_net(esp_modem_dce_t *dce, bool pause); +esp_modem_dce_mode_t esp_modem_get_mode(esp_modem_dce_t *dce); /** * @} */ diff --git a/components/esp_modem/src/esp_modem_c_api.cpp b/components/esp_modem/src/esp_modem_c_api.cpp index edd8ff379..036e01363 100644 --- a/components/esp_modem/src/esp_modem_c_api.cpp +++ b/components/esp_modem/src/esp_modem_c_api.cpp @@ -95,12 +95,43 @@ extern "C" esp_err_t esp_modem_sync(esp_modem_dce_t *dce_wrap) return command_response_to_esp_err(dce_wrap->dce->sync()); } +extern "C" esp_modem_dce_mode_t esp_modem_get_mode(esp_modem_dce_t *dce_wrap) +{ + if (dce_wrap == nullptr || dce_wrap->dce == nullptr) { + return ESP_MODEM_MODE_UNDEF; + } + auto mode = dce_wrap->dce->get_mode(); + switch (mode) { + default: + case modem_mode::UNDEF: + return ESP_MODEM_MODE_UNDEF; + case modem_mode::COMMAND_MODE: + return ESP_MODEM_MODE_COMMAND; + case modem_mode::DATA_MODE: + return ESP_MODEM_MODE_DATA; + case modem_mode::CMUX_MODE: + return ESP_MODEM_MODE_CMUX; + case modem_mode::CMUX_MANUAL_MODE: + return ESP_MODEM_MODE_CMUX_MANUAL; + case modem_mode::CMUX_MANUAL_EXIT: + return ESP_MODEM_MODE_CMUX_MANUAL_EXIT; + case modem_mode::CMUX_MANUAL_DATA: + return ESP_MODEM_MODE_CMUX_MANUAL_DATA; + case modem_mode::CMUX_MANUAL_COMMAND: + return ESP_MODEM_MODE_CMUX_MANUAL_COMMAND; + case modem_mode::CMUX_MANUAL_SWAP: + return ESP_MODEM_MODE_CMUX_MANUAL_SWAP; + } +} + extern "C" esp_err_t esp_modem_set_mode(esp_modem_dce_t *dce_wrap, esp_modem_dce_mode_t mode) { if (dce_wrap == nullptr || dce_wrap->dce == nullptr) { return ESP_ERR_INVALID_ARG; } switch (mode) { + case ESP_MODEM_MODE_UNDEF: + return dce_wrap->dce->set_mode(modem_mode::UNDEF) ? ESP_OK : ESP_FAIL; case ESP_MODEM_MODE_DATA: return dce_wrap->dce->set_mode(modem_mode::DATA_MODE) ? ESP_OK : ESP_FAIL; case ESP_MODEM_MODE_COMMAND: @@ -117,6 +148,8 @@ extern "C" esp_err_t esp_modem_set_mode(esp_modem_dce_t *dce_wrap, esp_modem_dce return dce_wrap->dce->set_mode(modem_mode::CMUX_MANUAL_DATA) ? ESP_OK : ESP_FAIL; case ESP_MODEM_MODE_CMUX_MANUAL_COMMAND: return dce_wrap->dce->set_mode(modem_mode::CMUX_MANUAL_COMMAND) ? ESP_OK : ESP_FAIL; + case ESP_MODEM_MODE_DETECT: + return dce_wrap->dce->set_mode(modem_mode::AUTODETECT) ? ESP_OK : ESP_FAIL; } return ESP_ERR_NOT_SUPPORTED; }