xref: /openbmc/phosphor-buttons/inc/power_button_profile.hpp (revision d36b6b1d3887f8545b1558f8f0d946a9c9785a72)
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