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), 38*2ec3a7e9SAndrew Geissler bus(bus), 39*2ec3a7e9SAndrew Geissler pgoodOn(bus, 40*2ec3a7e9SAndrew Geissler "type='signal',member='PowerGood'", 41*2ec3a7e9SAndrew Geissler Chassis::handlePgoodOn, 42*2ec3a7e9SAndrew Geissler this), 43*2ec3a7e9SAndrew Geissler pgoodOff(bus, 44*2ec3a7e9SAndrew Geissler "type='signal',member='PowerLost'", 45*2ec3a7e9SAndrew Geissler Chassis::handlePgoodOff, 46*2ec3a7e9SAndrew Geissler this) 47dff50ed6SAndrew Geissler { 48dff50ed6SAndrew Geissler determineInitialState(); 49dff50ed6SAndrew Geissler 50dff50ed6SAndrew Geissler // We deferred this until we could get our property correct 51dff50ed6SAndrew Geissler this->emit_object_added(); 52dff50ed6SAndrew Geissler } 53dff50ed6SAndrew Geissler 54dff50ed6SAndrew Geissler /** @brief Determine initial chassis state and set internally */ 55dff50ed6SAndrew Geissler void determineInitialState(); 56a90a31a9SAndrew Geissler 57a90a31a9SAndrew Geissler /** @brief Set value of RequestedPowerTransition */ 58a90a31a9SAndrew Geissler Transition requestedPowerTransition(Transition value) override; 59a90a31a9SAndrew Geissler 60a90a31a9SAndrew Geissler /** @brief Set value of CurrentPowerState */ 61a90a31a9SAndrew Geissler PowerState currentPowerState(PowerState value) override; 62a90a31a9SAndrew Geissler 63a90a31a9SAndrew Geissler private: 64*2ec3a7e9SAndrew Geissler /** @brief Callback function for pgood going to on state 65*2ec3a7e9SAndrew Geissler * 66*2ec3a7e9SAndrew Geissler * Update chassis object state to reflect pgood going to on state 67*2ec3a7e9SAndrew Geissler * 68*2ec3a7e9SAndrew Geissler * @param[in] msg - Data associated with subscribed signal 69*2ec3a7e9SAndrew Geissler * @param[in] userData - Pointer to this object instance 70*2ec3a7e9SAndrew Geissler * @param[in] retError - Return error data 71*2ec3a7e9SAndrew Geissler * 72*2ec3a7e9SAndrew Geissler */ 73*2ec3a7e9SAndrew Geissler static int handlePgoodOn(sd_bus_message* msg, 74*2ec3a7e9SAndrew Geissler void* userData, 75*2ec3a7e9SAndrew Geissler sd_bus_error* retError); 76*2ec3a7e9SAndrew Geissler 77*2ec3a7e9SAndrew Geissler /** @brief Callback function for pgood going to off state 78*2ec3a7e9SAndrew Geissler * 79*2ec3a7e9SAndrew Geissler * Update chassis object state to reflect pgood going to off state 80*2ec3a7e9SAndrew Geissler * 81*2ec3a7e9SAndrew Geissler * @param[in] msg - Data associated with subscribed signal 82*2ec3a7e9SAndrew Geissler * @param[in] userData - Pointer to this object instance 83*2ec3a7e9SAndrew Geissler * @param[in] retError - Return error data 84*2ec3a7e9SAndrew Geissler * 85*2ec3a7e9SAndrew Geissler */ 86*2ec3a7e9SAndrew Geissler static int handlePgoodOff(sd_bus_message* msg, 87*2ec3a7e9SAndrew Geissler void* userData, 88*2ec3a7e9SAndrew Geissler sd_bus_error* retError); 89*2ec3a7e9SAndrew Geissler 90a90a31a9SAndrew Geissler /** @brief Persistent sdbusplus DBus connection. */ 91a90a31a9SAndrew Geissler sdbusplus::bus::bus& bus; 92*2ec3a7e9SAndrew Geissler 93*2ec3a7e9SAndrew Geissler /** @brief Used to subscribe to dbus pgood on state changes */ 94*2ec3a7e9SAndrew Geissler sdbusplus::server::match::match pgoodOn; 95*2ec3a7e9SAndrew Geissler 96*2ec3a7e9SAndrew Geissler /** @brief Used to subscribe to dbus pgood off state changes */ 97*2ec3a7e9SAndrew Geissler sdbusplus::server::match::match pgoodOff; 98a90a31a9SAndrew Geissler }; 99a90a31a9SAndrew Geissler 100a90a31a9SAndrew Geissler } // namespace manager 101a90a31a9SAndrew Geissler } // namespace state 102a90a31a9SAndrew Geissler } // namespace phosphor 103