pfr-manager: move cpld_active version to settings service

Add Support to move the cpld_version object to settings service and
update the version in pfr-manager.

This is done to have the cpld_active version displayed in redfish if
pfr-manager stopped.

Tested:
Command: busctl get-property xyz.openbmc_project.Settings /xyz/openbmc_
         project/software/cpld_active xyz.openbmc_project.Software.
         Version "Version"
Response:
s "0.7-1.0-8675b80f7c90e9163f19b6af2351e3c231f4d154b5f03
   1442b6c3d9777671694"
Command: GET: https://BMC_IP>/redfish/v1/UpdateService/FirmwareInventory
              /cpld_active
Response:
{
    "@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/
                 cpld_active",
    "@odata.type": "#SoftwareInventory.v1_1_0.SoftwareInventory",
    "Description": "Other image",
    "Id": "cpld_active",
    "Name": "Software Inventory",
    "Status": {
        "Health": "OK",
        "HealthRollup": "OK",
        "State": "Enabled"
    },
    "Updateable": false,
    "Version": "0.7-1.0-8675b80f7c90e9163f19b6af2351e3c231f4d154b5f03
                1442b6c3d9777671694"
}

Signed-off-by: Chalapathi Venkataramashetty <chalapathix.venkataramashetty@intel.com>
Change-Id: I3772db318f25afff39c44692bea7c510b0070647
diff --git a/libpfr/inc/pfr.hpp b/libpfr/inc/pfr.hpp
index 6ae6d60..c0d3c11 100644
--- a/libpfr/inc/pfr.hpp
+++ b/libpfr/inc/pfr.hpp
@@ -45,6 +45,7 @@
 int getProvisioningStatus(bool& ufmLocked, bool& ufmProvisioned,
                           bool& ufmSupport);
 int readCpldReg(const ActionType& action, uint8_t& value);
+std::string readCPLDVersion();
 int setBMCBootCheckpoint(const uint8_t checkPoint);
 
 } // namespace pfr
diff --git a/libpfr/src/pfr.cpp b/libpfr/src/pfr.cpp
index a01b845..64476f4 100644
--- a/libpfr/src/pfr.cpp
+++ b/libpfr/src/pfr.cpp
@@ -248,7 +248,7 @@
     return true;
 }
 
-static std::string readCPLDVersion()
+std::string readCPLDVersion()
 {
     // CPLD SGPIO lines
     gpiod::line mainCPLDLine;
diff --git a/service/src/mainapp.cpp b/service/src/mainapp.cpp
index 316bdda..ba714fe 100644
--- a/service/src/mainapp.cpp
+++ b/service/src/mainapp.cpp
@@ -49,8 +49,6 @@
                         versionPurposeBMC),
         std::make_tuple("bios_recovery", ImageType::biosRecovery,
                         versionPurposeHost),
-        std::make_tuple("cpld_active", ImageType::cpldActive,
-                        versionPurposeOther),
         std::make_tuple("cpld_recovery", ImageType::cpldRecovery,
                         versionPurposeOther),
 };
@@ -456,6 +454,27 @@
     checkAndLogEvents();
 }
 
+static void updateCPLDversion(std::shared_ptr<sdbusplus::asio::connection> conn)
+{
+    std::string cpldVersion = pfr::readCPLDVersion();
+    conn->async_method_call(
+        [](const boost::system::error_code ec) {
+            if (ec)
+            {
+                phosphor::logging::log<phosphor::logging::level::ERR>(
+                    "Unable to update cpld_active version",
+                    phosphor::logging::entry("MSG=%s", ec.message().c_str()));
+                return;
+            }
+        },
+        "xyz.openbmc_project.Settings",
+        "/xyz/openbmc_project/software/cpld_active",
+        "org.freedesktop.DBus.Properties", "Set",
+        "xyz.openbmc_project.Software.Version", "Version",
+        std::variant<std::string>(cpldVersion));
+    return;
+}
+
 } // namespace pfr
 
 int main()
@@ -468,6 +487,9 @@
     auto server = sdbusplus::asio::object_server(conn, true);
     pfr::monitorSignals(server, conn);
 
+    // Update CPLD Version to cpld_active object in settings.
+    pfr::updateCPLDversion(conn);
+
     server.add_manager("/xyz/openbmc_project/pfr");
 
     // Create PFR attributes object and interface