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>
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 @@
     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