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(),