#pragma once #include #include #include "generate/esp_modem_command_declare.inc" #include "cxx_include/esp_modem_command_library.hpp" #include "cxx_include/esp_modem_types.hpp" enum class command_result; class DTE; class GenericModule: public ModuleIf { public: explicit GenericModule(std::shared_ptr dte, std::unique_ptr pdp): dte(std::move(dte)), pdp(std::move(pdp)) {} bool setup_data_mode() override { if (set_echo(false) != command_result::OK) return false; if (set_pdp_context(*pdp) != command_result::OK) return false; return true; } bool set_mode(modem_mode mode) override { if (mode == modem_mode::DATA_MODE) { if (set_data_mode() != command_result::OK) return resume_data_mode() == command_result::OK; return true; } else if (mode == modem_mode::COMMAND_MODE) { return set_command_mode() == command_result::OK; } else if (mode == modem_mode::CMUX_MODE) { return set_cmux() == command_result::OK; } return true; } #define ESP_MODEM_DECLARE_DCE_COMMAND(name, return_type, TEMPLATE_ARG, MUX_ARG, ...) \ template \ return_type name(Agrs&&... args) { return esp_modem::dce_commands::name(dte.get(), std::forward(args)...); } DECLARE_ALL_COMMAND_APIS(return_type name(...); ) #undef ESP_MODEM_DECLARE_DCE_COMMAND protected: std::shared_ptr dte; std::unique_ptr pdp; }; // Definitions of other modules class SIM7600: public GenericModule { using GenericModule::GenericModule; public: command_result get_module_name(std::string& name); }; class SIM800: public GenericModule { using GenericModule::GenericModule; public: command_result get_module_name(std::string& name); }; class BG96: public GenericModule { public: command_result get_module_name(std::string& name); };