xref: /openbmc/bmcweb/redfish-core/lib/led.hpp (revision 08bbe119)
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 "redfish_util.hpp"
22 
23 #include <sdbusplus/asio/property.hpp>
24 
25 namespace redfish
26 {
27 /**
28  * @brief Retrieves identify led group properties over dbus
29  *
30  * @param[in] asyncResp     Shared pointer for generating response message.
31  *
32  * @return None.
33  */
34 // TODO (Gunnar): Remove IndicatorLED after enough time has passed
35 inline void
36     getIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
37 {
38     BMCWEB_LOG_DEBUG << "Get led groups";
39     sdbusplus::asio::getProperty<bool>(
40         *crow::connections::systemBus, "xyz.openbmc_project.LED.GroupManager",
41         "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
42         "xyz.openbmc_project.Led.Group", "Asserted",
43         [asyncResp](const boost::system::error_code& ec, const bool blinking) {
44         // Some systems may not have enclosure_identify_blink object so
45         // proceed to get enclosure_identify state.
46         if (ec == boost::system::errc::invalid_argument)
47         {
48             BMCWEB_LOG_DEBUG
49                 << "Get identity blinking LED failed, missmatch in property type";
50             messages::internalError(asyncResp->res);
51             return;
52         }
53 
54         // Blinking ON, no need to check enclosure_identify assert.
55         if (!ec && blinking)
56         {
57             asyncResp->res.jsonValue["IndicatorLED"] = "Blinking";
58             return;
59         }
60 
61         sdbusplus::asio::getProperty<bool>(
62             *crow::connections::systemBus,
63             "xyz.openbmc_project.LED.GroupManager",
64             "/xyz/openbmc_project/led/groups/enclosure_identify",
65             "xyz.openbmc_project.Led.Group", "Asserted",
66             [asyncResp](const boost::system::error_code& ec2,
67                         const bool ledOn) {
68             if (ec2 == boost::system::errc::invalid_argument)
69             {
70                 BMCWEB_LOG_DEBUG
71                     << "Get enclosure identity led failed, missmatch in property type";
72                 messages::internalError(asyncResp->res);
73                 return;
74             }
75 
76             if (ec2)
77             {
78                 return;
79             }
80 
81             if (ledOn)
82             {
83                 asyncResp->res.jsonValue["IndicatorLED"] = "Lit";
84             }
85             else
86             {
87                 asyncResp->res.jsonValue["IndicatorLED"] = "Off";
88             }
89             });
90         });
91 }
92 
93 /**
94  * @brief Sets identify led group properties
95  *
96  * @param[in] asyncResp     Shared pointer for generating response message.
97  * @param[in] ledState  LED state passed from request
98  *
99  * @return None.
100  */
101 // TODO (Gunnar): Remove IndicatorLED after enough time has passed
102 inline void
103     setIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
104                          const std::string& ledState)
105 {
106     BMCWEB_LOG_DEBUG << "Set led groups";
107     bool ledOn = false;
108     bool ledBlinkng = false;
109 
110     if (ledState == "Lit")
111     {
112         ledOn = true;
113     }
114     else if (ledState == "Blinking")
115     {
116         ledBlinkng = true;
117     }
118     else if (ledState != "Off")
119     {
120         messages::propertyValueNotInList(asyncResp->res, ledState,
121                                          "IndicatorLED");
122         return;
123     }
124 
125     crow::connections::systemBus->async_method_call(
126         [asyncResp, ledOn,
127          ledBlinkng](const boost::system::error_code& ec) mutable {
128         if (ec)
129         {
130             // Some systems may not have enclosure_identify_blink object so
131             // Lets set enclosure_identify state to true if Blinking is
132             // true.
133             if (ledBlinkng)
134             {
135                 ledOn = true;
136             }
137         }
138         crow::connections::systemBus->async_method_call(
139             [asyncResp](const boost::system::error_code& ec2) {
140             if (ec2)
141             {
142                 BMCWEB_LOG_DEBUG << "DBUS response error " << ec2;
143                 messages::internalError(asyncResp->res);
144                 return;
145             }
146             messages::success(asyncResp->res);
147             },
148             "xyz.openbmc_project.LED.GroupManager",
149             "/xyz/openbmc_project/led/groups/enclosure_identify",
150             "org.freedesktop.DBus.Properties", "Set",
151             "xyz.openbmc_project.Led.Group", "Asserted",
152             dbus::utility::DbusVariantType(ledOn));
153         },
154         "xyz.openbmc_project.LED.GroupManager",
155         "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
156         "org.freedesktop.DBus.Properties", "Set",
157         "xyz.openbmc_project.Led.Group", "Asserted",
158         dbus::utility::DbusVariantType(ledBlinkng));
159 }
160 
161 /**
162  * @brief Retrieves identify led group properties over dbus
163  *
164  * @param[in] asyncResp     Shared pointer for generating response message.
165  *
166  * @return None.
167  */
168 inline void getLocationIndicatorActive(
169     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
170 {
171     BMCWEB_LOG_DEBUG << "Get LocationIndicatorActive";
172     sdbusplus::asio::getProperty<bool>(
173         *crow::connections::systemBus, "xyz.openbmc_project.LED.GroupManager",
174         "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
175         "xyz.openbmc_project.Led.Group", "Asserted",
176         [asyncResp](const boost::system::error_code& ec, const bool blinking) {
177         // Some systems may not have enclosure_identify_blink object so
178         // proceed to get enclosure_identify state.
179         if (ec == boost::system::errc::invalid_argument)
180         {
181             BMCWEB_LOG_DEBUG
182                 << "Get identity blinking LED failed, missmatch in property type";
183             messages::internalError(asyncResp->res);
184             return;
185         }
186 
187         // Blinking ON, no need to check enclosure_identify assert.
188         if (!ec && blinking)
189         {
190             asyncResp->res.jsonValue["LocationIndicatorActive"] = true;
191             return;
192         }
193 
194         sdbusplus::asio::getProperty<bool>(
195             *crow::connections::systemBus,
196             "xyz.openbmc_project.LED.GroupManager",
197             "/xyz/openbmc_project/led/groups/enclosure_identify",
198             "xyz.openbmc_project.Led.Group", "Asserted",
199             [asyncResp](const boost::system::error_code& ec2,
200                         const bool ledOn) {
201             if (ec2 == boost::system::errc::invalid_argument)
202             {
203                 BMCWEB_LOG_DEBUG
204                     << "Get enclosure identity led failed, missmatch in property type";
205                 messages::internalError(asyncResp->res);
206                 return;
207             }
208 
209             if (ec2)
210             {
211                 return;
212             }
213 
214             asyncResp->res.jsonValue["LocationIndicatorActive"] = ledOn;
215             });
216         });
217 }
218 
219 /**
220  * @brief Sets identify led group properties
221  *
222  * @param[in] asyncResp     Shared pointer for generating response message.
223  * @param[in] ledState  LED state passed from request
224  *
225  * @return None.
226  */
227 inline void setLocationIndicatorActive(
228     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, const bool ledState)
229 {
230     BMCWEB_LOG_DEBUG << "Set LocationIndicatorActive";
231 
232     crow::connections::systemBus->async_method_call(
233         [asyncResp, ledState](const boost::system::error_code& ec) mutable {
234         if (ec)
235         {
236             // Some systems may not have enclosure_identify_blink object so
237             // lets set enclosure_identify state also if
238             // enclosure_identify_blink failed
239             crow::connections::systemBus->async_method_call(
240                 [asyncResp](const boost::system::error_code& ec2) {
241                 if (ec2)
242                 {
243                     BMCWEB_LOG_DEBUG << "DBUS response error " << ec2;
244                     messages::internalError(asyncResp->res);
245                     return;
246                 }
247                 },
248                 "xyz.openbmc_project.LED.GroupManager",
249                 "/xyz/openbmc_project/led/groups/enclosure_identify",
250                 "org.freedesktop.DBus.Properties", "Set",
251                 "xyz.openbmc_project.Led.Group", "Asserted",
252                 dbus::utility::DbusVariantType(ledState));
253         }
254         },
255         "xyz.openbmc_project.LED.GroupManager",
256         "/xyz/openbmc_project/led/groups/enclosure_identify_blink",
257         "org.freedesktop.DBus.Properties", "Set",
258         "xyz.openbmc_project.Led.Group", "Asserted",
259         dbus::utility::DbusVariantType(ledState));
260 }
261 } // namespace redfish
262