pseq: Add power control dbus server interface

Add the PowerInterface class which provides a server interface for the
"org.openbmc.control.Power" dbus service.

Update meson.build file to support.

The "org.openbmc.control.Power" interface is currently used by the
Chassis component to control power on and off as well as by a number of
other OBMC applications which use the pgood property and associated
signals to determine the power state of the system.  Some desire to
move to a "xyz.openbmc_project.control.Power" interface has been
expressed.  The following is a proposed plan to accomplish this:
1. Create a compatible "org.openbmc.control.Power" application (this
   commit).
2. Add "xyz..." interface to this application (future commit).
3. Begin transition of existing applications to new interface (future
   commits).

Signed-off-by: Jim Wright <jlwright@us.ibm.com>
Change-Id: Ia9a6bbb58b5e439623d3931426cb91cb8948da7a
diff --git a/phosphor-power-sequencer/src/power_interface.hpp b/phosphor-power-sequencer/src/power_interface.hpp
new file mode 100644
index 0000000..76608ff
--- /dev/null
+++ b/phosphor-power-sequencer/src/power_interface.hpp
@@ -0,0 +1,142 @@
+#pragma once
+
+#include <systemd/sd-bus.h>
+
+#include <sdbusplus/sdbus.hpp>
+#include <sdbusplus/server/interface.hpp>
+#include <sdbusplus/vtable.hpp>
+
+#include <string>
+
+namespace phosphor::power::sequencer
+{
+
+/**
+ * @class PowerControl
+ * This class provides the org.openbmc.control.Power D-Bus interface.
+ */
+class PowerInterface
+{
+  public:
+    PowerInterface() = delete;
+    PowerInterface(const PowerInterface&) = delete;
+    PowerInterface& operator=(const PowerInterface&) = delete;
+    PowerInterface(PowerInterface&&) = delete;
+    PowerInterface& operator=(PowerInterface&&) = delete;
+    virtual ~PowerInterface() = default;
+
+    /**
+     * @brief Constructor to put object onto bus at a dbus path.
+     * @param[in] bus D-Bus bus object
+     * @param[in] path D-Bus object path
+     */
+    PowerInterface(sdbusplus::bus::bus& bus, const char* path);
+
+    /**
+     * Emit the power good signal
+     */
+    void emitPowerGoodSignal();
+
+    /**
+     * Emit the power lost signal
+     */
+    void emitPowerLostSignal();
+
+    /**
+     * Emit the property changed signal
+     * @param[in] property the property that changed
+     */
+    void emitPropertyChangedSignal(const char* property);
+
+    /**
+     * Implementation for the getPgood method
+     * @return power good
+     */
+    virtual int getPgood() = 0;
+
+    /**
+     * Implementation for the getPgoodTimeout method
+     * @return power good timeout
+     */
+    virtual int getPgoodTimeout() = 0;
+
+    /**
+     * Implementation for the getState method
+     * @return power state. A power on request is value 1. Power off is 0.
+     */
+    virtual int getState() = 0;
+
+    /**
+     * Implementation for the setPgoodTimeout method
+     * @param[in] timeout power good timeout
+     */
+    virtual void setPgoodTimeout(int timeout) = 0;
+
+    /**
+     * Implementation for the setState method
+     * @param[in] state power state. Request power on with a value of 1. Request
+     * power off with a value of 0. Other values will be rejected.
+     */
+    virtual void setState(int state) = 0;
+
+  private:
+    /**
+     * Holder for the instance of this interface to be on dbus
+     */
+    sdbusplus::server::interface::interface _serverInterface;
+
+    /**
+     * Systemd vtable structure that contains all the
+     * methods, signals, and properties of this interface with their
+     * respective systemd attributes
+     */
+    static const sdbusplus::vtable::vtable_t _vtable[];
+
+    /**
+     * Systemd bus callback for getting the pgood property
+     */
+    static int callbackGetPgood(sd_bus* bus, const char* path,
+                                const char* interface, const char* property,
+                                sd_bus_message* msg, void* context,
+                                sd_bus_error* ret_error);
+
+    /**
+     * Systemd bus callback for getting the pgood_timeout property
+     */
+    static int callbackGetPgoodTimeout(sd_bus* bus, const char* path,
+                                       const char* interface,
+                                       const char* property,
+                                       sd_bus_message* msg, void* context,
+                                       sd_bus_error* error);
+
+    /**
+     * Systemd bus callback for the getPowerState method
+     */
+    static int callbackGetPowerState(sd_bus_message* msg, void* context,
+                                     sd_bus_error* error);
+
+    /**
+     * Systemd bus callback for getting the state property
+     */
+    static int callbackGetState(sd_bus* bus, const char* path,
+                                const char* interface, const char* property,
+                                sd_bus_message* msg, void* context,
+                                sd_bus_error* error);
+
+    /**
+     * Systemd bus callback for setting the pgood_timeout property
+     */
+    static int callbackSetPgoodTimeout(sd_bus* bus, const char* path,
+                                       const char* interface,
+                                       const char* property,
+                                       sd_bus_message* msg, void* context,
+                                       sd_bus_error* error);
+
+    /**
+     * Systemd bus callback for the setPowerState method
+     */
+    static int callbackSetPowerState(sd_bus_message* msg, void* context,
+                                     sd_bus_error* error);
+};
+
+} // namespace phosphor::power::sequencer