From 38a93a8aa2feea7f4e785db6b4ff6d9e81f6020d Mon Sep 17 00:00:00 2001 From: Matthew Barth Date: Thu, 11 May 2017 14:12:27 -0500 Subject: Add property changed signal handler Enable the control application to handle property changed signals to set or update a cached set of these properties Change-Id: Ib84ffe1e801ee7dd85d17fdbb122d124d307dbd3 Signed-off-by: Matthew Barth --- control/functor.hpp | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 control/functor.hpp (limited to 'control/functor.hpp') diff --git a/control/functor.hpp b/control/functor.hpp new file mode 100644 index 0000000..f2f3a78 --- /dev/null +++ b/control/functor.hpp @@ -0,0 +1,109 @@ +#pragma once + +#include "types.hpp" +#include + +namespace phosphor +{ +namespace fan +{ +namespace control +{ +class Zone; + +using namespace phosphor::logging; + +/** + * @brief Create a handler function object + * + * @param[in] handler - The handler being created + * + * @return - The created handler function object + */ +template +auto make_handler(T&& handler) +{ + return Handler(std::forward(handler)); +} + +/** + * @struct Property Changed + * @brief A match filter functor for Dbus property value changed signals + * + * @tparam T - The type of the property value + * @tparam U - The type of the handler + */ +template +struct PropertyChanged +{ + PropertyChanged() = delete; + ~PropertyChanged() = default; + PropertyChanged(const PropertyChanged&) = default; + PropertyChanged& operator=(const PropertyChanged&) = default; + PropertyChanged(PropertyChanged&&) = default; + PropertyChanged& operator=(PropertyChanged&&) = default; + PropertyChanged(const char* iface, + const char* property, + U&& handler) : + _iface(iface), + _property(property), + _handler(std::forward(handler)) { } + + /** @brief Run signal handler function + * + * Extract the property from the PropertiesChanged + * message and run the handler function. + */ + void operator()(sdbusplus::bus::bus&, + sdbusplus::message::message& msg, + Zone& zone) const + { + std::map> properties; + const char* iface = nullptr; + + msg.read(iface); + if (!iface || strcmp(iface, _iface)) + { + return; + } + + msg.read(properties); + auto it = properties.find(_property); + if (it == properties.cend()) + { + log("Unable to find property on interface", + entry("PROPERTY=%s", _property), + entry("INTERFACE=%s", _iface)); + return; + } + + _handler(zone, std::forward(it->second.template get())); + } + +private: + const char* _iface; + const char* _property; + U _handler; +}; + +/** + * @brief Used to process a Dbus property changed signal event + * + * @param[in] iface - Sensor value interface + * @param[in] property - Sensor value property + * @param[in] handler - Handler function to perform + * + * @tparam T - The type of the property + * @tparam U - The type of the handler + */ +template +auto propertySignal(const char* iface, + const char* property, + U&& handler) +{ + return PropertyChanged(iface, property, std::forward(handler)); +} + +} // namespace control +} // namespace fan +} // namespace phosphor -- cgit v1.2.1