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