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