1 #pragma once
2
3 #include "config.hpp"
4 #include "power_button_profile.hpp"
5
6 #include <sdbusplus/bus.hpp>
7 #include <sdbusplus/bus/match.hpp>
8
9 #include <algorithm>
10 #include <numeric>
11 #include <sstream>
12 #include <string>
13
14 namespace phosphor
15 {
16 namespace button
17 {
18 enum class PowerEvent
19 {
20 powerPressed,
21 resetPressed,
22 powerReleased,
23 resetReleased
24 };
25
26 enum class PwrCtl
27 {
28 chassisOn,
29 chassisOff,
30 chassisCycle,
31 };
32
numberOfChassis()33 inline static size_t numberOfChassis()
34 {
35 return instances.size();
36 }
37
38 /**
39 * @class Handler
40 *
41 * This class acts on the signals generated by the
42 * xyz.openbmc_project.Chassis.Buttons code when
43 * it detects button presses.
44 *
45 * There are 3 buttons supported - Power, ID, and Reset.
46 * As not all systems may implement each button, this class will
47 * check for that button on D-Bus before listening for its signals.
48 */
49 class Handler
50 {
51 public:
52 Handler() = delete;
53 ~Handler() = default;
54 Handler(const Handler&) = delete;
55 Handler& operator=(const Handler&) = delete;
56 Handler(Handler&&) = delete;
57 Handler& operator=(Handler&&) = delete;
58
59 /**
60 * @brief Constructor
61 *
62 * @param[in] bus - sdbusplus connection object
63 */
64 explicit Handler(sdbusplus::bus_t& bus);
65
66 private:
67 /**
68 * @brief The handler for a power button press
69 *
70 * It will do power action according to the pressing duration.
71 *
72 * @param[in] msg - sdbusplus message from signal
73 */
74 void powerReleased(sdbusplus::message_t& msg);
75
76 /**
77 * @brief The handler for an ID button press
78 *
79 * Toggles the ID LED group
80 *
81 * @param[in] msg - sdbusplus message from signal
82 */
83 void idReleased(sdbusplus::message_t& msg);
84
85 /**
86 * @brief The handler for a reset button press
87 *
88 * Reboots the host if it is powered on.
89 *
90 * @param[in] msg - sdbusplus message from signal
91 */
92 void resetReleased(sdbusplus::message_t& msg);
93
94 /**
95 * @brief The handler for a OCP debug card host selector button press
96 *
97 * In multi host system increases host position by 1 up to max host
98 * position.
99 *
100 * @param[in] msg - sdbusplus message from signal
101 */
102
103 void debugHostSelectorReleased(sdbusplus::message_t& msg);
104
105 /**
106 * @brief Checks if system is powered on
107 *
108 * @return true if powered on, false else
109 */
110 bool poweredOn(size_t hostNumber) const;
111
112 /*
113 * @return std::string - the D-Bus service name if found, else
114 * an empty string
115 */
116 std::string getService(const std::string& path,
117 const std::string& interface) const;
118
119 /**
120 * @brief gets the valid host selector value in multi host
121 * system
122 *
123 * @return size_t throws exception if host selector position is
124 * invalid or not available.
125 */
126
127 size_t getHostSelectorValue();
128 /**
129 * @brief increases the host selector position property
130 * by 1 upto max host selector position
131 *
132 * @return void
133 */
134
135 void increaseHostSelectorPosition();
136 /**
137 * @brief checks if the system has multi host
138 * based on the host selector property availability
139 *
140 * @return bool returns true if multi host system
141 * else returns false.
142 */
143 bool isMultiHost();
144 /**
145 * @brief trigger the power ctrl event based on the
146 * button press event type.
147 *
148 * @return void
149 */
150 void handlePowerEvent(PowerEvent powerEventType,
151 const std::string& objectPath,
152 std::chrono::microseconds duration);
153
154 /**
155 * @brief sdbusplus connection object
156 */
157 sdbusplus::bus_t& bus;
158
159 /**
160 * @brief Matches on the power button released signal
161 */
162 std::unique_ptr<sdbusplus::bus::match_t> powerButtonReleased;
163
164 /**
165 * @brief Matches on the power button long press released signal
166 */
167 std::unique_ptr<sdbusplus::bus::match_t> powerButtonLongPressed;
168
169 /**
170 * @brief Matches on the multi power button released signal
171 */
172 std::vector<std::unique_ptr<sdbusplus::bus::match_t>>
173 multiPowerButtonReleased;
174
175 /**
176 * @brief Matches on the ID button released signal
177 */
178 std::unique_ptr<sdbusplus::bus::match_t> idButtonReleased;
179
180 /**
181 * @brief Matches on the reset button released signal
182 */
183 std::unique_ptr<sdbusplus::bus::match_t> resetButtonReleased;
184
185 /**
186 * @brief Matches on the ocp debug host selector button released signal
187 */
188 std::unique_ptr<sdbusplus::bus::match_t> debugHSButtonReleased;
189
190 /**
191 * @brief The custom power handler profile object.
192 */
193 std::unique_ptr<PowerButtonProfile> powerButtonProfile;
194
195 /**
196 * @brief Flag to indicate multi power button mode(false) or host select
197 * button mode(true)
198 */
199 bool hostSelectButtonMode = false;
200
201 /**
202 * @brief Flag to indicate if the button supports multi action
203 */
204 bool isButtonMultiActionSupport = true;
205 };
206
207 } // namespace button
208 } // namespace phosphor
209