Split occ_manager.hpp into header and source files

occ_manager.hpp is growing and hence this commit splits
into header and source files

Change-Id: I3203520c50910d39055fea98b770de55796bb074
Signed-off-by: Vishwanatha Subbanna <vishwa@linux.vnet.ibm.com>
diff --git a/occ_manager.cpp b/occ_manager.cpp
new file mode 100644
index 0000000..09cefcc
--- /dev/null
+++ b/occ_manager.cpp
@@ -0,0 +1,142 @@
+#include <experimental/filesystem>
+#include <phosphor-logging/log.hpp>
+#include <phosphor-logging/elog-errors.hpp>
+#include <xyz/openbmc_project/Common/error.hpp>
+#include "occ_finder.hpp"
+#include "occ_manager.hpp"
+#include "i2c_occ.hpp"
+#include "utils.hpp"
+#include "config.h"
+
+namespace open_power
+{
+namespace occ
+{
+
+void Manager::findAndCreateObjects()
+{
+    // Check if CPU inventory exists already.
+    auto occs = open_power::occ::finder::get(bus);
+    if (occs.empty())
+    {
+        // Need to watch for CPU inventory creation.
+        for (auto id = 0; id < MAX_CPUS; ++id)
+        {
+            auto path = std::string(CPU_PATH) + std::to_string(id);
+            cpuMatches.emplace_back(
+                    bus,
+                    sdbusRule::interfacesAdded() +
+                    sdbusRule::argNpath(0, path),
+                    std::bind(std::mem_fn(&Manager::cpuCreated),
+                        this, std::placeholders::_1));
+        }
+    }
+    else
+    {
+        for (const auto& occ : occs)
+        {
+            // CPU inventory exists already, OCC objects can be created.
+            createObjects(occ);
+        }
+    }
+}
+
+int Manager::cpuCreated(sdbusplus::message::message& msg)
+{
+    namespace fs = std::experimental::filesystem;
+
+    sdbusplus::message::object_path o;
+    msg.read(o);
+    fs::path cpuPath(std::string(std::move(o)));
+
+    auto name = cpuPath.filename().string();
+    auto index = name.find(CPU_NAME);
+    name.replace(index, std::strlen(CPU_NAME), OCC_NAME);
+
+    createObjects(name);
+
+    return 0;
+}
+
+void Manager::createObjects(const std::string& occ)
+{
+    auto path = fs::path(OCC_CONTROL_ROOT) / occ;
+
+    passThroughObjects.emplace_back(
+            std::make_unique<PassThrough>(
+                bus,
+                path.c_str()));
+
+    statusObjects.emplace_back(
+            std::make_unique<Status>(
+                bus,
+                event,
+                path.c_str(),
+                std::bind(std::mem_fn(&Manager::statusCallBack),
+                    this, std::placeholders::_1)));
+
+    // Create the power cap monitor object for master occ (0)
+    if (!pcap)
+    {
+        pcap = std::make_unique<open_power::occ::powercap::PowerCap>(
+                bus,
+                *statusObjects.front());
+    }
+}
+
+void Manager::statusCallBack(bool status)
+{
+    using namespace phosphor::logging;
+    using InternalFailure = sdbusplus::xyz::openbmc_project::Common::
+        Error::InternalFailure;
+
+    // At this time, it won't happen but keeping it
+    // here just in case something changes in the future
+    if ((activeCount == 0) && (!status))
+    {
+        log<level::ERR>("Invalid update on OCCActive");
+        elog<InternalFailure>();
+    }
+
+    activeCount += status ? 1 : -1;
+
+    // If all the OCCs are bound, then start error detection
+    if (activeCount == statusObjects.size())
+    {
+        for (const auto& occ: statusObjects)
+        {
+            occ->addErrorWatch();
+        }
+    }
+    else if (!status)
+    {
+        // If some OCCs are not bound yet, those will be a NO-OP
+        for (const auto& occ: statusObjects)
+        {
+            occ->removeErrorWatch();
+        }
+    }
+}
+
+#ifdef I2C_OCC
+void Manager::initStatusObjects()
+{
+    // Make sure we have a valid path string
+    static_assert(sizeof(DEV_PATH) != 0);
+
+    auto deviceNames = i2c_occ::getOccHwmonDevices(DEV_PATH);
+    for (auto& name : deviceNames)
+    {
+        i2c_occ::i2cToDbus(name);
+        auto path = fs::path(OCC_CONTROL_ROOT) / name;
+        statusObjects.emplace_back(
+                std::make_unique<Status>(
+                    bus,
+                    event,
+                    path.c_str()));
+    }
+}
+#endif
+
+} // namespace occ
+} // namespace open_power