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] 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, 125 ledBlinkng](const boost::system::error_code& ec) mutable { 126 if (ec) 127 { 128 // Some systems may not have enclosure_identify_blink object so 129 // Lets set enclosure_identify state to true if Blinking is 130 // true. 131 if (ledBlinkng) 132 { 133 ledOn = true; 134 } 135 } 136 crow::connections::systemBus->async_method_call( 137 [aResp](const boost::system::error_code& ec2) { 138 if (ec2) 139 { 140 BMCWEB_LOG_DEBUG << "DBUS response error " << ec2; 141 messages::internalError(aResp->res); 142 return; 143 } 144 messages::success(aResp->res); 145 }, 146 "xyz.openbmc_project.LED.GroupManager", 147 "/xyz/openbmc_project/led/groups/enclosure_identify", 148 "org.freedesktop.DBus.Properties", "Set", 149 "xyz.openbmc_project.Led.Group", "Asserted", 150 dbus::utility::DbusVariantType(ledOn)); 151 }, 152 "xyz.openbmc_project.LED.GroupManager", 153 "/xyz/openbmc_project/led/groups/enclosure_identify_blink", 154 "org.freedesktop.DBus.Properties", "Set", 155 "xyz.openbmc_project.Led.Group", "Asserted", 156 dbus::utility::DbusVariantType(ledBlinkng)); 157 } 158 159 /** 160 * @brief Retrieves identify led group properties over dbus 161 * 162 * @param[in] aResp Shared pointer for generating response message. 163 * 164 * @return None. 165 */ 166 inline void 167 getLocationIndicatorActive(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 168 { 169 BMCWEB_LOG_DEBUG << "Get LocationIndicatorActive"; 170 sdbusplus::asio::getProperty<bool>( 171 *crow::connections::systemBus, "xyz.openbmc_project.LED.GroupManager", 172 "/xyz/openbmc_project/led/groups/enclosure_identify_blink", 173 "xyz.openbmc_project.Led.Group", "Asserted", 174 [aResp](const boost::system::error_code& ec, const bool blinking) { 175 // Some systems may not have enclosure_identify_blink object so 176 // proceed to get enclosure_identify state. 177 if (ec == boost::system::errc::invalid_argument) 178 { 179 BMCWEB_LOG_DEBUG 180 << "Get identity blinking LED failed, missmatch in property type"; 181 messages::internalError(aResp->res); 182 return; 183 } 184 185 // Blinking ON, no need to check enclosure_identify assert. 186 if (!ec && blinking) 187 { 188 aResp->res.jsonValue["LocationIndicatorActive"] = true; 189 return; 190 } 191 192 sdbusplus::asio::getProperty<bool>( 193 *crow::connections::systemBus, 194 "xyz.openbmc_project.LED.GroupManager", 195 "/xyz/openbmc_project/led/groups/enclosure_identify", 196 "xyz.openbmc_project.Led.Group", "Asserted", 197 [aResp](const boost::system::error_code& ec2, const bool ledOn) { 198 if (ec2 == boost::system::errc::invalid_argument) 199 { 200 BMCWEB_LOG_DEBUG 201 << "Get enclosure identity led failed, missmatch in property type"; 202 messages::internalError(aResp->res); 203 return; 204 } 205 206 if (ec2) 207 { 208 return; 209 } 210 211 aResp->res.jsonValue["LocationIndicatorActive"] = ledOn; 212 }); 213 }); 214 } 215 216 /** 217 * @brief Sets identify led group properties 218 * 219 * @param[in] aResp Shared pointer for generating response message. 220 * @param[in] ledState LED state passed from request 221 * 222 * @return None. 223 */ 224 inline void 225 setLocationIndicatorActive(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 226 const bool ledState) 227 { 228 BMCWEB_LOG_DEBUG << "Set LocationIndicatorActive"; 229 230 crow::connections::systemBus->async_method_call( 231 [aResp, ledState](const boost::system::error_code& ec) mutable { 232 if (ec) 233 { 234 // Some systems may not have enclosure_identify_blink object so 235 // lets set enclosure_identify state also if 236 // enclosure_identify_blink failed 237 crow::connections::systemBus->async_method_call( 238 [aResp](const boost::system::error_code& ec2) { 239 if (ec2) 240 { 241 BMCWEB_LOG_DEBUG << "DBUS response error " << ec2; 242 messages::internalError(aResp->res); 243 return; 244 } 245 }, 246 "xyz.openbmc_project.LED.GroupManager", 247 "/xyz/openbmc_project/led/groups/enclosure_identify", 248 "org.freedesktop.DBus.Properties", "Set", 249 "xyz.openbmc_project.Led.Group", "Asserted", 250 dbus::utility::DbusVariantType(ledState)); 251 } 252 }, 253 "xyz.openbmc_project.LED.GroupManager", 254 "/xyz/openbmc_project/led/groups/enclosure_identify_blink", 255 "org.freedesktop.DBus.Properties", "Set", 256 "xyz.openbmc_project.Led.Group", "Asserted", 257 dbus::utility::DbusVariantType(ledState)); 258 } 259 } // namespace redfish 260