Add Timer support to TachSensor

Add a Timer object to the TachSensor class

Change-Id: I419b5712de9e8e94f2a08de84d13170e44c33c7a
Signed-off-by: Matt Spinler <spinler@us.ibm.com>
diff --git a/monitor/fan.cpp b/monitor/fan.cpp
index 852d2ba..7d657a0 100644
--- a/monitor/fan.cpp
+++ b/monitor/fan.cpp
@@ -44,10 +44,9 @@
                                          *this,
                                          std::get<sensorNameField>(s),
                                          std::get<hasTargetField>(s),
-                                         std::get<timeoutField>(def)));
-
+                                         std::get<timeoutField>(def),
+                                         events));
     }
-
 }
 
 
@@ -123,6 +122,16 @@
 }
 
 
+void Fan::timerExpired(TachSensor& sensor)
+{
+    sensor.setFunctional(false);
+
+    //If the fan is currently functional, but too many
+    //contained sensors are now nonfunctional, update
+    //the whole fan nonfunctional.
+    //TODO
+}
+
 }
 }
 }
diff --git a/monitor/fan.hpp b/monitor/fan.hpp
index d79ae31..9aeccd2 100644
--- a/monitor/fan.hpp
+++ b/monitor/fan.hpp
@@ -70,7 +70,7 @@
          * @brief Callback function for when an input sensor changes
          *
          * Starts a timer, where if it expires then the sensor
-         * was slow for too long and can be considered not functional.
+         * was out of range for too long and can be considered not functional.
          */
         void tachChanged(TachSensor& sensor);
 
@@ -79,6 +79,18 @@
          */
         void tachChanged();
 
+        /**
+         * @brief The callback function for the timer
+         *
+         * Sets the sensor to not functional.
+         * If enough sensors are now not functional,
+         * updates the functional status of the whole
+         * fan in the inventory.
+         *
+         * @param[in] sensor - the sensor whose timer expired
+         */
+        void timerExpired(TachSensor& sensor);
+
     private:
 
         /**
diff --git a/monitor/tach_sensor.cpp b/monitor/tach_sensor.cpp
index c991bb6..806eed7 100644
--- a/monitor/tach_sensor.cpp
+++ b/monitor/tach_sensor.cpp
@@ -84,13 +84,14 @@
                        Fan& fan,
                        const std::string& id,
                        bool hasTarget,
-                       size_t timeout) :
-
+                       size_t timeout,
+                       std::shared_ptr<sd_event>& events) :
     _bus(bus),
     _fan(fan),
     _name(FAN_SENSOR_PATH + id),
     _hasTarget(hasTarget),
-    _timeout(timeout)
+    _timeout(timeout),
+    _timer(events, [this, &fan](){ fan.timerExpired(*this); })
 {
     auto service = getService();
 
@@ -232,6 +233,14 @@
 }
 
 
+std::chrono::microseconds TachSensor::getTimeout()
+{
+    using namespace std::chrono;
+
+    return duration_cast<microseconds>(seconds(_timeout));
+}
+
+
 }
 }
 }
diff --git a/monitor/tach_sensor.hpp b/monitor/tach_sensor.hpp
index 003763c..7a65b64 100644
--- a/monitor/tach_sensor.hpp
+++ b/monitor/tach_sensor.hpp
@@ -3,6 +3,7 @@
 #include <chrono>
 #include <sdbusplus/bus.hpp>
 #include <sdbusplus/server.hpp>
+#include "timer.hpp"
 
 namespace phosphor
 {
@@ -46,12 +47,14 @@
          * @param[in] hasTarget - if the sensor supports
          *                        setting the speed
          * @param[in] timeout - Normal timeout value to use
+         * @param[in] events - sd_event pointer
          */
         TachSensor(sdbusplus::bus::bus& bus,
                    Fan& fan,
                    const std::string& id,
                    bool hasTarget,
-                   size_t timeout);
+                   size_t timeout,
+                   std::shared_ptr<sd_event>& events);
 
         /**
          * @brief Returns the target speed value
@@ -94,6 +97,19 @@
             _functional = functional;
         }
 
+        /**
+         * Returns the timer object for this sensor
+         */
+        inline phosphor::fan::util::Timer& getTimer()
+        {
+            return _timer;
+        }
+
+        /**
+         * @brief Returns the timeout value to use for the sensor
+         */
+        std::chrono::microseconds getTimeout();
+
     private:
 
         /**
@@ -197,6 +213,11 @@
         const size_t _timeout;
 
         /**
+         * The timer object
+         */
+        phosphor::fan::util::Timer _timer;
+
+        /**
          * @brief The match object for the Value properties changed signal
          */
         std::unique_ptr<sdbusplus::server::match::match> tachSignal;