summaryrefslogtreecommitdiff
path: root/services
diff options
context:
space:
mode:
authorKuiying Wang <kuiying.wang@intel.com>2018-04-26 12:25:02 +0300
committerKuiying Wang <kuiying.wang@intel.com>2018-05-08 10:00:01 +0300
commit6e3397eabf33e3a4374310fbf3982dc564038bac (patch)
treeb3c3e9e208aa338810ea27affd608bf0ed194766 /services
parent169ee6e388997bdaf0dd569159083ed082aaab16 (diff)
downloadprovingground-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.hpp67
-rw-r--r--services/chassis/ChassisControl/src/ChassisControl.cpp143
-rw-r--r--services/chassis/ChassisControl/src/main.cpp89
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;
}