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 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
setIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp> & asyncResp,const std::string & ledState)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 */
getSystemLocationIndicatorActive(const std::shared_ptr<bmcweb::AsyncResp> & asyncResp)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 */
setSystemLocationIndicatorActive(const std::shared_ptr<bmcweb::AsyncResp> & asyncResp,const bool ledState)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