xref: /openbmc/bmcweb/features/redfish/lib/led.hpp (revision 7e860f1550c8686eec42f7a75bc5f2ef51e756ad)
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