1 #pragma once 2 3 #include <sdbusplus/bus.hpp> 4 #include <sdbusplus/bus/match.hpp> 5 6 namespace phosphor 7 { 8 namespace button 9 { 10 11 /** 12 * @class Handler 13 * 14 * This class acts on the signals generated by the 15 * xyz.openbmc_project.Chassis.Buttons code when 16 * it detects button presses. 17 * 18 * There are 3 buttons supported - Power, ID, and Reset. 19 * As not all systems may implement each button, this class will 20 * check for that button on D-Bus before listening for its signals. 21 */ 22 class Handler 23 { 24 public: 25 Handler() = delete; 26 ~Handler() = default; 27 Handler(const Handler&) = delete; 28 Handler& operator=(const Handler&) = delete; 29 Handler(Handler&&) = delete; 30 Handler& operator=(Handler&&) = delete; 31 32 /** 33 * @brief Constructor 34 * 35 * @param[in] bus - sdbusplus connection object 36 */ 37 Handler(sdbusplus::bus::bus& bus); 38 39 private: 40 /** 41 * @brief The handler for a power button press 42 * 43 * It will power on the system if it's currently off, 44 * else it will soft power it off. 45 * 46 * @param[in] msg - sdbusplus message from signal 47 */ 48 void powerPressed(sdbusplus::message::message& msg); 49 50 /** 51 * @brief The handler for a long power button press 52 * 53 * If the system is currently powered on, it will 54 * perform an immediate power off. 55 * 56 * @param[in] msg - sdbusplus message from signal 57 */ 58 void longPowerPressed(sdbusplus::message::message& msg); 59 60 /** 61 * @brief The handler for an ID button press 62 * 63 * Toggles the ID LED group 64 * 65 * @param[in] msg - sdbusplus message from signal 66 */ 67 void idPressed(sdbusplus::message::message& msg); 68 69 /** 70 * @brief The handler for a reset button press 71 * 72 * Reboots the host if it is powered on. 73 * 74 * @param[in] msg - sdbusplus message from signal 75 */ 76 void resetPressed(sdbusplus::message::message& msg); 77 78 /** 79 * @brief Checks if system is powered on 80 * 81 * @return true if powered on, false else 82 */ 83 bool poweredOn() const; 84 85 /** 86 * @brief Returns the service name for an object 87 * 88 * @param[in] path - the object path 89 * @param[in] interface - the interface name 90 * 91 * @return std::string - the D-Bus service name if found, else 92 * an empty string 93 */ 94 std::string getService(const std::string& path, 95 const std::string& interface) const; 96 97 /** 98 * @brief sdbusplus connection object 99 */ 100 sdbusplus::bus::bus& bus; 101 102 /** 103 * @brief Matches on the power button released signal 104 */ 105 std::unique_ptr<sdbusplus::bus::match_t> powerButtonReleased; 106 107 /** 108 * @brief Matches on the power button long press released signal 109 */ 110 std::unique_ptr<sdbusplus::bus::match_t> powerButtonLongPressReleased; 111 112 /** 113 * @brief Matches on the ID button released signal 114 */ 115 std::unique_ptr<sdbusplus::bus::match_t> idButtonReleased; 116 117 /** 118 * @brief Matches on the reset button released signal 119 */ 120 std::unique_ptr<sdbusplus::bus::match_t> resetButtonReleased; 121 }; 122 123 } // namespace button 124 } // namespace phosphor 125