pseq: Add support for UCD90160 device

Refactor power sequencer class hierarchy to add support for the UCD90160
device.

Tested:
* Verify UCD information is obtained successfully from EntityManager
* Verify JSON configuration file is found and parsed successfully
* Test where no pgood error occurs
  * During power on
    * Verify power on continues
    * Verify no error is logged
  * After chassis is powered on
    * Verify chassis remains powered on
    * Verify no error is logged
* Test where pgood error occurs
  * During power on
    * Verify power on stops and chassis is powered off
    * Verify correct error is logged
    * Verify callouts and additional data in error log are correct
    * Detected via rail
    * Detected via pin
  * After chassis is powered on
    * Verify chassis is powered off
    * Verify correct error is logged
    * Verify callouts and additional data in error log are correct
    * Detected via rail
    * Detected via pin

Signed-off-by: Jim Wright <jlwright@us.ibm.com>
Change-Id: Ib00bc1ea34b504c245a4f0cb3979a86e51507f3c
Signed-off-by: Shawn McCarney <shawnmm@us.ibm.com>
diff --git a/phosphor-power-sequencer/src/ucd90320_monitor.hpp b/phosphor-power-sequencer/src/ucd90320_monitor.hpp
index 9bcbf77..a40456d 100644
--- a/phosphor-power-sequencer/src/ucd90320_monitor.hpp
+++ b/phosphor-power-sequencer/src/ucd90320_monitor.hpp
@@ -1,37 +1,23 @@
 #pragma once
 
-#include "pmbus.hpp"
-#include "power_sequencer_monitor.hpp"
+#include "ucd90x_monitor.hpp"
 
-#include <gpiod.hpp>
 #include <sdbusplus/bus.hpp>
-#include <sdbusplus/bus/match.hpp>
 
-#include <filesystem>
+#include <cstdint>
+#include <map>
+#include <string>
 #include <vector>
 
 namespace phosphor::power::sequencer
 {
 
-struct Pin
-{
-    std::string name;
-    unsigned int line;
-    std::string presence;
-};
-
-struct Rail
-{
-    std::string name;
-    std::string presence;
-};
-
 /**
  * @class UCD90320Monitor
  * This class implements fault analysis for the UCD90320
  * power sequencer device.
  */
-class UCD90320Monitor : public PowerSequencerMonitor
+class UCD90320Monitor : public UCD90xMonitor
 {
   public:
     UCD90320Monitor() = delete;
@@ -50,103 +36,11 @@
     UCD90320Monitor(sdbusplus::bus_t& bus, std::uint8_t i2cBus,
                     std::uint16_t i2cAddress);
 
-    /**
-     * Callback function to handle interfacesAdded D-Bus signals
-     * @param msg Expanded sdbusplus message data
-     */
-    void interfacesAddedHandler(sdbusplus::message_t& msg);
-
-    /** @copydoc PowerSequencerMonitor::onFailure() */
-    void onFailure(bool timeout, const std::string& powerSupplyError) override;
-
-  private:
-    /**
-     * The match to Entity Manager interfaces added.
-     */
-    sdbusplus::bus::match_t match;
-
-    /**
-     * List of pins
-     */
-    std::vector<Pin> pins;
-
-    /**
-     * The read/write interface to this hardware
-     */
-    pmbus::PMBus pmbusInterface;
-
-    /**
-     * List of rails
-     */
-    std::vector<Rail> rails;
-
-    /**
-     * Finds the list of compatible system types using D-Bus methods.
-     * This list is used to find the correct JSON configuration file for the
-     * current system.
-     */
-    void findCompatibleSystemTypes();
-
-    /**
-     * Finds the JSON configuration file.
-     * Looks for a configuration file based on the list of compatible system
-     * types.
-     * Throws an exception if an operating system error occurs while checking
-     * for the existance of a file.
-     * @param compatibleSystemTypes List of compatible system types
-     */
-    void findConfigFile(const std::vector<std::string>& compatibleSystemTypes);
-
-    /**
-     * Returns whether the hardware with the specified inventory path is
-     * present.
-     * If an error occurs while obtaining the presence value, presence is
-     * assumed to be false. An empty string path indicates no presence check is
-     * needed.
-     * @param inventoryPath D-Bus inventory path of the hardware
-     * @return true if hardware is present, false otherwise
-     */
-    bool isPresent(const std::string& inventoryPath);
-
-    /**
-     * Analyzes the device pins for errors when the device is known to be in an
-     * error state.
-     * @param message Message property of the error log entry
-     * @param additionalData AdditionalData property of the error log entry
-     */
-    void onFailureCheckPins(std::string& message,
-                            std::map<std::string, std::string>& additionalData);
-
-    /**
-     * Analyzes the device rails for errors when the device is known to be in an
-     * error state.
-     * @param message Message property of the error log entry
-     * @param additionalData AdditionalData property of the error log entry
-     * @param powerSupplyError The power supply error to log. A default
-     * std:string, i.e. empty string (""), is passed when there is no power
-     * supply error to log.
-     */
-    void onFailureCheckRails(std::string& message,
-                             std::map<std::string, std::string>& additionalData,
-                             const std::string& powerSupplyError);
-
-    /**
-     * Parse the JSON configuration file.
-     * @param pathName the path name
-     */
-    void parseConfigFile(const std::filesystem::path& pathName);
-
-    /**
-     * Reads the mfr_status register
-     * @return the register contents
-     */
-    uint64_t readMFRStatus();
-
-    /**
-     * Reads the status_word register
-     * @return the register contents
-     */
-    uint16_t readStatusWord();
+  protected:
+    /** @copydoc UCD90xMonitor::formatGpioValues() */
+    void formatGpioValues(
+        const std::vector<int>& values, unsigned int numberLines,
+        std::map<std::string, std::string>& additionalData) const override;
 };
 
 } // namespace phosphor::power::sequencer