blob: 1f145f4d16b6ba7018c14b317e2dca77c93951a1 [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 Dompke94f71c52021-12-10 07:16:33 +01009#include "utils/threshold_operations.hpp"
Szymon Dompkef763c9e2021-03-12 09:19:22 +010010
11#include <boost/asio/steady_timer.hpp>
12
13#include <chrono>
Szymon Dompke94f71c52021-12-10 07:16:33 +010014#include <map>
Szymon Dompkef763c9e2021-03-12 09:19:22 +010015#include <memory>
16#include <vector>
17
18class DiscreteThreshold :
19 public interfaces::Threshold,
20 public interfaces::SensorListener,
21 public std::enable_shared_from_this<DiscreteThreshold>
22{
23 public:
24 DiscreteThreshold(
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000025 boost::asio::io_context& ioc, Sensors sensors,
Szymon Dompkef763c9e2021-03-12 09:19:22 +010026 std::vector<std::unique_ptr<interfaces::TriggerAction>> actions,
Szymon Dompke94f71c52021-12-10 07:16:33 +010027 Milliseconds dwellTime, double thresholdValue, const std::string& name,
28 const discrete::Severity severity);
Szymon Dompkef763c9e2021-03-12 09:19:22 +010029 DiscreteThreshold(const DiscreteThreshold&) = delete;
30 DiscreteThreshold(DiscreteThreshold&&) = delete;
Szymon Dompkef763c9e2021-03-12 09:19:22 +010031
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 Dompke94f71c52021-12-10 07:16:33 +010035 LabeledThresholdParam getThresholdParam() const override;
36 void updateSensors(Sensors newSensors) override;
Szymon Dompkef763c9e2021-03-12 09:19:22 +010037
38 private:
39 boost::asio::io_context& ioc;
Szymon Dompkef763c9e2021-03-12 09:19:22 +010040 const std::vector<std::unique_ptr<interfaces::TriggerAction>> actions;
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000041 const Milliseconds dwellTime;
Szymon Dompkef763c9e2021-03-12 09:19:22 +010042 const double thresholdValue;
43 const std::string name;
Szymon Dompke94f71c52021-12-10 07:16:33 +010044 const discrete::Severity severity;
45 bool initialized = false;
Szymon Dompkef763c9e2021-03-12 09:19:22 +010046
47 struct ThresholdDetail
48 {
49 std::string sensorName;
50 bool dwell;
51 boost::asio::steady_timer timer;
52
53 ThresholdDetail(const std::string& name, bool dwell,
54 boost::asio::io_context& ioc) :
55 sensorName(name),
56 dwell(dwell), timer(ioc)
57 {}
58 };
Szymon Dompke94f71c52021-12-10 07:16:33 +010059 using SensorDetails =
60 std::unordered_map<std::shared_ptr<interfaces::Sensor>,
61 std::shared_ptr<ThresholdDetail>>;
62 SensorDetails sensorDetails;
Szymon Dompkef763c9e2021-03-12 09:19:22 +010063
Szymon Dompke94f71c52021-12-10 07:16:33 +010064 friend ThresholdOperations;
65
66 void startTimer(ThresholdDetail&, Milliseconds, double);
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +010067 void commit(const std::string&, Milliseconds, double);
Szymon Dompke94f71c52021-12-10 07:16:33 +010068 ThresholdDetail& getDetails(const interfaces::Sensor& sensor);
69 std::shared_ptr<ThresholdDetail> makeDetails(const std::string& sensorName);
Szymon Dompkef763c9e2021-03-12 09:19:22 +010070};