blob: b54edb03c728b8f1bb3923318b11cd5a2a36b8a5 [file] [log] [blame]
/*
// Copyright (c) 2019 Intel Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
*/
#pragma once
#include "app.hpp"
#include "async_resp.hpp"
#include "dbus_utility.hpp"
#include "generated/enums/chassis.hpp"
#include "redfish_util.hpp"
#include <sdbusplus/asio/property.hpp>
namespace redfish
{
/**
* @brief Retrieves identify led group properties over dbus
*
* @param[in] asyncResp Shared pointer for generating response message.
*
* @return None.
*/
// TODO (Gunnar): Remove IndicatorLED after enough time has passed
inline void
getIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
{
BMCWEB_LOG_DEBUG("Get led groups");
sdbusplus::asio::getProperty<bool>(
*crow::connections::systemBus, "xyz.openbmc_project.LED.GroupManager",
"/xyz/openbmc_project/led/groups/enclosure_identify_blink",
"xyz.openbmc_project.Led.Group", "Asserted",
[asyncResp](const boost::system::error_code& ec, const bool blinking) {
// Some systems may not have enclosure_identify_blink object so
// proceed to get enclosure_identify state.
if (ec == boost::system::errc::invalid_argument)
{
BMCWEB_LOG_DEBUG(
"Get identity blinking LED failed, mismatch in property type");
messages::internalError(asyncResp->res);
return;
}
// Blinking ON, no need to check enclosure_identify assert.
if (!ec && blinking)
{
asyncResp->res.jsonValue["IndicatorLED"] =
chassis::IndicatorLED::Blinking;
return;
}
sdbusplus::asio::getProperty<bool>(
*crow::connections::systemBus,
"xyz.openbmc_project.LED.GroupManager",
"/xyz/openbmc_project/led/groups/enclosure_identify",
"xyz.openbmc_project.Led.Group", "Asserted",
[asyncResp](const boost::system::error_code& ec2,
const bool ledOn) {
if (ec2 == boost::system::errc::invalid_argument)
{
BMCWEB_LOG_DEBUG(
"Get enclosure identity led failed, mismatch in property type");
messages::internalError(asyncResp->res);
return;
}
if (ec2)
{
return;
}
if (ledOn)
{
asyncResp->res.jsonValue["IndicatorLED"] =
chassis::IndicatorLED::Lit;
}
else
{
asyncResp->res.jsonValue["IndicatorLED"] =
chassis::IndicatorLED::Off;
}
});
});
}
/**
* @brief Sets identify led group properties
*
* @param[in] asyncResp Shared pointer for generating response message.
* @param[in] ledState LED state passed from request
*
* @return None.
*/
// TODO (Gunnar): Remove IndicatorLED after enough time has passed
inline void
setIndicatorLedState(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
const std::string& ledState)
{
BMCWEB_LOG_DEBUG("Set led groups");
bool ledOn = false;
bool ledBlinkng = false;
if (ledState == "Lit")
{
ledOn = true;
}
else if (ledState == "Blinking")
{
ledBlinkng = true;
}
else if (ledState != "Off")
{
messages::propertyValueNotInList(asyncResp->res, ledState,
"IndicatorLED");
return;
}
sdbusplus::asio::setProperty(
*crow::connections::systemBus, "xyz.openbmc_project.LED.GroupManager",
"/xyz/openbmc_project/led/groups/enclosure_identify_blink",
"xyz.openbmc_project.Led.Group", "Asserted", ledBlinkng,
[asyncResp, ledOn,
ledBlinkng](const boost::system::error_code& ec) mutable {
if (ec)
{
// Some systems may not have enclosure_identify_blink object so
// Lets set enclosure_identify state to true if Blinking is
// true.
if (ledBlinkng)
{
ledOn = true;
}
}
setDbusProperty(
asyncResp, "IndicatorLED", "xyz.openbmc_project.LED.GroupManager",
sdbusplus::message::object_path(
"/xyz/openbmc_project/led/groups/enclosure_identify"),
"xyz.openbmc_project.Led.Group", "Asserted", ledBlinkng);
});
}
/**
* @brief Retrieves identify system led group properties over dbus
*
* @param[in] asyncResp Shared pointer for generating response message.
*
* @return None.
*/
inline void getSystemLocationIndicatorActive(
const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
{
BMCWEB_LOG_DEBUG("Get LocationIndicatorActive");
sdbusplus::asio::getProperty<bool>(
*crow::connections::systemBus, "xyz.openbmc_project.LED.GroupManager",
"/xyz/openbmc_project/led/groups/enclosure_identify_blink",
"xyz.openbmc_project.Led.Group", "Asserted",
[asyncResp](const boost::system::error_code& ec, const bool blinking) {
// Some systems may not have enclosure_identify_blink object so
// proceed to get enclosure_identify state.
if (ec == boost::system::errc::invalid_argument)
{
BMCWEB_LOG_DEBUG(
"Get identity blinking LED failed, mismatch in property type");
messages::internalError(asyncResp->res);
return;
}
// Blinking ON, no need to check enclosure_identify assert.
if (!ec && blinking)
{
asyncResp->res.jsonValue["LocationIndicatorActive"] = true;
return;
}
sdbusplus::asio::getProperty<bool>(
*crow::connections::systemBus,
"xyz.openbmc_project.LED.GroupManager",
"/xyz/openbmc_project/led/groups/enclosure_identify",
"xyz.openbmc_project.Led.Group", "Asserted",
[asyncResp](const boost::system::error_code& ec2,
const bool ledOn) {
if (ec2 == boost::system::errc::invalid_argument)
{
BMCWEB_LOG_DEBUG(
"Get enclosure identity led failed, mismatch in property type");
messages::internalError(asyncResp->res);
return;
}
if (ec2)
{
return;
}
asyncResp->res.jsonValue["LocationIndicatorActive"] = ledOn;
});
});
}
/**
* @brief Sets identify system led group properties
*
* @param[in] asyncResp Shared pointer for generating response message.
* @param[in] ledState LED state passed from request
*
* @return None.
*/
inline void setSystemLocationIndicatorActive(
const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, const bool ledState)
{
BMCWEB_LOG_DEBUG("Set LocationIndicatorActive");
sdbusplus::asio::setProperty(
*crow::connections::systemBus, "xyz.openbmc_project.LED.GroupManager",
"/xyz/openbmc_project/led/groups/enclosure_identify_blink",
"xyz.openbmc_project.Led.Group", "Asserted", ledState,
[asyncResp, ledState](const boost::system::error_code& ec) {
if (ec)
{
// Some systems may not have enclosure_identify_blink object so
// lets set enclosure_identify state also if
// enclosure_identify_blink failed
setDbusProperty(
asyncResp, "LocationIndicatorActive",
"xyz.openbmc_project.LED.GroupManager",
sdbusplus::message::object_path(
"/xyz/openbmc_project/led/groups/enclosure_identify"),
"xyz.openbmc_project.Led.Group", "Asserted", ledState);
}
});
}
} // namespace redfish