summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Barth <msbarth@us.ibm.com>2017-02-17 17:48:56 -0600
committerMatthew Barth <msbarth@us.ibm.com>2017-03-15 13:46:25 -0500
commitcd4f4d1a0a49f4ed43b3a773d2e2046cc15ef1d1 (patch)
tree968a6a326d2ccf4dac30deb5c786a2ae6833ba3b
parentd64038262e4c8743ae774efde7a8e91544ed359b (diff)
downloadphosphor-fan-presence-cd4f4d1a0a49f4ed43b3a773d2e2046cc15ef1d1.tar.gz
phosphor-fan-presence-cd4f4d1a0a49f4ed43b3a773d2e2046cc15ef1d1.zip
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 <msbarth@us.ibm.com>
-rw-r--r--fan_enclosure.cpp14
-rw-r--r--fan_enclosure.hpp1
-rw-r--r--tach_sensor.cpp36
-rw-r--r--tach_sensor.hpp32
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 <algorithm>
#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>&& 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>&& 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 <sdbusplus/exception.hpp>
#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<TachSensor*>(usrData)->handleTachChange(sdbpMsg, err);
+ return 0;
+}
+
+void TachSensor::handleTachChange(sdbusplus::message::message& sdbpMsg,
+ sd_bus_error* err)
+{
+ std::string msgSensor;
+ std::map<std::string, sdbusplus::message::variant<int64_t>> 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<int64_t>(
+ 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 <sdbusplus/bus.hpp>
+#include <sdbusplus/server.hpp>
#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
OpenPOWER on IntegriCloud