mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	more generic state callback
This commit is contained in:
		| @@ -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") | ||||||
|   | |||||||
| @@ -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(); | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|   } |   } | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -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 | ||||||
|   | |||||||
| @@ -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) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user