1*8c99fcf5SAlexander Hansen #include "power_status_monitor.hpp" 2*8c99fcf5SAlexander Hansen 3*8c99fcf5SAlexander Hansen #include "utils.hpp" 4*8c99fcf5SAlexander Hansen 5*8c99fcf5SAlexander Hansen #include <boost/algorithm/string/predicate.hpp> 6*8c99fcf5SAlexander Hansen #include <sdbusplus/bus/match.hpp> 7*8c99fcf5SAlexander Hansen 8*8c99fcf5SAlexander Hansen namespace power 9*8c99fcf5SAlexander Hansen { 10*8c99fcf5SAlexander Hansen 11*8c99fcf5SAlexander Hansen const static constexpr char* busname = "xyz.openbmc_project.State.Host"; 12*8c99fcf5SAlexander Hansen const static constexpr char* interface = "xyz.openbmc_project.State.Host"; 13*8c99fcf5SAlexander Hansen const static constexpr char* path = "/xyz/openbmc_project/state/host0"; 14*8c99fcf5SAlexander Hansen const static constexpr char* property = "CurrentHostState"; 15*8c99fcf5SAlexander Hansen 16*8c99fcf5SAlexander Hansen bool PowerStatusMonitor::isPowerOn() 17*8c99fcf5SAlexander Hansen { 18*8c99fcf5SAlexander Hansen if (!powerMatch) 19*8c99fcf5SAlexander Hansen { 20*8c99fcf5SAlexander Hansen throw std::runtime_error("Power Match Not Created"); 21*8c99fcf5SAlexander Hansen } 22*8c99fcf5SAlexander Hansen return powerStatusOn; 23*8c99fcf5SAlexander Hansen } 24*8c99fcf5SAlexander Hansen 25*8c99fcf5SAlexander Hansen void PowerStatusMonitor::setupPowerMatch( 26*8c99fcf5SAlexander Hansen const std::shared_ptr<sdbusplus::asio::connection>& conn) 27*8c99fcf5SAlexander Hansen { 28*8c99fcf5SAlexander Hansen powerMatch = std::make_unique<sdbusplus::bus::match_t>( 29*8c99fcf5SAlexander Hansen static_cast<sdbusplus::bus_t&>(*conn), 30*8c99fcf5SAlexander Hansen "type='signal',interface='" + 31*8c99fcf5SAlexander Hansen std::string(em_utils::properties::interface) + "',path='" + 32*8c99fcf5SAlexander Hansen std::string(power::path) + "',arg0='" + 33*8c99fcf5SAlexander Hansen std::string(power::interface) + "'", 34*8c99fcf5SAlexander Hansen [this](sdbusplus::message_t& message) { 35*8c99fcf5SAlexander Hansen std::string objectName; 36*8c99fcf5SAlexander Hansen boost::container::flat_map<std::string, std::variant<std::string>> 37*8c99fcf5SAlexander Hansen values; 38*8c99fcf5SAlexander Hansen message.read(objectName, values); 39*8c99fcf5SAlexander Hansen auto findState = values.find(power::property); 40*8c99fcf5SAlexander Hansen if (findState != values.end()) 41*8c99fcf5SAlexander Hansen { 42*8c99fcf5SAlexander Hansen powerStatusOn = boost::ends_with( 43*8c99fcf5SAlexander Hansen std::get<std::string>(findState->second), "Running"); 44*8c99fcf5SAlexander Hansen } 45*8c99fcf5SAlexander Hansen }); 46*8c99fcf5SAlexander Hansen 47*8c99fcf5SAlexander Hansen conn->async_method_call( 48*8c99fcf5SAlexander Hansen [this](boost::system::error_code ec, 49*8c99fcf5SAlexander Hansen const std::variant<std::string>& state) { 50*8c99fcf5SAlexander Hansen if (ec) 51*8c99fcf5SAlexander Hansen { 52*8c99fcf5SAlexander Hansen return; 53*8c99fcf5SAlexander Hansen } 54*8c99fcf5SAlexander Hansen powerStatusOn = 55*8c99fcf5SAlexander Hansen boost::ends_with(std::get<std::string>(state), "Running"); 56*8c99fcf5SAlexander Hansen }, 57*8c99fcf5SAlexander Hansen power::busname, power::path, em_utils::properties::interface, 58*8c99fcf5SAlexander Hansen em_utils::properties::get, power::interface, power::property); 59*8c99fcf5SAlexander Hansen } 60*8c99fcf5SAlexander Hansen 61*8c99fcf5SAlexander Hansen } // namespace power 62