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