blob: be238a1e25245af108da1bbc45dee3a18f3116b3 [file] [log] [blame]
Matt Spinler8f5e6112021-01-15 10:44:32 -06001#pragma once
2
3#include <xyz/openbmc_project/Sensor/Threshold/Critical/server.hpp>
4#include <xyz/openbmc_project/Sensor/Threshold/HardShutdown/server.hpp>
Matt Spinlerb306b032021-02-01 10:05:46 -06005#include <xyz/openbmc_project/Sensor/Threshold/PerformanceLoss/server.hpp>
Matt Spinler8f5e6112021-01-15 10:44:32 -06006#include <xyz/openbmc_project/Sensor/Threshold/SoftShutdown/server.hpp>
7#include <xyz/openbmc_project/Sensor/Threshold/Warning/server.hpp>
8
9namespace phosphor::virtualSensor
10{
11
12template <typename... T>
Patrick Williams8e11ccc2022-07-22 19:26:57 -050013using ServerObject = typename sdbusplus::server::object_t<T...>;
Matt Spinler8f5e6112021-01-15 10:44:32 -060014
Patrick Williamsfdb826d2021-01-20 14:37:53 -060015namespace threshold_ns =
16 sdbusplus::xyz::openbmc_project::Sensor::Threshold::server;
17using CriticalObject = ServerObject<threshold_ns::Critical>;
18using WarningObject = ServerObject<threshold_ns::Warning>;
19using SoftShutdownObject = ServerObject<threshold_ns::SoftShutdown>;
20using HardShutdownObject = ServerObject<threshold_ns::HardShutdown>;
Matt Spinlerb306b032021-02-01 10:05:46 -060021using PerformanceLossObject = ServerObject<threshold_ns::PerformanceLoss>;
Matt Spinler8f5e6112021-01-15 10:44:32 -060022
23template <typename T>
Patrick Williamsfdb826d2021-01-20 14:37:53 -060024struct Threshold;
Matt Spinler8f5e6112021-01-15 10:44:32 -060025
Rashmica Gupta1dff7dc2021-07-27 19:43:31 +100026struct Hysteresis
27{
28 double highHysteresis;
29 double lowHysteresis;
30 auto getHighHysteresis()
31 {
32 return this->highHysteresis;
33 }
34
35 auto getLowHysteresis()
36 {
37 return this->lowHysteresis;
38 }
39
40 auto setHighHysteresis(double value)
41 {
42 this->highHysteresis = value;
43 }
44
45 auto setLowHysteresis(double value)
46 {
47 this->lowHysteresis = value;
48 }
49};
50
Matt Spinler8f5e6112021-01-15 10:44:32 -060051template <>
Rashmica Gupta1dff7dc2021-07-27 19:43:31 +100052struct Threshold<WarningObject> : public WarningObject, public Hysteresis
Matt Spinler8f5e6112021-01-15 10:44:32 -060053{
Patrick Williamsfdb826d2021-01-20 14:37:53 -060054 static constexpr auto name = "Warning";
55 using WarningObject::WarningObject;
Tao Lin91799db2022-07-27 21:02:20 +080056 /** @brief sdbusplus bus client connection. */
Patrick Williams83e3ac32022-11-26 09:41:58 -060057 sdbusplus::bus_t& bus;
Tao Lin91799db2022-07-27 21:02:20 +080058 std::string objPath;
59
60 /** @brief Virtual sensor path/interface in entityManagerDbus.
61 * This 3 value is used to set thresholds
62 */
63 std::string entityPath;
64 std::string entityInterfaceHigh;
65 std::string entityInterfaceLow;
66
67 /** @brief Constructor to put object onto bus at a dbus path.
68 * @param[in] bus - Bus to attach to.
69 * @param[in] path - Path to attach at.
70 */
Patrick Williams83e3ac32022-11-26 09:41:58 -060071 Threshold(sdbusplus::bus_t& bus, const char* path) :
Tao Lin91799db2022-07-27 21:02:20 +080072 WarningObject(bus, path), bus(bus), objPath(std::string(path))
73 {}
Patrick Williamsfdb826d2021-01-20 14:37:53 -060074
75 auto high()
Matt Spinler8f5e6112021-01-15 10:44:32 -060076 {
Tao Lin91799db2022-07-27 21:02:20 +080077 return WarningObject::warningHigh();
Matt Spinler8f5e6112021-01-15 10:44:32 -060078 }
Patrick Williamsfdb826d2021-01-20 14:37:53 -060079 auto low()
Matt Spinler8f5e6112021-01-15 10:44:32 -060080 {
Tao Lin91799db2022-07-27 21:02:20 +080081 return WarningObject::warningLow();
Matt Spinler8f5e6112021-01-15 10:44:32 -060082 }
83
Patrick Williamsfdb826d2021-01-20 14:37:53 -060084 template <typename... Args>
85 auto alarmHigh(Args... args)
Matt Spinler8f5e6112021-01-15 10:44:32 -060086 {
Patrick Williamsfdb826d2021-01-20 14:37:53 -060087 return warningAlarmHigh(std::forward<Args>(args)...);
Matt Spinler8f5e6112021-01-15 10:44:32 -060088 }
89
Patrick Williamsfdb826d2021-01-20 14:37:53 -060090 template <typename... Args>
91 auto alarmLow(Args... args)
Matt Spinler8f5e6112021-01-15 10:44:32 -060092 {
Patrick Williamsfdb826d2021-01-20 14:37:53 -060093 return warningAlarmLow(std::forward<Args>(args)...);
Matt Spinler8f5e6112021-01-15 10:44:32 -060094 }
George Hung4294e6d2021-04-14 20:58:21 +080095
96 template <typename... Args>
97 auto alarmHighSignalAsserted(Args... args)
98 {
99 return warningHighAlarmAsserted(std::forward<Args>(args)...);
100 }
101
102 template <typename... Args>
103 auto alarmHighSignalDeasserted(Args... args)
104 {
105 return warningHighAlarmDeasserted(std::forward<Args>(args)...);
106 }
107
108 template <typename... Args>
109 auto alarmLowSignalAsserted(Args... args)
110 {
111 return warningLowAlarmAsserted(std::forward<Args>(args)...);
112 }
113
114 template <typename... Args>
115 auto alarmLowSignalDeasserted(Args... args)
116 {
117 return warningLowAlarmDeasserted(std::forward<Args>(args)...);
118 }
Tao Lin91799db2022-07-27 21:02:20 +0800119
120 /** @brief Set value of WarningHigh */
121 virtual double warningHigh(double value)
122 {
Matt Spinlera291ce12023-02-06 15:12:44 -0600123 if (!entityPath.empty() && !entityInterfaceHigh.empty())
124 {
125 // persistThreshold
126 setDbusProperty(bus, entityManagerBusName, entityPath,
127 entityInterfaceHigh, "Value", value);
128 }
Tao Lin91799db2022-07-27 21:02:20 +0800129 return WarningObject::warningHigh(value);
130 }
131
132 /** @brief Set value of WarningLow */
133 virtual double warningLow(double value)
134 {
Matt Spinlera291ce12023-02-06 15:12:44 -0600135 if (!entityPath.empty() && !entityInterfaceLow.empty())
136 {
137 // persistThreshold
138 setDbusProperty(bus, entityManagerBusName, entityPath,
139 entityInterfaceLow, "Value", value);
140 }
Tao Lin91799db2022-07-27 21:02:20 +0800141 return WarningObject::warningLow(value);
142 }
143
144 /** @brief Set the entitymanager interface corresponding to virtualsensor
145 * warningLow
146 */
147 void setEntityInterfaceLow(const std::string& interfaceLow)
148 {
149 entityInterfaceLow = interfaceLow;
150 }
151
152 /** @brief Set the entitymanager interface corresponding to virtualsensor
153 * warningHigh
154 */
155 void setEntityInterfaceHigh(const std::string& interfaceHigh)
156 {
157 entityInterfaceHigh = interfaceHigh;
158 }
159
160 /** @brief Set the entitymanager path corresponding to virtualsensor warning
161 */
162 void setEntityPath(const std::string& path)
163 {
164 entityPath = path;
165 }
Matt Spinler8f5e6112021-01-15 10:44:32 -0600166};
167
168template <>
Rashmica Gupta1dff7dc2021-07-27 19:43:31 +1000169struct Threshold<CriticalObject> : public CriticalObject, public Hysteresis
Matt Spinler8f5e6112021-01-15 10:44:32 -0600170{
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600171 static constexpr auto name = "Critical";
Tao Lin91799db2022-07-27 21:02:20 +0800172
173 /** @brief sdbusplus bus client connection. */
Patrick Williams83e3ac32022-11-26 09:41:58 -0600174 sdbusplus::bus_t& bus;
Tao Lin91799db2022-07-27 21:02:20 +0800175 std::string objPath;
176
177 /** @brief Virtual sensor path/interface in entityManagerDbus.
178 * This 3 value is used to set thresholds
179 */
180 std::string entityPath;
181 std::string entityInterfaceHigh;
182 std::string entityInterfaceLow;
183
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600184 using CriticalObject::CriticalObject;
185
Tao Lin91799db2022-07-27 21:02:20 +0800186 /** @brief Constructor to put object onto bus at a dbus path.
187 * @param[in] bus - Bus to attach to.
188 * @param[in] path - Path to attach at.
189 */
Patrick Williams83e3ac32022-11-26 09:41:58 -0600190 Threshold(sdbusplus::bus_t& bus, const char* path) :
Tao Lin91799db2022-07-27 21:02:20 +0800191 CriticalObject(bus, path), bus(bus), objPath(std::string(path))
192 {}
193
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600194 auto high()
Matt Spinler8f5e6112021-01-15 10:44:32 -0600195 {
Tao Lin91799db2022-07-27 21:02:20 +0800196 return CriticalObject::criticalHigh();
Matt Spinler8f5e6112021-01-15 10:44:32 -0600197 }
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600198 auto low()
Matt Spinler8f5e6112021-01-15 10:44:32 -0600199 {
Tao Lin91799db2022-07-27 21:02:20 +0800200 return CriticalObject::criticalLow();
Matt Spinler8f5e6112021-01-15 10:44:32 -0600201 }
202
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600203 template <typename... Args>
204 auto alarmHigh(Args... args)
Matt Spinler8f5e6112021-01-15 10:44:32 -0600205 {
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600206 return criticalAlarmHigh(std::forward<Args>(args)...);
Matt Spinler8f5e6112021-01-15 10:44:32 -0600207 }
208
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600209 template <typename... Args>
210 auto alarmLow(Args... args)
Matt Spinler8f5e6112021-01-15 10:44:32 -0600211 {
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600212 return criticalAlarmLow(std::forward<Args>(args)...);
Matt Spinler8f5e6112021-01-15 10:44:32 -0600213 }
George Hung4294e6d2021-04-14 20:58:21 +0800214
215 template <typename... Args>
216 auto alarmHighSignalAsserted(Args... args)
217 {
218 return criticalHighAlarmAsserted(std::forward<Args>(args)...);
219 }
220
221 template <typename... Args>
222 auto alarmHighSignalDeasserted(Args... args)
223 {
224 return criticalHighAlarmDeasserted(std::forward<Args>(args)...);
225 }
226
227 template <typename... Args>
228 auto alarmLowSignalAsserted(Args... args)
229 {
230 return criticalLowAlarmAsserted(std::forward<Args>(args)...);
231 }
232
233 template <typename... Args>
234 auto alarmLowSignalDeasserted(Args... args)
235 {
236 return criticalLowAlarmDeasserted(std::forward<Args>(args)...);
237 }
Tao Lin91799db2022-07-27 21:02:20 +0800238
239 /** @brief Set value of CriticalHigh */
240 virtual double criticalHigh(double value)
241 {
242 // persistThreshold
Matt Spinlera291ce12023-02-06 15:12:44 -0600243 if (!entityPath.empty() && !entityInterfaceHigh.empty())
244 {
245 setDbusProperty(bus, entityManagerBusName, entityPath,
246 entityInterfaceHigh, "Value", value);
247 }
Tao Lin91799db2022-07-27 21:02:20 +0800248 return CriticalObject::criticalHigh(value);
249 }
250
251 /** @brief Set value of CriticalLow */
252 virtual double criticalLow(double value)
253 {
Matt Spinlera291ce12023-02-06 15:12:44 -0600254 if (!entityPath.empty() && !entityInterfaceLow.empty())
255 {
256 setDbusProperty(bus, entityManagerBusName, entityPath,
257 entityInterfaceLow, "Value", value);
258 }
Tao Lin91799db2022-07-27 21:02:20 +0800259 return CriticalObject::criticalLow(value);
260 }
261
262 /** @brief Set the entitymanager interface corresponding to virtualsensor
263 * criticalLow
264 */
265 void setEntityInterfaceLow(const std::string& interfaceLow)
266 {
267 entityInterfaceLow = interfaceLow;
268 }
269
270 /** @brief Set the entitymanager interface corresponding to virtualsensor
271 * criticalLow
272 */
273 void setEntityInterfaceHigh(const std::string& interfaceHigh)
274 {
275 entityInterfaceHigh = interfaceHigh;
276 }
277
278 /** @brief Set the entitymanager path corresponding to virtualsensor warning
279 */
280 void setEntityPath(const std::string& path)
281 {
282 entityPath = path;
283 }
Matt Spinler8f5e6112021-01-15 10:44:32 -0600284};
285
286template <>
Rashmica Gupta1dff7dc2021-07-27 19:43:31 +1000287struct Threshold<SoftShutdownObject> :
288 public SoftShutdownObject,
289 public Hysteresis
Matt Spinler8f5e6112021-01-15 10:44:32 -0600290{
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600291 static constexpr auto name = "SoftShutdown";
292 using SoftShutdownObject::SoftShutdownObject;
293
294 auto high()
Matt Spinler8f5e6112021-01-15 10:44:32 -0600295 {
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600296 return softShutdownHigh();
Matt Spinler8f5e6112021-01-15 10:44:32 -0600297 }
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600298 auto low()
Matt Spinler8f5e6112021-01-15 10:44:32 -0600299 {
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600300 return softShutdownLow();
Matt Spinler8f5e6112021-01-15 10:44:32 -0600301 }
302
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600303 template <typename... Args>
304 auto alarmHigh(Args... args)
Matt Spinler8f5e6112021-01-15 10:44:32 -0600305 {
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600306 return softShutdownAlarmHigh(std::forward<Args>(args)...);
Matt Spinler8f5e6112021-01-15 10:44:32 -0600307 }
308
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600309 template <typename... Args>
310 auto alarmLow(Args... args)
Matt Spinler8f5e6112021-01-15 10:44:32 -0600311 {
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600312 return softShutdownAlarmLow(std::forward<Args>(args)...);
Matt Spinler8f5e6112021-01-15 10:44:32 -0600313 }
George Hung4294e6d2021-04-14 20:58:21 +0800314
315 template <typename... Args>
316 auto alarmHighSignalAsserted(Args... args)
317 {
318 return softShutdownHighAlarmAsserted(std::forward<Args>(args)...);
319 }
320
321 template <typename... Args>
322 auto alarmHighSignalDeasserted(Args... args)
323 {
324 return softShutdownHighAlarmDeasserted(std::forward<Args>(args)...);
325 }
326
327 template <typename... Args>
328 auto alarmLowSignalAsserted(Args... args)
329 {
330 return softShutdownLowAlarmAsserted(std::forward<Args>(args)...);
331 }
332
333 template <typename... Args>
334 auto alarmLowSignalDeasserted(Args... args)
335 {
336 return softShutdownLowAlarmDeasserted(std::forward<Args>(args)...);
337 }
Matt Spinler8f5e6112021-01-15 10:44:32 -0600338};
339
340template <>
Rashmica Gupta1dff7dc2021-07-27 19:43:31 +1000341struct Threshold<HardShutdownObject> :
342 public HardShutdownObject,
343 public Hysteresis
Matt Spinler8f5e6112021-01-15 10:44:32 -0600344{
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600345 static constexpr auto name = "HardShutdown";
346 using HardShutdownObject::HardShutdownObject;
347
348 auto high()
Matt Spinler8f5e6112021-01-15 10:44:32 -0600349 {
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600350 return hardShutdownHigh();
Matt Spinler8f5e6112021-01-15 10:44:32 -0600351 }
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600352 auto low()
Matt Spinler8f5e6112021-01-15 10:44:32 -0600353 {
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600354 return hardShutdownLow();
Matt Spinler8f5e6112021-01-15 10:44:32 -0600355 }
356
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600357 template <typename... Args>
358 auto alarmHigh(Args... args)
Matt Spinler8f5e6112021-01-15 10:44:32 -0600359 {
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600360 return hardShutdownAlarmHigh(std::forward<Args>(args)...);
Matt Spinler8f5e6112021-01-15 10:44:32 -0600361 }
362
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600363 template <typename... Args>
364 auto alarmLow(Args... args)
Matt Spinler8f5e6112021-01-15 10:44:32 -0600365 {
Patrick Williamsfdb826d2021-01-20 14:37:53 -0600366 return hardShutdownAlarmLow(std::forward<Args>(args)...);
Matt Spinler8f5e6112021-01-15 10:44:32 -0600367 }
George Hung4294e6d2021-04-14 20:58:21 +0800368
369 template <typename... Args>
370 auto alarmHighSignalAsserted(Args... args)
371 {
372 return hardShutdownHighAlarmAsserted(std::forward<Args>(args)...);
373 }
374
375 template <typename... Args>
376 auto alarmHighSignalDeasserted(Args... args)
377 {
378 return hardShutdownHighAlarmDeasserted(std::forward<Args>(args)...);
379 }
380
381 template <typename... Args>
382 auto alarmLowSignalAsserted(Args... args)
383 {
384 return hardShutdownLowAlarmAsserted(std::forward<Args>(args)...);
385 }
386
387 template <typename... Args>
388 auto alarmLowSignalDeasserted(Args... args)
389 {
390 return hardShutdownLowAlarmDeasserted(std::forward<Args>(args)...);
391 }
Matt Spinler8f5e6112021-01-15 10:44:32 -0600392};
393
Matt Spinlerb306b032021-02-01 10:05:46 -0600394template <>
Rashmica Gupta1dff7dc2021-07-27 19:43:31 +1000395struct Threshold<PerformanceLossObject> :
396 public PerformanceLossObject,
397 public Hysteresis
Matt Spinlerb306b032021-02-01 10:05:46 -0600398{
399 static constexpr auto name = "PerformanceLoss";
400 using PerformanceLossObject::PerformanceLossObject;
Rashmica Gupta1dff7dc2021-07-27 19:43:31 +1000401 double performanceLossHighHysteresis;
402 double performanceLossLowHysteresis;
Matt Spinlerb306b032021-02-01 10:05:46 -0600403
404 auto high()
405 {
406 return performanceLossHigh();
407 }
408 auto low()
409 {
410 return performanceLossLow();
411 }
412
413 template <typename... Args>
414 auto alarmHigh(Args... args)
415 {
416 return performanceLossAlarmHigh(std::forward<Args>(args)...);
417 }
418
419 template <typename... Args>
420 auto alarmLow(Args... args)
421 {
422 return performanceLossAlarmLow(std::forward<Args>(args)...);
423 }
George Hung4294e6d2021-04-14 20:58:21 +0800424
425 template <typename... Args>
426 auto alarmHighSignalAsserted(Args... args)
427 {
428 return performanceLossHighAlarmAsserted(std::forward<Args>(args)...);
429 }
430
431 template <typename... Args>
432 auto alarmHighSignalDeasserted(Args... args)
433 {
434 return performanceLossHighAlarmDeasserted(std::forward<Args>(args)...);
435 }
436
437 template <typename... Args>
438 auto alarmLowSignalAsserted(Args... args)
439 {
440 return performanceLossLowAlarmAsserted(std::forward<Args>(args)...);
441 }
442
443 template <typename... Args>
444 auto alarmLowSignalDeasserted(Args... args)
445 {
446 return performanceLossLowAlarmDeasserted(std::forward<Args>(args)...);
447 }
Matt Spinlerb306b032021-02-01 10:05:46 -0600448};
449
Matt Spinler8f5e6112021-01-15 10:44:32 -0600450} // namespace phosphor::virtualSensor