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