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),
39*0029a5d2SAndrew Geissler                 systemdSignals(bus,
40*0029a5d2SAndrew Geissler                                "type='signal',"
41*0029a5d2SAndrew Geissler                                "member='JobRemoved',"
42*0029a5d2SAndrew Geissler                                "path='/org/freedesktop/systemd1',"
43*0029a5d2SAndrew Geissler                                "interface='org.freedesktop.systemd1.Manager'",
44*0029a5d2SAndrew Geissler                                 sysStateChangeSignal,
452ec3a7e9SAndrew Geissler                                 this)
46dff50ed6SAndrew Geissler         {
47*0029a5d2SAndrew Geissler             subscribeToSystemdSignals();
48*0029a5d2SAndrew 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:
62*0029a5d2SAndrew Geissler         /** @brief Determine initial chassis state and set internally */
63*0029a5d2SAndrew Geissler         void determineInitialState();
64*0029a5d2SAndrew Geissler 
65*0029a5d2SAndrew Geissler         /**
66*0029a5d2SAndrew Geissler          * @brief subscribe to the systemd signals
67*0029a5d2SAndrew Geissler          *
68*0029a5d2SAndrew Geissler          * This object needs to capture when it's systemd targets complete
69*0029a5d2SAndrew Geissler          * so it can keep it's state updated
70*0029a5d2SAndrew Geissler          *
71*0029a5d2SAndrew Geissler          **/
72*0029a5d2SAndrew Geissler         void subscribeToSystemdSignals();
73*0029a5d2SAndrew 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*0029a5d2SAndrew Geissler         /** @brief Callback function on systemd state changes
842ec3a7e9SAndrew Geissler          *
85*0029a5d2SAndrew Geissler          * Will just do a call into the appropriate object for processing
862ec3a7e9SAndrew Geissler          *
872ec3a7e9SAndrew Geissler          * @param[in]  msg       - Data associated with subscribed signal
882ec3a7e9SAndrew Geissler          * @param[in]  userData  - Pointer to this object instance
89*0029a5d2SAndrew Geissler          * @param[out] retError  - Not used but required with signal API
902ec3a7e9SAndrew Geissler          *
912ec3a7e9SAndrew Geissler          */
92*0029a5d2SAndrew Geissler         static int sysStateChangeSignal(sd_bus_message* msg,
932ec3a7e9SAndrew Geissler                                         void* userData,
942ec3a7e9SAndrew Geissler                                         sd_bus_error* retError);
952ec3a7e9SAndrew Geissler 
96*0029a5d2SAndrew Geissler         /** @brief Check if systemd state change is relevant to this object
972ec3a7e9SAndrew Geissler          *
98*0029a5d2SAndrew Geissler          * Instance specific interface to handle the detected systemd state
99*0029a5d2SAndrew Geissler          * change
1002ec3a7e9SAndrew Geissler          *
1012ec3a7e9SAndrew Geissler          * @param[in]  msg       - Data associated with subscribed signal
102*0029a5d2SAndrew Geissler          * @param[out] retError  - Not used but required with signal API
1032ec3a7e9SAndrew Geissler          *
1042ec3a7e9SAndrew Geissler          */
105*0029a5d2SAndrew Geissler         int sysStateChange(sd_bus_message* msg,
1062ec3a7e9SAndrew Geissler                            sd_bus_error* retError);
1072ec3a7e9SAndrew Geissler 
108a90a31a9SAndrew Geissler         /** @brief Persistent sdbusplus DBus connection. */
109a90a31a9SAndrew Geissler         sdbusplus::bus::bus& bus;
1102ec3a7e9SAndrew Geissler 
111*0029a5d2SAndrew Geissler         /** @brief Used to subscribe to dbus systemd signals **/
112*0029a5d2SAndrew Geissler         sdbusplus::server::match::match systemdSignals;
113a90a31a9SAndrew Geissler };
114a90a31a9SAndrew Geissler 
115a90a31a9SAndrew Geissler } // namespace manager
116a90a31a9SAndrew Geissler } // namespace state
117a90a31a9SAndrew Geissler } // namespace phosphor
118