Fan control: Fill in Manager class

Create Zone objects for the fan zones defined in the
definition data that meet all conditions.

Change-Id: I9c29be93716cd137f1c714355a0bd2a1c93271cd
Signed-off-by: Matt Spinler <spinler@us.ibm.com>
diff --git a/control/manager.cpp b/control/manager.cpp
index 5fe0781..9359a6b 100644
--- a/control/manager.cpp
+++ b/control/manager.cpp
@@ -13,6 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+#include <algorithm>
 #include "manager.hpp"
 
 namespace phosphor
@@ -25,7 +26,40 @@
 Manager::Manager(sdbusplus::bus::bus& bus) :
     _bus(bus)
 {
-    //TODO
+    //Create the appropriate Zone objects based on the
+    //actual system configuration.
+
+    //Find the 1 ZoneGroup that meets all of its conditions
+    for (auto& group : _zoneLayouts)
+    {
+        auto& conditions = std::get<conditionListPos>(group);
+
+        if (std::all_of(conditions.begin(), conditions.end(),
+                        [](const auto& c)
+                        {
+                            //TODO: openbmc/openbmc#1500
+                            //Still need to actually evaluate the conditions
+                            return true;
+                        }))
+        {
+            //Create a Zone object for each zone in this group
+            auto& zones = std::get<zoneListPos>(group);
+
+            for (auto& z : zones)
+            {
+                _zones.emplace(std::get<zoneNumPos>(z),
+                               std::make_unique<Zone>(_bus, z));
+            }
+
+            break;
+        }
+    }
+
+    //Set to full since we don't know state of system yet.
+    for (auto& z: _zones)
+    {
+        z.second->setFullSpeed();
+    }
 }