1 #pragma once 2 3 #include "config.h" 4 5 #include "group.hpp" 6 #include "manager.hpp" 7 8 #include <nlohmann/json.hpp> 9 #include <sdeventplus/utility/timer.hpp> 10 11 #include <queue> 12 #include <vector> 13 14 namespace phosphor 15 { 16 namespace led 17 { 18 19 /** @class LampTest 20 * @brief Manager LampTest feature 21 */ 22 class LampTest 23 { 24 public: 25 LampTest() = delete; 26 ~LampTest() = default; 27 LampTest(const LampTest&) = delete; 28 LampTest& operator=(const LampTest&) = delete; 29 LampTest(LampTest&&) = default; 30 LampTest& operator=(LampTest&&) = default; 31 32 /** @brief Constructs LED LampTest 33 * 34 * Constructs timer and when the timeout occurs, the stop method is called 35 * back to stop timer and also end the lamp test. 36 * 37 * @param[in] event - sd event handler 38 * @param[in] manager - reference to manager instance 39 */ 40 LampTest(const sdeventplus::Event& event, Manager& manager) : 41 timer(event, std::bind(std::mem_fn(&LampTest::timeOutHandler), this)), 42 manager(manager), groupObj(NULL) 43 { 44 // Get the force update and/or skipped physical LEDs names from the 45 // lamp-test-led-overrides.json file during lamp 46 getPhysicalLEDNamesFromJson(LAMP_TEST_LED_OVERRIDES_JSON); 47 } 48 49 /** @brief the lamp test request handler 50 * 51 * If lamp test is running (Asserted=true) and if user requests to stop lamp 52 * test (Asserted input=false), Stop operation will not take place and set 53 * the Asserted to true itself. LampTest Asserted is/can be set to false 54 * only when the lamptest timer expires. 55 * 56 * @param[in] group - Pointer to Group object 57 * @param[in] value - true: start lamptest 58 * false: stop lamptest 59 * 60 * @return Whether lamp test request is handled successfully or not. 61 */ 62 bool requestHandler(Group* group, bool value); 63 64 /** @brief Update physical LEDs states during lamp test and the lamp test is 65 * running 66 * 67 * @param[in] ledsAssert - LEDs that are to be asserted newly or to a 68 * different state 69 * @param[in] ledsDeAssert - LEDs that are to be Deasserted 70 * 71 * @return Is running lamp test, true running 72 */ 73 bool processLEDUpdates(const ActionSet& ledsAssert, 74 const ActionSet& ledsDeAssert); 75 76 /** @brief Clear LEDs triggered by lamptest 77 * When system reboots during lamptest, leds triggered by lamptest needs to 78 * be cleared in the upcoming boot. This method clears all the leds along 79 * with the persisted lamp test indicator file so that there is no sign of 80 * lamptest. 81 */ 82 void clearLamps(); 83 84 private: 85 /** @brief Timer used for LEDs lamp test period */ 86 sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic> timer; 87 88 /** @brief Reference to Manager object */ 89 Manager& manager; 90 91 /** DBusHandler class handles the D-Bus operations */ 92 DBusHandler dBusHandler; 93 94 /** @brief Pointer to Group object */ 95 Group* groupObj; 96 97 /** all the Physical paths */ 98 std::vector<std::string> physicalLEDPaths; 99 100 /** @brief Queue to save LED states during lamp test */ 101 std::queue<std::pair<ActionSet, ActionSet>> updatedLEDsDuringLampTest; 102 103 /** @brief Get state of the lamp test operation */ 104 bool isLampTestRunning{false}; 105 106 /** @brief Physical LED states prior to lamp test */ 107 ActionSet physicalLEDStatesPriorToLampTest; 108 109 /** @brief Vector of names of physical LEDs, whose changes will be forcibly 110 * updated even during lamp test. */ 111 std::vector<std::string> forceUpdateLEDs; 112 113 /** @brief Vector of names of physical LEDs, that will be exempted from lamp 114 * test */ 115 std::vector<std::string> skipUpdateLEDs; 116 117 /** @brief Start and restart lamp test depending on what is the current 118 * state. */ 119 void start(); 120 121 /** @brief Stop lamp test. */ 122 void stop(); 123 124 /** @brief This method gets called when the lamp test procedure is done as 125 * part of timeout. */ 126 void timeOutHandler(); 127 128 /** @brief Restore the physical LEDs states after the lamp test finishes */ 129 void restorePhysicalLedStates(); 130 131 /** @brief Store the physical LEDs states before the lamp test start */ 132 void storePhysicalLEDsStates(); 133 134 /** @brief Returns action enum based on string 135 * 136 * @param[in] str - Action string 137 * 138 * @return enumeration equivalent of the passed in string 139 */ 140 Layout::Action getActionFromString(const std::string& str); 141 142 /** @brief Notify host to start / stop the lamp test 143 * 144 * @param[in] value - the Asserted property value 145 */ 146 void doHostLampTest(bool value); 147 148 /** @brief Get physical LED names from lamp test JSON config file 149 * 150 * @param[in] path - path of LED JSON file 151 * 152 * return 153 */ 154 void getPhysicalLEDNamesFromJson(const fs::path& path); 155 }; 156 157 } // namespace led 158 } // namespace phosphor 159