#pragma once #include "types/sensor_types.hpp" #include "utils/conversion.hpp" #include "utils/labeled_tuple.hpp" #include "utils/tstring.hpp" #include "utils/variant_utils.hpp" #include #include #include #include #include enum class TriggerAction { LogToJournal = 0, LogToRedfishEventLog, UpdateReport, }; namespace details { constexpr std::array, 3> convDataTriggerAction = { std::make_pair( "xyz.openbmc_project.Telemetry.Trigger.TriggerAction.LogToJournal", TriggerAction::LogToJournal), std::make_pair("xyz.openbmc_project.Telemetry.Trigger.TriggerAction." "LogToRedfishEventLog", TriggerAction::LogToRedfishEventLog), std::make_pair( "xyz.openbmc_project.Telemetry.Trigger.TriggerAction.UpdateReport", TriggerAction::UpdateReport)}; } inline TriggerAction toTriggerAction(const std::string& str) { return utils::toEnum(details::convDataTriggerAction, str); } inline std::string actionToString(TriggerAction v) { return std::string(utils::enumToString(details::convDataTriggerAction, v)); } namespace discrete { enum class Severity { ok = 0, warning, critical }; using ThresholdParam = std::tuple; using LabeledThresholdParam = utils::LabeledTuple< std::tuple, utils::tstring::UserId, utils::tstring::Severity, utils::tstring::DwellTime, utils::tstring::ThresholdValue>; } // namespace discrete namespace numeric { enum class Type { lowerCritical = 0, lowerWarning, upperWarning, upperCritical }; enum class Direction { either = 0, decreasing, increasing }; namespace details { constexpr std::array, 4> convDataType = { std::make_pair("xyz.openbmc_project.Telemetry.Trigger.Type.LowerCritical", Type::lowerCritical), std::make_pair("xyz.openbmc_project.Telemetry.Trigger.Type.LowerWarning", Type::lowerWarning), std::make_pair("xyz.openbmc_project.Telemetry.Trigger.Type.UpperWarning", Type::upperWarning), std::make_pair("xyz.openbmc_project.Telemetry.Trigger.Type.UpperCritical", Type::upperCritical)}; constexpr std::array, 3> convDataDirection = { std::make_pair("xyz.openbmc_project.Telemetry.Trigger.Direction.Either", Direction::either), std::make_pair( "xyz.openbmc_project.Telemetry.Trigger.Direction.Decreasing", Direction::decreasing), std::make_pair( "xyz.openbmc_project.Telemetry.Trigger.Direction.Increasing", Direction::increasing)}; } // namespace details inline Type toType(const std::string& str) { return utils::toEnum(details::convDataType, str); } inline std::string typeToString(Type v) { return std::string(utils::enumToString(details::convDataType, v)); } inline Direction toDirection(const std::string& str) { return utils::toEnum(details::convDataDirection, str); } inline std::string directionToString(Direction v) { return std::string(utils::enumToString(details::convDataDirection, v)); } using ThresholdParam = std::tuple; using LabeledThresholdParam = utils::LabeledTuple, utils::tstring::Type, utils::tstring::DwellTime, utils::tstring::Direction, utils::tstring::ThresholdValue>; } // namespace numeric using TriggerThresholdParamsExt = std::variant, std::vector>; using TriggerThresholdParams = utils::WithoutMonostate; using LabeledTriggerThresholdParams = std::variant, std::vector>; using LabeledThresholdParam = std::variant; inline bool isTriggerThresholdDiscrete(const LabeledTriggerThresholdParams& params) { return std::holds_alternative>( params); } using TriggerId = std::unique_ptr; using TriggerValue = std::variant; using ThresholdName = std::optional>; inline std::string triggerValueToString(TriggerValue val) { if (auto* doubleVal = std::get_if(&val); doubleVal != nullptr) { return std::to_string(*doubleVal); } else { return std::get(val); } } namespace utils { constexpr std::array, 3> convDataSeverity = { std::make_pair("xyz.openbmc_project.Telemetry.Trigger.Severity.OK", discrete::Severity::ok), std::make_pair("xyz.openbmc_project.Telemetry.Trigger.Severity.Warning", discrete::Severity::warning), std::make_pair( "xyz.openbmc_project.Telemetry.Trigger.Severity.Critical", discrete::Severity::critical)}; inline discrete::Severity toSeverity(const std::string& str) { return utils::toEnum(convDataSeverity, str); } inline std::string enumToString(discrete::Severity v) { return std::string(enumToString(convDataSeverity, v)); } template <> struct EnumTraits { static constexpr auto propertyName = ConstexprString{"TriggerAction"}; }; template <> struct EnumTraits { static constexpr auto propertyName = ConstexprString{"discrete::Severity"}; }; template <> struct EnumTraits { static constexpr auto propertyName = ConstexprString{"numeric::Type"}; }; template <> struct EnumTraits { static constexpr auto propertyName = ConstexprString{"numeric::Direction"}; }; } // namespace utils