Add tach sensors to each fan enclosure

Create a tach sensor instance for each sensor listed within a fan
enclosure that uses 'tach' based presence detection. Each tach sensor
has a pointer to the fan it's associated with and is added to the list
of sensors for that fan enclosure.

Change-Id: I9a83ec52d1a5d01e39702e185336a09edeb4d158
Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
diff --git a/fan_enclosure.cpp b/fan_enclosure.cpp
index 346911d..46efeb5 100644
--- a/fan_enclosure.cpp
+++ b/fan_enclosure.cpp
@@ -13,6 +13,12 @@
     //TODO Add this fan to inventory
 }
 
+void FanEnclosure::addSensor(
+    std::unique_ptr<Sensor>&& sensor)
+{
+    FanEnclosure::sensors.push_back(std::move(sensor));
+}
+
 } // namespace presence
 } // namespace fan
 } // namespace phosphor
diff --git a/fan_enclosure.hpp b/fan_enclosure.hpp
index f214f18..0b96bfc 100644
--- a/fan_enclosure.hpp
+++ b/fan_enclosure.hpp
@@ -2,6 +2,7 @@
 
 #include <sdbusplus/bus.hpp>
 #include "fan_properties.hpp"
+#include "sensor_base.hpp"
 
 
 namespace phosphor
@@ -31,10 +32,14 @@
             addInventory();
         }
 
+        void addSensor(
+            std::unique_ptr<Sensor>&& sensor);
+
     private:
         sdbusplus::bus::bus& bus;
         const std::string invPath;
         const std::string fanDesc;
+        std::vector<std::unique_ptr<Sensor>> sensors;
 
         void addInventory();
 
diff --git a/sensor_base.hpp b/sensor_base.hpp
index 92f53a7..2dc2b8d 100644
--- a/sensor_base.hpp
+++ b/sensor_base.hpp
@@ -19,9 +19,19 @@
         Sensor& operator=(Sensor&&) = delete;
         virtual ~Sensor() = default;
 
+        Sensor(const std::string& id,
+               FanEnclosure& fanEnc) :
+            id(id),
+            fanEnc(fanEnc)
+        {
+            //Nothing to do here
+        }
+
         virtual bool isPresent() = 0;
 
     protected:
+        const std::string id;
+        FanEnclosure& fanEnc;
 
 };
 
diff --git a/tach_detect.cpp b/tach_detect.cpp
index e3d2389..5da1b48 100644
--- a/tach_detect.cpp
+++ b/tach_detect.cpp
@@ -2,6 +2,7 @@
 #include <sdbusplus/bus.hpp>
 #include "fan_enclosure.hpp"
 #include "fan_detect_defs.hpp"
+#include "tach_sensor.hpp"
 
 
 int main(void)
@@ -19,7 +20,14 @@
                 auto fan = std::make_unique<
                     phosphor::fan::presence::FanEnclosure>(bus,
                                                            fanProp);
-                // TODO Add sensors to fan object
+                for (auto const &fanSensor: std::get<2>(fanProp))
+                {
+                    auto sensor = std::make_unique<
+                        phosphor::fan::presence::TachSensor>(bus,
+                                                             fanSensor,
+                                                             *fan);
+                    fan->addSensor(std::move(sensor));
+                }
                 fans.push_back(std::move(fan));
             }
         }
diff --git a/tach_sensor.cpp b/tach_sensor.cpp
index 1325365..987e390 100644
--- a/tach_sensor.cpp
+++ b/tach_sensor.cpp
@@ -10,7 +10,7 @@
 
 bool TachSensor::isPresent()
 {
-    return false;
+    return (tach != 0);
 }
 
 } // namespace presence
diff --git a/tach_sensor.hpp b/tach_sensor.hpp
index 0ef2b0a..24ee453 100644
--- a/tach_sensor.hpp
+++ b/tach_sensor.hpp
@@ -1,5 +1,6 @@
 #pragma once
 
+#include <sdbusplus/bus.hpp>
 #include "sensor_base.hpp"
 
 
@@ -20,9 +21,19 @@
         TachSensor& operator=(TachSensor&&) = delete;
         ~TachSensor() = default;
 
+        TachSensor(sdbusplus::bus::bus& bus,
+                   const std::string& id,
+                   FanEnclosure& fanEnc) : Sensor(id, fanEnc),
+                       bus(bus)
+        {
+            // Nothing to do here
+        }
+
         bool isPresent();
 
     private:
+        sdbusplus::bus::bus& bus;
+        int64_t tach = 0;
 
 };