Files
esp-protocols/esp_modem/include/cxx_include/esp_modem_dce.hpp

77 lines
1.9 KiB
C++
Raw Normal View History

2021-03-03 20:35:08 +01:00
#pragma once
2021-03-24 21:06:27 +01:00
#include <utility>
#include "cxx_include/esp_modem_netif.hpp"
2021-03-24 21:06:27 +01:00
#include "cxx_include/esp_modem_dce_module.hpp"
2021-03-28 20:22:44 +02:00
//#include "generate/esp_modem_command_declare.inc"
2021-03-03 20:35:08 +01:00
2021-03-28 20:22:44 +02:00
namespace esp_modem::dce_factory {
2021-03-24 21:06:27 +01:00
class Modes {
public:
Modes(): mode(modem_mode::COMMAND_MODE) {}
~Modes() = default;
bool set(DTE *dte, ModuleIf *module, Netif &netif, modem_mode m);
2021-03-24 21:06:27 +01:00
modem_mode get();
private:
modem_mode mode;
};
}
template<class SpecificModule>
2021-03-24 21:06:27 +01:00
class DCE_T {
static_assert(std::is_base_of<ModuleIf, SpecificModule>::value, "DCE must be instantiated with Module class only");
2021-03-03 20:35:08 +01:00
public:
2021-03-24 21:06:27 +01:00
explicit DCE_T(const std::shared_ptr<DTE>& dte, std::shared_ptr<SpecificModule> device, esp_netif_t * netif):
dte(dte), module(std::move(device)), netif(dte, netif)
{ }
2021-03-24 21:06:27 +01:00
~DCE_T() = default;
void set_data() { set_mode(modem_mode::DATA_MODE); }
void exit_data() { set_mode(modem_mode::COMMAND_MODE); }
void set_cmux() { set_mode(modem_mode::CMUX_MODE); }
2021-03-28 20:22:44 +02:00
ModuleIf* get_module() { return module.get(); }
2021-03-24 21:06:27 +01:00
command_result command(const std::string& command, got_line_cb got_line, uint32_t time_ms)
{
return dte->command(command, std::move(got_line), time_ms);
}
2021-03-24 21:06:27 +01:00
protected:
bool set_mode(modem_mode m) { return mode.set(dte.get(), module.get(), netif, m); }
std::shared_ptr<DTE> dte;
std::shared_ptr<SpecificModule> module;
Netif netif;
2021-03-28 20:22:44 +02:00
esp_modem::dce_factory::Modes mode;
2021-03-24 21:06:27 +01:00
};
2021-03-28 20:22:44 +02:00
//typedef DCE_T<GenericModule> DCE;
//
//#if 0
2021-03-24 21:06:27 +01:00
class DCE: public DCE_T<GenericModule> {
public:
using DCE_T<GenericModule>::DCE_T;
#define ESP_MODEM_DECLARE_DCE_COMMAND(name, return_type, TEMPLATE_ARG, MUX_ARG, ...) \
template <typename ...Agrs> \
return_type name(Agrs&&... args) \
{ \
2021-03-24 21:06:27 +01:00
return module->name(std::forward<Agrs>(args)...); \
}
DECLARE_ALL_COMMAND_APIS(forwards name(...) { device->name(...); } )
#undef ESP_MODEM_DECLARE_DCE_COMMAND
2021-03-28 20:22:44 +02:00
};
//#endif