#include "power_status_monitor.hpp" #include "phosphor-logging/lg2.hpp" #include "utils.hpp" #include #include namespace power { const static constexpr char* busname = "xyz.openbmc_project.State.Host"; const static constexpr char* interface = "xyz.openbmc_project.State.Host"; const static constexpr char* path = "/xyz/openbmc_project/state/host0"; const static constexpr char* property = "CurrentHostState"; PowerStatusMonitor::PowerStatusMonitor(sdbusplus::asio::connection& conn) : powerMatch(static_cast(conn), "type='signal',interface='" + std::string(em_utils::properties::interface) + "',path='" + std::string(power::path) + "',arg0='" + std::string(power::interface) + "'", std::bind_front(&PowerStatusMonitor::handlePowerMatch, this)) { getInitialPowerStatus(conn); } bool PowerStatusMonitor::isPowerOn() const { return powerStatusOn; } void PowerStatusMonitor::handlePowerMatch(sdbusplus::message_t& message) { lg2::debug("power match triggered"); std::string objectName; std::flat_map> values; message.read(objectName, values); auto findState = values.find(power::property); if (findState != values.end()) { powerStatusOn = std::get(findState->second).ends_with("Running"); } } void PowerStatusMonitor::getInitialPowerStatus( sdbusplus::asio::connection& conn) { conn.async_method_call( [this](boost::system::error_code ec, const std::variant& state) { if (ec) { return; } powerStatusOn = std::get(state).ends_with("Running"); }, power::busname, power::path, em_utils::properties::interface, em_utils::properties::get, power::interface, power::property); } } // namespace power