blob: 0de9082caf572cbc15079b8f74739813f8e7e1be [file] [log] [blame]
George Liuc777bef2020-11-23 17:04:21 +08001#pragma once
2
George Liu82150322021-03-03 17:13:13 +08003#include "config.h"
4
George Liu87fd11c2020-11-23 16:40:14 +08005#include "group.hpp"
George Liuc777bef2020-11-23 17:04:21 +08006#include "manager.hpp"
7
George Liu82150322021-03-03 17:13:13 +08008#include <nlohmann/json.hpp>
George Liuc777bef2020-11-23 17:04:21 +08009#include <sdeventplus/utility/timer.hpp>
10
George Liub6151622020-11-23 18:16:18 +080011#include <queue>
George Liuc777bef2020-11-23 17:04:21 +080012#include <vector>
13
14namespace phosphor
15{
16namespace led
17{
18
19/** @class LampTest
20 * @brief Manager LampTest feature
21 */
22class 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)),
George Liu87fd11c2020-11-23 16:40:14 +080042 manager(manager), groupObj(NULL)
George Liu82150322021-03-03 17:13:13 +080043 {
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 }
George Liuc777bef2020-11-23 17:04:21 +080048
49 /** @brief the lamp test request handler
50 *
PriyangaRamasamy180090c2022-10-10 10:50:52 +053051 * 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 *
George Liu87fd11c2020-11-23 16:40:14 +080056 * @param[in] group - Pointer to Group object
George Liuc777bef2020-11-23 17:04:21 +080057 * @param[in] value - true: start lamptest
58 * false: stop lamptest
PriyangaRamasamy180090c2022-10-10 10:50:52 +053059 *
60 * @return Whether lamp test request is handled successfully or not.
George Liuc777bef2020-11-23 17:04:21 +080061 */
PriyangaRamasamy180090c2022-10-10 10:50:52 +053062 bool requestHandler(Group* group, bool value);
George Liuc777bef2020-11-23 17:04:21 +080063
George Liub6151622020-11-23 18:16:18 +080064 /** @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 */
Patrick Williams158b2c12022-03-17 05:57:44 -050073 bool processLEDUpdates(const ActionSet& ledsAssert,
74 const ActionSet& ledsDeAssert);
George Liub6151622020-11-23 18:16:18 +080075
George Liuc777bef2020-11-23 17:04:21 +080076 private:
77 /** @brief Timer used for LEDs lamp test period */
78 sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic> timer;
79
80 /** @brief Reference to Manager object */
81 Manager& manager;
82
George Liu87fd11c2020-11-23 16:40:14 +080083 /** DBusHandler class handles the D-Bus operations */
84 DBusHandler dBusHandler;
85
86 /** @brief Pointer to Group object */
87 Group* groupObj;
88
89 /** all the Physical paths */
90 std::vector<std::string> physicalLEDPaths;
91
George Liub6151622020-11-23 18:16:18 +080092 /** @brief Queue to save LED states during lamp test */
Patrick Williams158b2c12022-03-17 05:57:44 -050093 std::queue<std::pair<ActionSet, ActionSet>> updatedLEDsDuringLampTest;
George Liub6151622020-11-23 18:16:18 +080094
95 /** @brief Get state of the lamp test operation */
96 bool isLampTestRunning{false};
97
98 /** @brief Physical LED states prior to lamp test */
Patrick Williams158b2c12022-03-17 05:57:44 -050099 ActionSet physicalLEDStatesPriorToLampTest;
George Liub6151622020-11-23 18:16:18 +0800100
George Liu82150322021-03-03 17:13:13 +0800101 /** @brief Vector of names of physical LEDs, whose changes will be forcibly
102 * updated even during lamp test. */
103 std::vector<std::string> forceUpdateLEDs;
104
105 /** @brief Vector of names of physical LEDs, that will be exempted from lamp
106 * test */
107 std::vector<std::string> skipUpdateLEDs;
108
George Liuc777bef2020-11-23 17:04:21 +0800109 /** @brief Start and restart lamp test depending on what is the current
110 * state. */
111 void start();
112
113 /** @brief Stop lamp test. */
114 void stop();
115
116 /** @brief This method gets called when the lamp test procedure is done as
117 * part of timeout. */
118 void timeOutHandler();
George Liub6151622020-11-23 18:16:18 +0800119
120 /** @brief Restore the physical LEDs states after the lamp test finishes */
121 void restorePhysicalLedStates();
122
123 /** @brief Store the physical LEDs states before the lamp test start */
124 void storePhysicalLEDsStates();
125
126 /** @brief Returns action enum based on string
127 *
128 * @param[in] str - Action string
129 *
130 * @return enumeration equivalent of the passed in string
131 */
132 Layout::Action getActionFromString(const std::string& str);
George Liuce4d1c52021-01-25 11:32:37 +0800133
PriyangaRamasamy180090c2022-10-10 10:50:52 +0530134 /** @brief Notify host to start / stop the lamp test
George Liuce4d1c52021-01-25 11:32:37 +0800135 *
136 * @param[in] value - the Asserted property value
137 */
138 void doHostLampTest(bool value);
George Liu82150322021-03-03 17:13:13 +0800139
140 /** @brief Get physical LED names from lamp test JSON config file
141 *
142 * @param[in] path - path of LED JSON file
143 *
144 * return
145 */
146 void getPhysicalLEDNamesFromJson(const fs::path& path);
George Liuc777bef2020-11-23 17:04:21 +0800147};
148
149} // namespace led
150} // namespace phosphor