xref: /openbmc/phosphor-led-manager/manager/lamptest/lamptest.hpp (revision f05925599f7ad2b07e326eb3413a488ce21bd1c6)
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&&) = delete;
30     LampTest& operator=(LampTest&&) = delete;
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      */
LampTest(const sdeventplus::Event & event,Manager & manager)40     LampTest(const sdeventplus::Event& event, Manager& manager) :
41         timer(event, [this](auto&) { timeOutHandler(); }), manager(manager),
42         groupObj(nullptr)
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      * 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      *
56      *  @param[in]  group    -  Pointer to Group object
57      *  @param[in]  value    -  true: start lamptest
58      *                          false: stop lamptest
59      *
60      *  @return Whether lamp test request is handled successfully or not.
61      */
62     bool requestHandler(Group* group, bool value);
63 
64     /** @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      */
73     bool processLEDUpdates(const ActionSet& ledsAssert,
74                            const ActionSet& ledsDeAssert);
75 
76     /** @brief Clear LEDs triggered by lamptest
77      * When system reboots during lamptest, leds triggered by lamptest needs to
78      * be cleared in the upcoming boot. This method clears all the leds along
79      * with the persisted lamp test indicator file so that there is no sign of
80      * lamptest.
81      */
82     static void clearLamps();
83 
84   private:
85     /** @brief Timer used for LEDs lamp test period */
86     sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic> timer;
87 
88     /** @brief Reference to Manager object */
89     Manager& manager;
90 
91     /** @brief Pointer to Group object */
92     Group* groupObj;
93 
94     /** all the Physical paths */
95     std::vector<std::string> physicalLEDPaths;
96 
97     /** @brief Queue to save LED states during lamp test */
98     std::queue<std::pair<ActionSet, ActionSet>> updatedLEDsDuringLampTest;
99 
100     /** @brief Get state of the lamp test operation */
101     bool isLampTestRunning{false};
102 
103     /** @brief Physical LED states prior to lamp test */
104     ActionSet physicalLEDStatesPriorToLampTest;
105 
106     /** @brief Vector of names of physical LEDs, whose changes will be forcibly
107      *         updated even during lamp test. */
108     std::vector<std::string> forceUpdateLEDs;
109 
110     /** @brief Vector of names of physical LEDs, that will be exempted from lamp
111      *         test */
112     std::vector<std::string> skipUpdateLEDs;
113 
114     /** @brief Start and restart lamp test depending on what is the current
115      *         state. */
116     void start();
117 
118     /** @brief Stop lamp test. */
119     void stop();
120 
121     /** @brief This method gets called when the lamp test procedure is done as
122      *         part of timeout. */
123     void timeOutHandler();
124 
125     /** @brief Restore the physical LEDs states after the lamp test finishes */
126     void restorePhysicalLedStates();
127 
128     /** @brief Store the physical LEDs states before the lamp test start */
129     void storePhysicalLEDsStates();
130 
131     /** @brief Returns action enum based on string
132      *
133      *  @param[in]  str - Action string
134      *
135      *  @return enumeration equivalent of the passed in string
136      */
137     static Layout::Action getActionFromString(const std::string& str);
138 
139     /** @brief Notify host to start / stop the lamp test
140      *
141      *  @param[in]  value   -  the Asserted property value
142      */
143     static void doHostLampTest(bool value);
144 
145     /** @brief Get physical LED names from lamp test JSON config file
146      *
147      *  @param[in]  path - path of LED JSON file
148      *
149      *  return
150      */
151     void getPhysicalLEDNamesFromJson(const fs::path& path);
152 };
153 
154 } // namespace led
155 } // namespace phosphor
156