11a309f77SMatt Spinler #pragma once 21a309f77SMatt Spinler 315c60e2fSDelphine CC Chiu #include "config.hpp" 41a309f77SMatt Spinler 51a309f77SMatt Spinler #include <sdbusplus/bus.hpp> 61a309f77SMatt Spinler #include <sdbusplus/bus/match.hpp> 71a309f77SMatt Spinler #include <sdbusplus/message.hpp> 81a309f77SMatt Spinler 91a309f77SMatt Spinler #include <string> 101a309f77SMatt Spinler 111a309f77SMatt Spinler namespace phosphor::button 121a309f77SMatt Spinler { 131a309f77SMatt Spinler 141a309f77SMatt Spinler constexpr auto powerButtonInterface = 151a309f77SMatt Spinler "xyz.openbmc_project.Chassis.Buttons.Power"; 161a309f77SMatt Spinler namespace sdbusRule = sdbusplus::bus::match::rules; 171a309f77SMatt Spinler 181a309f77SMatt Spinler /** 191a309f77SMatt Spinler * @class PowerButtonProfile 201a309f77SMatt Spinler * 211a309f77SMatt Spinler * Abstract base class for custom power button profiles. 221a309f77SMatt Spinler * 231a309f77SMatt Spinler * Calls a derived class's pressed() and released() 241a309f77SMatt Spinler * functions when the power button is pressed and 251a309f77SMatt Spinler * released. 261a309f77SMatt Spinler */ 271a309f77SMatt Spinler class PowerButtonProfile 281a309f77SMatt Spinler { 291a309f77SMatt Spinler public: PowerButtonProfile(sdbusplus::bus_t & bus)301a309f77SMatt Spinler PowerButtonProfile(sdbusplus::bus_t& bus) : 311a309f77SMatt Spinler bus(bus), 321a309f77SMatt Spinler pressedMatch(bus, 331a309f77SMatt Spinler sdbusRule::type::signal() + sdbusRule::member("Pressed") + 341a309f77SMatt Spinler sdbusRule::path(POWER_DBUS_OBJECT_NAME) + 351a309f77SMatt Spinler sdbusRule::interface(powerButtonInterface), 361a309f77SMatt Spinler std::bind(&PowerButtonProfile::pressedHandler, this, 371a309f77SMatt Spinler std::placeholders::_1)), 38*d36b6b1dSPatrick Williams releasedMatch( 39*d36b6b1dSPatrick Williams bus, 40*d36b6b1dSPatrick Williams sdbusRule::type::signal() + sdbusRule::member("Released") + 411a309f77SMatt Spinler sdbusRule::path(POWER_DBUS_OBJECT_NAME) + 421a309f77SMatt Spinler sdbusRule::interface(powerButtonInterface), 431a309f77SMatt Spinler std::bind(&PowerButtonProfile::releasedHandler, this, 441a309f77SMatt Spinler std::placeholders::_1)) 451a309f77SMatt Spinler {} 461a309f77SMatt Spinler 471a309f77SMatt Spinler virtual ~PowerButtonProfile() = default; 481a309f77SMatt Spinler pressedHandler(sdbusplus::message_t)491a309f77SMatt Spinler void pressedHandler(sdbusplus::message_t /* msg*/) 501a309f77SMatt Spinler { 511a309f77SMatt Spinler pressed(); 521a309f77SMatt Spinler } 531a309f77SMatt Spinler releasedHandler(sdbusplus::message_t msg)541a309f77SMatt Spinler void releasedHandler(sdbusplus::message_t msg) 551a309f77SMatt Spinler { 561a309f77SMatt Spinler auto time = msg.unpack<uint64_t>(); 571a309f77SMatt Spinler released(time); 581a309f77SMatt Spinler } 591a309f77SMatt Spinler 601a309f77SMatt Spinler virtual void pressed() = 0; 611a309f77SMatt Spinler 621a309f77SMatt Spinler virtual void released(uint64_t pressTimeMS) = 0; 631a309f77SMatt Spinler 641a309f77SMatt Spinler protected: 651a309f77SMatt Spinler sdbusplus::bus_t& bus; 661a309f77SMatt Spinler 671a309f77SMatt Spinler private: 681a309f77SMatt Spinler sdbusplus::bus::match_t pressedMatch; 691a309f77SMatt Spinler sdbusplus::bus::match_t releasedMatch; 701a309f77SMatt Spinler }; 711a309f77SMatt Spinler 721a309f77SMatt Spinler } // namespace phosphor::button 73