Determine chassis power state on application startup

Change-Id: I406b2a6c7af1e4c26af0e43a432a130c967d84bc
Signed-off-by: Andrew Geissler <andrewg@us.ibm.com>
diff --git a/chassis_state_manager.cpp b/chassis_state_manager.cpp
index c146087..91a35d0 100644
--- a/chassis_state_manager.cpp
+++ b/chassis_state_manager.cpp
@@ -13,6 +13,41 @@
 
 using namespace phosphor::logging;
 
+// TODO - Will be rewritten once sdbusplus client bindings are in place
+//        and persistent storage design is in place and sdbusplus
+//        has read property function
+void Chassis::determineInitialState()
+{
+    sdbusplus::message::variant<int> pgood = -1;
+    auto method = this->bus.new_method_call("org.openbmc.control.Power",
+                                            "/org/openbmc/control/power0",
+                                            "org.freedesktop.DBus.Properties",
+                                            "Get");
+
+    method.append("org.openbmc.control.Power", "pgood");
+    auto reply = this->bus.call(method);
+    reply.read(pgood);
+
+    if(pgood == 1)
+    {
+        log<level::INFO>("Initial Chassis State will be On",
+                         entry("CHASSIS_CURRENT_POWER_STATE=%s",
+                               convertForMessage(PowerState::On).c_str()));
+        server::Chassis::currentPowerState(PowerState::On);
+        server::Chassis::requestedPowerTransition(Transition::On);
+    }
+    else
+    {
+        log<level::INFO>("Initial Chassis State will be Off",
+                         entry("CHASSIS_CURRENT_POWER_STATE=%s",
+                               convertForMessage(PowerState::Off).c_str()));
+        server::Chassis::currentPowerState(PowerState::Off);
+        server::Chassis::requestedPowerTransition(Transition::Off);
+    }
+
+    return;
+}
+
 Chassis::Transition Chassis::requestedPowerTransition(Transition value)
 {
 
diff --git a/chassis_state_manager.hpp b/chassis_state_manager.hpp
index f3df078..af3445d 100644
--- a/chassis_state_manager.hpp
+++ b/chassis_state_manager.hpp
@@ -21,8 +21,12 @@
     public:
         /** @brief Constructs Chassis State Manager
          *
+         * @note This constructor passes 'true' to the base class in order to
+         *       defer dbus object registration until we can run
+         *       determineInitialState() and set our properties
+         *
          * @param[in] bus       - The Dbus bus object
-         * @param[in] busName   - The Dbus name to own
+         * @param[in] instance  - The instance of this object
          * @param[in] objPath   - The Dbus object path
          */
         Chassis(sdbusplus::bus::bus& bus,
@@ -30,9 +34,17 @@
                 const char* objPath) :
                 sdbusplus::server::object::object<
                     sdbusplus::xyz::openbmc_project::State::server::Chassis>(
-                            bus, objPath),
+                            bus, objPath, true),
                 bus(bus)
-        {}
+        {
+            determineInitialState();
+
+            // We deferred this until we could get our property correct
+            this->emit_object_added();
+        }
+
+        /** @brief Determine initial chassis state and set internally */
+        void determineInitialState();
 
         /** @brief Set value of RequestedPowerTransition */
         Transition requestedPowerTransition(Transition value) override;