blob: 338d00b785b76999b41b8536d9a9b807ca1de491 [file] [log] [blame]
Wludzik, Jozef1477fe62021-01-02 11:56:10 +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 Grobelnydcc4e192021-03-08 09:09:34 +00007#include "types/milliseconds.hpp"
8#include "types/trigger_types.hpp"
Wludzik, Jozef1477fe62021-01-02 11:56:10 +01009
10#include <boost/asio/steady_timer.hpp>
11
12#include <chrono>
13#include <memory>
14#include <vector>
15
16class NumericThreshold :
17 public interfaces::Threshold,
18 public interfaces::SensorListener,
19 public std::enable_shared_from_this<NumericThreshold>
20{
21 public:
22 NumericThreshold(
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000023 boost::asio::io_context& ioc, Sensors sensors,
Wludzik, Jozef1477fe62021-01-02 11:56:10 +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, numeric::Direction direction,
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010027 double thresholdValue);
28 ~NumericThreshold();
29
30 void initialize() override;
31 void sensorUpdated(interfaces::Sensor&, uint64_t) override;
32 void sensorUpdated(interfaces::Sensor&, uint64_t, double) override;
33
34 private:
35 boost::asio::io_context& ioc;
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000036 const Sensors sensors;
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010037 const std::vector<std::unique_ptr<interfaces::TriggerAction>> actions;
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000038 const Milliseconds dwellTime;
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010039 const numeric::Direction direction;
40 const double thresholdValue;
41
42 struct ThresholdDetail
43 {
44 std::string sensorName;
45 double prevValue;
46 bool dwell;
47 boost::asio::steady_timer timer;
48
49 ThresholdDetail(const std::string& name, double prevValue, bool dwell,
50 boost::asio::io_context& ioc) :
51 sensorName(name),
52 prevValue(prevValue), dwell(dwell), timer(ioc)
53 {}
54 };
55 std::vector<ThresholdDetail> details;
56
57 void startTimer(const std::string&, uint64_t, double, bool&,
58 boost::asio::steady_timer&);
59 void commit(const std::string&, uint64_t, double);
60 ThresholdDetail& getDetails(interfaces::Sensor& sensor);
61};