From c049cf37710acb91b0361267048f8a71600677c1 Mon Sep 17 00:00:00 2001 From: wangjue Date: Thu, 24 Oct 2024 16:40:34 +0800 Subject: [PATCH] Add dimmLEDInterface and dimmLEDState property Signed-off-by: wangjue --- src/DIMMTempSensor.cpp | 51 ++++++++++++++++++++++++++++++++------ src/DIMMTempSensor.hpp | 7 ++++-- src/DIMMTempSensorMain.cpp | 1 + src/sensor.hpp | 1 + 4 files changed, 51 insertions(+), 9 deletions(-) diff --git a/src/DIMMTempSensor.cpp b/src/DIMMTempSensor.cpp index 6fba752..94843d2 100644 --- a/src/DIMMTempSensor.cpp +++ b/src/DIMMTempSensor.cpp @@ -60,7 +60,7 @@ DIMMTempSensor::DIMMTempSensor( std::move(thresholdData), sensorConfiguration, "", false, false, maxReading, minReading, conn, readState), sensorPollMs(static_cast(pollRate * 1000)), peciBus(peciBus), - peciAddr(peciAddr), dimmRank(rank), calibOffset(calibOffset), + peciAddr(peciAddr), dimmRank(rank), calibOffset(calibOffset), dimmLEDState("OFF"), objectServer(objectServer), waitTimer(io) { std::string interfacePath = "/xyz/openbmc_project/sensors/" + sensorType + @@ -69,6 +69,16 @@ DIMMTempSensor::DIMMTempSensor( sensorInterface = objectServer.add_interface( interfacePath, "xyz.openbmc_project.Sensor.Value"); + dimmLEDInterface = objectServer.add_interface( + interfacePath, "xyz.openbmc_project.Sensor.dimmLED"); + + dimmLEDInterface->register_property( + "LEDState", dimmLEDState, [this](const std::string& newValue, std::string& oldValue) { + oldValue = newValue; return true; + }); + + dimmLEDInterface->initialize(); + for (const auto& threshold : thresholds) { std::string interface = thresholds::getInterface(threshold.level); @@ -95,7 +105,7 @@ DIMMTempSensor::~DIMMTempSensor() objectServer.remove_interface(association); } -void DIMMTempSensor::init(void) +void DIMMTempSensor::init() { read(); } @@ -124,7 +134,7 @@ int DIMMTempSensor::getDIMMRegsTemp(double* ps64data) { std::cerr << "unable to open " << peciDevPath << " " << std::strerror(errno) << "\n"; - return -1; + goto err; } if (peci_Ping(peciAddr) == PECI_CC_SUCCESS) @@ -137,20 +147,25 @@ int DIMMTempSensor::getDIMMRegsTemp(double* ps64data) &cc) != PECI_CC_SUCCESS) { std::cerr << "PECI RdPkgConfig returns failure" << "\n"; - return -1; + goto err; } *ps64data = (double)pkgConfig[0]; } else { std::cerr << "PECI Ping returns failure" << "\n"; - return -1; + goto err; } + peci_Unlock(peciFd); return 0; + +err: + peci_Unlock(peciFd); + return -1; } -void DIMMTempSensor::read(void) +void DIMMTempSensor::read() { waitTimer.expires_after(std::chrono::milliseconds(sensorPollMs)); waitTimer.async_wait([this](const boost::system::error_code& ec) { @@ -177,18 +192,40 @@ void DIMMTempSensor::read(void) << temp << "\n"; } v += calibOffset; + + + updateDIMMLedState(dimmLEDInterface, dimmLEDState, "ON", "LEDState"); updateValue(v); } else { - std::cerr << "Invalid read getDIMMRegsInfoWord.\n"; + std::cerr << "Fail to read DIMM tempture.\n"; + updateDIMMLedState(dimmLEDInterface, dimmLEDState, "OFF", "LEDState"); incrementError(); } } else { updateValue(std::numeric_limits::quiet_NaN()); + updateDIMMLedState(dimmLEDInterface, dimmLEDState, "OFF", "LEDState"); } read(); }); } + +void DIMMTempSensor::updateDIMMLedState(std::shared_ptr& interface, + std::string& oldState, const std::string& newState, const char* dbusPropertyName) +{ + if(oldState == newState) + return; + oldState = newState; + + if (interface && + !(interface->set_property(dbusPropertyName, newState))) + { + std::cerr << "error setting property " << dbusPropertyName + << " to " << newState << "\n"; + } + + return; +} diff --git a/src/DIMMTempSensor.hpp b/src/DIMMTempSensor.hpp index dd52053..9aea017 100644 --- a/src/DIMMTempSensor.hpp +++ b/src/DIMMTempSensor.hpp @@ -24,8 +24,8 @@ struct DIMMTempSensor : public Sensor ~DIMMTempSensor() override; void checkThresholds(void) override; - void read(void); - void init(void); + void read(); + void init(); unsigned int sensorPollMs; @@ -33,10 +33,13 @@ struct DIMMTempSensor : public Sensor uint8_t peciAddr; uint8_t dimmRank; double calibOffset; + std::string dimmLEDState; private: int getDIMMRegsInfoWord(double* ps64data); int getDIMMRegsTemp(double* ps64data); + void updateDIMMLedState(std::shared_ptr& interface, + std::string& oldState, const std::string& newState, const char* dbusPropertyName); // int getDIMMRegsPower(double* ps64data); sdbusplus::asio::object_server& objectServer; boost::asio::steady_timer waitTimer; diff --git a/src/DIMMTempSensorMain.cpp b/src/DIMMTempSensorMain.cpp index 042659f..5c3573c 100644 --- a/src/DIMMTempSensorMain.cpp +++ b/src/DIMMTempSensorMain.cpp @@ -87,6 +87,7 @@ void createSensors( uint8_t peciBus = loadVariant(entry.second, "Bus"); uint8_t peciAddr = loadVariant(entry.second, "Address"); uint8_t dimmRank = loadVariant(entry.second, "Rank"); + //std::string LEDState = loadVariant(entry.second, "LEDState"); /* calibration offset */ auto findCalibOffset = entry.second.find("Offset"); diff --git a/src/sensor.hpp b/src/sensor.hpp index e48036a..2c46771 100644 --- a/src/sensor.hpp +++ b/src/sensor.hpp @@ -97,6 +97,7 @@ struct Sensor std::shared_ptr availableInterface; std::shared_ptr operationalInterface; std::shared_ptr valueMutabilityInterface; + std::shared_ptr dimmLEDInterface; double value = std::numeric_limits::quiet_NaN(); double rawValue = std::numeric_limits::quiet_NaN(); bool overriddenState = false; -- 2.34.1