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 * @param[in] group - Pointer to Group object 52 * @param[in] value - true: start lamptest 53 * false: stop lamptest 54 * @return 55 */ 56 void requestHandler(Group* group, bool value); 57 58 /** @brief Update physical LEDs states during lamp test and the lamp test is 59 * running 60 * 61 * @param[in] ledsAssert - LEDs that are to be asserted newly or to a 62 * different state 63 * @param[in] ledsDeAssert - LEDs that are to be Deasserted 64 * 65 * @return Is running lamp test, true running 66 */ 67 bool processLEDUpdates(const Manager::group& ledsAssert, 68 const Manager::group& ledsDeAssert); 69 70 private: 71 /** @brief Timer used for LEDs lamp test period */ 72 sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic> timer; 73 74 /** @brief Reference to Manager object */ 75 Manager& manager; 76 77 /** DBusHandler class handles the D-Bus operations */ 78 DBusHandler dBusHandler; 79 80 /** @brief Pointer to Group object */ 81 Group* groupObj; 82 83 /** all the Physical paths */ 84 std::vector<std::string> physicalLEDPaths; 85 86 /** @brief Queue to save LED states during lamp test */ 87 std::queue<std::pair<Manager::group, Manager::group>> 88 updatedLEDsDuringLampTest; 89 90 /** @brief Get state of the lamp test operation */ 91 bool isLampTestRunning{false}; 92 93 /** @brief Physical LED states prior to lamp test */ 94 Manager::group physicalLEDStatesPriorToLampTest; 95 96 /** @brief Vector of names of physical LEDs, whose changes will be forcibly 97 * updated even during lamp test. */ 98 std::vector<std::string> forceUpdateLEDs; 99 100 /** @brief Vector of names of physical LEDs, that will be exempted from lamp 101 * test */ 102 std::vector<std::string> skipUpdateLEDs; 103 104 /** @brief Start and restart lamp test depending on what is the current 105 * state. */ 106 void start(); 107 108 /** @brief Stop lamp test. */ 109 void stop(); 110 111 /** @brief This method gets called when the lamp test procedure is done as 112 * part of timeout. */ 113 void timeOutHandler(); 114 115 /** @brief Restore the physical LEDs states after the lamp test finishes */ 116 void restorePhysicalLedStates(); 117 118 /** @brief Store the physical LEDs states before the lamp test start */ 119 void storePhysicalLEDsStates(); 120 121 /** @brief Returns action enum based on string 122 * 123 * @param[in] str - Action string 124 * 125 * @return enumeration equivalent of the passed in string 126 */ 127 Layout::Action getActionFromString(const std::string& str); 128 129 /** @brief Notify PHYP to start / stop the lamp test 130 * 131 * @param[in] value - the Asserted property value 132 */ 133 void doHostLampTest(bool value); 134 135 /** @brief Get physical LED names from lamp test JSON config file 136 * 137 * @param[in] path - path of LED JSON file 138 * 139 * return 140 */ 141 void getPhysicalLEDNamesFromJson(const fs::path& path); 142 }; 143 144 } // namespace led 145 } // namespace phosphor 146