blob: d69667af8c1109fb310fae53841f762321bb62b4 [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 *
George Liu87fd11c2020-11-23 16:40:14 +080051 * @param[in] group - Pointer to Group object
George Liuc777bef2020-11-23 17:04:21 +080052 * @param[in] value - true: start lamptest
53 * false: stop lamptest
54 * @return
55 */
George Liu87fd11c2020-11-23 16:40:14 +080056 void requestHandler(Group* group, bool value);
George Liuc777bef2020-11-23 17:04:21 +080057
George Liub6151622020-11-23 18:16:18 +080058 /** @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
George Liuc777bef2020-11-23 17:04:21 +080070 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
George Liu87fd11c2020-11-23 16:40:14 +080077 /** 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
George Liub6151622020-11-23 18:16:18 +080086 /** @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
George Liu82150322021-03-03 17:13:13 +080096 /** @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
George Liuc777bef2020-11-23 17:04:21 +0800104 /** @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();
George Liub6151622020-11-23 18:16:18 +0800114
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);
George Liuce4d1c52021-01-25 11:32:37 +0800128
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);
George Liu82150322021-03-03 17:13:13 +0800134
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);
George Liuc777bef2020-11-23 17:04:21 +0800142};
143
144} // namespace led
145} // namespace phosphor