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"
7*dcc4e193SKrzysztof Grobelny #include "types/milliseconds.hpp"
8*dcc4e193SKrzysztof Grobelny #include "types/trigger_types.hpp"
9f763c9e3SSzymon Dompke 
10f763c9e3SSzymon Dompke #include <boost/asio/steady_timer.hpp>
11f763c9e3SSzymon Dompke 
12f763c9e3SSzymon Dompke #include <chrono>
13f763c9e3SSzymon Dompke #include <memory>
14f763c9e3SSzymon Dompke #include <vector>
15f763c9e3SSzymon Dompke 
16f763c9e3SSzymon Dompke class DiscreteThreshold :
17f763c9e3SSzymon Dompke     public interfaces::Threshold,
18f763c9e3SSzymon Dompke     public interfaces::SensorListener,
19f763c9e3SSzymon Dompke     public std::enable_shared_from_this<DiscreteThreshold>
20f763c9e3SSzymon Dompke {
21f763c9e3SSzymon Dompke   public:
22f763c9e3SSzymon Dompke     DiscreteThreshold(
23*dcc4e193SKrzysztof Grobelny         boost::asio::io_context& ioc, Sensors sensors,
24f763c9e3SSzymon Dompke         std::vector<std::string> sensorNames,
25f763c9e3SSzymon Dompke         std::vector<std::unique_ptr<interfaces::TriggerAction>> actions,
26*dcc4e193SKrzysztof Grobelny         Milliseconds dwellTime, double thresholdValue, std::string name);
27f763c9e3SSzymon Dompke     DiscreteThreshold(const DiscreteThreshold&) = delete;
28f763c9e3SSzymon Dompke     DiscreteThreshold(DiscreteThreshold&&) = delete;
29f763c9e3SSzymon Dompke     ~DiscreteThreshold()
30f763c9e3SSzymon Dompke     {}
31f763c9e3SSzymon Dompke 
32f763c9e3SSzymon Dompke     void initialize() override;
33f763c9e3SSzymon Dompke     void sensorUpdated(interfaces::Sensor&, uint64_t) override;
34f763c9e3SSzymon Dompke     void sensorUpdated(interfaces::Sensor&, uint64_t, double) override;
35f763c9e3SSzymon Dompke     const char* getName() const;
36f763c9e3SSzymon Dompke 
37f763c9e3SSzymon Dompke   private:
38f763c9e3SSzymon Dompke     boost::asio::io_context& ioc;
39*dcc4e193SKrzysztof Grobelny     const Sensors sensors;
40f763c9e3SSzymon Dompke     const std::vector<std::unique_ptr<interfaces::TriggerAction>> actions;
41*dcc4e193SKrzysztof Grobelny     const Milliseconds dwellTime;
42f763c9e3SSzymon Dompke     const double thresholdValue;
43f763c9e3SSzymon Dompke     const std::string name;
44f763c9e3SSzymon Dompke 
45f763c9e3SSzymon Dompke     struct ThresholdDetail
46f763c9e3SSzymon Dompke     {
47f763c9e3SSzymon Dompke         std::string sensorName;
48f763c9e3SSzymon Dompke         bool dwell;
49f763c9e3SSzymon Dompke         boost::asio::steady_timer timer;
50f763c9e3SSzymon Dompke 
51f763c9e3SSzymon Dompke         ThresholdDetail(const std::string& name, bool dwell,
52f763c9e3SSzymon Dompke                         boost::asio::io_context& ioc) :
53f763c9e3SSzymon Dompke             sensorName(name),
54f763c9e3SSzymon Dompke             dwell(dwell), timer(ioc)
55f763c9e3SSzymon Dompke         {}
56f763c9e3SSzymon Dompke     };
57f763c9e3SSzymon Dompke     std::vector<ThresholdDetail> details;
58f763c9e3SSzymon Dompke 
59f763c9e3SSzymon Dompke     void startTimer(interfaces::Sensor&, uint64_t, double);
60f763c9e3SSzymon Dompke     void commit(const std::string&, uint64_t, double);
61f763c9e3SSzymon Dompke     ThresholdDetail& getDetails(interfaces::Sensor& sensor);
62f763c9e3SSzymon Dompke };
63