1a90a31a9SAndrew Geissler #pragma once
2a90a31a9SAndrew Geissler 
3*8f8ba39fSPatrick 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 
14*8f8ba39fSPatrick Williams using ChassisInherit = sdbusplus::server::object::object<
15*8f8ba39fSPatrick Williams         sdbusplus::xyz::openbmc_project::State::server::Chassis>;
16*8f8ba39fSPatrick Williams namespace sdbusRule = sdbusplus::bus::match::rules;
17*8f8ba39fSPatrick 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  */
23*8f8ba39fSPatrick 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          */
36a90a31a9SAndrew Geissler         Chassis(sdbusplus::bus::bus& bus,
37a90a31a9SAndrew Geissler                 const char* busName,
38a90a31a9SAndrew Geissler                 const char* objPath) :
39*8f8ba39fSPatrick Williams                 ChassisInherit(bus, objPath, true),
402ec3a7e9SAndrew Geissler                 bus(bus),
410029a5d2SAndrew Geissler                 systemdSignals(bus,
42*8f8ba39fSPatrick Williams                                sdbusRule::type::signal() +
43*8f8ba39fSPatrick Williams                                sdbusRule::member("JobRemoved") +
44*8f8ba39fSPatrick Williams                                sdbusRule::path("/org/freedesktop/systemd1") +
45*8f8ba39fSPatrick Williams                                sdbusRule::interface(
46*8f8ba39fSPatrick Williams                                     "org.freedesktop.systemd1.Manager"),
47*8f8ba39fSPatrick Williams                                std::bind(std::mem_fn(&Chassis::sysStateChange),
48*8f8ba39fSPatrick Williams                                          this, std::placeholders::_1))
49dff50ed6SAndrew Geissler         {
500029a5d2SAndrew Geissler             subscribeToSystemdSignals();
510029a5d2SAndrew Geissler 
52dff50ed6SAndrew Geissler             determineInitialState();
53dff50ed6SAndrew Geissler 
54dff50ed6SAndrew Geissler             // We deferred this until we could get our property correct
55dff50ed6SAndrew Geissler             this->emit_object_added();
56dff50ed6SAndrew Geissler         }
57dff50ed6SAndrew Geissler 
58a90a31a9SAndrew Geissler         /** @brief Set value of RequestedPowerTransition */
59a90a31a9SAndrew Geissler         Transition requestedPowerTransition(Transition value) override;
60a90a31a9SAndrew Geissler 
61a90a31a9SAndrew Geissler         /** @brief Set value of CurrentPowerState */
62a90a31a9SAndrew Geissler         PowerState currentPowerState(PowerState value) override;
63a90a31a9SAndrew Geissler 
64a90a31a9SAndrew Geissler     private:
650029a5d2SAndrew Geissler         /** @brief Determine initial chassis state and set internally */
660029a5d2SAndrew Geissler         void determineInitialState();
670029a5d2SAndrew Geissler 
680029a5d2SAndrew Geissler         /**
690029a5d2SAndrew Geissler          * @brief subscribe to the systemd signals
700029a5d2SAndrew Geissler          *
710029a5d2SAndrew Geissler          * This object needs to capture when it's systemd targets complete
720029a5d2SAndrew Geissler          * so it can keep it's state updated
730029a5d2SAndrew Geissler          *
740029a5d2SAndrew Geissler          **/
750029a5d2SAndrew Geissler         void subscribeToSystemdSignals();
760029a5d2SAndrew Geissler 
77ce80f24cSAndrew Geissler         /** @brief Execute the transition request
78ce80f24cSAndrew Geissler          *
79ce80f24cSAndrew Geissler          * This function calls the appropriate systemd target for the input
80ce80f24cSAndrew Geissler          * transition.
81ce80f24cSAndrew Geissler          *
82ce80f24cSAndrew Geissler          * @param[in] tranReq    - Transition requested
83ce80f24cSAndrew Geissler          */
84ce80f24cSAndrew Geissler         void executeTransition(Transition tranReq);
85ce80f24cSAndrew Geissler 
86697474c5SJosh D. King         /**
87697474c5SJosh D. King          * @brief Determine if target is active
88697474c5SJosh D. King          *
89697474c5SJosh D. King          * This function determines if the target is active and
90697474c5SJosh D. King          * helps prevent misleading log recorded states.
91697474c5SJosh D. King          *
92697474c5SJosh D. King          * @param[in] target - Target string to check on
93697474c5SJosh D. King          *
94697474c5SJosh D. King          * @return boolean corresponding to state active
95697474c5SJosh D. King          **/
96697474c5SJosh D. King         bool stateActive(const std::string& target);
97697474c5SJosh D. King 
980029a5d2SAndrew Geissler         /** @brief Check if systemd state change is relevant to this object
992ec3a7e9SAndrew Geissler          *
1000029a5d2SAndrew Geissler          * Instance specific interface to handle the detected systemd state
1010029a5d2SAndrew Geissler          * change
1022ec3a7e9SAndrew Geissler          *
1032ec3a7e9SAndrew Geissler          * @param[in]  msg       - Data associated with subscribed signal
1042ec3a7e9SAndrew Geissler          *
1052ec3a7e9SAndrew Geissler          */
106*8f8ba39fSPatrick Williams         int sysStateChange(sdbusplus::message::message& msg);
1072ec3a7e9SAndrew Geissler 
108a90a31a9SAndrew Geissler         /** @brief Persistent sdbusplus DBus connection. */
109a90a31a9SAndrew Geissler         sdbusplus::bus::bus& bus;
1102ec3a7e9SAndrew Geissler 
1110029a5d2SAndrew Geissler         /** @brief Used to subscribe to dbus systemd signals **/
112*8f8ba39fSPatrick Williams         sdbusplus::bus::match_t systemdSignals;
113a90a31a9SAndrew Geissler };
114a90a31a9SAndrew Geissler 
115a90a31a9SAndrew Geissler } // namespace manager
116a90a31a9SAndrew Geissler } // namespace state
117a90a31a9SAndrew Geissler } // namespace phosphor
118