blob: 114138fd229a5e75af43b45898bc443a49c514c1 [file] [log] [blame]
#pragma once
#include "dbusUtils.hpp"
#include <xyz/openbmc_project/Sensor/Threshold/Critical/server.hpp>
#include <xyz/openbmc_project/Sensor/Threshold/HardShutdown/server.hpp>
#include <xyz/openbmc_project/Sensor/Threshold/PerformanceLoss/server.hpp>
#include <xyz/openbmc_project/Sensor/Threshold/SoftShutdown/server.hpp>
#include <xyz/openbmc_project/Sensor/Threshold/Warning/server.hpp>
const constexpr char* entityManagerBusName =
"xyz.openbmc_project.EntityManager";
namespace phosphor::virtual_sensor
{
template <typename... T>
using ServerObject = typename sdbusplus::server::object_t<T...>;
namespace threshold_ns =
sdbusplus::xyz::openbmc_project::Sensor::Threshold::server;
using CriticalObject = ServerObject<threshold_ns::Critical>;
using WarningObject = ServerObject<threshold_ns::Warning>;
using SoftShutdownObject = ServerObject<threshold_ns::SoftShutdown>;
using HardShutdownObject = ServerObject<threshold_ns::HardShutdown>;
using PerformanceLossObject = ServerObject<threshold_ns::PerformanceLoss>;
template <typename T>
struct Threshold;
struct Hysteresis
{
double highHysteresis;
double lowHysteresis;
auto getHighHysteresis()
{
return this->highHysteresis;
}
auto getLowHysteresis()
{
return this->lowHysteresis;
}
auto setHighHysteresis(double value)
{
this->highHysteresis = value;
}
auto setLowHysteresis(double value)
{
this->lowHysteresis = value;
}
};
template <>
struct Threshold<WarningObject> : public WarningObject, public Hysteresis
{
static constexpr auto name = "Warning";
using WarningObject::WarningObject;
/** @brief sdbusplus bus client connection. */
sdbusplus::bus_t& bus;
std::string objPath;
/** @brief Virtual sensor path/interface in entityManagerDbus.
* This 3 value is used to set thresholds
*/
std::string entityPath;
std::string entityInterfaceHigh;
std::string entityInterfaceLow;
/** @brief Constructor to put object onto bus at a dbus path.
* @param[in] bus - Bus to attach to.
* @param[in] path - Path to attach at.
*/
Threshold(sdbusplus::bus_t& bus, const char* path) :
WarningObject(bus, path), bus(bus), objPath(std::string(path))
{}
auto high()
{
return WarningObject::warningHigh();
}
auto low()
{
return WarningObject::warningLow();
}
template <typename... Args>
auto alarmHigh(Args... args)
{
return warningAlarmHigh(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmLow(Args... args)
{
return warningAlarmLow(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmHighSignalAsserted(Args... args)
{
return warningHighAlarmAsserted(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmHighSignalDeasserted(Args... args)
{
return warningHighAlarmDeasserted(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmLowSignalAsserted(Args... args)
{
return warningLowAlarmAsserted(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmLowSignalDeasserted(Args... args)
{
return warningLowAlarmDeasserted(std::forward<Args>(args)...);
}
/** @brief Set value of WarningHigh */
virtual double warningHigh(double value)
{
if (!entityPath.empty() && !entityInterfaceHigh.empty())
{
// persistThreshold
setDbusProperty(bus, entityManagerBusName, entityPath,
entityInterfaceHigh, "Value", value);
}
return WarningObject::warningHigh(value);
}
/** @brief Set value of WarningLow */
virtual double warningLow(double value)
{
if (!entityPath.empty() && !entityInterfaceLow.empty())
{
// persistThreshold
setDbusProperty(bus, entityManagerBusName, entityPath,
entityInterfaceLow, "Value", value);
}
return WarningObject::warningLow(value);
}
/** @brief Set the entitymanager interface corresponding to virtualsensor
* warningLow
*/
void setEntityInterfaceLow(const std::string& interfaceLow)
{
entityInterfaceLow = interfaceLow;
}
/** @brief Set the entitymanager interface corresponding to virtualsensor
* warningHigh
*/
void setEntityInterfaceHigh(const std::string& interfaceHigh)
{
entityInterfaceHigh = interfaceHigh;
}
/** @brief Set the entitymanager path corresponding to virtualsensor warning
*/
void setEntityPath(const std::string& path)
{
entityPath = path;
}
};
template <>
struct Threshold<CriticalObject> : public CriticalObject, public Hysteresis
{
static constexpr auto name = "Critical";
/** @brief sdbusplus bus client connection. */
sdbusplus::bus_t& bus;
std::string objPath;
/** @brief Virtual sensor path/interface in entityManagerDbus.
* This 3 value is used to set thresholds
*/
std::string entityPath;
std::string entityInterfaceHigh;
std::string entityInterfaceLow;
using CriticalObject::CriticalObject;
/** @brief Constructor to put object onto bus at a dbus path.
* @param[in] bus - Bus to attach to.
* @param[in] path - Path to attach at.
*/
Threshold(sdbusplus::bus_t& bus, const char* path) :
CriticalObject(bus, path), bus(bus), objPath(std::string(path))
{}
auto high()
{
return CriticalObject::criticalHigh();
}
auto low()
{
return CriticalObject::criticalLow();
}
template <typename... Args>
auto alarmHigh(Args... args)
{
return criticalAlarmHigh(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmLow(Args... args)
{
return criticalAlarmLow(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmHighSignalAsserted(Args... args)
{
return criticalHighAlarmAsserted(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmHighSignalDeasserted(Args... args)
{
return criticalHighAlarmDeasserted(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmLowSignalAsserted(Args... args)
{
return criticalLowAlarmAsserted(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmLowSignalDeasserted(Args... args)
{
return criticalLowAlarmDeasserted(std::forward<Args>(args)...);
}
/** @brief Set value of CriticalHigh */
virtual double criticalHigh(double value)
{
// persistThreshold
if (!entityPath.empty() && !entityInterfaceHigh.empty())
{
setDbusProperty(bus, entityManagerBusName, entityPath,
entityInterfaceHigh, "Value", value);
}
return CriticalObject::criticalHigh(value);
}
/** @brief Set value of CriticalLow */
virtual double criticalLow(double value)
{
if (!entityPath.empty() && !entityInterfaceLow.empty())
{
setDbusProperty(bus, entityManagerBusName, entityPath,
entityInterfaceLow, "Value", value);
}
return CriticalObject::criticalLow(value);
}
/** @brief Set the entitymanager interface corresponding to virtualsensor
* criticalLow
*/
void setEntityInterfaceLow(const std::string& interfaceLow)
{
entityInterfaceLow = interfaceLow;
}
/** @brief Set the entitymanager interface corresponding to virtualsensor
* criticalLow
*/
void setEntityInterfaceHigh(const std::string& interfaceHigh)
{
entityInterfaceHigh = interfaceHigh;
}
/** @brief Set the entitymanager path corresponding to virtualsensor warning
*/
void setEntityPath(const std::string& path)
{
entityPath = path;
}
};
template <>
struct Threshold<SoftShutdownObject> :
public SoftShutdownObject,
public Hysteresis
{
static constexpr auto name = "SoftShutdown";
using SoftShutdownObject::SoftShutdownObject;
auto high()
{
return softShutdownHigh();
}
auto low()
{
return softShutdownLow();
}
template <typename... Args>
auto alarmHigh(Args... args)
{
return softShutdownAlarmHigh(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmLow(Args... args)
{
return softShutdownAlarmLow(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmHighSignalAsserted(Args... args)
{
return softShutdownHighAlarmAsserted(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmHighSignalDeasserted(Args... args)
{
return softShutdownHighAlarmDeasserted(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmLowSignalAsserted(Args... args)
{
return softShutdownLowAlarmAsserted(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmLowSignalDeasserted(Args... args)
{
return softShutdownLowAlarmDeasserted(std::forward<Args>(args)...);
}
};
template <>
struct Threshold<HardShutdownObject> :
public HardShutdownObject,
public Hysteresis
{
static constexpr auto name = "HardShutdown";
using HardShutdownObject::HardShutdownObject;
auto high()
{
return hardShutdownHigh();
}
auto low()
{
return hardShutdownLow();
}
template <typename... Args>
auto alarmHigh(Args... args)
{
return hardShutdownAlarmHigh(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmLow(Args... args)
{
return hardShutdownAlarmLow(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmHighSignalAsserted(Args... args)
{
return hardShutdownHighAlarmAsserted(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmHighSignalDeasserted(Args... args)
{
return hardShutdownHighAlarmDeasserted(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmLowSignalAsserted(Args... args)
{
return hardShutdownLowAlarmAsserted(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmLowSignalDeasserted(Args... args)
{
return hardShutdownLowAlarmDeasserted(std::forward<Args>(args)...);
}
};
template <>
struct Threshold<PerformanceLossObject> :
public PerformanceLossObject,
public Hysteresis
{
static constexpr auto name = "PerformanceLoss";
using PerformanceLossObject::PerformanceLossObject;
double performanceLossHighHysteresis;
double performanceLossLowHysteresis;
auto high()
{
return performanceLossHigh();
}
auto low()
{
return performanceLossLow();
}
template <typename... Args>
auto alarmHigh(Args... args)
{
return performanceLossAlarmHigh(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmLow(Args... args)
{
return performanceLossAlarmLow(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmHighSignalAsserted(Args... args)
{
return performanceLossHighAlarmAsserted(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmHighSignalDeasserted(Args... args)
{
return performanceLossHighAlarmDeasserted(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmLowSignalAsserted(Args... args)
{
return performanceLossLowAlarmAsserted(std::forward<Args>(args)...);
}
template <typename... Args>
auto alarmLowSignalDeasserted(Args... args)
{
return performanceLossLowAlarmDeasserted(std::forward<Args>(args)...);
}
};
} // namespace phosphor::virtual_sensor