blob: 3801c3a6d4fd1f0ddc004707ddb01e8e94c6f622 [file] [log] [blame]
Vishwanatha Subbannabda97eb2016-11-30 12:21:25 +05301#pragma once
2
Andrew Jeffery42e02d32018-05-24 13:34:05 +09303#include "sysfs.hpp"
4
Vishwanatha Subbanna61675c32016-11-30 15:52:15 +05305#include <fstream>
Vishwanatha Subbannabda97eb2016-11-30 12:21:25 +05306#include <sdbusplus/bus.hpp>
7#include <sdbusplus/server/object.hpp>
Andrew Jefferyc41bf5b2018-05-25 16:39:22 +09308#include <string>
Vishwanatha Subbannae0891732017-03-10 15:27:23 +05309#include <xyz/openbmc_project/Led/Physical/server.hpp>
Andrew Jeffery42e02d32018-05-24 13:34:05 +093010
Vishwanatha Subbannabda97eb2016-11-30 12:21:25 +053011namespace phosphor
12{
13namespace led
14{
Andrew Jeffery5b1417b2019-03-18 17:20:37 +103015/** @brief De-assert value */
Andrew Jefferyaee9c2c2018-05-25 14:05:40 +093016constexpr unsigned long DEASSERT = 0;
Vishwanatha Subbannabda97eb2016-11-30 12:21:25 +053017
18/** @class Physical
19 * @brief Responsible for applying actions on a particular physical LED
20 */
21class Physical : public sdbusplus::server::object::object<
Andrew Jefferyc41bf5b2018-05-25 16:39:22 +093022 sdbusplus::xyz::openbmc_project::Led::server::Physical>
Vishwanatha Subbannabda97eb2016-11-30 12:21:25 +053023{
Andrew Jefferyc41bf5b2018-05-25 16:39:22 +093024 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;
Vishwanatha Subbannabda97eb2016-11-30 12:21:25 +053031
Andrew Jefferyc41bf5b2018-05-25 16:39:22 +093032 /** @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
Alexander Soldatov97ddb722019-04-16 09:10:00 +030040 * @param[in] color - led color name
Andrew Jefferyc41bf5b2018-05-25 16:39:22 +093041 */
42 Physical(sdbusplus::bus::bus& bus, const std::string& objPath,
Alexander Soldatov97ddb722019-04-16 09:10:00 +030043 SysfsLed& led, const std::string& color = "") :
Vishwanatha Subbannabda97eb2016-11-30 12:21:25 +053044
Andrew Jefferyc41bf5b2018-05-25 16:39:22 +093045 sdbusplus::server::object::object<
46 sdbusplus::xyz::openbmc_project::Led::server::Physical>(
47 bus, objPath.c_str(), true),
Andrew Jeffery42e02d32018-05-24 13:34:05 +093048 led(led)
Andrew Jefferyc41bf5b2018-05-25 16:39:22 +093049 {
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
Alexander Soldatov97ddb722019-04-16 09:10:00 +030054 // Read led color from enviroment and set it in DBus.
55 setLedColor(color);
56
Andrew Jefferyc41bf5b2018-05-25 16:39:22 +093057 // 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:
Andrew Jeffery42e02d32018-05-24 13:34:05 +093069 /** @brief Associated LED implementation
Andrew Jefferyc41bf5b2018-05-25 16:39:22 +093070 */
Andrew Jeffery42e02d32018-05-24 13:34:05 +093071 SysfsLed& led;
Andrew Jefferyc41bf5b2018-05-25 16:39:22 +093072
Andrew Jeffery5b1417b2019-03-18 17:20:37 +103073 /** @brief The value that will assert the LED */
74 unsigned long assert;
75
Andrew Jefferye5c40fe2018-05-25 15:27:18 +093076 /** @brief The period that the LED will operate on, in milliseconds
77 * Will be removed when periodicity is put into interface
Andrew Jefferyc41bf5b2018-05-25 16:39:22 +093078 */
Andrew Jefferye5c40fe2018-05-25 15:27:18 +093079 uint32_t periodMs;
Andrew Jefferyc41bf5b2018-05-25 16:39:22 +093080
Andrew Jefferyc41bf5b2018-05-25 16:39:22 +093081 /** @brief reads sysfs and then setsup the parameteres accordingly
82 *
83 * @return None
84 */
85 void setInitialState();
86
87 /** @brief Applies the user triggered action on the LED
88 * by writing to sysfs
89 *
90 * @param [in] current - Current state of LED
91 * @param [in] request - Requested state
92 *
93 * @return None
94 */
95 void driveLED(Action current, Action request);
96
97 /** @brief Sets the LED to either ON or OFF state
98 *
99 * @param [in] action - Requested action. Could be OFF or ON
100 * @return None
101 */
102 void stableStateOperation(Action action);
103
104 /** @brief Sets the LED to BLINKING
105 *
106 * @return None
107 */
108 void blinkOperation();
Alexander Soldatov97ddb722019-04-16 09:10:00 +0300109
110 /** @brief set led color property in DBus
111 *
112 * @param[in] color - led color name
113 */
114 void setLedColor(const std::string& color);
Vishwanatha Subbannabda97eb2016-11-30 12:21:25 +0530115};
116
117} // namespace led
Andrew Jefferyc41bf5b2018-05-25 16:39:22 +0930118} // namespace phosphor