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