xref: /openbmc/entity-manager/src/entity_manager/power_status_monitor.cpp (revision e1646276a815471e4b3510825c21293095fc322f)
18c99fcf5SAlexander Hansen #include "power_status_monitor.hpp"
28c99fcf5SAlexander Hansen 
30a4bb2a9SAlexander Hansen #include "phosphor-logging/lg2.hpp"
48c99fcf5SAlexander Hansen #include "utils.hpp"
58c99fcf5SAlexander Hansen 
68c99fcf5SAlexander Hansen #include <sdbusplus/bus/match.hpp>
78c99fcf5SAlexander Hansen 
80a4bb2a9SAlexander Hansen #include <flat_map>
90a4bb2a9SAlexander Hansen 
108c99fcf5SAlexander Hansen namespace power
118c99fcf5SAlexander Hansen {
128c99fcf5SAlexander Hansen 
138c99fcf5SAlexander Hansen const static constexpr char* busname = "xyz.openbmc_project.State.Host";
148c99fcf5SAlexander Hansen const static constexpr char* interface = "xyz.openbmc_project.State.Host";
158c99fcf5SAlexander Hansen const static constexpr char* path = "/xyz/openbmc_project/state/host0";
168c99fcf5SAlexander Hansen const static constexpr char* property = "CurrentHostState";
178c99fcf5SAlexander Hansen 
PowerStatusMonitor(sdbusplus::asio::connection & conn)18*e1646276SAlexander Hansen PowerStatusMonitor::PowerStatusMonitor(sdbusplus::asio::connection& conn) :
19*e1646276SAlexander Hansen 
20*e1646276SAlexander Hansen     powerMatch(static_cast<sdbusplus::bus_t&>(conn),
21*e1646276SAlexander Hansen                "type='signal',interface='" +
22*e1646276SAlexander Hansen                    std::string(em_utils::properties::interface) + "',path='" +
23*e1646276SAlexander Hansen                    std::string(power::path) + "',arg0='" +
24*e1646276SAlexander Hansen                    std::string(power::interface) + "'",
25*e1646276SAlexander Hansen                std::bind_front(&PowerStatusMonitor::handlePowerMatch, this))
26*e1646276SAlexander Hansen 
278c99fcf5SAlexander Hansen {
28*e1646276SAlexander Hansen     getInitialPowerStatus(conn);
298c99fcf5SAlexander Hansen }
30*e1646276SAlexander Hansen 
isPowerOn() const31*e1646276SAlexander Hansen bool PowerStatusMonitor::isPowerOn() const
32*e1646276SAlexander Hansen {
338c99fcf5SAlexander Hansen     return powerStatusOn;
348c99fcf5SAlexander Hansen }
358c99fcf5SAlexander Hansen 
handlePowerMatch(sdbusplus::message_t & message)360a4bb2a9SAlexander Hansen void PowerStatusMonitor::handlePowerMatch(sdbusplus::message_t& message)
370a4bb2a9SAlexander Hansen {
380a4bb2a9SAlexander Hansen     lg2::debug("power match triggered");
390a4bb2a9SAlexander Hansen 
400a4bb2a9SAlexander Hansen     std::string objectName;
410a4bb2a9SAlexander Hansen     std::flat_map<std::string, std::variant<std::string>> values;
420a4bb2a9SAlexander Hansen     message.read(objectName, values);
430a4bb2a9SAlexander Hansen     auto findState = values.find(power::property);
440a4bb2a9SAlexander Hansen     if (findState != values.end())
450a4bb2a9SAlexander Hansen     {
460a4bb2a9SAlexander Hansen         powerStatusOn =
470a4bb2a9SAlexander Hansen             std::get<std::string>(findState->second).ends_with("Running");
480a4bb2a9SAlexander Hansen     }
490a4bb2a9SAlexander Hansen }
500a4bb2a9SAlexander Hansen 
getInitialPowerStatus(sdbusplus::asio::connection & conn)51*e1646276SAlexander Hansen void PowerStatusMonitor::getInitialPowerStatus(
52*e1646276SAlexander Hansen     sdbusplus::asio::connection& conn)
538c99fcf5SAlexander Hansen {
54*e1646276SAlexander Hansen     conn.async_method_call(
558c99fcf5SAlexander Hansen         [this](boost::system::error_code ec,
568c99fcf5SAlexander Hansen                const std::variant<std::string>& state) {
578c99fcf5SAlexander Hansen             if (ec)
588c99fcf5SAlexander Hansen             {
598c99fcf5SAlexander Hansen                 return;
608c99fcf5SAlexander Hansen             }
610a4bb2a9SAlexander Hansen             powerStatusOn = std::get<std::string>(state).ends_with("Running");
628c99fcf5SAlexander Hansen         },
638c99fcf5SAlexander Hansen         power::busname, power::path, em_utils::properties::interface,
648c99fcf5SAlexander Hansen         em_utils::properties::get, power::interface, power::property);
658c99fcf5SAlexander Hansen }
668c99fcf5SAlexander Hansen 
678c99fcf5SAlexander Hansen } // namespace power
68