Add Ipmb Sensor

Add daemon responsible for polling ipmb for sensor
readings. Currently base ME and VR bridge sensors
are supported. This daemon uses ipmbd to get sensor
readings.

Tested-by: Saw correct readings on d-bus and verified
sensor list.

Change-Id: I71c216ae57567470d42180dce76aba8f69ecb50e
Signed-off-by: James Feist <james.feist@linux.intel.com>
diff --git a/include/ADCSensor.hpp b/include/ADCSensor.hpp
index 2b5cdd4..2397093 100644
--- a/include/ADCSensor.hpp
+++ b/include/ADCSensor.hpp
@@ -4,11 +4,6 @@
 #include <sdbusplus/asio/object_server.hpp>
 #include <sensor.hpp>
 
-enum class PowerState : bool
-{
-    on,
-    always
-};
 class ADCSensor : public Sensor
 {
   public:
diff --git a/include/IpmbSensor.hpp b/include/IpmbSensor.hpp
new file mode 100644
index 0000000..d5b0290
--- /dev/null
+++ b/include/IpmbSensor.hpp
@@ -0,0 +1,49 @@
+#pragma once
+#include "sensor.hpp"
+
+#include <boost/asio/deadline_timer.hpp>
+#include <boost/container/flat_map.hpp>
+#include <chrono>
+#include <limits>
+#include <vector>
+
+enum class IpmbType
+{
+    meSensor,
+    PXE1410CVR,
+    IR38363VR,
+    mpsVR
+};
+
+struct IpmbSensor : public Sensor
+{
+    IpmbSensor(std::shared_ptr<sdbusplus::asio::connection> &conn,
+               boost::asio::io_service &io, const std::string &name,
+               const std::string &sensorConfiguration,
+               sdbusplus::asio::object_server &objectServer,
+               std::vector<thresholds::Threshold> &&thresholds,
+               uint8_t deviceAddress);
+    ~IpmbSensor();
+
+    void checkThresholds(void) override;
+    void read(void);
+    void init(void);
+    void loadDefaults(void);
+
+    IpmbType type;
+    uint8_t commandAddress;
+    uint8_t netfn;
+    uint8_t command;
+    uint8_t deviceAddress;
+    std::vector<uint8_t> commandData;
+    std::optional<uint8_t> initCommand;
+    std::vector<uint8_t> initData;
+
+    // to date all ipmb sensors are power on only
+    PowerState readState = PowerState::on;
+
+  private:
+    sdbusplus::asio::object_server &objectServer;
+    std::shared_ptr<sdbusplus::asio::connection> dbusConnection;
+    boost::asio::deadline_timer waitTimer;
+};
\ No newline at end of file
diff --git a/include/Utils.hpp b/include/Utils.hpp
index 006c2bc..598662a 100644
--- a/include/Utils.hpp
+++ b/include/Utils.hpp
@@ -45,6 +45,12 @@
 void findLimits(std::pair<double, double>& limits,
                 const SensorBaseConfiguration* data);
 
+enum class PowerState : bool
+{
+    on,
+    always
+};
+
 template <typename T>
 inline T loadVariant(
     const boost::container::flat_map<std::string, BasicVariantType>& data,
@@ -61,6 +67,11 @@
         return sdbusplus::message::variant_ns::visit(VariantToDoubleVisitor(),
                                                      it->second);
     }
+    else if constexpr (std::is_unsigned_v<T>)
+    {
+        return sdbusplus::message::variant_ns::visit(
+            VariantToUnsignedIntVisitor(), it->second);
+    }
     else if constexpr (std::is_same_v<T, std::string>)
     {
         return sdbusplus::message::variant_ns::visit(VariantToStringVisitor(),