xref: /openbmc/bmcweb/redfish-core/lib/led.hpp (revision c6178aba)
1 /*
2 // Copyright (c) 2019 Intel Corporation
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 */
16 #pragma once
17 
18 #include "app.hpp"
19 #include "async_resp.hpp"
20 #include "dbus_utility.hpp"
21 #include "generated/enums/chassis.hpp"
22 #include "redfish_util.hpp"
23 
24 #include <sdbusplus/asio/property.hpp>
25 
26 namespace redfish
27 {
28 /**
29  * @brief Retrieves identify led group properties over dbus
30  *
31  * @param[in] asyncResp     Shared pointer for generating response message.
32  *
33  * @return None.
34  */
35 // TODO (Gunnar): Remove IndicatorLED after enough time has passed
36 inline void
37     getIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
38 {
39     BMCWEB_LOG_DEBUG("Get led groups");
40     sdbusplus::asio::getProperty<bool>(
41         *crow::connections::systemBus, "xyz.openbmc_project.LED.GroupManager",
42         "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
43         "xyz.openbmc_project.Led.Group", "Asserted",
44         [asyncResp](const boost::system::error_code& ec, const bool blinking) {
45             // Some systems may not have enclosure_identify_blink object so
46             // proceed to get enclosure_identify state.
47             if (ec == boost::system::errc::invalid_argument)
48             {
49                 BMCWEB_LOG_DEBUG(
50                     "Get identity blinking LED failed, mismatch in property type");
51                 messages::internalError(asyncResp->res);
52                 return;
53             }
54 
55             // Blinking ON, no need to check enclosure_identify assert.
56             if (!ec && blinking)
57             {
58                 asyncResp->res.jsonValue["IndicatorLED"] =
59                     chassis::IndicatorLED::Blinking;
60                 return;
61             }
62 
63             sdbusplus::asio::getProperty<bool>(
64                 *crow::connections::systemBus,
65                 "xyz.openbmc_project.LED.GroupManager",
66                 "/xyz/openbmc_project/led/groups/enclosure_identify",
67                 "xyz.openbmc_project.Led.Group", "Asserted",
68                 [asyncResp](const boost::system::error_code& ec2,
69                             const bool ledOn) {
70                     if (ec2 == boost::system::errc::invalid_argument)
71                     {
72                         BMCWEB_LOG_DEBUG(
73                             "Get enclosure identity led failed, mismatch in property type");
74                         messages::internalError(asyncResp->res);
75                         return;
76                     }
77 
78                     if (ec2)
79                     {
80                         return;
81                     }
82 
83                     if (ledOn)
84                     {
85                         asyncResp->res.jsonValue["IndicatorLED"] =
86                             chassis::IndicatorLED::Lit;
87                     }
88                     else
89                     {
90                         asyncResp->res.jsonValue["IndicatorLED"] =
91                             chassis::IndicatorLED::Off;
92                     }
93                 });
94         });
95 }
96 
97 /**
98  * @brief Sets identify led group properties
99  *
100  * @param[in] asyncResp     Shared pointer for generating response message.
101  * @param[in] ledState  LED state passed from request
102  *
103  * @return None.
104  */
105 // TODO (Gunnar): Remove IndicatorLED after enough time has passed
106 inline void
107     setIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
108                          const std::string& ledState)
109 {
110     BMCWEB_LOG_DEBUG("Set led groups");
111     bool ledOn = false;
112     bool ledBlinkng = false;
113 
114     if (ledState == "Lit")
115     {
116         ledOn = true;
117     }
118     else if (ledState == "Blinking")
119     {
120         ledBlinkng = true;
121     }
122     else if (ledState != "Off")
123     {
124         messages::propertyValueNotInList(asyncResp->res, ledState,
125                                          "IndicatorLED");
126         return;
127     }
128 
129     sdbusplus::asio::setProperty(
130         *crow::connections::systemBus, "xyz.openbmc_project.LED.GroupManager",
131         "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
132         "xyz.openbmc_project.Led.Group", "Asserted", ledBlinkng,
133         [asyncResp, ledOn,
134          ledBlinkng](const boost::system::error_code& ec) mutable {
135             if (ec)
136             {
137                 // Some systems may not have enclosure_identify_blink object so
138                 // Lets set enclosure_identify state to true if Blinking is
139                 // true.
140                 if (ledBlinkng)
141                 {
142                     ledOn = true;
143                 }
144             }
145             setDbusProperty(
146                 asyncResp, "IndicatorLED",
147                 "xyz.openbmc_project.LED.GroupManager",
148                 sdbusplus::message::object_path(
149                     "/xyz/openbmc_project/led/groups/enclosure_identify"),
150                 "xyz.openbmc_project.Led.Group", "Asserted", ledBlinkng);
151         });
152 }
153 
154 /**
155  * @brief Retrieves identify system led group properties over dbus
156  *
157  * @param[in] asyncResp     Shared pointer for generating response message.
158  *
159  * @return None.
160  */
161 inline void getSystemLocationIndicatorActive(
162     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
163 {
164     BMCWEB_LOG_DEBUG("Get LocationIndicatorActive");
165     sdbusplus::asio::getProperty<bool>(
166         *crow::connections::systemBus, "xyz.openbmc_project.LED.GroupManager",
167         "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
168         "xyz.openbmc_project.Led.Group", "Asserted",
169         [asyncResp](const boost::system::error_code& ec, const bool blinking) {
170             // Some systems may not have enclosure_identify_blink object so
171             // proceed to get enclosure_identify state.
172             if (ec == boost::system::errc::invalid_argument)
173             {
174                 BMCWEB_LOG_DEBUG(
175                     "Get identity blinking LED failed, mismatch in property type");
176                 messages::internalError(asyncResp->res);
177                 return;
178             }
179 
180             // Blinking ON, no need to check enclosure_identify assert.
181             if (!ec && blinking)
182             {
183                 asyncResp->res.jsonValue["LocationIndicatorActive"] = true;
184                 return;
185             }
186 
187             sdbusplus::asio::getProperty<bool>(
188                 *crow::connections::systemBus,
189                 "xyz.openbmc_project.LED.GroupManager",
190                 "/xyz/openbmc_project/led/groups/enclosure_identify",
191                 "xyz.openbmc_project.Led.Group", "Asserted",
192                 [asyncResp](const boost::system::error_code& ec2,
193                             const bool ledOn) {
194                     if (ec2 == boost::system::errc::invalid_argument)
195                     {
196                         BMCWEB_LOG_DEBUG(
197                             "Get enclosure identity led failed, mismatch in property type");
198                         messages::internalError(asyncResp->res);
199                         return;
200                     }
201 
202                     if (ec2)
203                     {
204                         return;
205                     }
206 
207                     asyncResp->res.jsonValue["LocationIndicatorActive"] = ledOn;
208                 });
209         });
210 }
211 
212 /**
213  * @brief Sets identify system led group properties
214  *
215  * @param[in] asyncResp     Shared pointer for generating response message.
216  * @param[in] ledState  LED state passed from request
217  *
218  * @return None.
219  */
220 inline void setSystemLocationIndicatorActive(
221     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, const bool ledState)
222 {
223     BMCWEB_LOG_DEBUG("Set LocationIndicatorActive");
224 
225     sdbusplus::asio::setProperty(
226         *crow::connections::systemBus, "xyz.openbmc_project.LED.GroupManager",
227         "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
228         "xyz.openbmc_project.Led.Group", "Asserted", ledState,
229         [asyncResp, ledState](const boost::system::error_code& ec) {
230             if (ec)
231             {
232                 // Some systems may not have enclosure_identify_blink object so
233                 // lets set enclosure_identify state also if
234                 // enclosure_identify_blink failed
235                 setDbusProperty(
236                     asyncResp, "LocationIndicatorActive",
237                     "xyz.openbmc_project.LED.GroupManager",
238                     sdbusplus::message::object_path(
239                         "/xyz/openbmc_project/led/groups/enclosure_identify"),
240                     "xyz.openbmc_project.Led.Group", "Asserted", ledState);
241             }
242         });
243 }
244 } // namespace redfish
245