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),
392ec3a7e9SAndrew Geissler                 pgoodOn(bus,
402ec3a7e9SAndrew Geissler                         "type='signal',member='PowerGood'",
412ec3a7e9SAndrew Geissler                         Chassis::handlePgoodOn,
422ec3a7e9SAndrew Geissler                         this),
432ec3a7e9SAndrew Geissler                 pgoodOff(bus,
442ec3a7e9SAndrew Geissler                         "type='signal',member='PowerLost'",
452ec3a7e9SAndrew Geissler                         Chassis::handlePgoodOff,
462ec3a7e9SAndrew 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*ce80f24cSAndrew Geissler         /** @brief Execute the transition request
65*ce80f24cSAndrew Geissler          *
66*ce80f24cSAndrew Geissler          * This function calls the appropriate systemd target for the input
67*ce80f24cSAndrew Geissler          * transition.
68*ce80f24cSAndrew Geissler          *
69*ce80f24cSAndrew Geissler          * @param[in] tranReq    - Transition requested
70*ce80f24cSAndrew Geissler          */
71*ce80f24cSAndrew Geissler         void executeTransition(Transition tranReq);
72*ce80f24cSAndrew Geissler 
732ec3a7e9SAndrew Geissler         /** @brief Callback function for pgood going to on state
742ec3a7e9SAndrew Geissler          *
752ec3a7e9SAndrew Geissler          *  Update chassis object state to reflect pgood going to on state
762ec3a7e9SAndrew Geissler          *
772ec3a7e9SAndrew Geissler          * @param[in] msg        - Data associated with subscribed signal
782ec3a7e9SAndrew Geissler          * @param[in] userData   - Pointer to this object instance
792ec3a7e9SAndrew Geissler          * @param[in] retError   - Return error data
802ec3a7e9SAndrew Geissler          *
812ec3a7e9SAndrew Geissler          */
822ec3a7e9SAndrew Geissler         static int handlePgoodOn(sd_bus_message* msg,
832ec3a7e9SAndrew Geissler                                  void* userData,
842ec3a7e9SAndrew Geissler                                  sd_bus_error* retError);
852ec3a7e9SAndrew Geissler 
862ec3a7e9SAndrew Geissler         /** @brief Callback function for pgood going to off state
872ec3a7e9SAndrew Geissler          *
882ec3a7e9SAndrew Geissler          *  Update chassis object state to reflect pgood going to off state
892ec3a7e9SAndrew Geissler          *
902ec3a7e9SAndrew Geissler          * @param[in] msg        - Data associated with subscribed signal
912ec3a7e9SAndrew Geissler          * @param[in] userData   - Pointer to this object instance
922ec3a7e9SAndrew Geissler          * @param[in] retError   - Return error data
932ec3a7e9SAndrew Geissler          *
942ec3a7e9SAndrew Geissler          */
952ec3a7e9SAndrew Geissler         static int handlePgoodOff(sd_bus_message* msg,
962ec3a7e9SAndrew Geissler                                   void* userData,
972ec3a7e9SAndrew Geissler                                   sd_bus_error* retError);
982ec3a7e9SAndrew Geissler 
99a90a31a9SAndrew Geissler         /** @brief Persistent sdbusplus DBus connection. */
100a90a31a9SAndrew Geissler         sdbusplus::bus::bus& bus;
1012ec3a7e9SAndrew Geissler 
1022ec3a7e9SAndrew Geissler         /** @brief Used to subscribe to dbus pgood on state changes */
1032ec3a7e9SAndrew Geissler         sdbusplus::server::match::match pgoodOn;
1042ec3a7e9SAndrew Geissler 
1052ec3a7e9SAndrew Geissler         /** @brief Used to subscribe to dbus pgood off state changes */
1062ec3a7e9SAndrew Geissler         sdbusplus::server::match::match pgoodOff;
107a90a31a9SAndrew Geissler };
108a90a31a9SAndrew Geissler 
109a90a31a9SAndrew Geissler } // namespace manager
110a90a31a9SAndrew Geissler } // namespace state
111a90a31a9SAndrew Geissler } // namespace phosphor
112