summaryrefslogtreecommitdiffstats
path: root/presence/tach_sensor.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'presence/tach_sensor.hpp')
-rw-r--r--presence/tach_sensor.hpp107
1 files changed, 107 insertions, 0 deletions
diff --git a/presence/tach_sensor.hpp b/presence/tach_sensor.hpp
new file mode 100644
index 0000000..90d955b
--- /dev/null
+++ b/presence/tach_sensor.hpp
@@ -0,0 +1,107 @@
+#pragma once
+
+#include <sdbusplus/bus.hpp>
+#include <sdbusplus/server.hpp>
+#include "sensor_base.hpp"
+
+
+namespace phosphor
+{
+namespace fan
+{
+namespace presence
+{
+
+/**
+ * @class TachSensor
+ * @brief OpenBMC Tach feedback sensor presence implementation
+ * @details Derived sensor type that uses the tach feedback value to determine
+ * the presence of the fan enclosure that contains this sensor
+ */
+class TachSensor : public Sensor
+{
+ public:
+ TachSensor() = delete;
+ TachSensor(const TachSensor&) = delete;
+ TachSensor(TachSensor&&) = delete;
+ TachSensor& operator=(const TachSensor&) = delete;
+ TachSensor& operator=(TachSensor&&) = delete;
+ ~TachSensor() = default;
+
+ /**
+ * @brief Constructs Tach Sensor Object
+ *
+ * @param[in] bus - Dbus bus object
+ * @param[in] id - ID name of this sensor
+ * @param[in] fanEnc - Reference to the fan enclosure with this sensor
+ */
+ 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
+ }
+
+ /**
+ * @brief Determine the presence of this sensor using the tach feedback
+ *
+ * @return Presence state based on tach feedback
+ */
+ bool isPresent();
+
+ private:
+ /** @brief Connection for sdbusplus bus */
+ sdbusplus::bus::bus& bus;
+ /** @brief Used to subscribe to dbus signals */
+ sdbusplus::server::match::match tachSignal;
+ /** @brief Tach speed value given from the signal */
+ int64_t tach = 0;
+
+ /**
+ * @brief Appends the fan sensor id to construct a match string
+ *
+ * @param[in] id - Fan sensor id
+ *
+ * @return Match string to register signal for the fan sensor id
+ */
+ static std::string match(const std::string& id)
+ {
+ return std::string("type='signal',"
+ "interface='org.freedesktop.DBus.Properties',"
+ "member='PropertiesChanged',"
+ "path='/xyz/openbmc_project/sensors/fan_tach/" +
+ id + "'");
+ }
+ /**
+ * @brief Callback function on tach change signals
+ *
+ * @param[out] msg - Data associated with the subscribed signal
+ * @param[out] data - Pointer to this tach sensor object instance
+ * @param[out] err - Contains any sdbus error reference if occurred
+ *
+ * @return 0
+ */
+ static int handleTachChangeSignal(sd_bus_message* msg,
+ void* data,
+ sd_bus_error* err);
+ /**
+ * @brief Determine & handle when the signal was a tach change
+ *
+ * @param[in] msg - Expanded sdbusplus message data
+ * @param[in] err - Contains any sdbus error reference if occurred
+ */
+ void handleTachChange(sdbusplus::message::message& msg,
+ sd_bus_error* err);
+
+};
+
+} // namespace presence
+} // namespace fan
+} // namespace phosphor
OpenPOWER on IntegriCloud