Move value iface creation into sensor object
Create the Sensor.Value interface for a sensor within the sensor object.
Each sensor must have an input sysfs file to get a Value property on the
Sensor.Value interface and be included by hwmon.
Tested:
No change in value interface creation for sensors
Change-Id: I09b1c79142ba2a34424f5ec29f41d19a987c84e7
Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
diff --git a/mainloop.cpp b/mainloop.cpp
index be9b680..595432d 100644
--- a/mainloop.cpp
+++ b/mainloop.cpp
@@ -17,7 +17,6 @@
#include <iostream>
#include <memory>
#include <cstdlib>
-#include <cstring>
#include <string>
#include <unordered_set>
#include <sstream>
@@ -79,137 +78,6 @@
// Store the valueAdjust for sensors
std::map<SensorSet::key_type, valueAdjust> sensorAdjusts;
-void addRemoveRCs(const SensorSet::key_type& sensor,
- const std::string& rcList)
-{
- if (rcList.empty())
- {
- return;
- }
-
- // Convert to a char* for strtok
- std::vector<char> rmRCs(rcList.c_str(),
- rcList.c_str() + rcList.size() + 1);
- auto rmRC = std::strtok(&rmRCs[0], ", ");
- while (rmRC != nullptr)
- {
- try
- {
- sensorAdjusts[sensor].rmRCs.insert(std::stoi(rmRC));
- }
- catch (const std::logic_error& le)
- {
- // Unable to convert to int, continue to next token
- std::string name = sensor.first + "_" + sensor.second;
- log<level::INFO>("Unable to convert sensor removal return code",
- entry("SENSOR=%s", name.c_str()),
- entry("RC=%s", rmRC),
- entry("EXCEPTION=%s", le.what()));
- }
- rmRC = std::strtok(nullptr, ", ");
- }
-}
-
-int64_t adjustValue(const SensorSet::key_type& sensor, int64_t value)
-{
-// Because read doesn't have an out pointer to store errors.
-// let's assume negative values are errors if they have this
-// set.
-#ifdef NEGATIVE_ERRNO_ON_FAIL
- if (value < 0)
- {
- return value;
- }
-#endif
-
- const auto& it = sensorAdjusts.find(sensor);
- if (it != sensorAdjusts.end())
- {
- // Adjust based on gain and offset
- value = static_cast<decltype(value)>(
- static_cast<double>(value) * it->second.gain
- + it->second.offset);
- }
- return value;
-}
-
-auto addValue(const SensorSet::key_type& sensor,
- const RetryIO& retryIO,
- hwmonio::HwmonIO& ioAccess,
- ObjectInfo& info)
-{
- static constexpr bool deferSignals = true;
-
- // Get the initial value for the value interface.
- auto& bus = *std::get<sdbusplus::bus::bus*>(info);
- auto& obj = std::get<Object>(info);
- auto& objPath = std::get<std::string>(info);
-
- auto senRmRCs = env::getEnv("REMOVERCS", sensor);
- // Add sensor removal return codes defined per sensor
- addRemoveRCs(sensor, senRmRCs);
-
- auto gain = env::getEnv("GAIN", sensor);
- if (!gain.empty())
- {
- sensorAdjusts[sensor].gain = std::stod(gain);
- }
-
- auto offset = env::getEnv("OFFSET", sensor);
- if (!offset.empty())
- {
- sensorAdjusts[sensor].offset = std::stoi(offset);
- }
-
- int64_t val = 0;
- std::shared_ptr<StatusObject> statusIface = nullptr;
- auto it = obj.find(InterfaceType::STATUS);
- if (it != obj.end())
- {
- statusIface = std::experimental::any_cast<
- std::shared_ptr<StatusObject>>(it->second);
- }
-
- // If there's no fault file or the sensor has a fault file and
- // its status is functional, read the input value.
- if (!statusIface || (statusIface && statusIface->functional()))
- {
- // Retry for up to a second if device is busy
- // or has a transient error.
- val = ioAccess.read(
- sensor.first,
- sensor.second,
- hwmon::entry::cinput,
- std::get<size_t>(retryIO),
- std::get<std::chrono::milliseconds>(retryIO));
- val = adjustValue(sensor, val);
- }
-
- auto iface = std::make_shared<ValueObject>(bus, objPath.c_str(), deferSignals);
- iface->value(val);
-
- hwmon::Attributes attrs;
- if (hwmon::getAttributes(sensor.first, attrs))
- {
- iface->unit(hwmon::getUnit(attrs));
- iface->scale(hwmon::getScale(attrs));
- }
-
- auto maxValue = env::getEnv("MAXVALUE", sensor);
- if(!maxValue.empty())
- {
- iface->maxValue(std::stoll(maxValue));
- }
- auto minValue = env::getEnv("MINVALUE", sensor);
- if(!minValue.empty())
- {
- iface->minValue(std::stoll(minValue));
- }
-
- obj[InterfaceType::VALUE] = iface;
- return iface;
-}
-
std::string MainLoop::getID(SensorSet::container_t::const_reference sensor)
{
std::string id;
@@ -295,7 +163,7 @@
// Get list of return codes for removing sensors on device
auto devRmRCs = env::getEnv("REMOVERCS");
// Add sensor removal return codes defined at the device level
- addRemoveRCs(sensor.first, devRmRCs);
+ sensorObj->addRemoveRCs(devRmRCs);
std::string objectPath{_root};
objectPath.append(1, '/');
@@ -317,7 +185,7 @@
{
// Add status interface based on _fault file being present
sensorObj->addStatus(info);
- valueInterface = addValue(sensor.first, retryIO, ioAccess, info);
+ valueInterface = sensorObj->addValue(retryIO, info);
}
catch (const std::system_error& e)
{
@@ -566,7 +434,7 @@
hwmonio::retries,
hwmonio::delay);
- value = adjustValue(i.first, value);
+ value = sensorObjects[i.first]->adjustValue(value);
for (auto& iface : obj)
{