diff --git a/components/esp_modem/command/include/esp_modem_api.h b/components/esp_modem/command/include/esp_modem_api.h new file mode 100644 index 0000000000..e0a168a931 --- /dev/null +++ b/components/esp_modem/command/include/esp_modem_api.h @@ -0,0 +1,338 @@ +/* + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include "esp_err.h" +//#include "generate/esp_modem_command_declare.inc" +#include "esp_modem_c_api_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// --- ESP-MODEM command module starts here --- + +// +//#define INT_IN(name) int name +//#ifdef __cplusplus +//#define STRING_IN(name) const std::string& name +//#define STRING_OUT(name) std::string& name +//#define BOOL_IN(name) const bool name +//#define BOOL_OUT(name) bool& name +//#define INT_OUT(name) int& name +//#define INTEGER_LIST_IN(name) const int* name +//#define STRUCT_OUT(struct_name, name) struct_name& name +//#else +//#define STRING_IN(name) const char* name +//#define STRING_OUT(name) char* name +//#define BOOL_IN(name) const bool name +//#define BOOL_OUT(name) bool* name +//#define INT_OUT(name) int* name +//#define INTEGER_LIST_IN(name) const int* name +//#define STRUCT_OUT(struct_name, name) esp_modem_ ## struct_name ## _t* name +//#endif +// +//#define FORWARD_INT_IN(name) name +//#define FORWARD_STRING_IN(name) name +//#define FORWARD_STRING_OUT(name) name +//#define FORWARD_BOOL_IN(name) name +//#define FORWARD_BOOL_OUT(name) name +//#define FORWARD_INT_OUT(name) name +//#define FORWARD_INTEGER_LIST_IN(name) name +//#define FORWARD_STRUCT_OUT(struct_name, name) name + +// Utility to count arguments (works for up to two parameters here) +//#define STRING_IN(name) const char* name +//#define STRING_OUT(name) char* name +//#define BOOL_IN(name) const bool name +//#define BOOL_OUT(name) bool* name +//#define INT_OUT(name) int* name +//#define INTEGER_LIST_IN(name) const int* name +//#define STRUCT_OUT(struct_name, name) esp_modem_ ## struct_name ## _t* name + + + + +/** + * @brief Sends the initial AT sequence to sync up with the device + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_sync(esp_modem_dce_t *dce ); + +/** + * @brief Reads the operator name + * @param[out] name operator name + * @param[out] act access technology + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_get_operator_name(esp_modem_dce_t *dce, char *name, int *act ); + +/** + * @brief Stores current user profile + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_store_profile(esp_modem_dce_t *dce ); + +/** + * @brief Sets the supplied PIN code + * @param[in] pin Pin + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_set_pin(esp_modem_dce_t *dce, const char *pin ); + +/** + * @brief Execute the supplied AT command in raw mode (doesn't append '\r' to command, returns everything) + * @param[in] cmd String command that's send to DTE + * @param[out] out Raw output from DTE + * @param[in] pass Pattern in response for the API to return OK + * @param[in] fail Pattern in response for the API to return FAIL + * @param[in] timeout AT command timeout in milliseconds + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_at_raw(esp_modem_dce_t *dce, const char *cmd, char *out, const char *pass, const char *fail, int timeout ); + +/** + * @brief Execute the supplied AT command + * @param[in] cmd AT command + * @param[out] out Command output string + * @param[in] timeout AT command timeout in milliseconds + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_at(esp_modem_dce_t *dce, const char *cmd, char *out, int timeout ); + +/** + * @brief Checks if the SIM needs a PIN + * @param[out] pin_ok true if the SIM card doesn't need a PIN to unlock + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_read_pin(esp_modem_dce_t *dce, bool *pin_ok ); + +/** + * @brief Sets echo mode + * @param[in] echo_on true if echo mode on (repeats the commands) + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_set_echo(esp_modem_dce_t *dce, const bool echo_on ); + +/** + * @brief Sets the Txt or Pdu mode for SMS (only txt is supported) + * @param[in] txt true if txt mode + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_sms_txt_mode(esp_modem_dce_t *dce, const bool txt ); + +/** + * @brief Sets the default (GSM) character set + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_sms_character_set(esp_modem_dce_t *dce ); + +/** + * @brief Sends SMS message in txt mode + * @param[in] number Phone number to send the message to + * @param[in] message Text message to be sent + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_send_sms(esp_modem_dce_t *dce, const char *number, const char *message ); + +/** + * @brief Resumes data mode (Switches back to the data mode, which was temporarily suspended) + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_resume_data_mode(esp_modem_dce_t *dce ); + +/** + * @brief Sets php context + * @param[in] p1 PdP context struct to setup modem cellular connection + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_set_pdp_context(esp_modem_dce_t *dce, esp_modem_PdpContext_t *pdp ); + +/** + * @brief Switches to the command mode + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_set_command_mode(esp_modem_dce_t *dce ); + +/** + * @brief Switches to the CMUX mode + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_set_cmux(esp_modem_dce_t *dce ); + +/** + * @brief Reads the IMSI number + * @param[out] imsi Module's IMSI number + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_get_imsi(esp_modem_dce_t *dce, char *imsi ); + +/** + * @brief Reads the IMEI number + * @param[out] imei Module's IMEI number + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_get_imei(esp_modem_dce_t *dce, char *imei ); + +/** + * @brief Reads the module name + * @param[out] name module name + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_get_module_name(esp_modem_dce_t *dce, char *name ); + +/** + * @brief Sets the modem to data mode + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_set_data_mode(esp_modem_dce_t *dce ); + +/** + * @brief Get Signal quality + * @param[out] rssi signal strength indication + * @param[out] ber channel bit error rate + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_get_signal_quality(esp_modem_dce_t *dce, int *rssi, int *ber ); + +/** + * @brief Sets HW control flow + * @param[in] dce_flow 0=none, 2=RTS hw flow control of DCE + * @param[in] dte_flow 0=none, 2=CTS hw flow control of DTE + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_set_flow_control(esp_modem_dce_t *dce, int dce_flow, int dte_flow ); + +/** + * @brief Hangs up current data call + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_hang_up(esp_modem_dce_t *dce ); + +/** + * @brief Get voltage levels of modem power up circuitry + * @param[out] voltage Current status in mV + * @param[out] bcs charge status (-1-Not available, 0-Not charging, 1-Charging, 2-Charging done) + * @param[out] bcl 1-100% battery capacity, -1-Not available + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_get_battery_status(esp_modem_dce_t *dce, int *voltage, int *bcs, int *bcl ); + +/** + * @brief Power down the module + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_power_down(esp_modem_dce_t *dce ); + +/** + * @brief Reset the module + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_reset(esp_modem_dce_t *dce ); + +/** + * @brief Configures the baudrate + * @param[in] baud Desired baud rate of the DTE + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_set_baud(esp_modem_dce_t *dce, int baud ); + +/** + * @brief Force an attempt to connect to a specific operator + * @param[in] mode mode of attempt + * mode=0 - automatic + * mode=1 - manual + * mode=2 - deregister + * mode=3 - set format for read operation + * mode=4 - manual with fallback to automatic + * @param[in] format what format the operator is given in + * format=0 - long format + * format=1 - short format + * format=2 - numeric + * @param[in] oper the operator to connect to + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_set_operator(esp_modem_dce_t *dce, int mode, int format, const char *oper ); + +/** + * @brief Attach or detach from the GPRS service + * @param[in] state 1-attach 0-detach + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_set_network_attachment_state(esp_modem_dce_t *dce, int state ); + +/** + * @brief Get network attachment state + * @param[out] state 1-attached 0-detached + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_get_network_attachment_state(esp_modem_dce_t *dce, int *state ); + +/** + * @brief What mode the radio should be set to + * @param[in] state state 1-full 0-minimum ... + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_set_radio_state(esp_modem_dce_t *dce, int state ); + +/** + * @brief Get current radio state + * @param[out] state 1-full 0-minimum ... + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_get_radio_state(esp_modem_dce_t *dce, int *state ); + +/** + * @brief Set network mode + * @param[in] mode preferred mode + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_set_network_mode(esp_modem_dce_t *dce, int mode ); + +/** + * @brief Preferred network mode (CAT-M and/or NB-IoT) + * @param[in] mode preferred selection + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_set_preferred_mode(esp_modem_dce_t *dce, int mode ); + +/** + * @brief Set network bands for CAT-M or NB-IoT + * @param[in] mode CAT-M or NB-IoT + * @param[in] bands bitmap in hex representing bands + * @param[in] size size of teh bands bitmap + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_set_network_bands(esp_modem_dce_t *dce, const char *mode, const int *bands, int size ); + +/** + * @brief Show network system mode + * @param[out] mode current network mode + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_get_network_system_mode(esp_modem_dce_t *dce, int *mode ); + +/** + * @brief GNSS power control + * @param[out] mode power mode (0 - off, 1 - on) + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_set_gnss_power_mode(esp_modem_dce_t *dce, int mode ); + +/** + * @brief GNSS power control + * @param[out] mode power mode (0 - off, 1 - on) + * @return OK, FAIL or TIMEOUT + */ +esp_err_t esp_modem_get_gnss_power_mode(esp_modem_dce_t *dce, int *mode ); + + +// --- ESP-MODEM command module ends here --- + +#ifdef __cplusplus +} +#endif diff --git a/components/esp_modem/generate/include/esp_modem_api.h b/components/esp_modem/generate/include/esp_modem_api.h index 94fa1f301d..6065c2c49b 100644 --- a/components/esp_modem/generate/include/esp_modem_api.h +++ b/components/esp_modem/generate/include/esp_modem_api.h @@ -23,6 +23,7 @@ extern "C" { #include "esp_modem_command_declare.inc" #undef ESP_MODEM_DECLARE_DCE_COMMAND +// --- ESP-MODEM command module ends here --- #ifdef __cplusplus } diff --git a/components/esp_modem/include/cxx_include/esp_modem_dce_template.hpp b/components/esp_modem/include/cxx_include/esp_modem_dce_template.hpp index be3a887c32..7e689907c0 100644 --- a/components/esp_modem/include/cxx_include/esp_modem_dce_template.hpp +++ b/components/esp_modem/include/cxx_include/esp_modem_dce_template.hpp @@ -30,9 +30,11 @@ class DCE_Mode { ~DCE_Mode() = default; bool set(DTE *dte, ModuleIf *module, Netif &netif, modem_mode m); modem_mode get(); + modem_mode guess(DTE *dte, bool with_cmux = false); private: bool set_unsafe(DTE *dte, ModuleIf *module, Netif &netif, modem_mode m); + modem_mode guess_unsafe(DTE *dte, bool with_cmux); modem_mode mode; }; @@ -79,6 +81,11 @@ class DCE_T { return dte->command(command, std::move(got_line), time_ms); } + modem_mode guess_mode(bool with_cmux = false) + { + return mode.guess(dte.get(), with_cmux); + } + bool set_mode(modem_mode m) { return mode.set(dte.get(), device.get(), netif, m); diff --git a/components/esp_modem/scripts/generate.sh b/components/esp_modem/scripts/generate.sh index 1b8dba96ef..f6f9d8266a 100755 --- a/components/esp_modem/scripts/generate.sh +++ b/components/esp_modem/scripts/generate.sh @@ -52,5 +52,7 @@ for file in "${files[@]}"; do # Preprocess everything else to expand command prototypes or implementations sed -n '1,/ESP-MODEM command module starts here/!p' "$in_file" | \ $compiler -I"$script_dir" -I"$processing_dir/generate/include" -I"$processing_dir/include" -I"$current_file_dir" - >> "$out_file" + # Add potential footer (typically closing C++ sentinel) + sed -n '1,/ESP-MODEM command module ends here/!p' "$in_file" >> "$out_file" astyle --style=otbs --attach-namespaces --attach-classes --indent=spaces=4 --convert-tabs --align-pointer=name --align-reference=name --keep-one-line-statements --pad-header --pad-oper --quiet "$out_file" done