xref: /openbmc/telemetry/src/numeric_threshold.hpp (revision f535cad6545d39fe58f50d0f23074359f43f8a03)
11477fe6aSWludzik, Jozef #pragma once
21477fe6aSWludzik, Jozef 
3b7b7e1b6SSzymon Dompke #include "interfaces/clock.hpp"
41477fe6aSWludzik, Jozef #include "interfaces/sensor.hpp"
51477fe6aSWludzik, Jozef #include "interfaces/sensor_listener.hpp"
61477fe6aSWludzik, Jozef #include "interfaces/threshold.hpp"
71477fe6aSWludzik, Jozef #include "interfaces/trigger_action.hpp"
851f0fd50SKrzysztof Grobelny #include "types/duration_types.hpp"
9dcc4e193SKrzysztof Grobelny #include "types/trigger_types.hpp"
1094f71c51SSzymon Dompke #include "utils/threshold_operations.hpp"
111477fe6aSWludzik, Jozef 
121477fe6aSWludzik, Jozef #include <boost/asio/steady_timer.hpp>
131477fe6aSWludzik, Jozef 
141477fe6aSWludzik, Jozef #include <chrono>
1594f71c51SSzymon Dompke #include <map>
161477fe6aSWludzik, Jozef #include <memory>
171477fe6aSWludzik, Jozef #include <vector>
181477fe6aSWludzik, Jozef 
191477fe6aSWludzik, Jozef class NumericThreshold :
201477fe6aSWludzik, Jozef     public interfaces::Threshold,
211477fe6aSWludzik, Jozef     public interfaces::SensorListener,
221477fe6aSWludzik, Jozef     public std::enable_shared_from_this<NumericThreshold>
231477fe6aSWludzik, Jozef {
241477fe6aSWludzik, Jozef   public:
251477fe6aSWludzik, Jozef     NumericThreshold(
26b7b7e1b6SSzymon Dompke         boost::asio::io_context& ioc, const std::string& triggerId,
27b7b7e1b6SSzymon Dompke         Sensors sensors,
281477fe6aSWludzik, Jozef         std::vector<std::unique_ptr<interfaces::TriggerAction>> actions,
29dcc4e193SKrzysztof Grobelny         Milliseconds dwellTime, numeric::Direction direction,
30b7b7e1b6SSzymon Dompke         double thresholdValue, numeric::Type type,
31b7b7e1b6SSzymon Dompke         std::unique_ptr<interfaces::Clock> clock);
3241fa80d8SKrzysztof Grobelny     NumericThreshold(const NumericThreshold&) = delete;
3341fa80d8SKrzysztof Grobelny     NumericThreshold(NumericThreshold&&) = delete;
341477fe6aSWludzik, Jozef 
351477fe6aSWludzik, Jozef     void initialize() override;
3651f0fd50SKrzysztof Grobelny     void sensorUpdated(interfaces::Sensor&, Milliseconds, double) override;
3794f71c51SSzymon Dompke     LabeledThresholdParam getThresholdParam() const override;
3894f71c51SSzymon Dompke     void updateSensors(Sensors newSensors) override;
391477fe6aSWludzik, Jozef 
401477fe6aSWludzik, Jozef   private:
411477fe6aSWludzik, Jozef     boost::asio::io_context& ioc;
42b7b7e1b6SSzymon Dompke     const std::string& triggerId;
431477fe6aSWludzik, Jozef     const std::vector<std::unique_ptr<interfaces::TriggerAction>> actions;
44dcc4e193SKrzysztof Grobelny     const Milliseconds dwellTime;
451477fe6aSWludzik, Jozef     const numeric::Direction direction;
461477fe6aSWludzik, Jozef     const double thresholdValue;
4794f71c51SSzymon Dompke     const numeric::Type type;
4894f71c51SSzymon Dompke     bool initialized = false;
49b7b7e1b6SSzymon Dompke     std::unique_ptr<interfaces::Clock> clock;
501477fe6aSWludzik, Jozef 
511477fe6aSWludzik, Jozef     struct ThresholdDetail
521477fe6aSWludzik, Jozef     {
53162b9761SSzymon Dompke         std::optional<double> prevValue = std::nullopt;
54162b9761SSzymon Dompke         numeric::Direction prevDirection = numeric::Direction::either;
55162b9761SSzymon Dompke         bool dwell = false;
561477fe6aSWludzik, Jozef         boost::asio::steady_timer timer;
571477fe6aSWludzik, Jozef 
ThresholdDetailNumericThreshold::ThresholdDetail58162b9761SSzymon Dompke         ThresholdDetail(const std::string& sensorNameIn,
591477fe6aSWludzik, Jozef                         boost::asio::io_context& ioc) :
60*f535cad6SPatrick Williams             timer(ioc), sensorName(sensorNameIn)
611477fe6aSWludzik, Jozef         {}
6241fa80d8SKrzysztof Grobelny         ThresholdDetail(const ThresholdDetail&) = delete;
6341fa80d8SKrzysztof Grobelny         ThresholdDetail(ThresholdDetail&&) = delete;
64162b9761SSzymon Dompke 
getSensorNameNumericThreshold::ThresholdDetail65162b9761SSzymon Dompke         const std::string& getSensorName()
66162b9761SSzymon Dompke         {
67162b9761SSzymon Dompke             return sensorName;
68162b9761SSzymon Dompke         }
69162b9761SSzymon Dompke 
70162b9761SSzymon Dompke       private:
71162b9761SSzymon Dompke         std::string sensorName;
721477fe6aSWludzik, Jozef     };
7394f71c51SSzymon Dompke     using SensorDetails =
7494f71c51SSzymon Dompke         std::unordered_map<std::shared_ptr<interfaces::Sensor>,
7594f71c51SSzymon Dompke                            std::shared_ptr<ThresholdDetail>>;
7694f71c51SSzymon Dompke     SensorDetails sensorDetails;
771477fe6aSWludzik, Jozef 
7894f71c51SSzymon Dompke     friend ThresholdOperations;
7994f71c51SSzymon Dompke 
80b7b7e1b6SSzymon Dompke     void startTimer(ThresholdDetail&, double);
81b7b7e1b6SSzymon Dompke     void commit(const std::string&, double);
8294f71c51SSzymon Dompke     ThresholdDetail& getDetails(const interfaces::Sensor& sensor);
8394f71c51SSzymon Dompke     std::shared_ptr<ThresholdDetail> makeDetails(const std::string& sensorName);
841477fe6aSWludzik, Jozef };
85