blob: cb6dbdd9c6ce2e4ac0aafe120557f65560ed2b79 [file] [log] [blame]
Wludzik, Jozef1477fe62021-01-02 11:56:10 +01001#include "numeric_threshold.hpp"
2
3#include <phosphor-logging/log.hpp>
4
5NumericThreshold::NumericThreshold(
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +00006 boost::asio::io_context& ioc, Sensors sensorsIn,
Wludzik, Jozef1477fe62021-01-02 11:56:10 +01007 std::vector<std::unique_ptr<interfaces::TriggerAction>> actionsIn,
Szymon Dompke94f71c52021-12-10 07:16:33 +01008 Milliseconds dwellTimeIn, numeric::Direction directionIn,
9 double thresholdValueIn, numeric::Type typeIn) :
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010010 ioc(ioc),
Szymon Dompke94f71c52021-12-10 07:16:33 +010011 actions(std::move(actionsIn)), dwellTime(dwellTimeIn),
12 direction(directionIn), thresholdValue(thresholdValueIn), type(typeIn)
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010013{
Szymon Dompke94f71c52021-12-10 07:16:33 +010014 for (const auto& sensor : sensorsIn)
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010015 {
Szymon Dompke94f71c52021-12-10 07:16:33 +010016 sensorDetails.emplace(sensor, makeDetails(sensor->getName()));
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010017 }
18}
19
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010020void NumericThreshold::initialize()
21{
Szymon Dompke94f71c52021-12-10 07:16:33 +010022 ThresholdOperations().initialize(this);
23}
24
25void NumericThreshold::updateSensors(Sensors newSensors)
26{
27 ThresholdOperations().updateSensors(this, std::move(newSensors));
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010028}
29
30NumericThreshold::ThresholdDetail&
Szymon Dompke94f71c52021-12-10 07:16:33 +010031 NumericThreshold::getDetails(const interfaces::Sensor& sensor)
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010032{
Szymon Dompke94f71c52021-12-10 07:16:33 +010033 return ThresholdOperations().getDetails(this, sensor);
34}
35
36std::shared_ptr<NumericThreshold::ThresholdDetail>
37 NumericThreshold::makeDetails(const std::string& sensorName)
38{
39 return std::make_shared<ThresholdDetail>(sensorName, thresholdValue, false,
40 ioc);
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010041}
42
43void NumericThreshold::sensorUpdated(interfaces::Sensor& sensor,
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +010044 Milliseconds timestamp, double value)
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010045{
Szymon Dompke94f71c52021-12-10 07:16:33 +010046 auto& details = getDetails(sensor);
47 auto& [sensorName, prevValue, dwell, timer] = details;
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010048 bool decreasing = thresholdValue < prevValue && thresholdValue > value;
49 bool increasing = thresholdValue > prevValue && thresholdValue < value;
50
51 if (dwell && (increasing || decreasing))
52 {
53 timer.cancel();
54 dwell = false;
55 }
56 if ((direction == numeric::Direction::decreasing && decreasing) ||
57 (direction == numeric::Direction::increasing && increasing) ||
58 (direction == numeric::Direction::either && (increasing || decreasing)))
59 {
Szymon Dompke94f71c52021-12-10 07:16:33 +010060 startTimer(details, timestamp, value);
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010061 }
62
63 prevValue = value;
64}
65
Szymon Dompke94f71c52021-12-10 07:16:33 +010066void NumericThreshold::startTimer(NumericThreshold::ThresholdDetail& details,
67 Milliseconds timestamp, double value)
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010068{
Szymon Dompke94f71c52021-12-10 07:16:33 +010069 const auto& sensorName = details.sensorName;
70 auto& dwell = details.dwell;
71 auto& timer = details.timer;
72
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000073 if (dwellTime == Milliseconds::zero())
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010074 {
75 commit(sensorName, timestamp, value);
76 }
77 else
78 {
79 dwell = true;
80 timer.expires_after(dwellTime);
Szymon Dompke94f71c52021-12-10 07:16:33 +010081 timer.async_wait([this, &sensorName, &dwell, timestamp,
82 value](const boost::system::error_code ec) {
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010083 if (ec)
84 {
85 phosphor::logging::log<phosphor::logging::level::DEBUG>(
86 "Timer has been canceled");
87 return;
88 }
89 commit(sensorName, timestamp, value);
90 dwell = false;
91 });
92 }
93}
94
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +010095void NumericThreshold::commit(const std::string& sensorName,
96 Milliseconds timestamp, double value)
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010097{
98 for (const auto& action : actions)
99 {
100 action->commit(sensorName, timestamp, value);
101 }
102}
Szymon Dompke94f71c52021-12-10 07:16:33 +0100103
104LabeledThresholdParam NumericThreshold::getThresholdParam() const
105{
106 return numeric::LabeledThresholdParam(type, dwellTime.count(), direction,
107 thresholdValue);
108}