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