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