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