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