1 #pragma once
2 
3 #include "sysfs.hpp"
4 
5 #include <sdbusplus/bus.hpp>
6 #include <sdbusplus/server/object.hpp>
7 #include <xyz/openbmc_project/Led/Physical/server.hpp>
8 
9 #include <fstream>
10 #include <string>
11 
12 namespace phosphor
13 {
14 namespace led
15 {
16 /** @brief De-assert value */
17 constexpr unsigned long deasserted = 0;
18 
19 using PhysicalIfaces = sdbusplus::server::object_t<
20     sdbusplus::xyz::openbmc_project::Led::server::Physical>;
21 
22 /** @class Physical
23  *  @brief Responsible for applying actions on a particular physical LED
24  */
25 class Physical : public PhysicalIfaces
26 {
27   public:
28     Physical() = delete;
29     ~Physical() override = default;
30     Physical(const Physical&) = delete;
31     Physical& operator=(const Physical&) = delete;
32     Physical(Physical&&) = delete;
33     Physical& operator=(Physical&&) = delete;
34 
35     /** @brief Constructs LED object. Argument 'true' says that we hold off
36      *   from sending the signals since we need to do some house keeping and
37      *   only when we finish that, we are considered active and can then
38      *   broadcast the signal.
39      *
40      * @param[in] bus       - system dbus handler
41      * @param[in] objPath   - The Dbus path that hosts physical LED
42      * @param[in] ledPath   - sysfs path where this LED is exported
43      * @param[in] color     - led color name
44      */
45     Physical(sdbusplus::bus_t& bus, const std::string& objPath, SysfsLed& led,
46              const std::string& color = "") :
47         PhysicalIfaces(bus, objPath.c_str(),
48                        PhysicalIfaces::action::defer_emit),
49         led(led)
50     {
51         // Suppose this is getting launched as part of BMC reboot, then we
52         // need to save what the micro-controller currently has.
53         setInitialState();
54 
55         // Read led color from environment and set it in DBus.
56         setLedColor(color);
57 
58         // We are now ready.
59         emit_object_added();
60     }
61 
62     /** @brief Overloaded State Property Setter function
63      *
64      *  @param[in] value   -  One of OFF / ON / BLINK
65      *  @return            -  Success or exception thrown
66      */
67     Action state(Action value) override;
68 
69     /** @brief Overridden State Property Getter function
70      *
71      *  @return  -  One of OFF / ON / BLINK
72      */
73     Action state() const override;
74 
75   private:
76     /** @brief Associated LED implementation
77      */
78     SysfsLed& led;
79 
80     /** @brief The value that will assert the LED */
81     unsigned long assert{};
82 
83     /** @brief reads sysfs and then setup the parameters accordingly
84      *
85      *  @return None
86      */
87     void setInitialState();
88 
89     /** @brief Applies the user triggered action on the LED
90      *   by writing to sysfs
91      *
92      *  @param [in] current - Current state of LED
93      *  @param [in] request - Requested state
94      *
95      *  @return None
96      */
97     void driveLED(Action current, Action request);
98 
99     /** @brief Sets the LED to either ON or OFF state
100      *
101      *  @param [in] action - Requested action. Could be OFF or ON
102      *  @return None
103      */
104     void stableStateOperation(Action action);
105 
106     /** @brief Sets the LED to BLINKING
107      *
108      *  @return None
109      */
110     void blinkOperation();
111 
112     /** @brief set led color property in DBus
113      *
114      *  @param[in] color - led color name
115      */
116     void setLedColor(const std::string& color);
117 };
118 
119 } // namespace led
120 } // namespace phosphor
121