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.
*/