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 The period that the LED will operate on, in milliseconds 77 * Will be removed when periodicity is put into interface 78 */ 79 uint32_t periodMs; 80 81 /** @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(); 109 110 /** @brief set led color property in DBus 111 * 112 * @param[in] color - led color name 113 */ 114 void setLedColor(const std::string& color); 115 }; 116 117 } // namespace led 118 } // namespace phosphor 119