more generic state callback

This commit is contained in:
oarcher 2024-07-17 18:47:53 +02:00
parent eb37215e9f
commit 2370d5c83d
4 changed files with 26 additions and 13 deletions

View file

@ -24,14 +24,13 @@ CONF_PIN_CODE = "pin_code"
CONF_APN = "apn" CONF_APN = "apn"
CONF_DTR_PIN = "dtr_pin" CONF_DTR_PIN = "dtr_pin"
CONF_INIT_AT = "init_at" CONF_INIT_AT = "init_at"
# CONF_ON_SCRIPT = "on_script"
# CONF_OFF_SCRIPT = "off_script"
CONF_ON_NOT_RESPONDING = "on_not_responding" CONF_ON_NOT_RESPONDING = "on_not_responding"
modem_ns = cg.esphome_ns.namespace("modem") modem_ns = cg.esphome_ns.namespace("modem")
ModemComponent = modem_ns.class_("ModemComponent", cg.Component) ModemComponent = modem_ns.class_("ModemComponent", cg.Component)
ModemNotRespondingTrigger = modem_ns.class_( ModemState = modem_ns.enum("ModemState")
"ModemNotRespondingTrigger", automation.Trigger.template() ModemOnNotRespondingTrigger = modem_ns.class_(
"ModemOnNotRespondingTrigger", automation.Trigger.template()
) )
@ -52,7 +51,7 @@ CONFIG_SCHEMA = cv.All(
cv.Optional(CONF_ON_NOT_RESPONDING): automation.validate_automation( cv.Optional(CONF_ON_NOT_RESPONDING): automation.validate_automation(
{ {
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id( cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(
ModemNotRespondingTrigger ModemOnNotRespondingTrigger
) )
} }
), ),
@ -85,6 +84,8 @@ async def to_code(config):
add_idf_sdkconfig_option("CONFIG_PPP_CHAP_SUPPORT", True) add_idf_sdkconfig_option("CONFIG_PPP_CHAP_SUPPORT", True)
add_idf_sdkconfig_option("CONFIG_LWIP_PPP_VJ_HEADER_COMPRESSION", True) add_idf_sdkconfig_option("CONFIG_LWIP_PPP_VJ_HEADER_COMPRESSION", True)
add_idf_sdkconfig_option("CONFIG_LWIP_PPP_NOTIFY_PHASE_SUPPORT", True) add_idf_sdkconfig_option("CONFIG_LWIP_PPP_NOTIFY_PHASE_SUPPORT", True)
# commented because cause crash if another UART is defined in the yaml
# If enabled, it should increase the reliability and the speed of the connection (TODO: test)
# add_idf_sdkconfig_option("CONFIG_UART_ISR_IN_IRAM", True) # add_idf_sdkconfig_option("CONFIG_UART_ISR_IN_IRAM", True)
cg.add_define("USE_MODEM") cg.add_define("USE_MODEM")

View file

@ -9,10 +9,14 @@
namespace esphome { namespace esphome {
namespace modem { namespace modem {
class ModemNotRespondingTrigger : public Trigger<> { class ModemOnNotRespondingTrigger : public Trigger<> {
public: public:
explicit ModemNotRespondingTrigger(ModemComponent *parent) { explicit ModemOnNotRespondingTrigger(ModemComponent *parent) {
parent->add_on_not_responding_callback([this, parent]() { this->trigger(); }); parent->add_on_state_callback([this, parent](ModemState state) {
if (!parent->is_failed() && state == ModemState::NOT_RESPONDING) {
this->trigger();
}
});
} }
}; };

View file

@ -269,7 +269,7 @@ void ModemComponent::loop() {
ESP_LOGW(TAG, "Forcing cmux manual exit mode"); ESP_LOGW(TAG, "Forcing cmux manual exit mode");
this->dce->set_mode(esp_modem::modem_mode::CMUX_MANUAL_EXIT); this->dce->set_mode(esp_modem::modem_mode::CMUX_MANUAL_EXIT);
if (!this->modem_ready()) { if (!this->modem_ready()) {
this->on_not_responding_callback_.call(); this->on_state_callback_.call(ModemState::NOT_RESPONDING);
} }
if (this->modem_ready()) { if (this->modem_ready()) {
ESP_LOGI(TAG, "Modem is ready"); ESP_LOGI(TAG, "Modem is ready");
@ -380,8 +380,8 @@ bool ModemComponent::modem_ready() {
return this->get_imei(imei); return this->get_imei(imei);
} }
void ModemComponent::add_on_not_responding_callback(std::function<void()> &&callback) { void ModemComponent::add_on_state_callback(std::function<void(ModemState)> &&callback) {
this->on_not_responding_callback_.add(std::move(callback)); this->on_state_callback_.add(std::move(callback));
} }
} // namespace modem } // namespace modem

View file

@ -27,12 +27,20 @@ using namespace esp_modem;
static const char *const TAG = "modem"; static const char *const TAG = "modem";
// used internally for loop management
enum class ModemComponentState { enum class ModemComponentState {
STOPPED, STOPPED,
CONNECTING, CONNECTING,
CONNECTED, CONNECTED,
}; };
// Automation states
enum class ModemState {
NOT_RESPONDING,
CONNECTED,
DISCONNECTED,
};
enum class ModemModel { BG96, SIM800, SIM7000, SIM7070, SIM7600, UNKNOWN }; enum class ModemModel { BG96, SIM800, SIM7000, SIM7070, SIM7600, UNKNOWN };
class ModemComponent : public Component { class ModemComponent : public Component {
@ -60,7 +68,7 @@ class ModemComponent : public Component {
std::string send_at(const std::string &cmd); std::string send_at(const std::string &cmd);
bool get_imei(std::string &result); bool get_imei(std::string &result);
bool modem_ready(); bool modem_ready();
void add_on_not_responding_callback(std::function<void()> &&callback); void add_on_state_callback(std::function<void(ModemState)> &&callback);
std::unique_ptr<DCE> dce; std::unique_ptr<DCE> dce;
protected: protected:
@ -90,7 +98,7 @@ class ModemComponent : public Component {
void dump_connect_params_(); void dump_connect_params_();
std::string use_address_; std::string use_address_;
uint32_t command_delay_ = 500; uint32_t command_delay_ = 500;
CallbackManager<void()> on_not_responding_callback_; CallbackManager<void(ModemState)> on_state_callback_;
}; };
// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables) // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)