blob: 4c4c513a8114098283e5109fa83adece754cd834 [file] [log] [blame]
James Feist1c8fba92019-12-20 15:12:07 -08001/*
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
Ed Tanous3ccb3ad2023-01-13 17:40:03 -080018#include "app.hpp"
James Feist1c8fba92019-12-20 15:12:07 -080019#include "async_resp.hpp"
20#include "dbus_utility.hpp"
21#include "redfish_util.hpp"
22
Jonathan Doman1e1e5982021-06-11 09:36:17 -070023#include <sdbusplus/asio/property.hpp>
John Edward Broadbent7e860f12021-04-08 15:57:16 -070024
James Feist1c8fba92019-12-20 15:12:07 -080025namespace 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 */
Gunnar Mills9f8bfa72020-09-28 13:45:19 -050034// TODO (Gunnar): Remove IndicatorLED after enough time has passed
zhanghch058d1b46d2021-04-01 11:18:24 +080035inline void
36 getIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& aResp)
James Feist1c8fba92019-12-20 15:12:07 -080037{
38 BMCWEB_LOG_DEBUG << "Get led groups";
Jonathan Doman1e1e5982021-06-11 09:36:17 -070039 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) {
Ed Tanous002d39b2022-05-31 08:59:27 -070044 // 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)
James Feist1c8fba92019-12-20 15:12:07 -080068 {
Jonathan Doman1e1e5982021-06-11 09:36:17 -070069 BMCWEB_LOG_DEBUG
Ed Tanous002d39b2022-05-31 08:59:27 -070070 << "Get enclosure identity led failed, missmatch in property type";
Jonathan Doman1e1e5982021-06-11 09:36:17 -070071 messages::internalError(aResp->res);
72 return;
James Feist1c8fba92019-12-20 15:12:07 -080073 }
James Feist1c8fba92019-12-20 15:12:07 -080074
Ed Tanous002d39b2022-05-31 08:59:27 -070075 if (ec2)
Jonathan Doman1e1e5982021-06-11 09:36:17 -070076 {
Jonathan Doman1e1e5982021-06-11 09:36:17 -070077 return;
78 }
79
Ed Tanous002d39b2022-05-31 08:59:27 -070080 if (ledOn)
81 {
82 aResp->res.jsonValue["IndicatorLED"] = "Lit";
83 }
84 else
85 {
86 aResp->res.jsonValue["IndicatorLED"] = "Off";
87 }
88 });
Jonathan Doman1e1e5982021-06-11 09:36:17 -070089 });
James Feist1c8fba92019-12-20 15:12:07 -080090}
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 */
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500100// TODO (Gunnar): Remove IndicatorLED after enough time has passed
zhanghch058d1b46d2021-04-01 11:18:24 +0800101inline void
102 setIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& aResp,
103 const std::string& ledState)
James Feist1c8fba92019-12-20 15:12:07 -0800104{
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(
Ed Tanouscb13a392020-07-25 19:02:03 +0000124 [aResp, ledOn, ledBlinkng](const boost::system::error_code ec) mutable {
Ed Tanous002d39b2022-05-31 08:59:27 -0700125 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)
James Feist1c8fba92019-12-20 15:12:07 -0800131 {
Ed Tanous002d39b2022-05-31 08:59:27 -0700132 ledOn = true;
James Feist1c8fba92019-12-20 15:12:07 -0800133 }
Ed Tanous002d39b2022-05-31 08:59:27 -0700134 }
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));
James Feist1c8fba92019-12-20 15:12:07 -0800150 },
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",
Ed Tanous168e20c2021-12-13 14:39:53 -0800155 dbus::utility::DbusVariantType(ledBlinkng));
James Feist1c8fba92019-12-20 15:12:07 -0800156}
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500157
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 */
zhanghch058d1b46d2021-04-01 11:18:24 +0800165inline void
166 getLocationIndicatorActive(const std::shared_ptr<bmcweb::AsyncResp>& aResp)
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500167{
168 BMCWEB_LOG_DEBUG << "Get LocationIndicatorActive";
Jonathan Doman1e1e5982021-06-11 09:36:17 -0700169 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) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700174 // 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)
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500198 {
Jonathan Doman1e1e5982021-06-11 09:36:17 -0700199 BMCWEB_LOG_DEBUG
Ed Tanous002d39b2022-05-31 08:59:27 -0700200 << "Get enclosure identity led failed, missmatch in property type";
Jonathan Doman1e1e5982021-06-11 09:36:17 -0700201 messages::internalError(aResp->res);
202 return;
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500203 }
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500204
Ed Tanous002d39b2022-05-31 08:59:27 -0700205 if (ec2)
Jonathan Doman1e1e5982021-06-11 09:36:17 -0700206 {
Jonathan Doman1e1e5982021-06-11 09:36:17 -0700207 return;
208 }
209
Ed Tanous002d39b2022-05-31 08:59:27 -0700210 aResp->res.jsonValue["LocationIndicatorActive"] = ledOn;
211 });
Jonathan Doman1e1e5982021-06-11 09:36:17 -0700212 });
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500213}
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 */
zhanghch058d1b46d2021-04-01 11:18:24 +0800223inline void
224 setLocationIndicatorActive(const std::shared_ptr<bmcweb::AsyncResp>& aResp,
225 const bool ledState)
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500226{
227 BMCWEB_LOG_DEBUG << "Set LocationIndicatorActive";
228
229 crow::connections::systemBus->async_method_call(
230 [aResp, ledState](const boost::system::error_code ec) mutable {
Ed Tanous002d39b2022-05-31 08:59:27 -0700231 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 }
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500251 },
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",
Ed Tanous168e20c2021-12-13 14:39:53 -0800256 dbus::utility::DbusVariantType(ledState));
Gunnar Mills9f8bfa72020-09-28 13:45:19 -0500257}
Ed Tanous23a21a12020-07-25 04:45:05 +0000258} // namespace redfish