pseq: Implement power interface in control app

Have the power control application be an implementer of the power
interface. Override methods and emit signals as appropriate.

Signed-off-by: Jim Wright <jlwright@us.ibm.com>
Change-Id: I96109d3278001c2fe9fd78f69ce69fe83c542ead
diff --git a/phosphor-power-sequencer/src/power_control.cpp b/phosphor-power-sequencer/src/power_control.cpp
index d5810b1..0ce46b8 100644
--- a/phosphor-power-sequencer/src/power_control.cpp
+++ b/phosphor-power-sequencer/src/power_control.cpp
@@ -18,6 +18,8 @@
 
 #include "types.hpp"
 
+#include <fmt/format.h>
+
 #include <phosphor-logging/log.hpp>
 #include <sdbusplus/bus.hpp>
 #include <sdeventplus/event.hpp>
@@ -33,16 +35,54 @@
 
 PowerControl::PowerControl(sdbusplus::bus::bus& bus,
                            const sdeventplus::Event& event) :
-    bus{bus},
-    eventLoop{event}, timer{event, std::bind(&PowerControl::pollPgood, this),
-                            std::chrono::milliseconds(pollInterval)}
+    PowerObject{bus, POWER_OBJ_PATH, true},
+    bus{bus}, timer{event, std::bind(&PowerControl::pollPgood, this),
+                    pollInterval}
 {
     // Obtain dbus service name
     bus.request_name(POWER_IFACE);
 }
 
+int PowerControl::getPgood() const
+{
+    return pgood;
+}
+
+int PowerControl::getPgoodTimeout() const
+{
+    return timeout.count();
+}
+
+int PowerControl::getState() const
+{
+    return state;
+}
+
 void PowerControl::pollPgood()
 {
 }
 
+void PowerControl::setPgoodTimeout(int t)
+{
+    if (timeout.count() != t)
+    {
+        timeout = std::chrono::seconds(t);
+        emitPropertyChangedSignal("pgood_timeout");
+    }
+}
+
+void PowerControl::setState(int s)
+{
+    if (state == s)
+    {
+        log<level::INFO>(
+            fmt::format("Power already at requested state: {}", state).c_str());
+        return;
+    }
+
+    log<level::INFO>(fmt::format("setState: {}", s).c_str());
+    state = s;
+    emitPropertyChangedSignal("state");
+}
+
 } // namespace phosphor::power::sequencer
diff --git a/phosphor-power-sequencer/src/power_control.hpp b/phosphor-power-sequencer/src/power_control.hpp
index c7c7951..248431a 100644
--- a/phosphor-power-sequencer/src/power_control.hpp
+++ b/phosphor-power-sequencer/src/power_control.hpp
@@ -1,5 +1,7 @@
 #pragma once
 
+#include "power_interface.hpp"
+
 #include <sdbusplus/bus.hpp>
 #include <sdbusplus/message.hpp>
 #include <sdbusplus/server/object.hpp>
@@ -11,12 +13,14 @@
 namespace phosphor::power::sequencer
 {
 
+using PowerObject = sdbusplus::server::object::object<PowerInterface>;
+
 /**
  * @class PowerControl
  * This class implements GPIO control of power on / off, and monitoring of the
  * chassis power good.
  */
-class PowerControl
+class PowerControl : public PowerObject
 {
   public:
     PowerControl() = delete;
@@ -33,6 +37,21 @@
      */
     PowerControl(sdbusplus::bus::bus& bus, const sdeventplus::Event& event);
 
+    /** @copydoc PowerInterface::getPgood() */
+    int getPgood() const override;
+
+    /** @copydoc PowerInterface::getPgoodTimeout() */
+    int getPgoodTimeout() const override;
+
+    /** @copydoc PowerInterface::getState() */
+    int getState() const override;
+
+    /** @copydoc PowerInterface::setPgoodTimeout() */
+    void setPgoodTimeout(int timeout) override;
+
+    /** @copydoc PowerInterface::setState() */
+    void setState(int state) override;
+
   private:
     /**
      * The D-Bus bus object
@@ -40,9 +59,31 @@
     sdbusplus::bus::bus& bus;
 
     /**
-     * Event to loop on
+     * Power good
      */
-    sdeventplus::Event eventLoop;
+    int pgood{0};
+
+    /**
+     * Power good timeout constant
+     */
+    static constexpr std::chrono::seconds pgoodTimeout{
+        std::chrono::seconds(10)};
+
+    /**
+     * Poll interval constant
+     */
+    static constexpr std::chrono::milliseconds pollInterval{
+        std::chrono::milliseconds(3000)};
+
+    /**
+     * Power state
+     */
+    int state{0};
+
+    /**
+     * Power good timeout
+     */
+    std::chrono::seconds timeout{pgoodTimeout};
 
     /**
      * Timer to poll the pgood
@@ -50,11 +91,6 @@
     sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic> timer;
 
     /**
-     * Poll interval constant
-     */
-    static constexpr int pollInterval{3000}; // Milliseconds
-
-    /**
      * Polling method for monitoring the system power good
      */
     void pollPgood();
diff --git a/phosphor-power-sequencer/src/power_interface.hpp b/phosphor-power-sequencer/src/power_interface.hpp
index 76608ff..d189120 100644
--- a/phosphor-power-sequencer/src/power_interface.hpp
+++ b/phosphor-power-sequencer/src/power_interface.hpp
@@ -49,31 +49,31 @@
     void emitPropertyChangedSignal(const char* property);
 
     /**
-     * Implementation for the getPgood method
+     * Returns the power good of the chassis
      * @return power good
      */
-    virtual int getPgood() = 0;
+    virtual int getPgood() const = 0;
 
     /**
-     * Implementation for the getPgoodTimeout method
+     * Returns the power good timeout
      * @return power good timeout
      */
-    virtual int getPgoodTimeout() = 0;
+    virtual int getPgoodTimeout() const = 0;
 
     /**
-     * Implementation for the getState method
+     * Returns the value of the last requested power state
      * @return power state. A power on request is value 1. Power off is 0.
      */
-    virtual int getState() = 0;
+    virtual int getState() const = 0;
 
     /**
-     * Implementation for the setPgoodTimeout method
+     * Sets the power good timeout
      * @param[in] timeout power good timeout
      */
     virtual void setPgoodTimeout(int timeout) = 0;
 
     /**
-     * Implementation for the setState method
+     * Initiates a chassis power state change
      * @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.
      */