diff options
Diffstat (limited to 'control')
-rw-r--r-- | control/functor.hpp | 13 | ||||
-rw-r--r-- | control/handlers.hpp | 20 | ||||
-rw-r--r-- | control/types.hpp | 7 | ||||
-rw-r--r-- | control/zone.cpp | 6 |
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(); |