esp-modem(DCE-Factory): Minor corrections per code review

This commit is contained in:
David Čermák
2021-06-01 15:52:39 +08:00
committed by David Cermak
parent 3332c27978
commit dc64f862c4
8 changed files with 131 additions and 83 deletions

View File

@ -85,7 +85,7 @@ protected:
/**
* @brief Common abstraction of the modem DCE, specialized by the GenericModule which is a parent class for the supported
* defices and most common modems, as well.
* devices and most common modems, as well.
*/
class DCE : public DCE_T<GenericModule> {
public:

View File

@ -13,6 +13,7 @@
// limitations under the License.
#pragma once
#include "esp_log.h"
/**
* @defgroup ESP_MODEM_DCE_FACTORY
@ -30,62 +31,67 @@ using config = ::esp_modem_dce_config;
/**
* @brief Helper class for creating a uder define pointer in a specific way, either as a plain pointer, shared_ptr or unique_ptr
* @brief Helper class for creating a user define pointer in a specific way, either as a plain pointer, shared_ptr or unique_ptr
*/
class FactoryHelper {
public:
static std::unique_ptr<PdpContext> create_pdp_context(std::string &apn);
template <typename T, typename Ptr, typename ...Args>
static auto make(Args&&... args) -> typename std::enable_if<std::is_same<Ptr, T*>::value, T*>::type
template <typename T, typename T_Ptr, typename ...Args>
static auto make(Args&&... args) -> typename std::enable_if<std::is_same<T_Ptr, T*>::value, T*>::type
{
return new T(std::forward<Args>(args)...);
}
template <typename T, typename Ptr, typename ...Args>
static auto make(Args&&... args) -> typename std::enable_if<std::is_same<Ptr, std::shared_ptr<T>>::value, std::shared_ptr<T>>::type
template <typename T, typename T_Ptr, typename ...Args>
static auto make(Args&&... args) -> typename std::enable_if<std::is_same<T_Ptr, std::shared_ptr<T>>::value, std::shared_ptr<T>>::type
{
return std::make_shared<T>(std::forward<Args>(args)...);
}
template <typename T, typename Ptr = std::unique_ptr<T>, typename ...Args>
static auto make(Args&&... args) -> typename std::enable_if<std::is_same<Ptr, std::unique_ptr<T>>::value, std::unique_ptr<T>>::type
template <typename T, typename T_Ptr = std::unique_ptr<T>, typename ...Args>
static auto make(Args&&... args) -> typename std::enable_if<std::is_same<T_Ptr, std::unique_ptr<T>>::value, std::unique_ptr<T>>::type
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
};
/**
* @brief Builder class for building a DCE_T<Module> in a specific way, either form a Module object or by default from the DTE and netif
* @brief Builder class for building a DCE_T<Module> in a specific way, either from a Module object or by default from the DTE and netif
*
* @throws
* - esp_modem::esp_err_exception on invalid arguments
* - std::bad_alloc if failed to allocate
*/
template<typename Module>
template<typename T_Module>
class Builder {
static_assert(std::is_base_of<ModuleIf, Module>::value, "Builder must be used only for Module classes");
static_assert(std::is_base_of<ModuleIf, T_Module>::value, "Builder must be used only for Module classes");
public:
Builder(std::shared_ptr<DTE> x, esp_netif_t* esp_netif): dte(std::move(x)), device(nullptr), netif(esp_netif)
Builder(std::shared_ptr<DTE> dte, esp_netif_t* esp_netif): dte(std::move(dte)), device(nullptr), netif(esp_netif)
{
throw_if_false(netif != nullptr, "Null netif");
}
Builder(std::shared_ptr<DTE> dte, esp_netif_t* esp_netif, std::shared_ptr<Module> dev): dte(std::move(dte)), device(std::move(dev)), netif(esp_netif)
Builder(std::shared_ptr<DTE> dte, esp_netif_t* esp_netif, std::shared_ptr<T_Module> dev): dte(std::move(dte)), device(std::move(dev)), netif(esp_netif)
{
throw_if_false(netif != nullptr, "Null netif");
}
~Builder()
{
throw_if_false(device == nullptr, "module was captured or created but never used");
if (device == nullptr) {
ESP_LOGE("dce_factory::~Builder", "module was captured or created but never used");
}
}
template<typename Ptr>
auto create_module(const esp_modem_dce_config *config) -> Ptr
template<typename T_Ptr>
auto create_module(const esp_modem_dce_config *config) -> T_Ptr
{
return FactoryHelper::make<Module, Ptr>(dte, config);
return FactoryHelper::make<T_Module, T_Ptr>(dte, config);
}
template<typename DceT, typename Ptr>
auto create(const esp_modem_dce_config *config) -> Ptr
template<typename T_Dce, typename T_Ptr>
auto create(const esp_modem_dce_config *config) -> T_Ptr
{
if (dte == nullptr)
return nullptr;
@ -94,19 +100,19 @@ public:
if (device == nullptr)
return nullptr;
}
return FactoryHelper::make<DceT, Ptr>(std::move(dte), std::move(device), netif);
return FactoryHelper::make<T_Dce, T_Ptr>(std::move(dte), std::move(device), netif);
}
private:
std::shared_ptr<DTE> dte;
std::shared_ptr<Module> device;
std::shared_ptr<T_Module> device;
esp_netif_t *netif;
};
/**
* @brief Specific modem choice when creating by the Factory
*/
enum class Modem {
enum class ModemType {
GenericModule, /*!< Default generic module with the most common commands */
SIM7600, /*!< Derived from the GenericModule, specifics applied to SIM7600 model */
BG96, /*!< Derived from the GenericModule, specifics applied to BG69 model */
@ -119,7 +125,7 @@ enum class Modem {
*/
class Factory {
public:
explicit Factory(Modem modem): m(modem) {}
explicit Factory(ModemType modem): m(modem) {}
/**
* @brief Create a default unique_ptr DCE in a specific way (from the module)
@ -129,10 +135,10 @@ public:
* @param args typically a DTE object and a netif handle for PPP network
* @return unique_ptr DCE of the created DCE on success
*/
template <typename Module, typename ...Args>
template <typename T_Module, typename ...Args>
static std::unique_ptr<DCE> build_unique(const config *cfg, Args&&... args)
{
return build_generic_DCE<Module, DCE, std::unique_ptr<DCE>>(cfg, std::forward<Args>(args)...);
return build_generic_DCE<T_Module, DCE, std::unique_ptr<DCE>>(cfg, std::forward<Args>(args)...);
}
/**
@ -143,17 +149,17 @@ public:
* @param args typically a DTE object and a netif handle for PPP network
* @return DCE pointer the created DCE on success
*/
template <typename Module, typename ...Args>
template <typename T_Module, typename ...Args>
static DCE* build(const config *cfg, Args&&... args)
{
return build_generic_DCE<Module, DCE>(cfg, std::forward<Args>(args)...);
return build_generic_DCE<T_Module, DCE>(cfg, std::forward<Args>(args)...);
}
template <typename Module, typename ...Args>
static std::shared_ptr<Module> build_shared_module(const config *cfg, Args&&... args)
template <typename T_Module, typename ...Args>
static std::shared_ptr<T_Module> build_shared_module(const config *cfg, Args&&... args)
{
return build_module_T<Module>(cfg, std::forward<Args>(args)...);
return build_module_T<T_Module>(cfg, std::forward<Args>(args)...);
}
@ -161,13 +167,13 @@ public:
std::shared_ptr<GenericModule> build_shared_module(const config *cfg, Args&&... args)
{
switch (m) {
case Modem::SIM800:
case ModemType::SIM800:
return build_shared_module<SIM800>(cfg, std::forward<Args>(args)...);
case Modem::SIM7600:
case ModemType::SIM7600:
return build_shared_module<SIM7600>(cfg, std::forward<Args>(args)...);
case Modem::BG96:
case ModemType::BG96:
return build_shared_module<BG96>(cfg, std::forward<Args>(args)...);
case Modem::GenericModule:
case ModemType::GenericModule:
return build_shared_module<GenericModule>(cfg, std::forward<Args>(args)...);
default:
break;
@ -186,13 +192,13 @@ public:
std::unique_ptr<DCE> build_unique(const config *cfg, Args&&... args)
{
switch (m) {
case Modem::SIM800:
case ModemType::SIM800:
return build_unique<SIM800>(cfg, std::forward<Args>(args)...);
case Modem::SIM7600:
case ModemType::SIM7600:
return build_unique<SIM7600>(cfg, std::forward<Args>(args)...);
case Modem::BG96:
case ModemType::BG96:
return build_unique<BG96>(cfg, std::forward<Args>(args)...);
case Modem::GenericModule:
case ModemType::GenericModule:
return build_unique<GenericModule>(cfg, std::forward<Args>(args)...);
default:
break;
@ -204,13 +210,13 @@ public:
DCE* build(const config *cfg, Args&&... args)
{
switch (m) {
case Modem::SIM800:
case ModemType::SIM800:
return build<SIM800>(cfg, std::forward<Args>(args)...);
case Modem::SIM7600:
case ModemType::SIM7600:
return build<SIM7600>(cfg, std::forward<Args>(args)...);
case Modem::BG96:
case ModemType::BG96:
return build<BG96>(cfg, std::forward<Args>(args)...);
case Modem::GenericModule:
case ModemType::GenericModule:
return build<GenericModule>(cfg, std::forward<Args>(args)...);
default:
break;
@ -219,22 +225,22 @@ public:
}
private:
Modem m;
ModemType m;
protected:
template <typename Module, typename Ptr = std::shared_ptr<Module>, typename ...Args>
template <typename T_Module, typename Ptr = std::shared_ptr<T_Module>, typename ...Args>
static Ptr build_module_T(const config *cfg, Args&&... args)
{
Builder<Module> b(std::forward<Args>(args)...);
Builder<T_Module> b(std::forward<Args>(args)...);
return b.template create_module<Ptr>(cfg);
}
template <typename Module, typename Dce = DCE_T<Module>, typename DcePtr = Dce*, typename ...Args>
static DcePtr build_generic_DCE(const config *cfg, Args&&... args)
template <typename T_Module, typename T_Dce = DCE_T<T_Module>, typename T_DcePtr = T_Dce*, typename ...Args>
static auto build_generic_DCE(const config *cfg, Args&&... args) -> T_DcePtr
{
Builder<Module> b(std::forward<Args>(args)...);
return b.template create<Dce, DcePtr>(cfg);
Builder<T_Module> b(std::forward<Args>(args)...);
return b.template create<T_Dce, T_DcePtr>(cfg);
}
};