18c99fcf5SAlexander Hansen #include "power_status_monitor.hpp" 28c99fcf5SAlexander Hansen 3*0a4bb2a9SAlexander Hansen #include "phosphor-logging/lg2.hpp" 48c99fcf5SAlexander Hansen #include "utils.hpp" 58c99fcf5SAlexander Hansen 68c99fcf5SAlexander Hansen #include <sdbusplus/bus/match.hpp> 78c99fcf5SAlexander Hansen 8*0a4bb2a9SAlexander Hansen #include <flat_map> 9*0a4bb2a9SAlexander 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 188c99fcf5SAlexander Hansen bool PowerStatusMonitor::isPowerOn() 198c99fcf5SAlexander Hansen { 208c99fcf5SAlexander Hansen if (!powerMatch) 218c99fcf5SAlexander Hansen { 228c99fcf5SAlexander Hansen throw std::runtime_error("Power Match Not Created"); 238c99fcf5SAlexander Hansen } 248c99fcf5SAlexander Hansen return powerStatusOn; 258c99fcf5SAlexander Hansen } 268c99fcf5SAlexander Hansen 27*0a4bb2a9SAlexander Hansen void PowerStatusMonitor::handlePowerMatch(sdbusplus::message_t& message) 28*0a4bb2a9SAlexander Hansen { 29*0a4bb2a9SAlexander Hansen lg2::debug("power match triggered"); 30*0a4bb2a9SAlexander Hansen 31*0a4bb2a9SAlexander Hansen std::string objectName; 32*0a4bb2a9SAlexander Hansen std::flat_map<std::string, std::variant<std::string>> values; 33*0a4bb2a9SAlexander Hansen message.read(objectName, values); 34*0a4bb2a9SAlexander Hansen auto findState = values.find(power::property); 35*0a4bb2a9SAlexander Hansen if (findState != values.end()) 36*0a4bb2a9SAlexander Hansen { 37*0a4bb2a9SAlexander Hansen powerStatusOn = 38*0a4bb2a9SAlexander Hansen std::get<std::string>(findState->second).ends_with("Running"); 39*0a4bb2a9SAlexander Hansen } 40*0a4bb2a9SAlexander Hansen } 41*0a4bb2a9SAlexander Hansen 428c99fcf5SAlexander Hansen void PowerStatusMonitor::setupPowerMatch( 438c99fcf5SAlexander Hansen const std::shared_ptr<sdbusplus::asio::connection>& conn) 448c99fcf5SAlexander Hansen { 458c99fcf5SAlexander Hansen powerMatch = std::make_unique<sdbusplus::bus::match_t>( 468c99fcf5SAlexander Hansen static_cast<sdbusplus::bus_t&>(*conn), 478c99fcf5SAlexander Hansen "type='signal',interface='" + 488c99fcf5SAlexander Hansen std::string(em_utils::properties::interface) + "',path='" + 498c99fcf5SAlexander Hansen std::string(power::path) + "',arg0='" + 508c99fcf5SAlexander Hansen std::string(power::interface) + "'", 51*0a4bb2a9SAlexander Hansen std::bind_front(&PowerStatusMonitor::handlePowerMatch, this)); 528c99fcf5SAlexander Hansen 538c99fcf5SAlexander Hansen conn->async_method_call( 548c99fcf5SAlexander Hansen [this](boost::system::error_code ec, 558c99fcf5SAlexander Hansen const std::variant<std::string>& state) { 568c99fcf5SAlexander Hansen if (ec) 578c99fcf5SAlexander Hansen { 588c99fcf5SAlexander Hansen return; 598c99fcf5SAlexander Hansen } 60*0a4bb2a9SAlexander Hansen powerStatusOn = std::get<std::string>(state).ends_with("Running"); 618c99fcf5SAlexander Hansen }, 628c99fcf5SAlexander Hansen power::busname, power::path, em_utils::properties::interface, 638c99fcf5SAlexander Hansen em_utils::properties::get, power::interface, power::property); 648c99fcf5SAlexander Hansen } 658c99fcf5SAlexander Hansen 668c99fcf5SAlexander Hansen } // namespace power 67