xref: /openbmc/entity-manager/src/entity_manager/power_status_monitor.cpp (revision 0a4bb2a943bf277a0f2a0559abbed244da2aec88)
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