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