blob: 2a51a1a69e03e4153bb51d37183f68a35784f991 [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, double) override;
Szymon Dompke94f71c52021-12-10 07:16:33 +010034 LabeledThresholdParam getThresholdParam() const override;
35 void updateSensors(Sensors newSensors) override;
Szymon Dompkef763c9e2021-03-12 09:19:22 +010036
37 private:
38 boost::asio::io_context& ioc;
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;
Szymon Dompke94f71c52021-12-10 07:16:33 +010043 const discrete::Severity severity;
44 bool initialized = false;
Szymon Dompkef763c9e2021-03-12 09:19:22 +010045
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 };
Szymon Dompke94f71c52021-12-10 07:16:33 +010058 using SensorDetails =
59 std::unordered_map<std::shared_ptr<interfaces::Sensor>,
60 std::shared_ptr<ThresholdDetail>>;
61 SensorDetails sensorDetails;
Szymon Dompkef763c9e2021-03-12 09:19:22 +010062
Szymon Dompke94f71c52021-12-10 07:16:33 +010063 friend ThresholdOperations;
64
65 void startTimer(ThresholdDetail&, Milliseconds, double);
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +010066 void commit(const std::string&, Milliseconds, double);
Szymon Dompke94f71c52021-12-10 07:16:33 +010067 ThresholdDetail& getDetails(const interfaces::Sensor& sensor);
68 std::shared_ptr<ThresholdDetail> makeDetails(const std::string& sensorName);
Szymon Dompkef763c9e2021-03-12 09:19:22 +010069};