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