Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[modem]: Add support for handling URC #620

Merged
merged 2 commits into from
Sep 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion components/esp_modem/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,13 @@ menu "esp-modem"
int "Size in bytes for response from AT commands returning textual values (C-API)"
default 128
help
Some AT commands returns textrual values which C-API copy as c-string to user allocated space,
Some AT commands returns textual values which C-API copy as c-string to user allocated space,
it also truncates the output data to this size. Increase this if some AT answers are truncated.

config ESP_MODEM_URC_HANDLER
euripedesrocha marked this conversation as resolved.
Show resolved Hide resolved
bool "Enable support for adding URC handler"
default n
help
If enabled, APIs to add URC handler are available

endmenu
9 changes: 8 additions & 1 deletion components/esp_modem/include/cxx_include/esp_modem_dce.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
Expand Down Expand Up @@ -89,6 +89,13 @@ class DCE_T {
return dte->recover();
}

#ifdef CONFIG_ESP_MODEM_URC_HANDLER
void set_urc(got_line_cb on_read_cb)
{
dte->set_urc_cb(on_read_cb);
}
#endif

protected:
std::shared_ptr<DTE> dte;
std::shared_ptr<SpecificModule> device;
Expand Down
16 changes: 15 additions & 1 deletion components/esp_modem/include/cxx_include/esp_modem_dte.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
Expand Down Expand Up @@ -94,6 +94,17 @@ class DTE : public CommandableIf {
*/
void set_error_cb(std::function<void(terminal_error err)> f);

#ifdef CONFIG_ESP_MODEM_URC_HANDLER
/**
* @brief Allow setting a line callback for all incoming data
* @param line_cb
*/
void set_urc_cb(got_line_cb line_cb)
{
command_cb.urc_handler = std::move(line_cb);
}
#endif

/**
* @brief Sets the DTE to desired mode (Command/Data/Cmux)
* @param m Desired operation mode
Expand Down Expand Up @@ -191,6 +202,9 @@ class DTE : public CommandableIf {
* @brief This abstracts command callback processing and implements its locking, signaling of completion and timeouts.
*/
struct command_cb {
#ifdef CONFIG_ESP_MODEM_URC_HANDLER
got_line_cb urc_handler {}; /*!< URC callback if enabled */
#endif
static const size_t GOT_LINE = SignalGroup::bit0; /*!< Bit indicating response available */
got_line_cb got_line; /*!< Supplied command callback */
Lock line_lock{}; /*!< Command callback locking mechanism */
Expand Down
15 changes: 11 additions & 4 deletions components/esp_modem/src/esp_modem_dte.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
Expand Down Expand Up @@ -50,9 +50,11 @@ void DTE::set_command_callbacks()
{
primary_term->set_read_cb([this](uint8_t *data, size_t len) {
Scoped<Lock> l(command_cb.line_lock);
if (command_cb.got_line == nullptr) {
return false;
#ifndef CONFIG_ESP_MODEM_URC_HANDLER
if (command_cb.got_line == nullptr || command_cb.result != command_result::TIMEOUT) {
return false; // this line has been processed already (got OK or FAIL previously)
}
#endif
if (data) {
// For terminals which post data directly with the callback (CMUX)
// we cannot defragment unless we allocate, but
Expand Down Expand Up @@ -347,9 +349,14 @@ void DTE::on_read(got_line_cb on_read_cb)

bool DTE::command_cb::process_line(uint8_t *data, size_t consumed, size_t len)
{
if (result != command_result::TIMEOUT) {
#ifdef CONFIG_ESP_MODEM_URC_HANDLER
if (urc_handler) {
urc_handler(data, consumed + len);
}
if (result != command_result::TIMEOUT || got_line == nullptr) {
return false; // this line has been processed already (got OK or FAIL previously)
}
#endif
if (memchr(data + consumed, separator, len)) {
result = got_line(data, consumed + len);
if (result == command_result::OK || result == command_result::FAIL) {
Expand Down
1 change: 0 additions & 1 deletion components/esp_modem/test/target/main/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
idf_component_register(SRCS "pppd_test.cpp"
"NetworkDCE.cpp"
INCLUDE_DIRS "$ENV{IDF_PATH}/tools/catch"
REQUIRES esp_modem)

set_target_properties(${COMPONENT_LIB} PROPERTIES
Expand Down
44 changes: 15 additions & 29 deletions components/esp_modem/test/target/main/pppd_test.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
Expand All @@ -17,9 +17,6 @@
#include "freertos/FreeRTOS.h"
#include "freertos/event_groups.h"

#define CATCH_CONFIG_MAIN
#include "catch.hpp"

static const char *TAG = "pppd_test";
static EventGroupHandle_t event_group = NULL;

Expand Down Expand Up @@ -76,6 +73,9 @@ esp_err_t modem_init_network(esp_netif_t *netif);
void modem_start_network();
void modem_stop_network();

bool test_connect();
bool test_disconnect();

extern "C" void app_main(void)
{

Expand All @@ -99,41 +99,27 @@ extern "C" void app_main(void)
#endif

modem_start_network();
Catch::Session session;
int numFailed = session.run();
if (numFailed > 0) {
ESP_LOGE(TAG, "Test FAILED!");

bool t1 = test_connect();
bool t2 = test_disconnect();

if (t1 && t2) {
ESP_LOGI(TAG, "All tests passed");
} else {
ESP_LOGI(TAG, "Test passed!");
ESP_LOGE(TAG, "Test FAILED!");
}

}

TEST_CASE("Connect test", "[esp_modem]")
bool test_connect() //("Connect test", "[esp_modem]")
{
EventBits_t b = xEventGroupWaitBits(event_group, 1, pdTRUE, pdFALSE, pdMS_TO_TICKS(15000));
CHECK(b == 1);
return b == 1;
}

TEST_CASE("Disconnection test", "[esp_modem]")
bool test_disconnect() //("Disconnection test", "[esp_modem]")
{
modem_stop_network();
EventBits_t b = xEventGroupWaitBits(event_group, 2, pdTRUE, pdFALSE, pdMS_TO_TICKS(15000));
CHECK(b == 2);
}


extern "C" {

static void handle(int nr)
{
ESP_LOGE(TAG, "Signal handler %d", nr);
}

_sig_func_ptr signal (int nr, _sig_func_ptr)
{
return handle;
}


return b == 2;
}
Loading