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 ActionSet& ledsAssert, 68 const ActionSet& 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<ActionSet, ActionSet>> updatedLEDsDuringLampTest; 88 89 /** @brief Get state of the lamp test operation */ 90 bool isLampTestRunning{false}; 91 92 /** @brief Physical LED states prior to lamp test */ 93 ActionSet physicalLEDStatesPriorToLampTest; 94 95 /** @brief Vector of names of physical LEDs, whose changes will be forcibly 96 * updated even during lamp test. */ 97 std::vector<std::string> forceUpdateLEDs; 98 99 /** @brief Vector of names of physical LEDs, that will be exempted from lamp 100 * test */ 101 std::vector<std::string> skipUpdateLEDs; 102 103 /** @brief Start and restart lamp test depending on what is the current 104 * state. */ 105 void start(); 106 107 /** @brief Stop lamp test. */ 108 void stop(); 109 110 /** @brief This method gets called when the lamp test procedure is done as 111 * part of timeout. */ 112 void timeOutHandler(); 113 114 /** @brief Restore the physical LEDs states after the lamp test finishes */ 115 void restorePhysicalLedStates(); 116 117 /** @brief Store the physical LEDs states before the lamp test start */ 118 void storePhysicalLEDsStates(); 119 120 /** @brief Returns action enum based on string 121 * 122 * @param[in] str - Action string 123 * 124 * @return enumeration equivalent of the passed in string 125 */ 126 Layout::Action getActionFromString(const std::string& str); 127 128 /** @brief Notify PHYP to start / stop the lamp test 129 * 130 * @param[in] value - the Asserted property value 131 */ 132 void doHostLampTest(bool value); 133 134 /** @brief Get physical LED names from lamp test JSON config file 135 * 136 * @param[in] path - path of LED JSON file 137 * 138 * return 139 */ 140 void getPhysicalLEDNamesFromJson(const fs::path& path); 141 }; 142 143 } // namespace led 144 } // namespace phosphor 145