1a90a31a9SAndrew Geissler #pragma once
2a90a31a9SAndrew Geissler 
38f8ba39fSPatrick Williams #include <functional>
4a90a31a9SAndrew Geissler #include <sdbusplus/bus.hpp>
5a90a31a9SAndrew Geissler #include "xyz/openbmc_project/State/Chassis/server.hpp"
6a90a31a9SAndrew Geissler 
7a90a31a9SAndrew Geissler namespace phosphor
8a90a31a9SAndrew Geissler {
9a90a31a9SAndrew Geissler namespace state
10a90a31a9SAndrew Geissler {
11a90a31a9SAndrew Geissler namespace manager
12a90a31a9SAndrew Geissler {
13a90a31a9SAndrew Geissler 
148f8ba39fSPatrick Williams using ChassisInherit = sdbusplus::server::object::object<
158f8ba39fSPatrick Williams     sdbusplus::xyz::openbmc_project::State::server::Chassis>;
168f8ba39fSPatrick Williams namespace sdbusRule = sdbusplus::bus::match::rules;
178f8ba39fSPatrick Williams 
18a90a31a9SAndrew Geissler /** @class Chassis
19a90a31a9SAndrew Geissler  *  @brief OpenBMC chassis state management implementation.
20a90a31a9SAndrew Geissler  *  @details A concrete implementation for xyz.openbmc_project.State.Chassis
21a90a31a9SAndrew Geissler  *  DBus API.
22a90a31a9SAndrew Geissler  */
238f8ba39fSPatrick Williams class Chassis : public ChassisInherit
24a90a31a9SAndrew Geissler {
25a90a31a9SAndrew Geissler   public:
26a90a31a9SAndrew Geissler     /** @brief Constructs Chassis State Manager
27a90a31a9SAndrew Geissler      *
28dff50ed6SAndrew Geissler      * @note This constructor passes 'true' to the base class in order to
29dff50ed6SAndrew Geissler      *       defer dbus object registration until we can run
30dff50ed6SAndrew Geissler      *       determineInitialState() and set our properties
31dff50ed6SAndrew Geissler      *
32a90a31a9SAndrew Geissler      * @param[in] bus       - The Dbus bus object
33dff50ed6SAndrew Geissler      * @param[in] instance  - The instance of this object
34a90a31a9SAndrew Geissler      * @param[in] objPath   - The Dbus object path
35a90a31a9SAndrew Geissler      */
36*58a18013SAndrew Geissler     Chassis(sdbusplus::bus::bus& bus, const char* busName,
37a90a31a9SAndrew Geissler             const char* objPath) :
388f8ba39fSPatrick Williams         ChassisInherit(bus, objPath, true),
392ec3a7e9SAndrew Geissler         bus(bus),
40*58a18013SAndrew Geissler         systemdSignals(
41*58a18013SAndrew Geissler             bus,
42*58a18013SAndrew Geissler             sdbusRule::type::signal() + sdbusRule::member("JobRemoved") +
438f8ba39fSPatrick Williams                 sdbusRule::path("/org/freedesktop/systemd1") +
44*58a18013SAndrew Geissler                 sdbusRule::interface("org.freedesktop.systemd1.Manager"),
45*58a18013SAndrew Geissler             std::bind(std::mem_fn(&Chassis::sysStateChange), this,
46*58a18013SAndrew Geissler                       std::placeholders::_1))
47dff50ed6SAndrew Geissler     {
480029a5d2SAndrew Geissler         subscribeToSystemdSignals();
490029a5d2SAndrew Geissler 
50dff50ed6SAndrew Geissler         determineInitialState();
51dff50ed6SAndrew Geissler 
52dff50ed6SAndrew Geissler         // We deferred this until we could get our property correct
53dff50ed6SAndrew Geissler         this->emit_object_added();
54dff50ed6SAndrew Geissler     }
55dff50ed6SAndrew Geissler 
56a90a31a9SAndrew Geissler     /** @brief Set value of RequestedPowerTransition */
57a90a31a9SAndrew Geissler     Transition requestedPowerTransition(Transition value) override;
58a90a31a9SAndrew Geissler 
59a90a31a9SAndrew Geissler     /** @brief Set value of CurrentPowerState */
60a90a31a9SAndrew Geissler     PowerState currentPowerState(PowerState value) override;
61a90a31a9SAndrew Geissler 
62a90a31a9SAndrew Geissler   private:
630029a5d2SAndrew Geissler     /** @brief Determine initial chassis state and set internally */
640029a5d2SAndrew Geissler     void determineInitialState();
650029a5d2SAndrew Geissler 
660029a5d2SAndrew Geissler     /**
670029a5d2SAndrew Geissler      * @brief subscribe to the systemd signals
680029a5d2SAndrew Geissler      *
690029a5d2SAndrew Geissler      * This object needs to capture when it's systemd targets complete
700029a5d2SAndrew Geissler      * so it can keep it's state updated
710029a5d2SAndrew Geissler      *
720029a5d2SAndrew Geissler      **/
730029a5d2SAndrew Geissler     void subscribeToSystemdSignals();
740029a5d2SAndrew Geissler 
75ce80f24cSAndrew Geissler     /** @brief Execute the transition request
76ce80f24cSAndrew Geissler      *
77ce80f24cSAndrew Geissler      * This function calls the appropriate systemd target for the input
78ce80f24cSAndrew Geissler      * transition.
79ce80f24cSAndrew Geissler      *
80ce80f24cSAndrew Geissler      * @param[in] tranReq    - Transition requested
81ce80f24cSAndrew Geissler      */
82ce80f24cSAndrew Geissler     void executeTransition(Transition tranReq);
83ce80f24cSAndrew Geissler 
84697474c5SJosh D. King     /**
85697474c5SJosh D. King      * @brief Determine if target is active
86697474c5SJosh D. King      *
87697474c5SJosh D. King      * This function determines if the target is active and
88697474c5SJosh D. King      * helps prevent misleading log recorded states.
89697474c5SJosh D. King      *
90697474c5SJosh D. King      * @param[in] target - Target string to check on
91697474c5SJosh D. King      *
92697474c5SJosh D. King      * @return boolean corresponding to state active
93697474c5SJosh D. King      **/
94697474c5SJosh D. King     bool stateActive(const std::string& target);
95697474c5SJosh D. King 
960029a5d2SAndrew Geissler     /** @brief Check if systemd state change is relevant to this object
972ec3a7e9SAndrew Geissler      *
980029a5d2SAndrew Geissler      * Instance specific interface to handle the detected systemd state
990029a5d2SAndrew Geissler      * change
1002ec3a7e9SAndrew Geissler      *
1012ec3a7e9SAndrew Geissler      * @param[in]  msg       - Data associated with subscribed signal
1022ec3a7e9SAndrew Geissler      *
1032ec3a7e9SAndrew Geissler      */
1048f8ba39fSPatrick Williams     int sysStateChange(sdbusplus::message::message& msg);
1052ec3a7e9SAndrew Geissler 
106a90a31a9SAndrew Geissler     /** @brief Persistent sdbusplus DBus connection. */
107a90a31a9SAndrew Geissler     sdbusplus::bus::bus& bus;
1082ec3a7e9SAndrew Geissler 
1090029a5d2SAndrew Geissler     /** @brief Used to subscribe to dbus systemd signals **/
1108f8ba39fSPatrick Williams     sdbusplus::bus::match_t systemdSignals;
111a90a31a9SAndrew Geissler };
112a90a31a9SAndrew Geissler 
113a90a31a9SAndrew Geissler } // namespace manager
114a90a31a9SAndrew Geissler } // namespace state
115a90a31a9SAndrew Geissler } // namespace phosphor
116