API to update IM value on system planar

This commit implements code to update IM value on system planar
EEPROM path.

Change-Id: Ib4e8570d1ad5c86dd4573aca9882031282342a88
Signed-off-by: Rekha Aparna <vrekhaaparna@ibm.com>
diff --git a/vpd-manager/include/constants.hpp b/vpd-manager/include/constants.hpp
index e605cd1..5195c38 100644
--- a/vpd-manager/include/constants.hpp
+++ b/vpd-manager/include/constants.hpp
@@ -142,6 +142,7 @@
 constexpr auto kwdFN = "FN";
 constexpr auto recVSYS = "VSYS";
 constexpr auto recVCEN = "VCEN";
+constexpr auto recVSBP = "VSBP";
 constexpr auto locationCodeInf = "com.ibm.ipzvpd.Location";
 constexpr auto xyzLocationCodeInf =
     "xyz.openbmc_project.Inventory.Decorator.LocationCode";
diff --git a/vpd-manager/include/single_fab.hpp b/vpd-manager/include/single_fab.hpp
index 8587519..c618cb8 100644
--- a/vpd-manager/include/single_fab.hpp
+++ b/vpd-manager/include/single_fab.hpp
@@ -29,5 +29,14 @@
      * @return IM value on success, empty string otherwise.
      */
     std::string getImFromPlanar() const noexcept;
+
+    /**
+     * @brief API to update IM value on system planar EEPROM path.
+     *
+     * @param[in] i_imValue - IM value to be updated.
+     *
+     * @return true if value updated successfully, otherwise false.
+     */
+    bool setImOnPlanar(const std::string& i_imValue) const noexcept;
 };
 } // namespace vpd
diff --git a/vpd-manager/src/single_fab.cpp b/vpd-manager/src/single_fab.cpp
index 24556d0..c198841 100644
--- a/vpd-manager/src/single_fab.cpp
+++ b/vpd-manager/src/single_fab.cpp
@@ -3,8 +3,10 @@
 #include "single_fab.hpp"
 
 #include "constants.hpp"
+#include "parser.hpp"
 #include "types.hpp"
 
+#include <nlohmann/json.hpp>
 #include <utility/json_utility.hpp>
 
 namespace vpd
@@ -41,12 +43,7 @@
         return l_imData.str();
     }
     catch (const std::exception& l_ex)
-    {
-        logging::logMessage(
-            "Error while getting IM value from PIM persisted file: " +
-            std::string(pimPersistVsbpPath) +
-            ", reason: " + std::string(l_ex.what()));
-    }
+    {}
 
     return std::string();
 }
@@ -85,4 +82,33 @@
 
     return std::string();
 }
+
+bool SingleFab::setImOnPlanar(const std::string& i_imValue) const noexcept
+{
+    try
+    {
+        types::BinaryVector l_imValue;
+        const std::string l_systemPlanarEepromPath = SYSTEM_VPD_FILE_PATH;
+
+        // Convert string to vector of bytes
+        for (auto l_value : i_imValue | std::views::chunk(2))
+        {
+            std::string l_byteString(l_value.begin(), l_value.end());
+            l_imValue.push_back(
+                static_cast<uint8_t>(std::stoi(l_byteString, nullptr, 16)));
+        }
+
+        std::shared_ptr<Parser> l_parserObj = std::make_shared<Parser>(
+            l_systemPlanarEepromPath, nlohmann::json{});
+
+        int l_bytes_updated = l_parserObj->updateVpdKeywordOnHardware(
+            std::make_tuple(constants::recVSBP, constants::kwdIM, l_imValue));
+
+        return l_bytes_updated > 0 ? true : false;
+    }
+    catch (const std::exception& l_ex)
+    {
+        return false;
+    }
+}
 } // namespace vpd