diff options
Diffstat (limited to 'chassis_state_manager.cpp')
-rw-r--r-- | chassis_state_manager.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/chassis_state_manager.cpp b/chassis_state_manager.cpp index a2b6dbf..fb0c2a3 100644 --- a/chassis_state_manager.cpp +++ b/chassis_state_manager.cpp @@ -13,6 +13,17 @@ namespace server = sdbusplus::xyz::openbmc_project::State::server; using namespace phosphor::logging; +/* Map a transition to it's systemd target */ +const std::map<server::Chassis::Transition,std::string> SYSTEMD_TARGET_TABLE = +{ + {server::Chassis::Transition::Off, "obmc-power-chassis-off@0.target"}, + {server::Chassis::Transition::On, "obmc-power-chassis-on@0.target"} +}; + +constexpr auto SYSTEMD_SERVICE = "org.freedesktop.systemd1"; +constexpr auto SYSTEMD_OBJ_PATH = "/org/freedesktop/systemd1"; +constexpr auto SYSTEMD_INTERFACE = "org.freedesktop.systemd1.Manager"; + /* TODO:Issue 774 - Use systemd target signals to control chassis state */ int Chassis::handlePgoodOn(sd_bus_message* /*msg*/, void* usrData, sd_bus_error* retError) @@ -73,12 +84,30 @@ void Chassis::determineInitialState() return; } +void Chassis::executeTransition(Transition tranReq) +{ + auto sysdTarget = SYSTEMD_TARGET_TABLE.find(tranReq)->second; + + auto method = this->bus.new_method_call(SYSTEMD_SERVICE, + SYSTEMD_OBJ_PATH, + SYSTEMD_INTERFACE, + "StartUnit"); + + method.append(sysdTarget); + method.append("replace"); + + this->bus.call_noreply(method); + + return; +} + Chassis::Transition Chassis::requestedPowerTransition(Transition value) { log<level::INFO>("Change to Chassis Requested Power State", entry("CHASSIS_REQUESTED_POWER_STATE=%s", convertForMessage(value).c_str())); + executeTransition(value); return server::Chassis::requestedPowerTransition(value); } |