1a90a31a9SAndrew Geissler #pragma once 2a90a31a9SAndrew Geissler 3*8f8ba39fSPatrick Williams #include <functional> 4a90a31a9SAndrew Geissler #include <sdbusplus/bus.hpp> 5a90a31a9SAndrew Geissler #include "xyz/openbmc_project/State/Chassis/server.hpp" 6a90a31a9SAndrew Geissler 7a90a31a9SAndrew Geissler namespace phosphor 8a90a31a9SAndrew Geissler { 9a90a31a9SAndrew Geissler namespace state 10a90a31a9SAndrew Geissler { 11a90a31a9SAndrew Geissler namespace manager 12a90a31a9SAndrew Geissler { 13a90a31a9SAndrew Geissler 14*8f8ba39fSPatrick Williams using ChassisInherit = sdbusplus::server::object::object< 15*8f8ba39fSPatrick Williams sdbusplus::xyz::openbmc_project::State::server::Chassis>; 16*8f8ba39fSPatrick Williams namespace sdbusRule = sdbusplus::bus::match::rules; 17*8f8ba39fSPatrick Williams 18a90a31a9SAndrew Geissler /** @class Chassis 19a90a31a9SAndrew Geissler * @brief OpenBMC chassis state management implementation. 20a90a31a9SAndrew Geissler * @details A concrete implementation for xyz.openbmc_project.State.Chassis 21a90a31a9SAndrew Geissler * DBus API. 22a90a31a9SAndrew Geissler */ 23*8f8ba39fSPatrick Williams class Chassis : public ChassisInherit 24a90a31a9SAndrew Geissler { 25a90a31a9SAndrew Geissler public: 26a90a31a9SAndrew Geissler /** @brief Constructs Chassis State Manager 27a90a31a9SAndrew Geissler * 28dff50ed6SAndrew Geissler * @note This constructor passes 'true' to the base class in order to 29dff50ed6SAndrew Geissler * defer dbus object registration until we can run 30dff50ed6SAndrew Geissler * determineInitialState() and set our properties 31dff50ed6SAndrew Geissler * 32a90a31a9SAndrew Geissler * @param[in] bus - The Dbus bus object 33dff50ed6SAndrew Geissler * @param[in] instance - The instance of this object 34a90a31a9SAndrew Geissler * @param[in] objPath - The Dbus object path 35a90a31a9SAndrew Geissler */ 36a90a31a9SAndrew Geissler Chassis(sdbusplus::bus::bus& bus, 37a90a31a9SAndrew Geissler const char* busName, 38a90a31a9SAndrew Geissler const char* objPath) : 39*8f8ba39fSPatrick Williams ChassisInherit(bus, objPath, true), 402ec3a7e9SAndrew Geissler bus(bus), 410029a5d2SAndrew Geissler systemdSignals(bus, 42*8f8ba39fSPatrick Williams sdbusRule::type::signal() + 43*8f8ba39fSPatrick Williams sdbusRule::member("JobRemoved") + 44*8f8ba39fSPatrick Williams sdbusRule::path("/org/freedesktop/systemd1") + 45*8f8ba39fSPatrick Williams sdbusRule::interface( 46*8f8ba39fSPatrick Williams "org.freedesktop.systemd1.Manager"), 47*8f8ba39fSPatrick Williams std::bind(std::mem_fn(&Chassis::sysStateChange), 48*8f8ba39fSPatrick Williams this, std::placeholders::_1)) 49dff50ed6SAndrew Geissler { 500029a5d2SAndrew Geissler subscribeToSystemdSignals(); 510029a5d2SAndrew Geissler 52dff50ed6SAndrew Geissler determineInitialState(); 53dff50ed6SAndrew Geissler 54dff50ed6SAndrew Geissler // We deferred this until we could get our property correct 55dff50ed6SAndrew Geissler this->emit_object_added(); 56dff50ed6SAndrew Geissler } 57dff50ed6SAndrew Geissler 58a90a31a9SAndrew Geissler /** @brief Set value of RequestedPowerTransition */ 59a90a31a9SAndrew Geissler Transition requestedPowerTransition(Transition value) override; 60a90a31a9SAndrew Geissler 61a90a31a9SAndrew Geissler /** @brief Set value of CurrentPowerState */ 62a90a31a9SAndrew Geissler PowerState currentPowerState(PowerState value) override; 63a90a31a9SAndrew Geissler 64a90a31a9SAndrew Geissler private: 650029a5d2SAndrew Geissler /** @brief Determine initial chassis state and set internally */ 660029a5d2SAndrew Geissler void determineInitialState(); 670029a5d2SAndrew Geissler 680029a5d2SAndrew Geissler /** 690029a5d2SAndrew Geissler * @brief subscribe to the systemd signals 700029a5d2SAndrew Geissler * 710029a5d2SAndrew Geissler * This object needs to capture when it's systemd targets complete 720029a5d2SAndrew Geissler * so it can keep it's state updated 730029a5d2SAndrew Geissler * 740029a5d2SAndrew Geissler **/ 750029a5d2SAndrew Geissler void subscribeToSystemdSignals(); 760029a5d2SAndrew Geissler 77ce80f24cSAndrew Geissler /** @brief Execute the transition request 78ce80f24cSAndrew Geissler * 79ce80f24cSAndrew Geissler * This function calls the appropriate systemd target for the input 80ce80f24cSAndrew Geissler * transition. 81ce80f24cSAndrew Geissler * 82ce80f24cSAndrew Geissler * @param[in] tranReq - Transition requested 83ce80f24cSAndrew Geissler */ 84ce80f24cSAndrew Geissler void executeTransition(Transition tranReq); 85ce80f24cSAndrew Geissler 86697474c5SJosh D. King /** 87697474c5SJosh D. King * @brief Determine if target is active 88697474c5SJosh D. King * 89697474c5SJosh D. King * This function determines if the target is active and 90697474c5SJosh D. King * helps prevent misleading log recorded states. 91697474c5SJosh D. King * 92697474c5SJosh D. King * @param[in] target - Target string to check on 93697474c5SJosh D. King * 94697474c5SJosh D. King * @return boolean corresponding to state active 95697474c5SJosh D. King **/ 96697474c5SJosh D. King bool stateActive(const std::string& target); 97697474c5SJosh D. King 980029a5d2SAndrew Geissler /** @brief Check if systemd state change is relevant to this object 992ec3a7e9SAndrew Geissler * 1000029a5d2SAndrew Geissler * Instance specific interface to handle the detected systemd state 1010029a5d2SAndrew Geissler * change 1022ec3a7e9SAndrew Geissler * 1032ec3a7e9SAndrew Geissler * @param[in] msg - Data associated with subscribed signal 1042ec3a7e9SAndrew Geissler * 1052ec3a7e9SAndrew Geissler */ 106*8f8ba39fSPatrick Williams int sysStateChange(sdbusplus::message::message& msg); 1072ec3a7e9SAndrew Geissler 108a90a31a9SAndrew Geissler /** @brief Persistent sdbusplus DBus connection. */ 109a90a31a9SAndrew Geissler sdbusplus::bus::bus& bus; 1102ec3a7e9SAndrew Geissler 1110029a5d2SAndrew Geissler /** @brief Used to subscribe to dbus systemd signals **/ 112*8f8ba39fSPatrick Williams sdbusplus::bus::match_t systemdSignals; 113a90a31a9SAndrew Geissler }; 114a90a31a9SAndrew Geissler 115a90a31a9SAndrew Geissler } // namespace manager 116a90a31a9SAndrew Geissler } // namespace state 117a90a31a9SAndrew Geissler } // namespace phosphor 118