blob: d15530bb92a670e0922ff17c3c4436f2f1d02d7c [file] [log] [blame]
Wludzik, Jozef1477fe62021-01-02 11:56:10 +01001#pragma once
2
Szymon Dompkeb7b7e1b2022-05-19 10:15:48 +02003#include "interfaces/clock.hpp"
Wludzik, Jozef1477fe62021-01-02 11:56:10 +01004#include "interfaces/sensor.hpp"
5#include "interfaces/sensor_listener.hpp"
6#include "interfaces/threshold.hpp"
7#include "interfaces/trigger_action.hpp"
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +01008#include "types/duration_types.hpp"
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +00009#include "types/trigger_types.hpp"
Szymon Dompke94f71c52021-12-10 07:16:33 +010010#include "utils/threshold_operations.hpp"
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010011
12#include <boost/asio/steady_timer.hpp>
13
14#include <chrono>
Szymon Dompke94f71c52021-12-10 07:16:33 +010015#include <map>
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010016#include <memory>
17#include <vector>
18
19class NumericThreshold :
20 public interfaces::Threshold,
21 public interfaces::SensorListener,
22 public std::enable_shared_from_this<NumericThreshold>
23{
24 public:
25 NumericThreshold(
Szymon Dompkeb7b7e1b2022-05-19 10:15:48 +020026 boost::asio::io_context& ioc, const std::string& triggerId,
27 Sensors sensors,
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010028 std::vector<std::unique_ptr<interfaces::TriggerAction>> actions,
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000029 Milliseconds dwellTime, numeric::Direction direction,
Szymon Dompkeb7b7e1b2022-05-19 10:15:48 +020030 double thresholdValue, numeric::Type type,
31 std::unique_ptr<interfaces::Clock> clock);
Piotr Sulewskic1dbac12025-11-12 14:14:09 +010032 ~NumericThreshold() = default;
Krzysztof Grobelny41fa80d2022-06-09 13:27:16 +020033 NumericThreshold(const NumericThreshold&) = delete;
Piotr Sulewskic1dbac12025-11-12 14:14:09 +010034 NumericThreshold& operator=(const NumericThreshold&) = delete;
Krzysztof Grobelny41fa80d2022-06-09 13:27:16 +020035 NumericThreshold(NumericThreshold&&) = delete;
Piotr Sulewskic1dbac12025-11-12 14:14:09 +010036 NumericThreshold& operator=(NumericThreshold&&) = delete;
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010037
38 void initialize() override;
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +010039 void sensorUpdated(interfaces::Sensor&, Milliseconds, double) override;
Szymon Dompke94f71c52021-12-10 07:16:33 +010040 LabeledThresholdParam getThresholdParam() const override;
41 void updateSensors(Sensors newSensors) override;
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010042
43 private:
44 boost::asio::io_context& ioc;
Szymon Dompkeb7b7e1b2022-05-19 10:15:48 +020045 const std::string& triggerId;
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010046 const std::vector<std::unique_ptr<interfaces::TriggerAction>> actions;
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000047 const Milliseconds dwellTime;
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010048 const numeric::Direction direction;
49 const double thresholdValue;
Szymon Dompke94f71c52021-12-10 07:16:33 +010050 const numeric::Type type;
51 bool initialized = false;
Szymon Dompkeb7b7e1b2022-05-19 10:15:48 +020052 std::unique_ptr<interfaces::Clock> clock;
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010053
54 struct ThresholdDetail
55 {
Szymon Dompke162b9762022-06-07 12:45:48 +020056 std::optional<double> prevValue = std::nullopt;
57 numeric::Direction prevDirection = numeric::Direction::either;
58 bool dwell = false;
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010059 boost::asio::steady_timer timer;
60
Szymon Dompke162b9762022-06-07 12:45:48 +020061 ThresholdDetail(const std::string& sensorNameIn,
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010062 boost::asio::io_context& ioc) :
Patrick Williamsf535cad2024-08-16 15:21:20 -040063 timer(ioc), sensorName(sensorNameIn)
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010064 {}
Piotr Sulewskic1dbac12025-11-12 14:14:09 +010065 ~ThresholdDetail() = default;
Krzysztof Grobelny41fa80d2022-06-09 13:27:16 +020066 ThresholdDetail(const ThresholdDetail&) = delete;
Piotr Sulewskic1dbac12025-11-12 14:14:09 +010067 ThresholdDetail& operator=(const ThresholdDetail&) = delete;
Krzysztof Grobelny41fa80d2022-06-09 13:27:16 +020068 ThresholdDetail(ThresholdDetail&&) = delete;
Piotr Sulewskic1dbac12025-11-12 14:14:09 +010069 ThresholdDetail& operator=(ThresholdDetail&&) = delete;
Szymon Dompke162b9762022-06-07 12:45:48 +020070
71 const std::string& getSensorName()
72 {
73 return sensorName;
74 }
75
76 private:
77 std::string sensorName;
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010078 };
Szymon Dompke94f71c52021-12-10 07:16:33 +010079 using SensorDetails =
80 std::unordered_map<std::shared_ptr<interfaces::Sensor>,
81 std::shared_ptr<ThresholdDetail>>;
82 SensorDetails sensorDetails;
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010083
Szymon Dompke94f71c52021-12-10 07:16:33 +010084 friend ThresholdOperations;
85
Szymon Dompkeb7b7e1b2022-05-19 10:15:48 +020086 void startTimer(ThresholdDetail&, double);
87 void commit(const std::string&, double);
Szymon Dompke94f71c52021-12-10 07:16:33 +010088 ThresholdDetail& getDetails(const interfaces::Sensor& sensor);
89 std::shared_ptr<ThresholdDetail> makeDetails(const std::string& sensorName);
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010090};