11c8fba97SJames Feist /* 21c8fba97SJames Feist // Copyright (c) 2019 Intel Corporation 31c8fba97SJames Feist // 41c8fba97SJames Feist // Licensed under the Apache License, Version 2.0 (the "License"); 51c8fba97SJames Feist // you may not use this file except in compliance with the License. 61c8fba97SJames Feist // You may obtain a copy of the License at 71c8fba97SJames Feist // 81c8fba97SJames Feist // http://www.apache.org/licenses/LICENSE-2.0 91c8fba97SJames Feist // 101c8fba97SJames Feist // Unless required by applicable law or agreed to in writing, software 111c8fba97SJames Feist // distributed under the License is distributed on an "AS IS" BASIS, 121c8fba97SJames Feist // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131c8fba97SJames Feist // See the License for the specific language governing permissions and 141c8fba97SJames Feist // limitations under the License. 151c8fba97SJames Feist */ 161c8fba97SJames Feist #pragma once 171c8fba97SJames Feist 181c8fba97SJames Feist #include "async_resp.hpp" 191c8fba97SJames Feist #include "dbus_utility.hpp" 201c8fba97SJames Feist #include "redfish_util.hpp" 211c8fba97SJames Feist 22*7e860f15SJohn Edward Broadbent #include <app.hpp> 23*7e860f15SJohn Edward Broadbent 241c8fba97SJames Feist #include <variant> 251c8fba97SJames Feist 261c8fba97SJames Feist namespace redfish 271c8fba97SJames Feist { 281c8fba97SJames Feist /** 291c8fba97SJames Feist * @brief Retrieves identify led group properties over dbus 301c8fba97SJames Feist * 311c8fba97SJames Feist * @param[in] aResp Shared pointer for generating response message. 321c8fba97SJames Feist * 331c8fba97SJames Feist * @return None. 341c8fba97SJames Feist */ 359f8bfa7cSGunnar Mills // TODO (Gunnar): Remove IndicatorLED after enough time has passed 368d1b46d7Szhanghch05 inline void 378d1b46d7Szhanghch05 getIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 381c8fba97SJames Feist { 391c8fba97SJames Feist BMCWEB_LOG_DEBUG << "Get led groups"; 401c8fba97SJames Feist crow::connections::systemBus->async_method_call( 411c8fba97SJames Feist [aResp](const boost::system::error_code ec, 421c8fba97SJames Feist const std::variant<bool> asserted) { 431c8fba97SJames Feist // Some systems may not have enclosure_identify_blink object so 441c8fba97SJames Feist // proceed to get enclosure_identify state. 451c8fba97SJames Feist if (!ec) 461c8fba97SJames Feist { 471c8fba97SJames Feist const bool* blinking = std::get_if<bool>(&asserted); 481c8fba97SJames Feist if (!blinking) 491c8fba97SJames Feist { 501c8fba97SJames Feist BMCWEB_LOG_DEBUG << "Get identity blinking LED failed"; 511c8fba97SJames Feist messages::internalError(aResp->res); 521c8fba97SJames Feist return; 531c8fba97SJames Feist } 541c8fba97SJames Feist // Blinking ON, no need to check enclosure_identify assert. 551c8fba97SJames Feist if (*blinking) 561c8fba97SJames Feist { 571c8fba97SJames Feist aResp->res.jsonValue["IndicatorLED"] = "Blinking"; 581c8fba97SJames Feist return; 591c8fba97SJames Feist } 601c8fba97SJames Feist } 611c8fba97SJames Feist crow::connections::systemBus->async_method_call( 6223a21a1cSEd Tanous [aResp](const boost::system::error_code ec2, 6323a21a1cSEd Tanous const std::variant<bool> asserted2) { 6423a21a1cSEd Tanous if (!ec2) 651c8fba97SJames Feist { 6623a21a1cSEd Tanous const bool* ledOn = std::get_if<bool>(&asserted2); 671c8fba97SJames Feist if (!ledOn) 681c8fba97SJames Feist { 691c8fba97SJames Feist BMCWEB_LOG_DEBUG 701c8fba97SJames Feist << "Get enclosure identity led failed"; 711c8fba97SJames Feist messages::internalError(aResp->res); 721c8fba97SJames Feist return; 731c8fba97SJames Feist } 741c8fba97SJames Feist 751c8fba97SJames Feist if (*ledOn) 761c8fba97SJames Feist { 771c8fba97SJames Feist aResp->res.jsonValue["IndicatorLED"] = "Lit"; 781c8fba97SJames Feist } 791c8fba97SJames Feist else 801c8fba97SJames Feist { 811c8fba97SJames Feist aResp->res.jsonValue["IndicatorLED"] = "Off"; 821c8fba97SJames Feist } 831c8fba97SJames Feist } 841c8fba97SJames Feist return; 851c8fba97SJames Feist }, 861c8fba97SJames Feist "xyz.openbmc_project.LED.GroupManager", 871c8fba97SJames Feist "/xyz/openbmc_project/led/groups/enclosure_identify", 881c8fba97SJames Feist "org.freedesktop.DBus.Properties", "Get", 891c8fba97SJames Feist "xyz.openbmc_project.Led.Group", "Asserted"); 901c8fba97SJames Feist }, 911c8fba97SJames Feist "xyz.openbmc_project.LED.GroupManager", 921c8fba97SJames Feist "/xyz/openbmc_project/led/groups/enclosure_identify_blink", 931c8fba97SJames Feist "org.freedesktop.DBus.Properties", "Get", 941c8fba97SJames Feist "xyz.openbmc_project.Led.Group", "Asserted"); 951c8fba97SJames Feist } 961c8fba97SJames Feist 971c8fba97SJames Feist /** 981c8fba97SJames Feist * @brief Sets identify led group properties 991c8fba97SJames Feist * 1001c8fba97SJames Feist * @param[in] aResp Shared pointer for generating response message. 1011c8fba97SJames Feist * @param[in] ledState LED state passed from request 1021c8fba97SJames Feist * 1031c8fba97SJames Feist * @return None. 1041c8fba97SJames Feist */ 1059f8bfa7cSGunnar Mills // TODO (Gunnar): Remove IndicatorLED after enough time has passed 1068d1b46d7Szhanghch05 inline void 1078d1b46d7Szhanghch05 setIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 1081c8fba97SJames Feist const std::string& ledState) 1091c8fba97SJames Feist { 1101c8fba97SJames Feist BMCWEB_LOG_DEBUG << "Set led groups"; 1111c8fba97SJames Feist bool ledOn = false; 1121c8fba97SJames Feist bool ledBlinkng = false; 1131c8fba97SJames Feist 1141c8fba97SJames Feist if (ledState == "Lit") 1151c8fba97SJames Feist { 1161c8fba97SJames Feist ledOn = true; 1171c8fba97SJames Feist } 1181c8fba97SJames Feist else if (ledState == "Blinking") 1191c8fba97SJames Feist { 1201c8fba97SJames Feist ledBlinkng = true; 1211c8fba97SJames Feist } 1221c8fba97SJames Feist else if (ledState != "Off") 1231c8fba97SJames Feist { 1241c8fba97SJames Feist messages::propertyValueNotInList(aResp->res, ledState, "IndicatorLED"); 1251c8fba97SJames Feist return; 1261c8fba97SJames Feist } 1271c8fba97SJames Feist 1281c8fba97SJames Feist crow::connections::systemBus->async_method_call( 129cb13a392SEd Tanous [aResp, ledOn, ledBlinkng](const boost::system::error_code ec) mutable { 1301c8fba97SJames Feist if (ec) 1311c8fba97SJames Feist { 1321c8fba97SJames Feist // Some systems may not have enclosure_identify_blink object so 1331c8fba97SJames Feist // Lets set enclosure_identify state to true if Blinking is 1341c8fba97SJames Feist // true. 1351c8fba97SJames Feist if (ledBlinkng) 1361c8fba97SJames Feist { 1371c8fba97SJames Feist ledOn = true; 1381c8fba97SJames Feist } 1391c8fba97SJames Feist } 1401c8fba97SJames Feist crow::connections::systemBus->async_method_call( 141cb13a392SEd Tanous [aResp](const boost::system::error_code ec2) { 14223a21a1cSEd Tanous if (ec2) 1431c8fba97SJames Feist { 14423a21a1cSEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec2; 1451c8fba97SJames Feist messages::internalError(aResp->res); 1461c8fba97SJames Feist return; 1471c8fba97SJames Feist } 1481d40ef69SJayaprakash Mutyala messages::success(aResp->res); 1491c8fba97SJames Feist }, 1501c8fba97SJames Feist "xyz.openbmc_project.LED.GroupManager", 1511c8fba97SJames Feist "/xyz/openbmc_project/led/groups/enclosure_identify", 1521c8fba97SJames Feist "org.freedesktop.DBus.Properties", "Set", 1531c8fba97SJames Feist "xyz.openbmc_project.Led.Group", "Asserted", 1541c8fba97SJames Feist std::variant<bool>(ledOn)); 1551c8fba97SJames Feist }, 1561c8fba97SJames Feist "xyz.openbmc_project.LED.GroupManager", 1571c8fba97SJames Feist "/xyz/openbmc_project/led/groups/enclosure_identify_blink", 1581c8fba97SJames Feist "org.freedesktop.DBus.Properties", "Set", 1591c8fba97SJames Feist "xyz.openbmc_project.Led.Group", "Asserted", 1601c8fba97SJames Feist std::variant<bool>(ledBlinkng)); 1611c8fba97SJames Feist } 1629f8bfa7cSGunnar Mills 1639f8bfa7cSGunnar Mills /** 1649f8bfa7cSGunnar Mills * @brief Retrieves identify led group properties over dbus 1659f8bfa7cSGunnar Mills * 1669f8bfa7cSGunnar Mills * @param[in] aResp Shared pointer for generating response message. 1679f8bfa7cSGunnar Mills * 1689f8bfa7cSGunnar Mills * @return None. 1699f8bfa7cSGunnar Mills */ 1708d1b46d7Szhanghch05 inline void 1718d1b46d7Szhanghch05 getLocationIndicatorActive(const std::shared_ptr<bmcweb::AsyncResp>& aResp) 1729f8bfa7cSGunnar Mills { 1739f8bfa7cSGunnar Mills BMCWEB_LOG_DEBUG << "Get LocationIndicatorActive"; 1749f8bfa7cSGunnar Mills crow::connections::systemBus->async_method_call( 1759f8bfa7cSGunnar Mills [aResp](const boost::system::error_code ec, 1769f8bfa7cSGunnar Mills const std::variant<bool> asserted) { 1779f8bfa7cSGunnar Mills // Some systems may not have enclosure_identify_blink object so 1789f8bfa7cSGunnar Mills // proceed to get enclosure_identify state. 1799f8bfa7cSGunnar Mills if (!ec) 1809f8bfa7cSGunnar Mills { 1819f8bfa7cSGunnar Mills const bool* blinking = std::get_if<bool>(&asserted); 1829f8bfa7cSGunnar Mills if (!blinking) 1839f8bfa7cSGunnar Mills { 1849f8bfa7cSGunnar Mills BMCWEB_LOG_DEBUG << "Get identity blinking LED failed"; 1859f8bfa7cSGunnar Mills messages::internalError(aResp->res); 1869f8bfa7cSGunnar Mills return; 1879f8bfa7cSGunnar Mills } 1889f8bfa7cSGunnar Mills // Blinking ON, no need to check enclosure_identify assert. 1899f8bfa7cSGunnar Mills if (*blinking) 1909f8bfa7cSGunnar Mills { 1919f8bfa7cSGunnar Mills aResp->res.jsonValue["LocationIndicatorActive"] = true; 1929f8bfa7cSGunnar Mills return; 1939f8bfa7cSGunnar Mills } 1949f8bfa7cSGunnar Mills } 1959f8bfa7cSGunnar Mills crow::connections::systemBus->async_method_call( 1969f8bfa7cSGunnar Mills [aResp](const boost::system::error_code ec2, 1979f8bfa7cSGunnar Mills const std::variant<bool> asserted2) { 1989f8bfa7cSGunnar Mills if (!ec2) 1999f8bfa7cSGunnar Mills { 2009f8bfa7cSGunnar Mills const bool* ledOn = std::get_if<bool>(&asserted2); 2019f8bfa7cSGunnar Mills if (!ledOn) 2029f8bfa7cSGunnar Mills { 2039f8bfa7cSGunnar Mills BMCWEB_LOG_DEBUG 2049f8bfa7cSGunnar Mills << "Get enclosure identity led failed"; 2059f8bfa7cSGunnar Mills messages::internalError(aResp->res); 2069f8bfa7cSGunnar Mills return; 2079f8bfa7cSGunnar Mills } 2089f8bfa7cSGunnar Mills 2099f8bfa7cSGunnar Mills if (*ledOn) 2109f8bfa7cSGunnar Mills { 2119f8bfa7cSGunnar Mills aResp->res.jsonValue["LocationIndicatorActive"] = 2129f8bfa7cSGunnar Mills true; 2139f8bfa7cSGunnar Mills } 2149f8bfa7cSGunnar Mills else 2159f8bfa7cSGunnar Mills { 2169f8bfa7cSGunnar Mills aResp->res.jsonValue["LocationIndicatorActive"] = 2179f8bfa7cSGunnar Mills false; 2189f8bfa7cSGunnar Mills } 2199f8bfa7cSGunnar Mills } 2209f8bfa7cSGunnar Mills return; 2219f8bfa7cSGunnar Mills }, 2229f8bfa7cSGunnar Mills "xyz.openbmc_project.LED.GroupManager", 2239f8bfa7cSGunnar Mills "/xyz/openbmc_project/led/groups/enclosure_identify", 2249f8bfa7cSGunnar Mills "org.freedesktop.DBus.Properties", "Get", 2259f8bfa7cSGunnar Mills "xyz.openbmc_project.Led.Group", "Asserted"); 2269f8bfa7cSGunnar Mills }, 2279f8bfa7cSGunnar Mills "xyz.openbmc_project.LED.GroupManager", 2289f8bfa7cSGunnar Mills "/xyz/openbmc_project/led/groups/enclosure_identify_blink", 2299f8bfa7cSGunnar Mills "org.freedesktop.DBus.Properties", "Get", 2309f8bfa7cSGunnar Mills "xyz.openbmc_project.Led.Group", "Asserted"); 2319f8bfa7cSGunnar Mills } 2329f8bfa7cSGunnar Mills 2339f8bfa7cSGunnar Mills /** 2349f8bfa7cSGunnar Mills * @brief Sets identify led group properties 2359f8bfa7cSGunnar Mills * 2369f8bfa7cSGunnar Mills * @param[in] aResp Shared pointer for generating response message. 2379f8bfa7cSGunnar Mills * @param[in] ledState LED state passed from request 2389f8bfa7cSGunnar Mills * 2399f8bfa7cSGunnar Mills * @return None. 2409f8bfa7cSGunnar Mills */ 2418d1b46d7Szhanghch05 inline void 2428d1b46d7Szhanghch05 setLocationIndicatorActive(const std::shared_ptr<bmcweb::AsyncResp>& aResp, 2439f8bfa7cSGunnar Mills const bool ledState) 2449f8bfa7cSGunnar Mills { 2459f8bfa7cSGunnar Mills BMCWEB_LOG_DEBUG << "Set LocationIndicatorActive"; 2469f8bfa7cSGunnar Mills 2479f8bfa7cSGunnar Mills crow::connections::systemBus->async_method_call( 2489f8bfa7cSGunnar Mills [aResp, ledState](const boost::system::error_code ec) mutable { 2499f8bfa7cSGunnar Mills if (ec) 2509f8bfa7cSGunnar Mills { 2519f8bfa7cSGunnar Mills // Some systems may not have enclosure_identify_blink object so 2529f8bfa7cSGunnar Mills // lets set enclosure_identify state also if 2539f8bfa7cSGunnar Mills // enclosure_identify_blink failed 2549f8bfa7cSGunnar Mills crow::connections::systemBus->async_method_call( 2559f8bfa7cSGunnar Mills [aResp](const boost::system::error_code ec2) { 2569f8bfa7cSGunnar Mills if (ec2) 2579f8bfa7cSGunnar Mills { 2589f8bfa7cSGunnar Mills BMCWEB_LOG_DEBUG << "DBUS response error " << ec2; 2599f8bfa7cSGunnar Mills messages::internalError(aResp->res); 2609f8bfa7cSGunnar Mills return; 2619f8bfa7cSGunnar Mills } 2629f8bfa7cSGunnar Mills }, 2639f8bfa7cSGunnar Mills "xyz.openbmc_project.LED.GroupManager", 2649f8bfa7cSGunnar Mills "/xyz/openbmc_project/led/groups/enclosure_identify", 2659f8bfa7cSGunnar Mills "org.freedesktop.DBus.Properties", "Set", 2669f8bfa7cSGunnar Mills "xyz.openbmc_project.Led.Group", "Asserted", 2679f8bfa7cSGunnar Mills std::variant<bool>(ledState)); 2689f8bfa7cSGunnar Mills } 2699f8bfa7cSGunnar Mills }, 2709f8bfa7cSGunnar Mills "xyz.openbmc_project.LED.GroupManager", 2719f8bfa7cSGunnar Mills "/xyz/openbmc_project/led/groups/enclosure_identify_blink", 2729f8bfa7cSGunnar Mills "org.freedesktop.DBus.Properties", "Set", 2739f8bfa7cSGunnar Mills "xyz.openbmc_project.Led.Group", "Asserted", 2749f8bfa7cSGunnar Mills std::variant<bool>(ledState)); 2759f8bfa7cSGunnar Mills } 2761c8fba97SJames Feist } // namespace redfish 277