1f763c9e3SSzymon Dompke #pragma once
2f763c9e3SSzymon Dompke 
3f763c9e3SSzymon Dompke #include "interfaces/sensor.hpp"
4f763c9e3SSzymon Dompke #include "interfaces/sensor_listener.hpp"
5f763c9e3SSzymon Dompke #include "interfaces/threshold.hpp"
6f763c9e3SSzymon Dompke #include "interfaces/trigger_action.hpp"
751f0fd50SKrzysztof Grobelny #include "types/duration_types.hpp"
8dcc4e193SKrzysztof Grobelny #include "types/trigger_types.hpp"
994f71c51SSzymon Dompke #include "utils/threshold_operations.hpp"
10f763c9e3SSzymon Dompke 
11f763c9e3SSzymon Dompke #include <boost/asio/steady_timer.hpp>
12f763c9e3SSzymon Dompke 
13f763c9e3SSzymon Dompke #include <chrono>
1494f71c51SSzymon Dompke #include <map>
15f763c9e3SSzymon Dompke #include <memory>
16f763c9e3SSzymon Dompke #include <vector>
17f763c9e3SSzymon Dompke 
18f763c9e3SSzymon Dompke class DiscreteThreshold :
19f763c9e3SSzymon Dompke     public interfaces::Threshold,
20f763c9e3SSzymon Dompke     public interfaces::SensorListener,
21f763c9e3SSzymon Dompke     public std::enable_shared_from_this<DiscreteThreshold>
22f763c9e3SSzymon Dompke {
23f763c9e3SSzymon Dompke   public:
24f763c9e3SSzymon Dompke     DiscreteThreshold(
25dcc4e193SKrzysztof Grobelny         boost::asio::io_context& ioc, Sensors sensors,
26f763c9e3SSzymon Dompke         std::vector<std::unique_ptr<interfaces::TriggerAction>> actions,
27*aa572361SSzymon Dompke         Milliseconds dwellTime, const std::string& thresholdValue,
28*aa572361SSzymon Dompke         const std::string& name, const discrete::Severity severity);
29f763c9e3SSzymon Dompke     DiscreteThreshold(const DiscreteThreshold&) = delete;
30f763c9e3SSzymon Dompke     DiscreteThreshold(DiscreteThreshold&&) = delete;
31f763c9e3SSzymon Dompke 
32f763c9e3SSzymon Dompke     void initialize() override;
3351f0fd50SKrzysztof Grobelny     void sensorUpdated(interfaces::Sensor&, Milliseconds, double) override;
3494f71c51SSzymon Dompke     LabeledThresholdParam getThresholdParam() const override;
3594f71c51SSzymon Dompke     void updateSensors(Sensors newSensors) override;
36f763c9e3SSzymon Dompke 
37f763c9e3SSzymon Dompke   private:
38f763c9e3SSzymon Dompke     boost::asio::io_context& ioc;
39f763c9e3SSzymon Dompke     const std::vector<std::unique_ptr<interfaces::TriggerAction>> actions;
40dcc4e193SKrzysztof Grobelny     const Milliseconds dwellTime;
41*aa572361SSzymon Dompke     const std::string thresholdValue;
42*aa572361SSzymon Dompke     const double numericThresholdValue;
43f763c9e3SSzymon Dompke     const std::string name;
4494f71c51SSzymon Dompke     const discrete::Severity severity;
4594f71c51SSzymon Dompke     bool initialized = false;
46f763c9e3SSzymon Dompke 
47f763c9e3SSzymon Dompke     struct ThresholdDetail
48f763c9e3SSzymon Dompke     {
49f763c9e3SSzymon Dompke         std::string sensorName;
50f763c9e3SSzymon Dompke         bool dwell;
51f763c9e3SSzymon Dompke         boost::asio::steady_timer timer;
52f763c9e3SSzymon Dompke 
53f763c9e3SSzymon Dompke         ThresholdDetail(const std::string& name, bool dwell,
54f763c9e3SSzymon Dompke                         boost::asio::io_context& ioc) :
55f763c9e3SSzymon Dompke             sensorName(name),
56f763c9e3SSzymon Dompke             dwell(dwell), timer(ioc)
57f763c9e3SSzymon Dompke         {}
58f763c9e3SSzymon Dompke     };
5994f71c51SSzymon Dompke     using SensorDetails =
6094f71c51SSzymon Dompke         std::unordered_map<std::shared_ptr<interfaces::Sensor>,
6194f71c51SSzymon Dompke                            std::shared_ptr<ThresholdDetail>>;
6294f71c51SSzymon Dompke     SensorDetails sensorDetails;
63f763c9e3SSzymon Dompke 
6494f71c51SSzymon Dompke     friend ThresholdOperations;
6594f71c51SSzymon Dompke 
6694f71c51SSzymon Dompke     void startTimer(ThresholdDetail&, Milliseconds, double);
6751f0fd50SKrzysztof Grobelny     void commit(const std::string&, Milliseconds, double);
6894f71c51SSzymon Dompke     ThresholdDetail& getDetails(const interfaces::Sensor& sensor);
6994f71c51SSzymon Dompke     std::shared_ptr<ThresholdDetail> makeDetails(const std::string& sensorName);
70f763c9e3SSzymon Dompke };
71