diff --git a/components/esp_modem/CMakeLists.txt b/components/esp_modem/CMakeLists.txt index 447d94af7..80fbe28f9 100644 --- a/components/esp_modem/CMakeLists.txt +++ b/components/esp_modem/CMakeLists.txt @@ -37,7 +37,7 @@ idf_component_register(SRCS "${srcs}" set_target_properties(${COMPONENT_LIB} PROPERTIES - CXX_STANDARD 17 + CXX_STANDARD 23 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS ON ) diff --git a/components/esp_modem/include/cxx_include/esp_modem_command_library.hpp b/components/esp_modem/include/cxx_include/esp_modem_command_library.hpp index d0e133eeb..197417e41 100644 --- a/components/esp_modem/include/cxx_include/esp_modem_command_library.hpp +++ b/components/esp_modem/include/cxx_include/esp_modem_command_library.hpp @@ -31,9 +31,9 @@ namespace dce_commands { * @param fail_phrase String to be present in the reply to fail this command * @param timeout_ms Timeout in ms */ -command_result generic_command(CommandableIf *t, const std::string &command, - const std::string &pass_phrase, - const std::string &fail_phrase, uint32_t timeout_ms); +command_result generic_command(CommandableIf *t, std::string_view command, + std::string_view pass_phrase, + std::string_view fail_phrase, uint32_t timeout_ms); /** * @brief Declaration of all commands is generated from esp_modem_command_declare.inc diff --git a/components/esp_modem/include/cxx_include/esp_modem_command_library_utils.hpp b/components/esp_modem/include/cxx_include/esp_modem_command_library_utils.hpp index 9cae9cdf9..79f9f4a1e 100644 --- a/components/esp_modem/include/cxx_include/esp_modem_command_library_utils.hpp +++ b/components/esp_modem/include/cxx_include/esp_modem_command_library_utils.hpp @@ -6,6 +6,9 @@ #pragma once +#include +#include + namespace esp_modem::dce_commands { /** @@ -17,9 +20,9 @@ namespace esp_modem::dce_commands { * @param timeout_ms Command timeout in ms * @return Generic command return type (OK, FAIL, TIMEOUT) */ -command_result generic_command(CommandableIf *t, const std::string &command, - const std::string &pass_phrase, - const std::string &fail_phrase, uint32_t timeout_ms); +command_result generic_command(CommandableIf *t, std::string_view command, + std::string_view pass_phrase, + std::string_view fail_phrase, uint32_t timeout_ms); /** * @brief Utility command to send command and return reply (after DCE says OK) @@ -29,7 +32,7 @@ command_result generic_command(CommandableIf *t, const std::string &command, * @param timeout_ms Command timeout in ms * @return Generic command return type (OK, FAIL, TIMEOUT) */ -template command_result generic_get_string(CommandableIf *t, const std::string &command, T &output, uint32_t timeout_ms = 500); +template command_result generic_get_string(CommandableIf *t, std::string_view command, T &output, uint32_t timeout_ms = 500); /** * @brief Generic command that passes on "OK" and fails on "ERROR" @@ -38,6 +41,6 @@ template command_result generic_get_string(CommandableIf *t, const * @param timeout_ms Command timeout in ms * @return Generic command return type (OK, FAIL, TIMEOUT) */ -command_result generic_command_common(CommandableIf *t, const std::string &command, uint32_t timeout_ms = 500); +command_result generic_command_common(CommandableIf *t, std::string_view command, uint32_t timeout_ms = 500); } // esp_modem::dce_commands 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 1b04bbfdd..f7e86e2c2 100644 --- a/components/esp_modem/include/cxx_include/esp_modem_dce.hpp +++ b/components/esp_modem/include/cxx_include/esp_modem_dce.hpp @@ -74,7 +74,7 @@ public: return device.get(); } - command_result command(const std::string &command, got_line_cb got_line, uint32_t time_ms) + command_result command(std::string_view command, got_line_cb got_line, uint32_t time_ms) { return dte->command(command, std::move(got_line), time_ms); } diff --git a/components/esp_modem/include/cxx_include/esp_modem_dte.hpp b/components/esp_modem/include/cxx_include/esp_modem_dte.hpp index b865180c5..5aa9406ab 100644 --- a/components/esp_modem/include/cxx_include/esp_modem_dte.hpp +++ b/components/esp_modem/include/cxx_include/esp_modem_dte.hpp @@ -108,12 +108,12 @@ public: * @param time_ms Time in ms to wait for the answer * @return OK, FAIL, TIMEOUT */ - command_result command(const std::string &command, got_line_cb got_line, uint32_t time_ms) override; + command_result command(std::string_view command, got_line_cb got_line, uint32_t time_ms) override; /** * @brief Sends the command (same as above) but with a specific separator */ - command_result command(const std::string &command, got_line_cb got_line, uint32_t time_ms, char separator) override; + command_result command(std::string_view command, got_line_cb got_line, uint32_t time_ms, char separator) override; /** * @brief Allows this DTE to recover from a generic connection issue diff --git a/components/esp_modem/include/cxx_include/esp_modem_types.hpp b/components/esp_modem/include/cxx_include/esp_modem_types.hpp index 944427156..9ea85cf04 100644 --- a/components/esp_modem/include/cxx_include/esp_modem_types.hpp +++ b/components/esp_modem/include/cxx_include/esp_modem_types.hpp @@ -79,8 +79,8 @@ public: * @param separator Character treated as a line separator, typically '\n' * @return OK, FAIL or TIMEOUT */ - virtual command_result command(const std::string &command, got_line_cb got_line, uint32_t time_ms, const char separator) = 0; - virtual command_result command(const std::string &command, got_line_cb got_line, uint32_t time_ms) = 0; + virtual command_result command(std::string_view command, got_line_cb got_line, uint32_t time_ms, const char separator) = 0; + virtual command_result command(std::string_view command, got_line_cb got_line, uint32_t time_ms) = 0; virtual int write(uint8_t *data, size_t len) = 0; virtual void on_read(got_line_cb on_data) = 0; diff --git a/components/esp_modem/src/esp_modem_command_library.cpp b/components/esp_modem/src/esp_modem_command_library.cpp index 6f06bb7bd..96d236766 100644 --- a/components/esp_modem/src/esp_modem_command_library.cpp +++ b/components/esp_modem/src/esp_modem_command_library.cpp @@ -5,7 +5,8 @@ */ #include -#include +#include + #include "esp_log.h" #include "cxx_include/esp_modem_dte.hpp" #include "cxx_include/esp_modem_dce_module.hpp" @@ -16,12 +17,12 @@ namespace esp_modem::dce_commands { static const char *TAG = "command_lib"; -static command_result generic_command(CommandableIf *t, const std::string &command, - const std::list &pass_phrase, - const std::list &fail_phrase, - uint32_t timeout_ms) +command_result generic_command(CommandableIf *t, std::string_view command, + std::span pass_phrase, + std::span fail_phrase, + uint32_t timeout_ms) { - ESP_LOGD(TAG, "%s command %s\n", __func__, command.c_str()); + ESP_LOGD(TAG, "%s command %.*s\n", __func__, command.size(), command.data()); return t->command(command, [&](uint8_t *data, size_t len) { std::string_view response((char *)data, len); if (data == nullptr || len == 0 || response.empty()) { @@ -41,13 +42,13 @@ static command_result generic_command(CommandableIf *t, const std::string &comma } -command_result generic_command(CommandableIf *t, const std::string &command, - const std::string &pass_phrase, - const std::string &fail_phrase, uint32_t timeout_ms) +command_result generic_command(CommandableIf *t, std::string_view command, + std::string_view pass_phrase, + std::string_view fail_phrase, uint32_t timeout_ms) { ESP_LOGV(TAG, "%s", __func__ ); - const auto pass = std::list({pass_phrase}); - const auto fail = std::list({fail_phrase}); + const std::string_view pass[] { pass_phrase }; + const std::string_view fail[] { fail_phrase }; return generic_command(t, command, pass, fail, timeout_ms); } @@ -79,7 +80,7 @@ bool set(std::span &dest, std::string_view &src) } // str_copy -template command_result generic_get_string(CommandableIf *t, const std::string &command, T &output, uint32_t timeout_ms) +template command_result generic_get_string(CommandableIf *t, std::string_view command, T &output, uint32_t timeout_ms) { ESP_LOGV(TAG, "%s", __func__ ); return t->command(command, [&](uint8_t *data, size_t len) { @@ -108,7 +109,7 @@ template command_result generic_get_string(CommandableIf *t, const }, timeout_ms); } -command_result generic_command_common(CommandableIf *t, const std::string &command, uint32_t timeout_ms) +command_result generic_command_common(CommandableIf *t, std::string_view command, uint32_t timeout_ms) { ESP_LOGV(TAG, "%s", __func__ ); return generic_command(t, command, "OK", "ERROR", timeout_ms); @@ -313,9 +314,7 @@ command_result resume_data_mode(CommandableIf *t) command_result set_command_mode(CommandableIf *t) { ESP_LOGV(TAG, "%s", __func__ ); - const auto pass = std::list({"NO CARRIER", "OK"}); - const auto fail = std::list({"ERROR"}); - return generic_command(t, "+++", pass, fail, 5000); + return generic_command(t, "+++", {"NO CARRIER", "OK"}, {"ERROR"}, 5000); } command_result get_imsi(CommandableIf *t, std::string &imsi_number) diff --git a/components/esp_modem/src/esp_modem_dte.cpp b/components/esp_modem/src/esp_modem_dte.cpp index 5517ac606..a58ba640e 100644 --- a/components/esp_modem/src/esp_modem_dte.cpp +++ b/components/esp_modem/src/esp_modem_dte.cpp @@ -130,11 +130,11 @@ void DTE::set_command_callbacks() } -command_result DTE::command(const std::string &command, got_line_cb got_line, uint32_t time_ms, const char separator) +command_result DTE::command(std::string_view command, got_line_cb got_line, uint32_t time_ms, const char separator) { Scoped l1(internal_lock); command_cb.set(got_line, separator); - primary_term->write((uint8_t *)command.c_str(), command.length()); + primary_term->write((uint8_t *)command.data(), command.length()); command_cb.wait_for_line(time_ms); command_cb.set(nullptr); buffer.consumed = 0; @@ -144,7 +144,7 @@ command_result DTE::command(const std::string &command, got_line_cb got_line, ui return command_cb.result; } -command_result DTE::command(const std::string &cmd, got_line_cb got_line, uint32_t time_ms) +command_result DTE::command(std::string_view cmd, got_line_cb got_line, uint32_t time_ms) { return command(cmd, got_line, time_ms, '\n'); }