1 #pragma once
2 
3 #include <systemd/sd-bus.h>
4 
5 #include <sdbusplus/sdbus.hpp>
6 #include <sdbusplus/server/interface.hpp>
7 #include <sdbusplus/vtable.hpp>
8 
9 #include <string>
10 
11 namespace phosphor::power::sequencer
12 {
13 
14 /**
15  * @class PowerControl
16  * This class provides the org.openbmc.control.Power D-Bus interface.
17  */
18 class PowerInterface
19 {
20   public:
21     PowerInterface() = delete;
22     PowerInterface(const PowerInterface&) = delete;
23     PowerInterface& operator=(const PowerInterface&) = delete;
24     PowerInterface(PowerInterface&&) = delete;
25     PowerInterface& operator=(PowerInterface&&) = delete;
26     virtual ~PowerInterface() = default;
27 
28     /**
29      * Constructor to put object onto bus at a dbus path.
30      * @param bus D-Bus bus object
31      * @param path D-Bus object path
32      */
33     PowerInterface(sdbusplus::bus_t& bus, const char* path);
34 
35     /**
36      * Emit the power good signal
37      */
38     void emitPowerGoodSignal();
39 
40     /**
41      * Emit the power lost signal
42      */
43     void emitPowerLostSignal();
44 
45     /**
46      * Emit the property changed signal
47      * @param property the property that changed
48      */
49     void emitPropertyChangedSignal(const char* property);
50 
51     /**
52      * Returns the power good of the chassis
53      * @return power good
54      */
55     virtual int getPgood() const = 0;
56 
57     /**
58      * Returns the power good timeout
59      * @return power good timeout
60      */
61     virtual int getPgoodTimeout() const = 0;
62 
63     /**
64      * Returns the value of the last requested power state
65      * @return power state. A power on request is value 1. Power off is 0.
66      */
67     virtual int getState() const = 0;
68 
69     /**
70      * Sets the power good timeout
71      * @param timeout power good timeout
72      */
73     virtual void setPgoodTimeout(int timeout) = 0;
74 
75     /**
76      * Initiates a chassis power state change
77      * @param state power state. Request power on with a value of 1. Request
78      * power off with a value of 0. Other values will be rejected.
79      */
80     virtual void setState(int state) = 0;
81 
82     /**
83      * Sets the power supply error.
84      * @param error power supply error. The value should be a message
85      * argument for a phosphor-logging Create call, e.g.
86      * "xyz.openbmc_project.Power.PowerSupply.Error.PSKillFault"
87      */
88     virtual void setPowerSupplyError(const std::string& error) = 0;
89 
90   private:
91     /**
92      * Holder for the instance of this interface to be on dbus
93      */
94     sdbusplus::server::interface::interface serverInterface;
95 
96     /**
97      * Systemd vtable structure that contains all the
98      * methods, signals, and properties of this interface with their
99      * respective systemd attributes
100      */
101     static const sdbusplus::vtable::vtable_t vtable[];
102 
103     /**
104      * Systemd bus callback for getting the pgood property
105      */
106     static int callbackGetPgood(sd_bus* bus, const char* path,
107                                 const char* interface, const char* property,
108                                 sd_bus_message* msg, void* context,
109                                 sd_bus_error* ret_error);
110 
111     /**
112      * Systemd bus callback for getting the pgood_timeout property
113      */
114     static int callbackGetPgoodTimeout(
115         sd_bus* bus, const char* path, const char* interface,
116         const char* property, sd_bus_message* msg, void* context,
117         sd_bus_error* error);
118 
119     /**
120      * Systemd bus callback for the getPowerState method
121      */
122     static int callbackGetPowerState(sd_bus_message* msg, void* context,
123                                      sd_bus_error* error);
124 
125     /**
126      * Systemd bus callback for getting the state property
127      */
128     static int callbackGetState(sd_bus* bus, const char* path,
129                                 const char* interface, const char* property,
130                                 sd_bus_message* msg, void* context,
131                                 sd_bus_error* error);
132 
133     /**
134      * Systemd bus callback for setting the pgood_timeout property
135      */
136     static int callbackSetPgoodTimeout(
137         sd_bus* bus, const char* path, const char* interface,
138         const char* property, sd_bus_message* msg, void* context,
139         sd_bus_error* error);
140 
141     /**
142      * Systemd bus callback for the setPowerSupplyError method
143      */
144     static int callbackSetPowerSupplyError(sd_bus_message* msg, void* context,
145                                            sd_bus_error* error);
146 
147     /**
148      * Systemd bus callback for the setPowerState method
149      */
150     static int callbackSetPowerState(sd_bus_message* msg, void* context,
151                                      sd_bus_error* error);
152 };
153 
154 } // namespace phosphor::power::sequencer
155