xref: /openbmc/phosphor-virtual-sensor/src/thresholds.hpp (revision 6272a39308bf6c1945edabf54891157c8079165a)
1*6272a393SAlexander Hansen #pragma once
2*6272a393SAlexander Hansen 
3*6272a393SAlexander Hansen #include "dbusUtils.hpp"
4*6272a393SAlexander Hansen 
5*6272a393SAlexander Hansen #include <phosphor-logging/commit.hpp>
6*6272a393SAlexander Hansen #include <xyz/openbmc_project/Sensor/Threshold/Critical/server.hpp>
7*6272a393SAlexander Hansen #include <xyz/openbmc_project/Sensor/Threshold/HardShutdown/server.hpp>
8*6272a393SAlexander Hansen #include <xyz/openbmc_project/Sensor/Threshold/PerformanceLoss/server.hpp>
9*6272a393SAlexander Hansen #include <xyz/openbmc_project/Sensor/Threshold/SoftShutdown/server.hpp>
10*6272a393SAlexander Hansen #include <xyz/openbmc_project/Sensor/Threshold/Warning/server.hpp>
11*6272a393SAlexander Hansen #include <xyz/openbmc_project/Sensor/Threshold/event.hpp>
12*6272a393SAlexander Hansen #include <xyz/openbmc_project/Sensor/Value/server.hpp>
13*6272a393SAlexander Hansen 
14*6272a393SAlexander Hansen const constexpr char* entityManagerBusName =
15*6272a393SAlexander Hansen     "xyz.openbmc_project.EntityManager";
16*6272a393SAlexander Hansen namespace phosphor::virtual_sensor
17*6272a393SAlexander Hansen {
18*6272a393SAlexander Hansen 
19*6272a393SAlexander Hansen template <typename... T>
20*6272a393SAlexander Hansen using ServerObject = typename sdbusplus::server::object_t<T...>;
21*6272a393SAlexander Hansen 
22*6272a393SAlexander Hansen namespace threshold_ns =
23*6272a393SAlexander Hansen     sdbusplus::xyz::openbmc_project::Sensor::Threshold::server;
24*6272a393SAlexander Hansen using Unit = sdbusplus::xyz::openbmc_project::Sensor::server::Value::Unit;
25*6272a393SAlexander Hansen using CriticalObject = ServerObject<threshold_ns::Critical>;
26*6272a393SAlexander Hansen using WarningObject = ServerObject<threshold_ns::Warning>;
27*6272a393SAlexander Hansen using SoftShutdownObject = ServerObject<threshold_ns::SoftShutdown>;
28*6272a393SAlexander Hansen using HardShutdownObject = ServerObject<threshold_ns::HardShutdown>;
29*6272a393SAlexander Hansen using PerformanceLossObject = ServerObject<threshold_ns::PerformanceLoss>;
30*6272a393SAlexander Hansen 
31*6272a393SAlexander Hansen template <typename T>
32*6272a393SAlexander Hansen struct Threshold;
33*6272a393SAlexander Hansen 
34*6272a393SAlexander Hansen struct Hysteresis
35*6272a393SAlexander Hansen {
36*6272a393SAlexander Hansen     double highHysteresis;
37*6272a393SAlexander Hansen     double lowHysteresis;
getHighHysteresisphosphor::virtual_sensor::Hysteresis38*6272a393SAlexander Hansen     auto getHighHysteresis()
39*6272a393SAlexander Hansen     {
40*6272a393SAlexander Hansen         return this->highHysteresis;
41*6272a393SAlexander Hansen     }
42*6272a393SAlexander Hansen 
getLowHysteresisphosphor::virtual_sensor::Hysteresis43*6272a393SAlexander Hansen     auto getLowHysteresis()
44*6272a393SAlexander Hansen     {
45*6272a393SAlexander Hansen         return this->lowHysteresis;
46*6272a393SAlexander Hansen     }
47*6272a393SAlexander Hansen 
setHighHysteresisphosphor::virtual_sensor::Hysteresis48*6272a393SAlexander Hansen     auto setHighHysteresis(double value)
49*6272a393SAlexander Hansen     {
50*6272a393SAlexander Hansen         this->highHysteresis = value;
51*6272a393SAlexander Hansen     }
52*6272a393SAlexander Hansen 
setLowHysteresisphosphor::virtual_sensor::Hysteresis53*6272a393SAlexander Hansen     auto setLowHysteresis(double value)
54*6272a393SAlexander Hansen     {
55*6272a393SAlexander Hansen         this->lowHysteresis = value;
56*6272a393SAlexander Hansen     }
57*6272a393SAlexander Hansen };
58*6272a393SAlexander Hansen 
59*6272a393SAlexander Hansen template <typename error>
tryCommit(const std::string & objPath,double value,Unit unit,double thresholdValue)60*6272a393SAlexander Hansen auto tryCommit(const std::string& objPath, double value, Unit unit,
61*6272a393SAlexander Hansen                double thresholdValue)
62*6272a393SAlexander Hansen     -> std::optional<sdbusplus::message::object_path>
63*6272a393SAlexander Hansen {
64*6272a393SAlexander Hansen     try
65*6272a393SAlexander Hansen     {
66*6272a393SAlexander Hansen         return lg2::commit(
67*6272a393SAlexander Hansen             error("SENSOR_NAME", objPath, "READING_VALUE", value, "UNITS", unit,
68*6272a393SAlexander Hansen                   "THRESHOLD_VALUE", thresholdValue));
69*6272a393SAlexander Hansen     }
70*6272a393SAlexander Hansen     catch (std::exception&)
71*6272a393SAlexander Hansen     {
72*6272a393SAlexander Hansen         lg2::error(
73*6272a393SAlexander Hansen             "Failed creating a threshold log entry for {SENSOR} with value {VALUE}",
74*6272a393SAlexander Hansen             "SENSOR", objPath, "VALUE", value);
75*6272a393SAlexander Hansen         return std::nullopt;
76*6272a393SAlexander Hansen     }
77*6272a393SAlexander Hansen }
78*6272a393SAlexander Hansen 
tryResolve(std::optional<sdbusplus::message::object_path> & log)79*6272a393SAlexander Hansen static inline void tryResolve(
80*6272a393SAlexander Hansen     std::optional<sdbusplus::message::object_path>& log)
81*6272a393SAlexander Hansen {
82*6272a393SAlexander Hansen     if (log)
83*6272a393SAlexander Hansen     {
84*6272a393SAlexander Hansen         try
85*6272a393SAlexander Hansen         {
86*6272a393SAlexander Hansen             lg2::resolve(*log);
87*6272a393SAlexander Hansen         }
88*6272a393SAlexander Hansen         catch (std::exception&)
89*6272a393SAlexander Hansen         {
90*6272a393SAlexander Hansen             lg2::error("Failed to resolve: {LOG}", "LOG", *log);
91*6272a393SAlexander Hansen         }
92*6272a393SAlexander Hansen         log.reset();
93*6272a393SAlexander Hansen     }
94*6272a393SAlexander Hansen }
95*6272a393SAlexander Hansen 
96*6272a393SAlexander Hansen template <>
97*6272a393SAlexander Hansen struct Threshold<WarningObject> : public WarningObject, public Hysteresis
98*6272a393SAlexander Hansen {
99*6272a393SAlexander Hansen     static constexpr auto name = "Warning";
100*6272a393SAlexander Hansen     using WarningObject::WarningObject;
101*6272a393SAlexander Hansen     using ReadingAboveUpperWarningThreshold = sdbusplus::error::xyz::
102*6272a393SAlexander Hansen         openbmc_project::sensor::Threshold::ReadingAboveUpperWarningThreshold;
103*6272a393SAlexander Hansen     using ReadingBelowLowerWarningThreshold = sdbusplus::error::xyz::
104*6272a393SAlexander Hansen         openbmc_project::sensor::Threshold::ReadingBelowLowerWarningThreshold;
105*6272a393SAlexander Hansen     /** @brief sdbusplus bus client connection. */
106*6272a393SAlexander Hansen     sdbusplus::bus_t& bus;
107*6272a393SAlexander Hansen     std::string objPath;
108*6272a393SAlexander Hansen     Unit units;
109*6272a393SAlexander Hansen 
110*6272a393SAlexander Hansen     /** @brief Virtual sensor path/interface in entityManagerDbus.
111*6272a393SAlexander Hansen      * This 3 value is used to set thresholds
112*6272a393SAlexander Hansen      */
113*6272a393SAlexander Hansen     std::string entityPath;
114*6272a393SAlexander Hansen     std::string entityInterfaceHigh;
115*6272a393SAlexander Hansen     std::string entityInterfaceLow;
116*6272a393SAlexander Hansen     std::optional<sdbusplus::message::object_path> assertedHighLog;
117*6272a393SAlexander Hansen     std::optional<sdbusplus::message::object_path> assertedLowLog;
118*6272a393SAlexander Hansen 
119*6272a393SAlexander Hansen     /** @brief Constructor to put object onto bus at a dbus path.
120*6272a393SAlexander Hansen      *  @param[in] bus - Bus to attach to.
121*6272a393SAlexander Hansen      *  @param[in] path - Path to attach at.
122*6272a393SAlexander Hansen      *  @param[in] units - units
123*6272a393SAlexander Hansen      */
Thresholdphosphor::virtual_sensor::Threshold124*6272a393SAlexander Hansen     Threshold(sdbusplus::bus_t& bus, const char* path, Unit units) :
125*6272a393SAlexander Hansen         WarningObject(bus, path), bus(bus), objPath(std::string(path)),
126*6272a393SAlexander Hansen         units(units)
127*6272a393SAlexander Hansen     {}
128*6272a393SAlexander Hansen 
highphosphor::virtual_sensor::Threshold129*6272a393SAlexander Hansen     auto high()
130*6272a393SAlexander Hansen     {
131*6272a393SAlexander Hansen         return WarningObject::warningHigh();
132*6272a393SAlexander Hansen     }
lowphosphor::virtual_sensor::Threshold133*6272a393SAlexander Hansen     auto low()
134*6272a393SAlexander Hansen     {
135*6272a393SAlexander Hansen         return WarningObject::warningLow();
136*6272a393SAlexander Hansen     }
137*6272a393SAlexander Hansen 
138*6272a393SAlexander Hansen     template <typename... Args>
alarmHighphosphor::virtual_sensor::Threshold139*6272a393SAlexander Hansen     auto alarmHigh(Args... args)
140*6272a393SAlexander Hansen     {
141*6272a393SAlexander Hansen         return warningAlarmHigh(std::forward<Args>(args)...);
142*6272a393SAlexander Hansen     }
143*6272a393SAlexander Hansen 
144*6272a393SAlexander Hansen     template <typename... Args>
alarmLowphosphor::virtual_sensor::Threshold145*6272a393SAlexander Hansen     auto alarmLow(Args... args)
146*6272a393SAlexander Hansen     {
147*6272a393SAlexander Hansen         return warningAlarmLow(std::forward<Args>(args)...);
148*6272a393SAlexander Hansen     }
149*6272a393SAlexander Hansen 
150*6272a393SAlexander Hansen     template <typename V>
alarmHighSignalAssertedphosphor::virtual_sensor::Threshold151*6272a393SAlexander Hansen     auto alarmHighSignalAsserted(V value)
152*6272a393SAlexander Hansen     {
153*6272a393SAlexander Hansen         assertedHighLog = tryCommit<ReadingAboveUpperWarningThreshold>(
154*6272a393SAlexander Hansen             objPath, value, units, high());
155*6272a393SAlexander Hansen         return warningHighAlarmAsserted(value);
156*6272a393SAlexander Hansen     }
157*6272a393SAlexander Hansen 
158*6272a393SAlexander Hansen     template <typename... Args>
alarmHighSignalDeassertedphosphor::virtual_sensor::Threshold159*6272a393SAlexander Hansen     auto alarmHighSignalDeasserted(Args... args)
160*6272a393SAlexander Hansen     {
161*6272a393SAlexander Hansen         tryResolve(assertedHighLog);
162*6272a393SAlexander Hansen         return warningHighAlarmDeasserted(std::forward<Args>(args)...);
163*6272a393SAlexander Hansen     }
164*6272a393SAlexander Hansen 
165*6272a393SAlexander Hansen     template <typename V>
alarmLowSignalAssertedphosphor::virtual_sensor::Threshold166*6272a393SAlexander Hansen     auto alarmLowSignalAsserted(V value)
167*6272a393SAlexander Hansen     {
168*6272a393SAlexander Hansen         assertedLowLog = tryCommit<ReadingBelowLowerWarningThreshold>(
169*6272a393SAlexander Hansen             objPath, value, units, low());
170*6272a393SAlexander Hansen         return warningLowAlarmAsserted(value);
171*6272a393SAlexander Hansen     }
172*6272a393SAlexander Hansen 
173*6272a393SAlexander Hansen     template <typename... Args>
alarmLowSignalDeassertedphosphor::virtual_sensor::Threshold174*6272a393SAlexander Hansen     auto alarmLowSignalDeasserted(Args... args)
175*6272a393SAlexander Hansen     {
176*6272a393SAlexander Hansen         tryResolve(assertedLowLog);
177*6272a393SAlexander Hansen         return warningLowAlarmDeasserted(std::forward<Args>(args)...);
178*6272a393SAlexander Hansen     }
179*6272a393SAlexander Hansen 
180*6272a393SAlexander Hansen     /** @brief Set value of WarningHigh */
warningHighphosphor::virtual_sensor::Threshold181*6272a393SAlexander Hansen     virtual double warningHigh(double value)
182*6272a393SAlexander Hansen     {
183*6272a393SAlexander Hansen         if (!entityPath.empty() && !entityInterfaceHigh.empty())
184*6272a393SAlexander Hansen         {
185*6272a393SAlexander Hansen             // persistThreshold
186*6272a393SAlexander Hansen             setDbusProperty(bus, entityManagerBusName, entityPath,
187*6272a393SAlexander Hansen                             entityInterfaceHigh, "Value", value);
188*6272a393SAlexander Hansen         }
189*6272a393SAlexander Hansen         return WarningObject::warningHigh(value);
190*6272a393SAlexander Hansen     }
191*6272a393SAlexander Hansen 
192*6272a393SAlexander Hansen     /** @brief Set value of WarningLow */
warningLowphosphor::virtual_sensor::Threshold193*6272a393SAlexander Hansen     virtual double warningLow(double value)
194*6272a393SAlexander Hansen     {
195*6272a393SAlexander Hansen         if (!entityPath.empty() && !entityInterfaceLow.empty())
196*6272a393SAlexander Hansen         {
197*6272a393SAlexander Hansen             // persistThreshold
198*6272a393SAlexander Hansen             setDbusProperty(bus, entityManagerBusName, entityPath,
199*6272a393SAlexander Hansen                             entityInterfaceLow, "Value", value);
200*6272a393SAlexander Hansen         }
201*6272a393SAlexander Hansen         return WarningObject::warningLow(value);
202*6272a393SAlexander Hansen     }
203*6272a393SAlexander Hansen 
204*6272a393SAlexander Hansen     /** @brief Set the entitymanager interface corresponding to virtualsensor
205*6272a393SAlexander Hansen      * warningLow
206*6272a393SAlexander Hansen      */
setEntityInterfaceLowphosphor::virtual_sensor::Threshold207*6272a393SAlexander Hansen     void setEntityInterfaceLow(const std::string& interfaceLow)
208*6272a393SAlexander Hansen     {
209*6272a393SAlexander Hansen         entityInterfaceLow = interfaceLow;
210*6272a393SAlexander Hansen     }
211*6272a393SAlexander Hansen 
212*6272a393SAlexander Hansen     /** @brief Set the entitymanager interface corresponding to virtualsensor
213*6272a393SAlexander Hansen      * warningHigh
214*6272a393SAlexander Hansen      */
setEntityInterfaceHighphosphor::virtual_sensor::Threshold215*6272a393SAlexander Hansen     void setEntityInterfaceHigh(const std::string& interfaceHigh)
216*6272a393SAlexander Hansen     {
217*6272a393SAlexander Hansen         entityInterfaceHigh = interfaceHigh;
218*6272a393SAlexander Hansen     }
219*6272a393SAlexander Hansen 
220*6272a393SAlexander Hansen     /** @brief Set the entitymanager path corresponding to virtualsensor warning
221*6272a393SAlexander Hansen      */
setEntityPathphosphor::virtual_sensor::Threshold222*6272a393SAlexander Hansen     void setEntityPath(const std::string& path)
223*6272a393SAlexander Hansen     {
224*6272a393SAlexander Hansen         entityPath = path;
225*6272a393SAlexander Hansen     }
226*6272a393SAlexander Hansen };
227*6272a393SAlexander Hansen 
228*6272a393SAlexander Hansen template <>
229*6272a393SAlexander Hansen struct Threshold<CriticalObject> : public CriticalObject, public Hysteresis
230*6272a393SAlexander Hansen {
231*6272a393SAlexander Hansen     static constexpr auto name = "Critical";
232*6272a393SAlexander Hansen 
233*6272a393SAlexander Hansen     /** @brief sdbusplus bus client connection. */
234*6272a393SAlexander Hansen     sdbusplus::bus_t& bus;
235*6272a393SAlexander Hansen     std::string objPath;
236*6272a393SAlexander Hansen     Unit units;
237*6272a393SAlexander Hansen 
238*6272a393SAlexander Hansen     /** @brief Virtual sensor path/interface in entityManagerDbus.
239*6272a393SAlexander Hansen      * This 3 value is used to set thresholds
240*6272a393SAlexander Hansen      */
241*6272a393SAlexander Hansen     std::string entityPath;
242*6272a393SAlexander Hansen     std::string entityInterfaceHigh;
243*6272a393SAlexander Hansen     std::string entityInterfaceLow;
244*6272a393SAlexander Hansen     std::optional<sdbusplus::message::object_path> assertedHighLog;
245*6272a393SAlexander Hansen     std::optional<sdbusplus::message::object_path> assertedLowLog;
246*6272a393SAlexander Hansen 
247*6272a393SAlexander Hansen     using CriticalObject::CriticalObject;
248*6272a393SAlexander Hansen     using ReadingAboveUpperCriticalThreshold = sdbusplus::error::xyz::
249*6272a393SAlexander Hansen         openbmc_project::sensor::Threshold::ReadingAboveUpperCriticalThreshold;
250*6272a393SAlexander Hansen     using ReadingBelowLowerCriticalThreshold = sdbusplus::error::xyz::
251*6272a393SAlexander Hansen         openbmc_project::sensor::Threshold::ReadingBelowLowerCriticalThreshold;
252*6272a393SAlexander Hansen 
253*6272a393SAlexander Hansen     /** @brief Constructor to put object onto bus at a dbus path.
254*6272a393SAlexander Hansen      *  @param[in] bus - Bus to attach to.
255*6272a393SAlexander Hansen      *  @param[in] path - Path to attach at.
256*6272a393SAlexander Hansen      *  @param[in] units - units
257*6272a393SAlexander Hansen      */
Thresholdphosphor::virtual_sensor::Threshold258*6272a393SAlexander Hansen     Threshold(sdbusplus::bus_t& bus, const char* path, Unit units) :
259*6272a393SAlexander Hansen         CriticalObject(bus, path), bus(bus), objPath(std::string(path)),
260*6272a393SAlexander Hansen         units(units)
261*6272a393SAlexander Hansen     {}
262*6272a393SAlexander Hansen 
highphosphor::virtual_sensor::Threshold263*6272a393SAlexander Hansen     auto high()
264*6272a393SAlexander Hansen     {
265*6272a393SAlexander Hansen         return CriticalObject::criticalHigh();
266*6272a393SAlexander Hansen     }
lowphosphor::virtual_sensor::Threshold267*6272a393SAlexander Hansen     auto low()
268*6272a393SAlexander Hansen     {
269*6272a393SAlexander Hansen         return CriticalObject::criticalLow();
270*6272a393SAlexander Hansen     }
271*6272a393SAlexander Hansen 
272*6272a393SAlexander Hansen     template <typename... Args>
alarmHighphosphor::virtual_sensor::Threshold273*6272a393SAlexander Hansen     auto alarmHigh(Args... args)
274*6272a393SAlexander Hansen     {
275*6272a393SAlexander Hansen         return criticalAlarmHigh(std::forward<Args>(args)...);
276*6272a393SAlexander Hansen     }
277*6272a393SAlexander Hansen 
278*6272a393SAlexander Hansen     template <typename... Args>
alarmLowphosphor::virtual_sensor::Threshold279*6272a393SAlexander Hansen     auto alarmLow(Args... args)
280*6272a393SAlexander Hansen     {
281*6272a393SAlexander Hansen         return criticalAlarmLow(std::forward<Args>(args)...);
282*6272a393SAlexander Hansen     }
283*6272a393SAlexander Hansen 
284*6272a393SAlexander Hansen     template <typename V>
alarmHighSignalAssertedphosphor::virtual_sensor::Threshold285*6272a393SAlexander Hansen     auto alarmHighSignalAsserted(V value)
286*6272a393SAlexander Hansen     {
287*6272a393SAlexander Hansen         assertedHighLog = tryCommit<ReadingAboveUpperCriticalThreshold>(
288*6272a393SAlexander Hansen             objPath, value, units, high());
289*6272a393SAlexander Hansen         return criticalHighAlarmAsserted(value);
290*6272a393SAlexander Hansen     }
291*6272a393SAlexander Hansen 
292*6272a393SAlexander Hansen     template <typename... Args>
alarmHighSignalDeassertedphosphor::virtual_sensor::Threshold293*6272a393SAlexander Hansen     auto alarmHighSignalDeasserted(Args... args)
294*6272a393SAlexander Hansen     {
295*6272a393SAlexander Hansen         tryResolve(assertedHighLog);
296*6272a393SAlexander Hansen         return criticalHighAlarmDeasserted(std::forward<Args>(args)...);
297*6272a393SAlexander Hansen     }
298*6272a393SAlexander Hansen 
299*6272a393SAlexander Hansen     template <typename V>
alarmLowSignalAssertedphosphor::virtual_sensor::Threshold300*6272a393SAlexander Hansen     auto alarmLowSignalAsserted(V value)
301*6272a393SAlexander Hansen     {
302*6272a393SAlexander Hansen         assertedLowLog = tryCommit<ReadingBelowLowerCriticalThreshold>(
303*6272a393SAlexander Hansen             objPath, value, units, low());
304*6272a393SAlexander Hansen         return criticalLowAlarmAsserted(value);
305*6272a393SAlexander Hansen     }
306*6272a393SAlexander Hansen 
307*6272a393SAlexander Hansen     template <typename... Args>
alarmLowSignalDeassertedphosphor::virtual_sensor::Threshold308*6272a393SAlexander Hansen     auto alarmLowSignalDeasserted(Args... args)
309*6272a393SAlexander Hansen     {
310*6272a393SAlexander Hansen         tryResolve(assertedLowLog);
311*6272a393SAlexander Hansen         return criticalLowAlarmDeasserted(std::forward<Args>(args)...);
312*6272a393SAlexander Hansen     }
313*6272a393SAlexander Hansen 
314*6272a393SAlexander Hansen     /** @brief Set value of CriticalHigh */
criticalHighphosphor::virtual_sensor::Threshold315*6272a393SAlexander Hansen     virtual double criticalHigh(double value)
316*6272a393SAlexander Hansen     {
317*6272a393SAlexander Hansen         // persistThreshold
318*6272a393SAlexander Hansen         if (!entityPath.empty() && !entityInterfaceHigh.empty())
319*6272a393SAlexander Hansen         {
320*6272a393SAlexander Hansen             setDbusProperty(bus, entityManagerBusName, entityPath,
321*6272a393SAlexander Hansen                             entityInterfaceHigh, "Value", value);
322*6272a393SAlexander Hansen         }
323*6272a393SAlexander Hansen         return CriticalObject::criticalHigh(value);
324*6272a393SAlexander Hansen     }
325*6272a393SAlexander Hansen 
326*6272a393SAlexander Hansen     /** @brief Set value of CriticalLow */
criticalLowphosphor::virtual_sensor::Threshold327*6272a393SAlexander Hansen     virtual double criticalLow(double value)
328*6272a393SAlexander Hansen     {
329*6272a393SAlexander Hansen         if (!entityPath.empty() && !entityInterfaceLow.empty())
330*6272a393SAlexander Hansen         {
331*6272a393SAlexander Hansen             setDbusProperty(bus, entityManagerBusName, entityPath,
332*6272a393SAlexander Hansen                             entityInterfaceLow, "Value", value);
333*6272a393SAlexander Hansen         }
334*6272a393SAlexander Hansen         return CriticalObject::criticalLow(value);
335*6272a393SAlexander Hansen     }
336*6272a393SAlexander Hansen 
337*6272a393SAlexander Hansen     /** @brief Set the entitymanager interface corresponding to virtualsensor
338*6272a393SAlexander Hansen      * criticalLow
339*6272a393SAlexander Hansen      */
setEntityInterfaceLowphosphor::virtual_sensor::Threshold340*6272a393SAlexander Hansen     void setEntityInterfaceLow(const std::string& interfaceLow)
341*6272a393SAlexander Hansen     {
342*6272a393SAlexander Hansen         entityInterfaceLow = interfaceLow;
343*6272a393SAlexander Hansen     }
344*6272a393SAlexander Hansen 
345*6272a393SAlexander Hansen     /** @brief Set the entitymanager interface corresponding to virtualsensor
346*6272a393SAlexander Hansen      * criticalLow
347*6272a393SAlexander Hansen      */
setEntityInterfaceHighphosphor::virtual_sensor::Threshold348*6272a393SAlexander Hansen     void setEntityInterfaceHigh(const std::string& interfaceHigh)
349*6272a393SAlexander Hansen     {
350*6272a393SAlexander Hansen         entityInterfaceHigh = interfaceHigh;
351*6272a393SAlexander Hansen     }
352*6272a393SAlexander Hansen 
353*6272a393SAlexander Hansen     /** @brief Set the entitymanager path corresponding to virtualsensor warning
354*6272a393SAlexander Hansen      */
setEntityPathphosphor::virtual_sensor::Threshold355*6272a393SAlexander Hansen     void setEntityPath(const std::string& path)
356*6272a393SAlexander Hansen     {
357*6272a393SAlexander Hansen         entityPath = path;
358*6272a393SAlexander Hansen     }
359*6272a393SAlexander Hansen };
360*6272a393SAlexander Hansen 
361*6272a393SAlexander Hansen template <>
362*6272a393SAlexander Hansen struct Threshold<SoftShutdownObject> :
363*6272a393SAlexander Hansen     public SoftShutdownObject,
364*6272a393SAlexander Hansen     public Hysteresis
365*6272a393SAlexander Hansen {
366*6272a393SAlexander Hansen     static constexpr auto name = "SoftShutdown";
367*6272a393SAlexander Hansen 
368*6272a393SAlexander Hansen     /** @brief sdbusplus bus client connection. */
369*6272a393SAlexander Hansen     sdbusplus::bus_t& bus;
370*6272a393SAlexander Hansen     std::string objPath;
371*6272a393SAlexander Hansen     Unit units;
372*6272a393SAlexander Hansen 
373*6272a393SAlexander Hansen     using SoftShutdownObject::SoftShutdownObject;
374*6272a393SAlexander Hansen     using ReadingAboveUpperSoftShutdownThreshold =
375*6272a393SAlexander Hansen         sdbusplus::error::xyz::openbmc_project::sensor::Threshold::
376*6272a393SAlexander Hansen             ReadingAboveUpperSoftShutdownThreshold;
377*6272a393SAlexander Hansen     using ReadingBelowLowerSoftShutdownThreshold =
378*6272a393SAlexander Hansen         sdbusplus::error::xyz::openbmc_project::sensor::Threshold::
379*6272a393SAlexander Hansen             ReadingBelowLowerSoftShutdownThreshold;
380*6272a393SAlexander Hansen     std::optional<sdbusplus::message::object_path> assertedHighLog;
381*6272a393SAlexander Hansen     std::optional<sdbusplus::message::object_path> assertedLowLog;
382*6272a393SAlexander Hansen 
383*6272a393SAlexander Hansen     /** @brief Constructor to put object onto bus at a dbus path.
384*6272a393SAlexander Hansen      *  @param[in] bus - Bus to attach to.
385*6272a393SAlexander Hansen      *  @param[in] path - Path to attach at.
386*6272a393SAlexander Hansen      *  @param[in] units - units
387*6272a393SAlexander Hansen      */
Thresholdphosphor::virtual_sensor::Threshold388*6272a393SAlexander Hansen     Threshold(sdbusplus::bus_t& bus, const char* path, Unit units) :
389*6272a393SAlexander Hansen         SoftShutdownObject(bus, path), bus(bus), objPath(std::string(path)),
390*6272a393SAlexander Hansen         units(units)
391*6272a393SAlexander Hansen     {}
392*6272a393SAlexander Hansen 
highphosphor::virtual_sensor::Threshold393*6272a393SAlexander Hansen     auto high()
394*6272a393SAlexander Hansen     {
395*6272a393SAlexander Hansen         return softShutdownHigh();
396*6272a393SAlexander Hansen     }
lowphosphor::virtual_sensor::Threshold397*6272a393SAlexander Hansen     auto low()
398*6272a393SAlexander Hansen     {
399*6272a393SAlexander Hansen         return softShutdownLow();
400*6272a393SAlexander Hansen     }
401*6272a393SAlexander Hansen 
402*6272a393SAlexander Hansen     template <typename... Args>
alarmHighphosphor::virtual_sensor::Threshold403*6272a393SAlexander Hansen     auto alarmHigh(Args... args)
404*6272a393SAlexander Hansen     {
405*6272a393SAlexander Hansen         return softShutdownAlarmHigh(std::forward<Args>(args)...);
406*6272a393SAlexander Hansen     }
407*6272a393SAlexander Hansen 
408*6272a393SAlexander Hansen     template <typename... Args>
alarmLowphosphor::virtual_sensor::Threshold409*6272a393SAlexander Hansen     auto alarmLow(Args... args)
410*6272a393SAlexander Hansen     {
411*6272a393SAlexander Hansen         return softShutdownAlarmLow(std::forward<Args>(args)...);
412*6272a393SAlexander Hansen     }
413*6272a393SAlexander Hansen 
414*6272a393SAlexander Hansen     template <typename V>
alarmHighSignalAssertedphosphor::virtual_sensor::Threshold415*6272a393SAlexander Hansen     auto alarmHighSignalAsserted(V value)
416*6272a393SAlexander Hansen     {
417*6272a393SAlexander Hansen         assertedHighLog = tryCommit<ReadingAboveUpperSoftShutdownThreshold>(
418*6272a393SAlexander Hansen             objPath, value, units, high());
419*6272a393SAlexander Hansen         return softShutdownHighAlarmAsserted(value);
420*6272a393SAlexander Hansen     }
421*6272a393SAlexander Hansen 
422*6272a393SAlexander Hansen     template <typename... Args>
alarmHighSignalDeassertedphosphor::virtual_sensor::Threshold423*6272a393SAlexander Hansen     auto alarmHighSignalDeasserted(Args... args)
424*6272a393SAlexander Hansen     {
425*6272a393SAlexander Hansen         tryResolve(assertedHighLog);
426*6272a393SAlexander Hansen         return softShutdownHighAlarmDeasserted(std::forward<Args>(args)...);
427*6272a393SAlexander Hansen     }
428*6272a393SAlexander Hansen 
429*6272a393SAlexander Hansen     template <typename V>
alarmLowSignalAssertedphosphor::virtual_sensor::Threshold430*6272a393SAlexander Hansen     auto alarmLowSignalAsserted(V value)
431*6272a393SAlexander Hansen     {
432*6272a393SAlexander Hansen         assertedLowLog = tryCommit<ReadingBelowLowerSoftShutdownThreshold>(
433*6272a393SAlexander Hansen             objPath, value, units, low());
434*6272a393SAlexander Hansen         return softShutdownLowAlarmAsserted(value);
435*6272a393SAlexander Hansen     }
436*6272a393SAlexander Hansen 
437*6272a393SAlexander Hansen     template <typename... Args>
alarmLowSignalDeassertedphosphor::virtual_sensor::Threshold438*6272a393SAlexander Hansen     auto alarmLowSignalDeasserted(Args... args)
439*6272a393SAlexander Hansen     {
440*6272a393SAlexander Hansen         tryResolve(assertedLowLog);
441*6272a393SAlexander Hansen         return softShutdownLowAlarmDeasserted(std::forward<Args>(args)...);
442*6272a393SAlexander Hansen     }
443*6272a393SAlexander Hansen };
444*6272a393SAlexander Hansen 
445*6272a393SAlexander Hansen template <>
446*6272a393SAlexander Hansen struct Threshold<HardShutdownObject> :
447*6272a393SAlexander Hansen     public HardShutdownObject,
448*6272a393SAlexander Hansen     public Hysteresis
449*6272a393SAlexander Hansen {
450*6272a393SAlexander Hansen     static constexpr auto name = "HardShutdown";
451*6272a393SAlexander Hansen 
452*6272a393SAlexander Hansen     /** @brief sdbusplus bus client connection. */
453*6272a393SAlexander Hansen     sdbusplus::bus_t& bus;
454*6272a393SAlexander Hansen     std::string objPath;
455*6272a393SAlexander Hansen     Unit units;
456*6272a393SAlexander Hansen 
457*6272a393SAlexander Hansen     using HardShutdownObject::HardShutdownObject;
458*6272a393SAlexander Hansen     using ReadingAboveUpperHardShutdownThreshold =
459*6272a393SAlexander Hansen         sdbusplus::error::xyz::openbmc_project::sensor::Threshold::
460*6272a393SAlexander Hansen             ReadingAboveUpperHardShutdownThreshold;
461*6272a393SAlexander Hansen     using ReadingBelowLowerHardShutdownThreshold =
462*6272a393SAlexander Hansen         sdbusplus::error::xyz::openbmc_project::sensor::Threshold::
463*6272a393SAlexander Hansen             ReadingBelowLowerHardShutdownThreshold;
464*6272a393SAlexander Hansen     std::optional<sdbusplus::message::object_path> assertedHighLog;
465*6272a393SAlexander Hansen     std::optional<sdbusplus::message::object_path> assertedLowLog;
466*6272a393SAlexander Hansen 
467*6272a393SAlexander Hansen     /** @brief Constructor to put object onto bus at a dbus path.
468*6272a393SAlexander Hansen      *  @param[in] bus - Bus to attach to.
469*6272a393SAlexander Hansen      *  @param[in] path - Path to attach at.
470*6272a393SAlexander Hansen      *  @param[in] units - units
471*6272a393SAlexander Hansen      */
Thresholdphosphor::virtual_sensor::Threshold472*6272a393SAlexander Hansen     Threshold(sdbusplus::bus_t& bus, const char* path, Unit units) :
473*6272a393SAlexander Hansen         HardShutdownObject(bus, path), bus(bus), objPath(std::string(path)),
474*6272a393SAlexander Hansen         units(units)
475*6272a393SAlexander Hansen     {}
476*6272a393SAlexander Hansen 
highphosphor::virtual_sensor::Threshold477*6272a393SAlexander Hansen     auto high()
478*6272a393SAlexander Hansen     {
479*6272a393SAlexander Hansen         return hardShutdownHigh();
480*6272a393SAlexander Hansen     }
lowphosphor::virtual_sensor::Threshold481*6272a393SAlexander Hansen     auto low()
482*6272a393SAlexander Hansen     {
483*6272a393SAlexander Hansen         return hardShutdownLow();
484*6272a393SAlexander Hansen     }
485*6272a393SAlexander Hansen 
486*6272a393SAlexander Hansen     template <typename... Args>
alarmHighphosphor::virtual_sensor::Threshold487*6272a393SAlexander Hansen     auto alarmHigh(Args... args)
488*6272a393SAlexander Hansen     {
489*6272a393SAlexander Hansen         return hardShutdownAlarmHigh(std::forward<Args>(args)...);
490*6272a393SAlexander Hansen     }
491*6272a393SAlexander Hansen 
492*6272a393SAlexander Hansen     template <typename... Args>
alarmLowphosphor::virtual_sensor::Threshold493*6272a393SAlexander Hansen     auto alarmLow(Args... args)
494*6272a393SAlexander Hansen     {
495*6272a393SAlexander Hansen         return hardShutdownAlarmLow(std::forward<Args>(args)...);
496*6272a393SAlexander Hansen     }
497*6272a393SAlexander Hansen 
498*6272a393SAlexander Hansen     template <typename V>
alarmHighSignalAssertedphosphor::virtual_sensor::Threshold499*6272a393SAlexander Hansen     auto alarmHighSignalAsserted(V value)
500*6272a393SAlexander Hansen     {
501*6272a393SAlexander Hansen         assertedHighLog = tryCommit<ReadingAboveUpperHardShutdownThreshold>(
502*6272a393SAlexander Hansen             objPath, value, units, high());
503*6272a393SAlexander Hansen         return hardShutdownHighAlarmAsserted(value);
504*6272a393SAlexander Hansen     }
505*6272a393SAlexander Hansen 
506*6272a393SAlexander Hansen     template <typename... Args>
alarmHighSignalDeassertedphosphor::virtual_sensor::Threshold507*6272a393SAlexander Hansen     auto alarmHighSignalDeasserted(Args... args)
508*6272a393SAlexander Hansen     {
509*6272a393SAlexander Hansen         tryResolve(assertedHighLog);
510*6272a393SAlexander Hansen         return hardShutdownHighAlarmDeasserted(std::forward<Args>(args)...);
511*6272a393SAlexander Hansen     }
512*6272a393SAlexander Hansen 
513*6272a393SAlexander Hansen     template <typename V>
alarmLowSignalAssertedphosphor::virtual_sensor::Threshold514*6272a393SAlexander Hansen     auto alarmLowSignalAsserted(V value)
515*6272a393SAlexander Hansen     {
516*6272a393SAlexander Hansen         assertedLowLog = tryCommit<ReadingBelowLowerHardShutdownThreshold>(
517*6272a393SAlexander Hansen             objPath, value, units, low());
518*6272a393SAlexander Hansen         return hardShutdownLowAlarmAsserted(value);
519*6272a393SAlexander Hansen     }
520*6272a393SAlexander Hansen 
521*6272a393SAlexander Hansen     template <typename... Args>
alarmLowSignalDeassertedphosphor::virtual_sensor::Threshold522*6272a393SAlexander Hansen     auto alarmLowSignalDeasserted(Args... args)
523*6272a393SAlexander Hansen     {
524*6272a393SAlexander Hansen         tryResolve(assertedLowLog);
525*6272a393SAlexander Hansen         return hardShutdownLowAlarmDeasserted(std::forward<Args>(args)...);
526*6272a393SAlexander Hansen     }
527*6272a393SAlexander Hansen };
528*6272a393SAlexander Hansen 
529*6272a393SAlexander Hansen template <>
530*6272a393SAlexander Hansen struct Threshold<PerformanceLossObject> :
531*6272a393SAlexander Hansen     public PerformanceLossObject,
532*6272a393SAlexander Hansen     public Hysteresis
533*6272a393SAlexander Hansen {
534*6272a393SAlexander Hansen     static constexpr auto name = "PerformanceLoss";
535*6272a393SAlexander Hansen     /** @brief sdbusplus bus client connection. */
536*6272a393SAlexander Hansen     sdbusplus::bus_t& bus;
537*6272a393SAlexander Hansen     std::string objPath;
538*6272a393SAlexander Hansen     Unit units;
539*6272a393SAlexander Hansen 
540*6272a393SAlexander Hansen     using PerformanceLossObject::PerformanceLossObject;
541*6272a393SAlexander Hansen     using ReadingAboveUpperPerformanceLossThreshold =
542*6272a393SAlexander Hansen         sdbusplus::error::xyz::openbmc_project::sensor::Threshold::
543*6272a393SAlexander Hansen             ReadingAboveUpperPerformanceLossThreshold;
544*6272a393SAlexander Hansen     using ReadingBelowLowerPerformanceLossThreshold =
545*6272a393SAlexander Hansen         sdbusplus::error::xyz::openbmc_project::sensor::Threshold::
546*6272a393SAlexander Hansen             ReadingBelowLowerPerformanceLossThreshold;
547*6272a393SAlexander Hansen     double performanceLossHighHysteresis;
548*6272a393SAlexander Hansen     double performanceLossLowHysteresis;
549*6272a393SAlexander Hansen     std::optional<sdbusplus::message::object_path> assertedHighLog;
550*6272a393SAlexander Hansen     std::optional<sdbusplus::message::object_path> assertedLowLog;
551*6272a393SAlexander Hansen 
552*6272a393SAlexander Hansen     /** @brief Constructor to put object onto bus at a dbus path.
553*6272a393SAlexander Hansen      *  @param[in] bus - Bus to attach to.
554*6272a393SAlexander Hansen      *  @param[in] path - Path to attach at.
555*6272a393SAlexander Hansen      *  @param[in] units - units
556*6272a393SAlexander Hansen      */
Thresholdphosphor::virtual_sensor::Threshold557*6272a393SAlexander Hansen     Threshold(sdbusplus::bus_t& bus, const char* path, Unit units) :
558*6272a393SAlexander Hansen         PerformanceLossObject(bus, path), bus(bus), objPath(std::string(path)),
559*6272a393SAlexander Hansen         units(units)
560*6272a393SAlexander Hansen     {}
561*6272a393SAlexander Hansen 
highphosphor::virtual_sensor::Threshold562*6272a393SAlexander Hansen     auto high()
563*6272a393SAlexander Hansen     {
564*6272a393SAlexander Hansen         return performanceLossHigh();
565*6272a393SAlexander Hansen     }
lowphosphor::virtual_sensor::Threshold566*6272a393SAlexander Hansen     auto low()
567*6272a393SAlexander Hansen     {
568*6272a393SAlexander Hansen         return performanceLossLow();
569*6272a393SAlexander Hansen     }
570*6272a393SAlexander Hansen 
571*6272a393SAlexander Hansen     template <typename... Args>
alarmHighphosphor::virtual_sensor::Threshold572*6272a393SAlexander Hansen     auto alarmHigh(Args... args)
573*6272a393SAlexander Hansen     {
574*6272a393SAlexander Hansen         return performanceLossAlarmHigh(std::forward<Args>(args)...);
575*6272a393SAlexander Hansen     }
576*6272a393SAlexander Hansen 
577*6272a393SAlexander Hansen     template <typename... Args>
alarmLowphosphor::virtual_sensor::Threshold578*6272a393SAlexander Hansen     auto alarmLow(Args... args)
579*6272a393SAlexander Hansen     {
580*6272a393SAlexander Hansen         return performanceLossAlarmLow(std::forward<Args>(args)...);
581*6272a393SAlexander Hansen     }
582*6272a393SAlexander Hansen 
583*6272a393SAlexander Hansen     template <typename V>
alarmHighSignalAssertedphosphor::virtual_sensor::Threshold584*6272a393SAlexander Hansen     auto alarmHighSignalAsserted(V value)
585*6272a393SAlexander Hansen     {
586*6272a393SAlexander Hansen         assertedHighLog = tryCommit<ReadingAboveUpperPerformanceLossThreshold>(
587*6272a393SAlexander Hansen             objPath, value, units, high());
588*6272a393SAlexander Hansen         return performanceLossHighAlarmAsserted(value);
589*6272a393SAlexander Hansen     }
590*6272a393SAlexander Hansen 
591*6272a393SAlexander Hansen     template <typename... Args>
alarmHighSignalDeassertedphosphor::virtual_sensor::Threshold592*6272a393SAlexander Hansen     auto alarmHighSignalDeasserted(Args... args)
593*6272a393SAlexander Hansen     {
594*6272a393SAlexander Hansen         tryResolve(assertedHighLog);
595*6272a393SAlexander Hansen         return performanceLossHighAlarmDeasserted(std::forward<Args>(args)...);
596*6272a393SAlexander Hansen     }
597*6272a393SAlexander Hansen 
598*6272a393SAlexander Hansen     template <typename V>
alarmLowSignalAssertedphosphor::virtual_sensor::Threshold599*6272a393SAlexander Hansen     auto alarmLowSignalAsserted(V value)
600*6272a393SAlexander Hansen     {
601*6272a393SAlexander Hansen         assertedLowLog = tryCommit<ReadingBelowLowerPerformanceLossThreshold>(
602*6272a393SAlexander Hansen             objPath, value, units, low());
603*6272a393SAlexander Hansen         return performanceLossLowAlarmAsserted(value);
604*6272a393SAlexander Hansen     }
605*6272a393SAlexander Hansen 
606*6272a393SAlexander Hansen     template <typename... Args>
alarmLowSignalDeassertedphosphor::virtual_sensor::Threshold607*6272a393SAlexander Hansen     auto alarmLowSignalDeasserted(Args... args)
608*6272a393SAlexander Hansen     {
609*6272a393SAlexander Hansen         tryResolve(assertedLowLog);
610*6272a393SAlexander Hansen         return performanceLossLowAlarmDeasserted(std::forward<Args>(args)...);
611*6272a393SAlexander Hansen     }
612*6272a393SAlexander Hansen };
613*6272a393SAlexander Hansen 
614*6272a393SAlexander Hansen } // namespace phosphor::virtual_sensor
615