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