summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xocc_sensor.mako.hpp9
-rw-r--r--occ_status.cpp9
-rw-r--r--occ_status.hpp48
3 files changed, 55 insertions, 11 deletions
diff --git a/occ_sensor.mako.hpp b/occ_sensor.mako.hpp
index b5fac53..19c785f 100755
--- a/occ_sensor.mako.hpp
+++ b/occ_sensor.mako.hpp
@@ -6,6 +6,8 @@
#pragma once
#include <map>
+#include <string>
+#include <tuple>
namespace open_power
{
@@ -14,15 +16,18 @@ namespace occ
using instanceID = int;
using sensorID = uint8_t;
-const std::map<instanceID, sensorID> Status::sensorMap = {
+using sensorName = std::string;
+using sensorDefs = std::tuple<sensorID, sensorName>;
+const std::map<instanceID, sensorDefs> Status::sensorMap = {
\
% for occ in occDict:
<%
instance = occ.get("Instance")
id = occ.get("SensorID")
+ name = occ.get("SensorName")
%>\
\
- { ${instance}, ${id} },\
+ { ${instance}, { ${id}, "${name}" }},\
% endfor
};
diff --git a/occ_status.cpp b/occ_status.cpp
index c2c4bae..0782f87 100644
--- a/occ_status.cpp
+++ b/occ_status.cpp
@@ -95,7 +95,8 @@ void Status::resetOCC()
method.append(convertForMessage(Control::Host::Command::OCCReset).c_str());
// OCC Sensor ID for callout reasons
- method.append(sdbusplus::message::variant<uint8_t>(sensorMap.at(instance)));
+ method.append(sdbusplus::message::variant<uint8_t>(
+ std::get<0>(sensorMap.at(instance))));
bus.call_noreply(method);
return;
}
@@ -122,9 +123,9 @@ void Status::hostControlEvent(sdbusplus::message::message& msg)
Control::Host::Command::OCCReset)
{
// Must be a Timeout. Log an Error trace
- log<level::ERR>("Error resetting the OCC.",
- entry("PATH=%s", path.c_str()),
- entry("SENSORID=0x%X", sensorMap.at(instance)));
+ log<level::ERR>(
+ "Error resetting the OCC.", entry("PATH=%s", path.c_str()),
+ entry("SENSORID=0x%X", std::get<0>(sensorMap.at(instance))));
}
}
return;
diff --git a/occ_status.hpp b/occ_status.hpp
index 859b5b0..1617d12 100644
--- a/occ_status.hpp
+++ b/occ_status.hpp
@@ -31,6 +31,12 @@ using instanceID = int;
// IPMI sensor ID for a given OCC instance
using sensorID = uint8_t;
+// Human readable sensor name for DBus tree. E.g. "CPU0_OCC"
+using sensorName = std::string;
+
+// OCC sensors definitions in the map
+using sensorDefs = std::tuple<sensorID, sensorName>;
+
// OCC sysfs name prefix
const std::string sysfsName = "occ-hwmon";
@@ -60,9 +66,8 @@ class Status : public Interface
Status(sdbusplus::bus::bus& bus, EventPtr& event, const char* path,
const Manager& manager,
std::function<void(bool)> callBack = nullptr) :
- Interface(bus, path, true),
- bus(bus), path(path), callBack(callBack),
- instance(((this->path.back() - '0'))),
+ Interface(bus, getDbusPath(path).c_str(), true),
+ bus(bus), path(path), callBack(callBack), instance(getInstance(path)),
device(event,
#ifdef I2C_OCC
fs::path(DEV_PATH) / i2c_occ::getI2cDeviceName(path),
@@ -140,8 +145,8 @@ class Status : public Interface
/** @brief OCC instance number. Ex, 0,1, etc */
int instance;
- /** @brief OCC instance to Sensor ID mapping */
- static const std::map<instanceID, sensorID> sensorMap;
+ /** @brief OCC instance to Sensor definitions mapping */
+ static const std::map<instanceID, sensorDefs> sensorMap;
/** @brief OCC device object to do bind and unbind */
Device device;
@@ -169,6 +174,39 @@ class Status : public Interface
/** @brief Sends a message to host control command handler to reset OCC
*/
void resetOCC();
+
+ /** @brief Determines the instance ID by specified object path.
+ * @param[in] path Estimated OCC Dbus object path
+ * @return Instance number
+ */
+ static int getInstance(const std::string& path)
+ {
+ return (path.empty() ? 0 : path.back() - '0');
+ }
+
+ /** @brief Override the sensor name with name from the definition.
+ * @param[in] estimatedPath - Estimated OCC Dbus object path
+ * @return Fixed OCC DBus object path
+ */
+ static std::string getDbusPath(const std::string& estimatedPath)
+ {
+ if (!estimatedPath.empty())
+ {
+ auto it = sensorMap.find(getInstance(estimatedPath));
+ if (sensorMap.end() != it)
+ {
+ auto& name = std::get<1>(it->second);
+ if (!name.empty() && name != "None")
+ {
+ auto path = fs::path(estimatedPath);
+ path.replace_filename(name);
+ return path.string();
+ }
+ }
+ }
+
+ return estimatedPath;
+ }
};
} // namespace occ
OpenPOWER on IntegriCloud