Initial updates to support preconditions
Any defined preconditions for a set speed event must be satisfied prior
to configuring the event parameters for fan control. These preconditions
will accept a list of group entries that include the value the group's
property must be to have the precondition met for that group. Once all
preconditions are met, the set speed event will be initialized and
become active.
Change-Id: Ia5555be55c5937c891af527bea63da1546655b2f
Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
diff --git a/control/preconditions.hpp b/control/preconditions.hpp
new file mode 100644
index 0000000..61a2f50
--- /dev/null
+++ b/control/preconditions.hpp
@@ -0,0 +1,43 @@
+#pragma once
+
+namespace phosphor
+{
+namespace fan
+{
+namespace control
+{
+namespace precondition
+{
+
+/**
+ * @brief A precondition to compare a group of property values and
+ * subscribe/unsubscribe a set speed event group
+ * @details Compares each entry within the precondition group to a given value
+ * that when each entry's property value matches the given value, the set speed
+ * event is then initialized. At any point a precondition entry's value no
+ * longer matches, the set speed event is removed from being active and fans
+ * are set to full speed.
+ *
+ * @param[in] pg - Precondition property group of property values
+ * @param[in] sse - Set speed event definition
+ *
+ * @return Lambda function
+ * A lambda function to compare precondition property value states
+ * and either subscribe or unsubscribe a set speed event group.
+ */
+auto property_states_match(std::vector<PrecondGroup>&& pg,
+ SetSpeedEvent&& sse)
+{
+ return [pg = std::move(pg),
+ sse = std::move(sse)](auto& zone, auto& group)
+ {
+ // TODO Read/Compare given precondition entries
+ // TODO Only init the event when the precondition(s) are true
+ // TODO Remove the event properties when the precondition(s) are false
+ };
+}
+
+} // namespace precondition
+} // namespace control
+} // namespace fan
+} // namespace phosphor
diff --git a/control/types.hpp b/control/types.hpp
index b6a031f..d45226f 100644
--- a/control/types.hpp
+++ b/control/types.hpp
@@ -42,6 +42,15 @@
Zone&)>;
using Action = std::function<void(Zone&, const Group&)>;
+constexpr auto pcPathPos = 0;
+constexpr auto pcIntfPos = 1;
+constexpr auto pcPropPos = 2;
+constexpr auto pcValuePos = 3;
+using PrecondGroup = std::tuple<std::string,
+ std::string,
+ std::string,
+ PropertyVariantType>;
+
constexpr auto signaturePos = 0;
constexpr auto handlerObjPos = 1;
using PropertyChange = std::tuple<std::string, Handler>;
@@ -49,7 +58,9 @@
constexpr auto groupPos = 0;
constexpr auto actionPos = 1;
constexpr auto propChangeListPos = 2;
-using SetSpeedEvent = std::tuple<Group, Action, std::vector<PropertyChange>>;
+using SetSpeedEvent = std::tuple<Group,
+ Action,
+ std::vector<PropertyChange>>;
constexpr auto eventGroupPos = 0;
constexpr auto eventHandlerPos = 1;
diff --git a/control/zone.cpp b/control/zone.cpp
index 93a616a..4fb60cd 100644
--- a/control/zone.cpp
+++ b/control/zone.cpp
@@ -57,7 +57,11 @@
// Do not enable set speed events when in init mode
if (mode != Mode::init)
{
- initEvents(def);
+ // Setup signal trigger for set speed events
+ for (auto& event : std::get<setSpeedEventsPos>(def))
+ {
+ initEvent(event);
+ }
// Start timer for fan speed decreases
if (!_decTimer.running() && _decInterval != seconds::zero())
{
@@ -168,42 +172,38 @@
// Decrease timer is restarted since its repeating
}
-void Zone::initEvents(const ZoneDefinition& def)
+void Zone::initEvent(const SetSpeedEvent& event)
{
- // Setup signal trigger for set speed events
- for (auto& event : std::get<setSpeedEventsPos>(def))
+ // Get the current value for each property
+ for (auto& entry : std::get<groupPos>(event))
{
- // Get the current value for each property
- for (auto& entry : std::get<groupPos>(event))
- {
- refreshProperty(_bus,
- entry.first,
- std::get<intfPos>(entry.second),
- std::get<propPos>(entry.second));
- }
- // Setup signal matches for property change events
- for (auto& prop : std::get<propChangeListPos>(event))
- {
- _signalEvents.emplace_back(
- std::make_unique<EventData>(
- EventData
- {
- std::get<groupPos>(event),
- std::get<handlerObjPos>(prop),
- std::get<actionPos>(event)
- }));
- _matches.emplace_back(
- _bus,
- std::get<signaturePos>(prop).c_str(),
- std::bind(std::mem_fn(&Zone::handleEvent),
- this,
- std::placeholders::_1,
- _signalEvents.back().get()));
- }
- // Run action function for initial event state
- std::get<actionPos>(event)(*this,
- std::get<groupPos>(event));
+ refreshProperty(_bus,
+ entry.first,
+ std::get<intfPos>(entry.second),
+ std::get<propPos>(entry.second));
}
+ // Setup signal matches for property change events
+ for (auto& prop : std::get<propChangeListPos>(event))
+ {
+ _signalEvents.emplace_back(
+ std::make_unique<EventData>(
+ EventData
+ {
+ std::get<groupPos>(event),
+ std::get<handlerObjPos>(prop),
+ std::get<actionPos>(event)
+ }));
+ _matches.emplace_back(
+ _bus,
+ std::get<signaturePos>(prop).c_str(),
+ std::bind(std::mem_fn(&Zone::handleEvent),
+ this,
+ std::placeholders::_1,
+ _signalEvents.back().get()));
+ }
+ // Run action function for initial event state
+ std::get<actionPos>(event)(*this,
+ std::get<groupPos>(event));
}
void Zone::refreshProperty(sdbusplus::bus::bus& bus,
diff --git a/control/zone.hpp b/control/zone.hpp
index 706d9c2..077bfcf 100644
--- a/control/zone.hpp
+++ b/control/zone.hpp
@@ -329,11 +329,11 @@
std::vector<sdbusplus::server::match::match> _matches;
/**
- * @brief Initialize all the set speed event properties and actions
+ * @brief Initialize a set speed event properties and actions
*
- * @param[in] def - zone definition containing set speed events
+ * @param[in] event - Set speed event
*/
- void initEvents(const ZoneDefinition& def);
+ void initEvent(const SetSpeedEvent& event);
/**
* @brief Refresh the given property's cached value