1 #pragma once
2 
3 #include "../utils.hpp"
4 
5 #include <sdbusplus/bus.hpp>
6 #include <sdbusplus/server.hpp>
7 
8 namespace phosphor
9 {
10 namespace led
11 {
12 namespace Operational
13 {
14 namespace status
15 {
16 namespace monitor
17 {
18 using namespace phosphor::led::utils;
19 
20 /** @class Monitor
21  *  @brief Implementation of LED handling during the change of the Functional
22  *         property of the OperationalStatus interface
23  *
24  *  @details This implements methods for watching OperationalStatus interface of
25  *           Inventory D-Bus object and then assert corresponding LED Group
26  *           D-Bus objects.
27  */
28 class Monitor
29 {
30   public:
31     Monitor() = delete;
32     ~Monitor() = default;
33     Monitor(const Monitor&) = delete;
34     Monitor& operator=(const Monitor&) = delete;
35     Monitor(Monitor&&) = default;
36     Monitor& operator=(Monitor&&) = default;
37 
38     /** @brief Add a watch for OperationalStatus.
39      *
40      *  @param[in] bus -  D-Bus object
41      */
Monitor(sdbusplus::bus_t & bus)42     explicit Monitor(sdbusplus::bus_t& bus) :
43         bus(bus),
44         matchSignal(bus,
45                     "type='signal',member='PropertiesChanged', "
46                     "interface='org.freedesktop.DBus.Properties', "
47                     "sender='xyz.openbmc_project.Inventory.Manager', "
48                     "arg0namespace='xyz.openbmc_project.State.Decorator."
49                     "OperationalStatus'",
50                     [this](sdbusplus::message_t& m) { matchHandler(m); })
51 
52     {}
53 
54   private:
55     /** @brief sdbusplus D-Bus connection. */
56     sdbusplus::bus_t& bus;
57 
58     /** @brief sdbusplus signal matches for Monitor */
59     sdbusplus::bus::match_t matchSignal;
60 
61     /** DBusHandler class handles the D-Bus operations */
62     DBusHandler dBusHandler;
63 
64     /**
65      * @brief Callback handler that gets invoked when the PropertiesChanged
66      *        signal is caught by this app. Message is scanned for Inventory
67      *        D-Bus object path and if OperationalStatus::Functional is changed,
68      *        then corresponding LED Group D-Bus object is called to assert.
69      *
70      * @param[in] msg - The D-Bus message contents
71      */
72     void matchHandler(sdbusplus::message_t& msg);
73 
74     /**
75      * @brief From the Inventory D-Bus object, obtains the associated LED group
76      *        D-Bus object, where the association name is "fault_led_group"
77      *
78      * @param[in] inventoryPath         - Inventory D-Bus object path
79      *
80      * @return std::vector<std::string> - Vector of LED Group D-Bus object paths
81      */
82     std::vector<std::string>
83         getLedGroupPaths(const std::string& inventoryPath) const;
84 
85     /**
86      * @brief Update the Asserted property of the LED Group Manager.
87      *
88      * @param[in] ledGroupPaths   - LED Group D-Bus object Paths
89      * @param[in] value           - The Asserted property value, True / False
90      */
91     void updateAssertedProperty(const std::vector<std::string>& ledGroupPaths,
92                                 bool value);
93 };
94 } // namespace monitor
95 } // namespace status
96 } // namespace Operational
97 } // namespace led
98 } // namespace phosphor
99