xref: /openbmc/telemetry/src/discrete_threshold.hpp (revision c1dbac16fe3c705b773155f607a4541cf2ad79fa)
1 #pragma once
2 
3 #include "interfaces/clock.hpp"
4 #include "interfaces/sensor.hpp"
5 #include "interfaces/sensor_listener.hpp"
6 #include "interfaces/threshold.hpp"
7 #include "interfaces/trigger_action.hpp"
8 #include "types/duration_types.hpp"
9 #include "types/trigger_types.hpp"
10 #include "utils/threshold_operations.hpp"
11 
12 #include <boost/asio/steady_timer.hpp>
13 
14 #include <chrono>
15 #include <map>
16 #include <memory>
17 #include <vector>
18 
19 class DiscreteThreshold :
20     public interfaces::Threshold,
21     public interfaces::SensorListener,
22     public std::enable_shared_from_this<DiscreteThreshold>
23 {
24   public:
25     DiscreteThreshold(
26         boost::asio::io_context& ioc, const std::string& triggerId,
27         Sensors sensors,
28         std::vector<std::unique_ptr<interfaces::TriggerAction>> actions,
29         Milliseconds dwellTime, const std::string& thresholdValue,
30         const std::string& name, const discrete::Severity severity,
31         std::unique_ptr<interfaces::Clock> clock);
32     ~DiscreteThreshold() = default;
33     DiscreteThreshold(const DiscreteThreshold&) = delete;
34     DiscreteThreshold& operator=(const DiscreteThreshold&) = delete;
35     DiscreteThreshold(DiscreteThreshold&&) = delete;
36     DiscreteThreshold& operator=(DiscreteThreshold&&) = delete;
37 
38     void initialize() override;
39     void sensorUpdated(interfaces::Sensor&, Milliseconds, double) override;
40     LabeledThresholdParam getThresholdParam() const override;
41     void updateSensors(Sensors newSensors) override;
42 
43   private:
44     boost::asio::io_context& ioc;
45     const std::string& triggerId;
46     const std::vector<std::unique_ptr<interfaces::TriggerAction>> actions;
47     const Milliseconds dwellTime;
48     const std::string thresholdValue;
49     const double numericThresholdValue;
50     const discrete::Severity severity;
51     const std::string name;
52     bool initialized = false;
53     std::unique_ptr<interfaces::Clock> clock;
54 
55     struct ThresholdDetail
56     {
57         bool dwell = false;
58         boost::asio::steady_timer timer;
59 
ThresholdDetailDiscreteThreshold::ThresholdDetail60         ThresholdDetail(const std::string& sensorNameIn,
61                         boost::asio::io_context& ioc) :
62             timer(ioc), sensorName(sensorNameIn)
63         {}
64         ~ThresholdDetail() = default;
65         ThresholdDetail(const ThresholdDetail&) = delete;
66         ThresholdDetail& operator=(const ThresholdDetail&) = delete;
67         ThresholdDetail(ThresholdDetail&&) = delete;
68         ThresholdDetail& operator=(ThresholdDetail&&) = delete;
69 
getSensorNameDiscreteThreshold::ThresholdDetail70         const std::string& getSensorName()
71         {
72             return sensorName;
73         }
74 
75       private:
76         std::string sensorName;
77     };
78     using SensorDetails =
79         std::unordered_map<std::shared_ptr<interfaces::Sensor>,
80                            std::shared_ptr<ThresholdDetail>>;
81     SensorDetails sensorDetails;
82 
83     friend ThresholdOperations;
84 
85     void startTimer(ThresholdDetail&, double);
86     void commit(const std::string&, double);
87     ThresholdDetail& getDetails(const interfaces::Sensor& sensor);
88     std::shared_ptr<ThresholdDetail> makeDetails(const std::string& sensorName);
89     std::string getNonEmptyName(const std::string& nameIn) const;
90 };
91