diff options
author | Kuiying Wang <kuiying.wang@intel.com> | 2018-04-26 12:25:02 +0300 |
---|---|---|
committer | Kuiying Wang <kuiying.wang@intel.com> | 2018-05-08 10:00:01 +0300 |
commit | 6e3397eabf33e3a4374310fbf3982dc564038bac (patch) | |
tree | b3c3e9e208aa338810ea27affd608bf0ed194766 /services | |
parent | 169ee6e388997bdaf0dd569159083ed082aaab16 (diff) | |
download | provingground-6e3397eabf33e3a4374310fbf3982dc564038bac.tar.xz |
[ChassisPowerControl] chassis hard power off
Change-Id: I480c0938b95539a72289967d582db7aa8f855c1d
Signed-off-by: Kuiying Wang <kuiying.wang@intel.com>
Diffstat (limited to 'services')
-rw-r--r-- | services/chassis/ChassisControl/inc/ChassisControl.hpp | 67 | ||||
-rw-r--r-- | services/chassis/ChassisControl/src/ChassisControl.cpp | 143 | ||||
-rw-r--r-- | services/chassis/ChassisControl/src/main.cpp | 89 |
3 files changed, 157 insertions, 142 deletions
diff --git a/services/chassis/ChassisControl/inc/ChassisControl.hpp b/services/chassis/ChassisControl/inc/ChassisControl.hpp index 982b72f..7f6ab8f 100644 --- a/services/chassis/ChassisControl/inc/ChassisControl.hpp +++ b/services/chassis/ChassisControl/inc/ChassisControl.hpp @@ -1,46 +1,53 @@ #pragma once #include "xyz/openbmc_project/Chassis/Control/Chassis/error.hpp" #include "xyz/openbmc_project/Chassis/Control/Chassis/server.hpp" +#include <phosphor-logging/log.hpp> +#include <systemd/sd-event.h> + +constexpr auto POWER_BUTTON_PATH = + "/xyz/openbmc_project/Chassis/Buttons/Power0"; +constexpr auto POWER_BUTTON_INTF = "xyz.openbmc_project.Chassis.Buttons.Power"; const static int32_t POWER_OFF = 0; const static int32_t POWER_ON = 1; +namespace sdbusRule = sdbusplus::bus::match::rules; -struct EventDeleter -{ - void operator()(sd_event *event) const - { - event = sd_event_unref(event); - } +struct EventDeleter { + void operator()(sd_event *event) const { event = sd_event_unref(event); } }; using EventPtr = std::unique_ptr<sd_event, EventDeleter>; struct ChassisControl : sdbusplus::server::object_t< - sdbusplus::xyz::openbmc_project::Chassis::Control::server::Chassis> -{ - ChassisControl(sdbusplus::bus::bus& bus, const char* path, EventPtr &event) - : sdbusplus::server::object_t< + sdbusplus::xyz::openbmc_project::Chassis::Control::server::Chassis> { + ChassisControl(sdbusplus::bus::bus &bus, const char *path, EventPtr &event) + : sdbusplus::server::object_t< sdbusplus::xyz::openbmc_project::Chassis::Control::server::Chassis>( bus, path), - mBus(bus), - mState(POWER_OFF) - { - phosphor::logging::log<phosphor::logging::level::DEBUG>("ChassisControl is created."); - } - - int32_t powerOn() override; - int32_t powerOff() override; - int32_t softPowerOff() override; - int32_t reboot() override; - int32_t softReboot() override; - int32_t quiesce() override; - int32_t getPowerState() override; - - - - private: - sdbusplus::bus::bus& mBus; - int32_t mState; + mBus(bus), + powerButtonPressedSignal( + bus, + sdbusRule::type::signal() + sdbusRule::member("Pressed") + + sdbusRule::path(POWER_BUTTON_PATH) + + sdbusRule::interface(POWER_BUTTON_INTF), + std::bind(std::mem_fn(&ChassisControl::powerButtonPressed), this, + std::placeholders::_1)) { + phosphor::logging::log<phosphor::logging::level::DEBUG>( + "ChassisControl is created."); + } + + int32_t powerOn() override; + int32_t powerOff() override; + int32_t softPowerOff() override; + int32_t reboot() override; + int32_t softReboot() override; + int32_t quiesce() override; + int32_t getPowerState() override; + +private: + sdbusplus::bus::bus &mBus; + + sdbusplus::bus::match_t powerButtonPressedSignal; + void powerButtonPressed(sdbusplus::message::message &m); }; - diff --git a/services/chassis/ChassisControl/src/ChassisControl.cpp b/services/chassis/ChassisControl/src/ChassisControl.cpp index 7dbdb4a..7e48106 100644 --- a/services/chassis/ChassisControl/src/ChassisControl.cpp +++ b/services/chassis/ChassisControl/src/ChassisControl.cpp @@ -13,78 +13,101 @@ // See the License for the specific language governing permissions and // limitations under the License. */ -#include <phosphor-logging/elog-errors.hpp> -#include <phosphor-logging/elog.hpp> -#include <phosphor-logging/log.hpp> -#include <xyz/openbmc_project/Common/error.hpp> -#include <chrono> + #include "ChassisControl.hpp" +#include <chrono> +#include <xyz/openbmc_project/Common/error.hpp> -constexpr auto SYSTEMD_SERVICE = "org.freedesktop.systemd1"; -constexpr auto SYSTEMD_OBJ_PATH = "/org/freedesktop/systemd1"; +constexpr auto SYSTEMD_SERVICE = "org.freedesktop.systemd1"; +constexpr auto SYSTEMD_OBJ_PATH = "/org/freedesktop/systemd1"; constexpr auto SYSTEMD_INTERFACE = "org.freedesktop.systemd1.Manager"; -constexpr auto HOST_START_TARGET = "obmc-intel-host-start@.target"; +constexpr auto HOST_START_TARGET = "obmc-host-start@0.target"; +constexpr auto CHASSIS_HARD_POWER_OFF_TARGET = + "obmc-chassis-hard-poweroff@0.target"; +constexpr auto CHASSIS_POWER_OFF_TARGET = "obmc-chassis-poweroff@0.target"; -constexpr auto POWER_CONTROL_SERVICE = "xyz.openbmc_project.Chassis.Control.Power"; -constexpr auto POWER_CONTROL_OBJ_PATH = "/xyz/openbmc_project/Chassis/Control/Power"; -constexpr auto POWER_CONTROL_INTERFACE = "xyz.openbmc_project.Chassis.Control.Power"; +constexpr auto POWER_CONTROL_SERVICE = + "xyz.openbmc_project.Chassis.Control.Power"; +constexpr auto POWER_CONTROL_OBJ_PATH = + "/xyz/openbmc_project/Chassis/Control/Power0"; +constexpr auto POWER_CONTROL_INTERFACE = + "xyz.openbmc_project.Chassis.Control.Power"; -int32_t ChassisControl::powerOn() -{ - auto method = mBus.new_method_call(SYSTEMD_SERVICE, - SYSTEMD_OBJ_PATH, - SYSTEMD_INTERFACE, - "StartUnit"); - method.append(HOST_START_TARGET); - method.append("replace"); - auto response = mBus.call(method); - if (response.is_method_error()) - { - phosphor::logging::log<phosphor::logging::level::ERR> - ("ERROR: Failed to run host start target"); - return -1; - } +int32_t ChassisControl::powerOn() { + auto method = mBus.new_method_call(SYSTEMD_SERVICE, SYSTEMD_OBJ_PATH, + SYSTEMD_INTERFACE, "StartUnit"); + method.append(HOST_START_TARGET); + method.append("replace"); + auto response = mBus.call(method); + if (response.is_method_error()) { + phosphor::logging::log<phosphor::logging::level::ERR>( + "ERROR: Failed to run host start target"); + return -1; + } - return 0; + return 0; } -int32_t ChassisControl::powerOff() -{ - //TODO - return 0; +int32_t ChassisControl::powerOff() { + auto method = mBus.new_method_call(SYSTEMD_SERVICE, SYSTEMD_OBJ_PATH, + SYSTEMD_INTERFACE, "StartUnit"); + method.append(CHASSIS_POWER_OFF_TARGET); + method.append("replace"); + auto response = mBus.call(method); + if (response.is_method_error()) { + phosphor::logging::log<phosphor::logging::level::ERR>( + "ERROR: Failed to run chassis hard power off target"); + return -1; + } + + return 0; } -int32_t ChassisControl::softPowerOff() -{ - //TODO - return 0; +int32_t ChassisControl::softPowerOff() { + // TODO + return 0; +} +int32_t ChassisControl::reboot() { + // TODO + return 0; } -int32_t ChassisControl::reboot() -{ - //TODO - return 0; +int32_t ChassisControl::softReboot() { + // TODO + return 0; } -int32_t ChassisControl::softReboot() -{ - //TODO - return 0; +int32_t ChassisControl::quiesce() { + // TODO + return 0; } -int32_t ChassisControl::quiesce() -{ - //TODO - return 0; +int32_t ChassisControl::getPowerState() { + int32_t state = 0; + auto method = + mBus.new_method_call(POWER_CONTROL_SERVICE, POWER_CONTROL_OBJ_PATH, + POWER_CONTROL_INTERFACE, "getPowerState"); + auto result = mBus.call(method); + if (result.is_method_error()) { + phosphor::logging::log<phosphor::logging::level::ERR>( + "ERROR: Failed to call power control method getPowerState"); + return -1; + } + result.read(state); + + return state; } -int32_t ChassisControl::getPowerState() -{ - auto method = mBus.new_method_call(POWER_CONTROL_SERVICE, POWER_CONTROL_OBJ_PATH, - POWER_CONTROL_INTERFACE, "getPowerState"); - auto result = mBus.call(method); - if (result.is_method_error()) - { - phosphor::logging::log<phosphor::logging::level::ERR> - ("ERROR: Failed to call power control method getPowerState"); - return -1; - } - result.read(mState); - return mState; +void ChassisControl::powerButtonPressed(sdbusplus::message::message &msg) { + + phosphor::logging::log<phosphor::logging::level::INFO>( + "powerButtonPressed callback function is called..."); + int32_t state = -1; + state = getPowerState(); + if (POWER_ON == state) { + powerOff(); + } else if (POWER_OFF == state) { + powerOn(); + } else { + phosphor::logging::log<phosphor::logging::level::ERR>( + "UNKNOWN power state"); + } + + return; } diff --git a/services/chassis/ChassisControl/src/main.cpp b/services/chassis/ChassisControl/src/main.cpp index d426c36..a174dc4 100644 --- a/services/chassis/ChassisControl/src/main.cpp +++ b/services/chassis/ChassisControl/src/main.cpp @@ -13,67 +13,52 @@ // See the License for the specific language governing permissions and // limitations under the License. */ -#include <chrono> -#include <experimental/filesystem> -#include <fcntl.h> -#include <fstream> -#include <iostream> -#include <phosphor-logging/elog-errors.hpp> -#include <phosphor-logging/elog.hpp> -#include <phosphor-logging/log.hpp> -#include <sys/stat.h> -#include <sys/types.h> -#include <systemd/sd-event.h> + +#include "ChassisControl.hpp" #include <unistd.h> #include <xyz/openbmc_project/Common/error.hpp> -#include "ChassisControl.hpp" -int main(int argc, char *argv[]) -{ - int ret = 0; +constexpr auto CHASSIS_CONTROL_PATH = + "/xyz/openbmc_project/Chassis/Control/Chassis/"; +constexpr auto CHASSIS_CONTROL_NAME = + "xyz.openbmc_project.Chassis.Control.Chassis"; - phosphor::logging::log<phosphor::logging::level::INFO>( - "Start Chassis Control service..."); - - sd_event *event = nullptr; - ret = sd_event_default(&event); - if (ret < 0) - { - phosphor::logging::log<phosphor::logging::level::ERR>( - "Error creating a default sd_event handler"); - return ret; - } - EventPtr eventP{event}; - event = nullptr; +int main(int argc, char *argv[]) { + int ret = 0; - auto bus = sdbusplus::bus::new_default(); - sdbusplus::server::manager::manager objManager{ - bus, "/xyz/openbmc_project/Chassis/Control/Chassis"}; + phosphor::logging::log<phosphor::logging::level::INFO>( + "Start Chassis Control service..."); + sd_event *event = nullptr; + ret = sd_event_default(&event); + if (ret < 0) { + phosphor::logging::log<phosphor::logging::level::ERR>( + "Error creating a default sd_event handler"); + return ret; + } + EventPtr eventP{event}; + event = nullptr; - bus.request_name("xyz.openbmc_project.Chassis.Control.Chassis"); + auto bus = sdbusplus::bus::new_default(); + sdbusplus::server::manager::manager objManager{bus, CHASSIS_CONTROL_PATH}; - ChassisControl chassisControl{bus, DBUS_OBJECT_NAME, eventP}; + bus.request_name(CHASSIS_CONTROL_NAME); - try - { - bus.attach_event(eventP.get(), SD_EVENT_PRIORITY_NORMAL); + ChassisControl chassisControl{bus, DBUS_OBJECT_NAME, eventP}; - while (true) - { - ret = sd_event_run(eventP.get(), (uint64_t)-1); - if (ret < 0) - { - phosphor::logging::log<phosphor::logging::level::ERR>( - "Error waiting for events"); - break; - } - } + try { + bus.attach_event(eventP.get(), SD_EVENT_PRIORITY_NORMAL); + ret = sd_event_loop(eventP.get()); + if (ret < 0) { + phosphor::logging::log<phosphor::logging::level::ERR>( + "Failed call to sd_event_loop"); + ret = -1; } + } - catch (std::exception &e) - { - phosphor::logging::log<phosphor::logging::level::ERR>(e.what()); - ret = -1; - } - return ret; + catch (std::exception &e) { + phosphor::logging::log<phosphor::logging::level::ERR>(e.what()); + ret = -1; + } + + return ret; } |