This commit is contained in:
J. Nick Koston
2025-11-28 16:43:22 -06:00
parent 913581e7ee
commit c7e8a3eea5

View File

@@ -14,12 +14,12 @@ class StateTrigger : public Trigger<> {
}
};
/// Trigger when entering TRIGGERED state
class TriggeredTrigger : public Trigger<> {
/// Template trigger that fires when entering a specific state
template<AlarmControlPanelState State> class StateEnterTrigger : public Trigger<> {
public:
explicit TriggeredTrigger(AlarmControlPanel *alarm_control_panel) : alarm_control_panel_(alarm_control_panel) {
explicit StateEnterTrigger(AlarmControlPanel *alarm_control_panel) : alarm_control_panel_(alarm_control_panel) {
alarm_control_panel->add_on_state_callback([this]() {
if (this->alarm_control_panel_->get_state() == ACP_STATE_TRIGGERED)
if (this->alarm_control_panel_->get_state() == State)
this->trigger();
});
}
@@ -28,89 +28,14 @@ class TriggeredTrigger : public Trigger<> {
AlarmControlPanel *alarm_control_panel_;
};
/// Trigger when entering ARMING state
class ArmingTrigger : public Trigger<> {
public:
explicit ArmingTrigger(AlarmControlPanel *alarm_control_panel) : alarm_control_panel_(alarm_control_panel) {
alarm_control_panel->add_on_state_callback([this]() {
if (this->alarm_control_panel_->get_state() == ACP_STATE_ARMING)
this->trigger();
});
}
protected:
AlarmControlPanel *alarm_control_panel_;
};
/// Trigger when entering PENDING state
class PendingTrigger : public Trigger<> {
public:
explicit PendingTrigger(AlarmControlPanel *alarm_control_panel) : alarm_control_panel_(alarm_control_panel) {
alarm_control_panel->add_on_state_callback([this]() {
if (this->alarm_control_panel_->get_state() == ACP_STATE_PENDING)
this->trigger();
});
}
protected:
AlarmControlPanel *alarm_control_panel_;
};
/// Trigger when entering ARMED_HOME state
class ArmedHomeTrigger : public Trigger<> {
public:
explicit ArmedHomeTrigger(AlarmControlPanel *alarm_control_panel) : alarm_control_panel_(alarm_control_panel) {
alarm_control_panel->add_on_state_callback([this]() {
if (this->alarm_control_panel_->get_state() == ACP_STATE_ARMED_HOME)
this->trigger();
});
}
protected:
AlarmControlPanel *alarm_control_panel_;
};
/// Trigger when entering ARMED_NIGHT state
class ArmedNightTrigger : public Trigger<> {
public:
explicit ArmedNightTrigger(AlarmControlPanel *alarm_control_panel) : alarm_control_panel_(alarm_control_panel) {
alarm_control_panel->add_on_state_callback([this]() {
if (this->alarm_control_panel_->get_state() == ACP_STATE_ARMED_NIGHT)
this->trigger();
});
}
protected:
AlarmControlPanel *alarm_control_panel_;
};
/// Trigger when entering ARMED_AWAY state
class ArmedAwayTrigger : public Trigger<> {
public:
explicit ArmedAwayTrigger(AlarmControlPanel *alarm_control_panel) : alarm_control_panel_(alarm_control_panel) {
alarm_control_panel->add_on_state_callback([this]() {
if (this->alarm_control_panel_->get_state() == ACP_STATE_ARMED_AWAY)
this->trigger();
});
}
protected:
AlarmControlPanel *alarm_control_panel_;
};
/// Trigger when entering DISARMED state
class DisarmedTrigger : public Trigger<> {
public:
explicit DisarmedTrigger(AlarmControlPanel *alarm_control_panel) : alarm_control_panel_(alarm_control_panel) {
alarm_control_panel->add_on_state_callback([this]() {
if (this->alarm_control_panel_->get_state() == ACP_STATE_DISARMED)
this->trigger();
});
}
protected:
AlarmControlPanel *alarm_control_panel_;
};
// Type aliases for state-specific triggers
using TriggeredTrigger = StateEnterTrigger<ACP_STATE_TRIGGERED>;
using ArmingTrigger = StateEnterTrigger<ACP_STATE_ARMING>;
using PendingTrigger = StateEnterTrigger<ACP_STATE_PENDING>;
using ArmedHomeTrigger = StateEnterTrigger<ACP_STATE_ARMED_HOME>;
using ArmedNightTrigger = StateEnterTrigger<ACP_STATE_ARMED_NIGHT>;
using ArmedAwayTrigger = StateEnterTrigger<ACP_STATE_ARMED_AWAY>;
using DisarmedTrigger = StateEnterTrigger<ACP_STATE_DISARMED>;
/// Trigger when leaving TRIGGERED state (alarm cleared)
class ClearedTrigger : public Trigger<> {