summaryrefslogtreecommitdiffstats
path: root/control
diff options
context:
space:
mode:
Diffstat (limited to 'control')
-rw-r--r--control/functor.hpp13
-rw-r--r--control/handlers.hpp20
-rw-r--r--control/types.hpp7
-rw-r--r--control/zone.cpp6
4 files changed, 44 insertions, 2 deletions
diff --git a/control/functor.hpp b/control/functor.hpp
index 71607c5..ab5005d 100644
--- a/control/functor.hpp
+++ b/control/functor.hpp
@@ -17,6 +17,19 @@ using namespace sdbusplus::bus::match;
using namespace phosphor::logging;
/**
+ * @brief Create a zone handler function object
+ *
+ * @param[in] handler - The handler being created
+ *
+ * @return - The created zone handler function object
+ */
+template <typename T>
+auto make_zoneHandler(T&& handler)
+{
+ return ZoneHandler(std::forward<T>(handler));
+}
+
+/**
* @brief Create a handler function object
*
* @param[in] handler - The handler being created
diff --git a/control/handlers.hpp b/control/handlers.hpp
index 6661e1a..215662a 100644
--- a/control/handlers.hpp
+++ b/control/handlers.hpp
@@ -10,6 +10,26 @@ namespace handler
{
/**
+ * @brief A handler function to set/update a property on a zone
+ * @details Sets or updates a zone property to the given value using the
+ * provided zone dbus object's set property function
+ *
+ * @param[in] value - Value to set property to
+ * @param[in] func - Zone set property function pointer
+ *
+ * @return Lambda function
+ * A lambda function to set/update the zone property
+ */
+template <typename T>
+auto setZoneProperty(T (Zone::*func)(T), T&& value)
+{
+ return [func, value = std::forward<T>(value)](auto& zone)
+ {
+ (zone.*func)(value);
+ };
+}
+
+/**
* @brief A handler function to set/update a property
* @details Sets or updates a property's value determined by a combination of
* an object's path and property names
diff --git a/control/types.hpp b/control/types.hpp
index 239d00d..dcc1b8c 100644
--- a/control/types.hpp
+++ b/control/types.hpp
@@ -45,6 +45,7 @@ using FanDefinition = std::tuple<std::string,
constexpr auto intfPos = 0;
constexpr auto propPos = 1;
using Group = std::map<std::string, std::tuple<std::string, std::string>>;
+using ZoneHandler = std::function<void(Zone&)>;
using Handler = std::function<void(sdbusplus::bus::bus&,
sdbusplus::message::message&,
Zone&)>;
@@ -108,13 +109,15 @@ constexpr auto fullSpeedPos = 1;
constexpr auto floorSpeedPos = 2;
constexpr auto incDelayPos = 3;
constexpr auto decIntervalPos = 4;
-constexpr auto fanListPos = 5;
-constexpr auto setSpeedEventsPos = 6;
+constexpr auto handlerPos = 5;
+constexpr auto fanListPos = 6;
+constexpr auto setSpeedEventsPos = 7;
using ZoneDefinition = std::tuple<size_t,
uint64_t,
uint64_t,
size_t,
size_t,
+ std::vector<ZoneHandler>,
std::vector<FanDefinition>,
std::vector<SetSpeedEvent>>;
diff --git a/control/zone.cpp b/control/zone.cpp
index 326ca68..b844793 100644
--- a/control/zone.cpp
+++ b/control/zone.cpp
@@ -72,6 +72,12 @@ Zone::Zone(Mode mode,
// Do not enable set speed events when in init mode
if (mode == Mode::control)
{
+ // Process any zone handlers defined
+ for (auto& hand : std::get<handlerPos>(def))
+ {
+ hand(*this);
+ }
+
// Restore thermal control current mode state
restoreCurrentMode();
OpenPOWER on IntegriCloud