From fe536e476c4d646b24f22c34dfa6323c0b4e1754 Mon Sep 17 00:00:00 2001 From: diplfranzhoepfinger <37779037+diplfranzhoepfinger@users.noreply.github.com> Date: Wed, 5 Oct 2022 08:54:41 +0200 Subject: [PATCH] esp_modem_get_gnss_power_mode (#136) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Franz Höpfinger --- .../generate/esp_modem_command_declare.inc | 7 +++++++ components/esp_modem/src/esp_modem_c_api.cpp | 13 ++++++++++++ .../src/esp_modem_command_library.cpp | 21 +++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/components/esp_modem/include/generate/esp_modem_command_declare.inc b/components/esp_modem/include/generate/esp_modem_command_declare.inc index 3406c75fd..de2fd382e 100644 --- a/components/esp_modem/include/generate/esp_modem_command_declare.inc +++ b/components/esp_modem/include/generate/esp_modem_command_declare.inc @@ -295,6 +295,13 @@ ESP_MODEM_DECLARE_DCE_COMMAND(get_network_system_mode, command_result, 1, INT_OU */ \ ESP_MODEM_DECLARE_DCE_COMMAND(set_gnss_power_mode, command_result, 1, INT_IN(p1, mode)) \ \ +/** + * @brief GNSS power control + * @param[out] mode power mode (0 - off, 1 - on) + * @return OK, FAIL or TIMEOUT + */ \ +ESP_MODEM_DECLARE_DCE_COMMAND(get_gnss_power_mode, command_result, 1, INT_OUT(p1, mode)) \ + \ #ifdef GENERATE_DOCS diff --git a/components/esp_modem/src/esp_modem_c_api.cpp b/components/esp_modem/src/esp_modem_c_api.cpp index 29a4d1b51..f1f0aa15b 100644 --- a/components/esp_modem/src/esp_modem_c_api.cpp +++ b/components/esp_modem/src/esp_modem_c_api.cpp @@ -371,6 +371,19 @@ extern "C" esp_err_t esp_modem_set_gnss_power_mode(esp_modem_dce_t *dce_wrap, in return command_response_to_esp_err(dce_wrap->dce->set_gnss_power_mode(mode)); } +extern "C" esp_err_t esp_modem_get_gnss_power_mode(esp_modem_dce_t *dce_wrap, int *p_mode) +{ + if (dce_wrap == nullptr || dce_wrap->dce == nullptr) { + return ESP_ERR_INVALID_ARG; + } + int mode; + auto ret = command_response_to_esp_err(dce_wrap->dce->get_gnss_power_mode(mode)); + if (ret == ESP_OK) { + *p_mode = mode; + } + return ret; +} + extern "C" esp_err_t esp_modem_reset(esp_modem_dce_t *dce_wrap) { return command_response_to_esp_err(dce_wrap->dce->reset()); diff --git a/components/esp_modem/src/esp_modem_command_library.cpp b/components/esp_modem/src/esp_modem_command_library.cpp index 78be8879f..065483efa 100644 --- a/components/esp_modem/src/esp_modem_command_library.cpp +++ b/components/esp_modem/src/esp_modem_command_library.cpp @@ -554,6 +554,27 @@ command_result set_gnss_power_mode(CommandableIf *t, int mode) return generic_command_common(t, "AT+CGNSPWR=" + std::to_string(mode) + "\r"); } +command_result get_gnss_power_mode(CommandableIf *t, int &mode) +{ + ESP_LOGV(TAG, "%s", __func__ ); + std::string_view out; + auto ret = generic_get_string(t, "AT+CGNSPWR?\r", out); + if (ret != command_result::OK) { + return ret; + } + constexpr std::string_view pattern = "+CGNSPWR: "; + constexpr int pos = pattern.size(); + if (out.find(pattern) == std::string::npos) { + return command_result::FAIL; + } + + if (std::from_chars(out.data() + pos, out.data() + out.size(), mode).ec == std::errc::invalid_argument) { + return command_result::FAIL; + } + + return command_result::OK; +} + command_result set_gnss_power_mode_sim76xx(CommandableIf *t, int mode) { ESP_LOGV(TAG, "%s", __func__ );