From cd4f4d1a0a49f4ed43b3a773d2e2046cc15ef1d1 Mon Sep 17 00:00:00 2001 From: Matthew Barth Date: Fri, 17 Feb 2017 17:48:56 -0600 Subject: Enable tach signal handler Register and handle tach change signals for each tach sensor. Inventory would be updated when all tach sensors for a specific fan enclosure have a tach value of zero. Change-Id: Idd3f53c29c68c6171d858e616fbfe868f30a4ea9 Signed-off-by: Matthew Barth --- fan_enclosure.cpp | 14 ++++++++++++++ fan_enclosure.hpp | 1 + tach_sensor.cpp | 36 ++++++++++++++++++++++++++++++++++++ tach_sensor.hpp | 32 ++++++++++++++++++++++++++++---- 4 files changed, 79 insertions(+), 4 deletions(-) diff --git a/fan_enclosure.cpp b/fan_enclosure.cpp index 46efeb5..b02d6e1 100644 --- a/fan_enclosure.cpp +++ b/fan_enclosure.cpp @@ -1,3 +1,4 @@ +#include #include "fan_enclosure.hpp" @@ -13,6 +14,19 @@ void FanEnclosure::addInventory() //TODO Add this fan to inventory } +void FanEnclosure::updInventory() +{ + auto presPred = [](auto const& s) {return s->isPresent();}; + // Determine if all sensors show fan is not present + auto isPresent = std::any_of(FanEnclosure::sensors.begin(), + FanEnclosure::sensors.end(), + presPred); + if (!isPresent) + { + //TODO Update inventory for this fan + } +} + void FanEnclosure::addSensor( std::unique_ptr&& sensor) { diff --git a/fan_enclosure.hpp b/fan_enclosure.hpp index 0b96bfc..5c6a040 100644 --- a/fan_enclosure.hpp +++ b/fan_enclosure.hpp @@ -32,6 +32,7 @@ class FanEnclosure addInventory(); } + void updInventory(); void addSensor( std::unique_ptr&& sensor); diff --git a/tach_sensor.cpp b/tach_sensor.cpp index 987e390..91e249d 100644 --- a/tach_sensor.cpp +++ b/tach_sensor.cpp @@ -1,4 +1,6 @@ +#include #include "tach_sensor.hpp" +#include "fan_enclosure.hpp" namespace phosphor @@ -13,6 +15,40 @@ bool TachSensor::isPresent() return (tach != 0); } +// Tach signal callback handler +int TachSensor::handleTachChangeSignal(sd_bus_message* msg, + void* usrData, + sd_bus_error* err) +{ + auto sdbpMsg = sdbusplus::message::message(msg); + static_cast(usrData)->handleTachChange(sdbpMsg, err); + return 0; +} + +void TachSensor::handleTachChange(sdbusplus::message::message& sdbpMsg, + sd_bus_error* err) +{ + std::string msgSensor; + std::map> msgData; + sdbpMsg.read(msgSensor, msgData); + + // TODO openbmc/phosphor-fan-presence#5 + // Update to use 'arg0namespace' match option to reduce dbus traffic + // Find interface with value property + if (msgSensor.compare("xyz.openbmc_project.Sensor.Value") == 0) + { + // Find the 'Value' property containing tach + auto valPropMap = msgData.find("Value"); + if (valPropMap != msgData.end()) + { + tach = sdbusplus::message::variant_ns::get( + valPropMap->second); + } + } + // Update inventory according to latest tach reported + fanEnc.updInventory(); +} + } // namespace presence } // namespace fan } // namespace phosphor diff --git a/tach_sensor.hpp b/tach_sensor.hpp index 24ee453..b9ac9b3 100644 --- a/tach_sensor.hpp +++ b/tach_sensor.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include "sensor_base.hpp" @@ -21,10 +22,16 @@ class TachSensor : public Sensor TachSensor& operator=(TachSensor&&) = delete; ~TachSensor() = default; - TachSensor(sdbusplus::bus::bus& bus, - const std::string& id, - FanEnclosure& fanEnc) : Sensor(id, fanEnc), - bus(bus) + TachSensor( + sdbusplus::bus::bus& bus, + const std::string& id, + FanEnclosure& fanEnc) : + Sensor(id, fanEnc), + bus(bus), + tachSignal(bus, + match(id).c_str(), + handleTachChangeSignal, + this) { // Nothing to do here } @@ -33,8 +40,25 @@ class TachSensor : public Sensor private: sdbusplus::bus::bus& bus; + sdbusplus::server::match::match tachSignal; int64_t tach = 0; + static std::string match(std::string id) + { + return std::string("type='signal'," + "interface='org.freedesktop.DBus.Properties'," + "member='PropertiesChanged'," + "path='/xyz/openbmc_project/sensors/fan_tach/" + + id + "'"); + } + // Tach signal callback handler + static int handleTachChangeSignal(sd_bus_message* msg, + void* data, + sd_bus_error* err); + + void handleTachChange(sdbusplus::message::message& msg, + sd_bus_error* err); + }; } // namespace presence -- cgit v1.2.1