blob: 636a4f5002ff961c4a9e85de9e8fab6e45e14b50 [file] [log] [blame]
Szymon Dompkef763c9e2021-03-12 09:19:22 +01001#pragma once
2
3#include "interfaces/sensor.hpp"
4#include "interfaces/sensor_listener.hpp"
5#include "interfaces/threshold.hpp"
6#include "interfaces/trigger_action.hpp"
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +01007#include "types/duration_types.hpp"
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +00008#include "types/trigger_types.hpp"
Szymon Dompkef763c9e2021-03-12 09:19:22 +01009
10#include <boost/asio/steady_timer.hpp>
11
12#include <chrono>
13#include <memory>
14#include <vector>
15
16class DiscreteThreshold :
17 public interfaces::Threshold,
18 public interfaces::SensorListener,
19 public std::enable_shared_from_this<DiscreteThreshold>
20{
21 public:
22 DiscreteThreshold(
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000023 boost::asio::io_context& ioc, Sensors sensors,
Szymon Dompkef763c9e2021-03-12 09:19:22 +010024 std::vector<std::string> sensorNames,
25 std::vector<std::unique_ptr<interfaces::TriggerAction>> actions,
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000026 Milliseconds dwellTime, double thresholdValue, std::string name);
Szymon Dompkef763c9e2021-03-12 09:19:22 +010027 DiscreteThreshold(const DiscreteThreshold&) = delete;
28 DiscreteThreshold(DiscreteThreshold&&) = delete;
29 ~DiscreteThreshold()
30 {}
31
32 void initialize() override;
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +010033 void sensorUpdated(interfaces::Sensor&, Milliseconds) override;
34 void sensorUpdated(interfaces::Sensor&, Milliseconds, double) override;
Szymon Dompkef763c9e2021-03-12 09:19:22 +010035
36 private:
37 boost::asio::io_context& ioc;
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000038 const Sensors sensors;
Szymon Dompkef763c9e2021-03-12 09:19:22 +010039 const std::vector<std::unique_ptr<interfaces::TriggerAction>> actions;
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000040 const Milliseconds dwellTime;
Szymon Dompkef763c9e2021-03-12 09:19:22 +010041 const double thresholdValue;
42 const std::string name;
43
44 struct ThresholdDetail
45 {
46 std::string sensorName;
47 bool dwell;
48 boost::asio::steady_timer timer;
49
50 ThresholdDetail(const std::string& name, bool dwell,
51 boost::asio::io_context& ioc) :
52 sensorName(name),
53 dwell(dwell), timer(ioc)
54 {}
55 };
56 std::vector<ThresholdDetail> details;
57
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +010058 void startTimer(interfaces::Sensor&, Milliseconds, double);
59 void commit(const std::string&, Milliseconds, double);
Szymon Dompkef763c9e2021-03-12 09:19:22 +010060 ThresholdDetail& getDetails(interfaces::Sensor& sensor);
61};