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