From 1b3e960219c8d7d4add71c862cd8756104615251 Mon Sep 17 00:00:00 2001 From: Matthew Barth Date: Wed, 13 Feb 2019 11:37:03 -0600 Subject: Add framework to set properties on a zone Properties hosted by a zone object need the ability to be set upon zone initialization. This adds support to allow the zone configuration yaml to contain what properties to set and with what values on a zone. The parser updates to generate what uses this framework is in a followup commit. Change-Id: I9fd93746cc097f05869400451daff03cf3ef89b7 Signed-off-by: Matthew Barth --- control/functor.hpp | 13 +++++++++++++ control/handlers.hpp | 20 ++++++++++++++++++++ control/types.hpp | 7 +++++-- control/zone.cpp | 6 ++++++ 4 files changed, 44 insertions(+), 2 deletions(-) (limited to 'control') diff --git a/control/functor.hpp b/control/functor.hpp index 71607c5..ab5005d 100644 --- a/control/functor.hpp +++ b/control/functor.hpp @@ -16,6 +16,19 @@ using namespace phosphor::fan; 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 +auto make_zoneHandler(T&& handler) +{ + return ZoneHandler(std::forward(handler)); +} + /** * @brief Create a handler function object * diff --git a/control/handlers.hpp b/control/handlers.hpp index 6661e1a..215662a 100644 --- a/control/handlers.hpp +++ b/control/handlers.hpp @@ -9,6 +9,26 @@ namespace control 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 +auto setZoneProperty(T (Zone::*func)(T), T&& value) +{ + return [func, value = std::forward(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 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>; +using ZoneHandler = std::function; using Handler = std::function; @@ -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, std::vector, std::vector>; 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(def)) + { + hand(*this); + } + // Restore thermal control current mode state restoreCurrentMode(); -- cgit v1.2.1