pseq: Add base and UCD90320 device monitor classes

Add a power sequencer device monitoring base class and a UCD90320
subclass. Update power controller class to construct and pass device
information to device class.  Update build file to support.

Signed-off-by: Jim Wright <jlwright@us.ibm.com>
Change-Id: Idf3ef53011b23f15841d93795f9f0995892b10b9
diff --git a/phosphor-power-sequencer/src/meson.build b/phosphor-power-sequencer/src/meson.build
index 8f74c7e..4ea4b9c 100644
--- a/phosphor-power-sequencer/src/meson.build
+++ b/phosphor-power-sequencer/src/meson.build
@@ -8,6 +8,7 @@
     'power_control_main.cpp',
     'power_control.cpp',
     'power_interface.cpp',
+    'ucd90320_monitor.cpp',
     dependencies: [
         libgpiodcxx,
         phosphor_logging,
diff --git a/phosphor-power-sequencer/src/power_control.cpp b/phosphor-power-sequencer/src/power_control.cpp
index 6e9fa58..aa47598 100644
--- a/phosphor-power-sequencer/src/power_control.cpp
+++ b/phosphor-power-sequencer/src/power_control.cpp
@@ -17,6 +17,7 @@
 #include "power_control.hpp"
 
 #include "types.hpp"
+#include "ucd90320_monitor.hpp"
 
 #include <fmt/format.h>
 #include <sys/types.h>
@@ -92,12 +93,13 @@
 
     if (i2cBus && i2cAddress && name && !name->empty())
     {
-        log<level::INFO>(
+        log<level::DEBUG>(
             fmt::format(
                 "Found power sequencer device properties, name: {}, bus: {} addr: {:#02x} ",
                 *name, *i2cBus, *i2cAddress)
                 .c_str());
         // Create device object
+        device = std::make_unique<UCD90320Monitor>(bus, *i2cBus, *i2cAddress);
     }
 }
 
diff --git a/phosphor-power-sequencer/src/power_control.hpp b/phosphor-power-sequencer/src/power_control.hpp
index 1699dcc..62dfce2 100644
--- a/phosphor-power-sequencer/src/power_control.hpp
+++ b/phosphor-power-sequencer/src/power_control.hpp
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "power_interface.hpp"
+#include "power_sequencer_monitor.hpp"
 #include "utility.hpp"
 
 #include <gpiod.hpp>
@@ -69,6 +70,11 @@
     sdbusplus::bus::bus& bus;
 
     /**
+     * The power sequencer device to monitor.
+     */
+    std::unique_ptr<PowerSequencerMonitor> device;
+
+    /**
      * Indicates if a state transistion is taking place
      */
     bool inStateTransition{false};
diff --git a/phosphor-power-sequencer/src/power_sequencer_monitor.hpp b/phosphor-power-sequencer/src/power_sequencer_monitor.hpp
new file mode 100644
index 0000000..e714d08
--- /dev/null
+++ b/phosphor-power-sequencer/src/power_sequencer_monitor.hpp
@@ -0,0 +1,21 @@
+#pragma once
+
+namespace phosphor::power::sequencer
+{
+
+/**
+ * @class PowerSequencerMonitor
+ * Define a base class for monitoring a power sequencer device.
+ */
+class PowerSequencerMonitor
+{
+  public:
+    PowerSequencerMonitor() = default;
+    PowerSequencerMonitor(const PowerSequencerMonitor&) = delete;
+    PowerSequencerMonitor& operator=(const PowerSequencerMonitor&) = delete;
+    PowerSequencerMonitor(PowerSequencerMonitor&&) = delete;
+    PowerSequencerMonitor& operator=(PowerSequencerMonitor&&) = delete;
+    virtual ~PowerSequencerMonitor() = default;
+};
+
+} // namespace phosphor::power::sequencer
diff --git a/phosphor-power-sequencer/src/ucd90320_monitor.cpp b/phosphor-power-sequencer/src/ucd90320_monitor.cpp
index 698b0d0..36301b4 100644
--- a/phosphor-power-sequencer/src/ucd90320_monitor.cpp
+++ b/phosphor-power-sequencer/src/ucd90320_monitor.cpp
@@ -14,7 +14,22 @@
  * limitations under the License.
  */
 
-int main()
+#include "ucd90320_monitor.hpp"
+
+#include <fmt/format.h>
+
+#include <string>
+
+namespace phosphor::power::sequencer
 {
-    return 0;
+
+UCD90320Monitor::UCD90320Monitor(sdbusplus::bus::bus& bus, std::uint8_t i2cBus,
+                                 std::uint16_t i2cAddress) :
+    PowerSequencerMonitor(),
+    bus{bus}, interface {
+    fmt::format("/sys/bus/i2c/devices/{}-{:04x}", i2cBus, i2cAddress).c_str(),
+        "ucd9000", 0
 }
+{}
+
+} // namespace phosphor::power::sequencer
diff --git a/phosphor-power-sequencer/src/ucd90320_monitor.hpp b/phosphor-power-sequencer/src/ucd90320_monitor.hpp
new file mode 100644
index 0000000..9512190
--- /dev/null
+++ b/phosphor-power-sequencer/src/ucd90320_monitor.hpp
@@ -0,0 +1,47 @@
+#pragma once
+
+#include "pmbus.hpp"
+#include "power_sequencer_monitor.hpp"
+
+#include <sdbusplus/bus.hpp>
+
+namespace phosphor::power::sequencer
+{
+
+/**
+ * @class UCD90320Monitor
+ * This class implements fault analysis for the UCD90320
+ * power sequencer device.
+ */
+class UCD90320Monitor : public PowerSequencerMonitor
+{
+  public:
+    UCD90320Monitor() = delete;
+    UCD90320Monitor(const UCD90320Monitor&) = delete;
+    UCD90320Monitor& operator=(const UCD90320Monitor&) = delete;
+    UCD90320Monitor(UCD90320Monitor&&) = delete;
+    UCD90320Monitor& operator=(UCD90320Monitor&&) = delete;
+    virtual ~UCD90320Monitor() = default;
+
+    /**
+     * Create a device object for UCD90320 monitoring.
+     * @param[in] bus D-Bus bus object
+     * @param[in] i2cBus The bus number of the power sequencer device
+     * @param[in] i2cAddress The I2C address of the power sequencer device
+     */
+    UCD90320Monitor(sdbusplus::bus::bus& bus, std::uint8_t i2cBus,
+                    const std::uint16_t i2cAddress);
+
+  private:
+    /**
+     * The D-Bus bus object
+     */
+    sdbusplus::bus::bus& bus;
+
+    /**
+     * The read/write interface to this hardware
+     */
+    pmbus::PMBus interface;
+};
+
+} // namespace phosphor::power::sequencer