#pragma once #include "config.hpp" #include #include #include #include namespace phosphor::button { constexpr auto powerButtonInterface = "xyz.openbmc_project.Chassis.Buttons.Power"; namespace sdbusRule = sdbusplus::bus::match::rules; /** * @class PowerButtonProfile * * Abstract base class for custom power button profiles. * * Calls a derived class's pressed() and released() * functions when the power button is pressed and * released. */ class PowerButtonProfile { public: PowerButtonProfile(sdbusplus::bus_t& bus) : bus(bus), pressedMatch(bus, sdbusRule::type::signal() + sdbusRule::member("Pressed") + sdbusRule::path(POWER_DBUS_OBJECT_NAME) + sdbusRule::interface(powerButtonInterface), std::bind(&PowerButtonProfile::pressedHandler, this, std::placeholders::_1)), releasedMatch( bus, sdbusRule::type::signal() + sdbusRule::member("Released") + sdbusRule::path(POWER_DBUS_OBJECT_NAME) + sdbusRule::interface(powerButtonInterface), std::bind(&PowerButtonProfile::releasedHandler, this, std::placeholders::_1)) {} virtual ~PowerButtonProfile() = default; void pressedHandler(sdbusplus::message_t /* msg*/) { pressed(); } void releasedHandler(sdbusplus::message_t msg) { auto time = msg.unpack(); released(time); } virtual void pressed() = 0; virtual void released(uint64_t pressTimeMS) = 0; protected: sdbusplus::bus_t& bus; private: sdbusplus::bus::match_t pressedMatch; sdbusplus::bus::match_t releasedMatch; }; } // namespace phosphor::button