1a90a31a9SAndrew Geissler #pragma once 2a90a31a9SAndrew Geissler 3a90a31a9SAndrew Geissler #include <sdbusplus/bus.hpp> 4a90a31a9SAndrew Geissler #include "xyz/openbmc_project/State/Chassis/server.hpp" 5a90a31a9SAndrew Geissler 6a90a31a9SAndrew Geissler namespace phosphor 7a90a31a9SAndrew Geissler { 8a90a31a9SAndrew Geissler namespace state 9a90a31a9SAndrew Geissler { 10a90a31a9SAndrew Geissler namespace manager 11a90a31a9SAndrew Geissler { 12a90a31a9SAndrew Geissler 13a90a31a9SAndrew Geissler /** @class Chassis 14a90a31a9SAndrew Geissler * @brief OpenBMC chassis state management implementation. 15a90a31a9SAndrew Geissler * @details A concrete implementation for xyz.openbmc_project.State.Chassis 16a90a31a9SAndrew Geissler * DBus API. 17a90a31a9SAndrew Geissler */ 18a90a31a9SAndrew Geissler class Chassis : public sdbusplus::server::object::object< 19a90a31a9SAndrew Geissler sdbusplus::xyz::openbmc_project::State::server::Chassis> 20a90a31a9SAndrew Geissler { 21a90a31a9SAndrew Geissler public: 22a90a31a9SAndrew Geissler /** @brief Constructs Chassis State Manager 23a90a31a9SAndrew Geissler * 24dff50ed6SAndrew Geissler * @note This constructor passes 'true' to the base class in order to 25dff50ed6SAndrew Geissler * defer dbus object registration until we can run 26dff50ed6SAndrew Geissler * determineInitialState() and set our properties 27dff50ed6SAndrew Geissler * 28a90a31a9SAndrew Geissler * @param[in] bus - The Dbus bus object 29dff50ed6SAndrew Geissler * @param[in] instance - The instance of this object 30a90a31a9SAndrew Geissler * @param[in] objPath - The Dbus object path 31a90a31a9SAndrew Geissler */ 32a90a31a9SAndrew Geissler Chassis(sdbusplus::bus::bus& bus, 33a90a31a9SAndrew Geissler const char* busName, 34a90a31a9SAndrew Geissler const char* objPath) : 35a90a31a9SAndrew Geissler sdbusplus::server::object::object< 36a90a31a9SAndrew Geissler sdbusplus::xyz::openbmc_project::State::server::Chassis>( 37dff50ed6SAndrew Geissler bus, objPath, true), 382ec3a7e9SAndrew Geissler bus(bus), 390029a5d2SAndrew Geissler systemdSignals(bus, 400029a5d2SAndrew Geissler "type='signal'," 410029a5d2SAndrew Geissler "member='JobRemoved'," 420029a5d2SAndrew Geissler "path='/org/freedesktop/systemd1'," 430029a5d2SAndrew Geissler "interface='org.freedesktop.systemd1.Manager'", 440029a5d2SAndrew Geissler sysStateChangeSignal, 452ec3a7e9SAndrew Geissler this) 46dff50ed6SAndrew Geissler { 470029a5d2SAndrew Geissler subscribeToSystemdSignals(); 480029a5d2SAndrew Geissler 49dff50ed6SAndrew Geissler determineInitialState(); 50dff50ed6SAndrew Geissler 51dff50ed6SAndrew Geissler // We deferred this until we could get our property correct 52dff50ed6SAndrew Geissler this->emit_object_added(); 53dff50ed6SAndrew Geissler } 54dff50ed6SAndrew Geissler 55a90a31a9SAndrew Geissler /** @brief Set value of RequestedPowerTransition */ 56a90a31a9SAndrew Geissler Transition requestedPowerTransition(Transition value) override; 57a90a31a9SAndrew Geissler 58a90a31a9SAndrew Geissler /** @brief Set value of CurrentPowerState */ 59a90a31a9SAndrew Geissler PowerState currentPowerState(PowerState value) override; 60a90a31a9SAndrew Geissler 61a90a31a9SAndrew Geissler private: 620029a5d2SAndrew Geissler /** @brief Determine initial chassis state and set internally */ 630029a5d2SAndrew Geissler void determineInitialState(); 640029a5d2SAndrew Geissler 650029a5d2SAndrew Geissler /** 660029a5d2SAndrew Geissler * @brief subscribe to the systemd signals 670029a5d2SAndrew Geissler * 680029a5d2SAndrew Geissler * This object needs to capture when it's systemd targets complete 690029a5d2SAndrew Geissler * so it can keep it's state updated 700029a5d2SAndrew Geissler * 710029a5d2SAndrew Geissler **/ 720029a5d2SAndrew Geissler void subscribeToSystemdSignals(); 730029a5d2SAndrew Geissler 74ce80f24cSAndrew Geissler /** @brief Execute the transition request 75ce80f24cSAndrew Geissler * 76ce80f24cSAndrew Geissler * This function calls the appropriate systemd target for the input 77ce80f24cSAndrew Geissler * transition. 78ce80f24cSAndrew Geissler * 79ce80f24cSAndrew Geissler * @param[in] tranReq - Transition requested 80ce80f24cSAndrew Geissler */ 81ce80f24cSAndrew Geissler void executeTransition(Transition tranReq); 82ce80f24cSAndrew Geissler 83*697474c5SJosh D. King /** 84*697474c5SJosh D. King * @brief Determine if target is active 85*697474c5SJosh D. King * 86*697474c5SJosh D. King * This function determines if the target is active and 87*697474c5SJosh D. King * helps prevent misleading log recorded states. 88*697474c5SJosh D. King * 89*697474c5SJosh D. King * @param[in] target - Target string to check on 90*697474c5SJosh D. King * 91*697474c5SJosh D. King * @return boolean corresponding to state active 92*697474c5SJosh D. King **/ 93*697474c5SJosh D. King bool stateActive(const std::string& target); 94*697474c5SJosh D. King 950029a5d2SAndrew Geissler /** @brief Callback function on systemd state changes 962ec3a7e9SAndrew Geissler * 970029a5d2SAndrew Geissler * Will just do a call into the appropriate object for processing 982ec3a7e9SAndrew Geissler * 992ec3a7e9SAndrew Geissler * @param[in] msg - Data associated with subscribed signal 1002ec3a7e9SAndrew Geissler * @param[in] userData - Pointer to this object instance 1010029a5d2SAndrew Geissler * @param[out] retError - Not used but required with signal API 1022ec3a7e9SAndrew Geissler * 1032ec3a7e9SAndrew Geissler */ 1040029a5d2SAndrew Geissler static int sysStateChangeSignal(sd_bus_message* msg, 1052ec3a7e9SAndrew Geissler void* userData, 1062ec3a7e9SAndrew Geissler sd_bus_error* retError); 1072ec3a7e9SAndrew Geissler 1080029a5d2SAndrew Geissler /** @brief Check if systemd state change is relevant to this object 1092ec3a7e9SAndrew Geissler * 1100029a5d2SAndrew Geissler * Instance specific interface to handle the detected systemd state 1110029a5d2SAndrew Geissler * change 1122ec3a7e9SAndrew Geissler * 1132ec3a7e9SAndrew Geissler * @param[in] msg - Data associated with subscribed signal 1140029a5d2SAndrew Geissler * @param[out] retError - Not used but required with signal API 1152ec3a7e9SAndrew Geissler * 1162ec3a7e9SAndrew Geissler */ 1170029a5d2SAndrew Geissler int sysStateChange(sd_bus_message* msg, 1182ec3a7e9SAndrew Geissler sd_bus_error* retError); 1192ec3a7e9SAndrew Geissler 120a90a31a9SAndrew Geissler /** @brief Persistent sdbusplus DBus connection. */ 121a90a31a9SAndrew Geissler sdbusplus::bus::bus& bus; 1222ec3a7e9SAndrew Geissler 1230029a5d2SAndrew Geissler /** @brief Used to subscribe to dbus systemd signals **/ 1240029a5d2SAndrew Geissler sdbusplus::server::match::match systemdSignals; 125a90a31a9SAndrew Geissler }; 126a90a31a9SAndrew Geissler 127a90a31a9SAndrew Geissler } // namespace manager 128a90a31a9SAndrew Geissler } // namespace state 129a90a31a9SAndrew Geissler } // namespace phosphor 130