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" 751f0fd50SKrzysztof Grobelny #include "types/duration_types.hpp" 8dcc4e193SKrzysztof Grobelny #include "types/trigger_types.hpp" 994f71c51SSzymon Dompke #include "utils/threshold_operations.hpp" 10f763c9e3SSzymon Dompke 11f763c9e3SSzymon Dompke #include <boost/asio/steady_timer.hpp> 12f763c9e3SSzymon Dompke 13f763c9e3SSzymon Dompke #include <chrono> 1494f71c51SSzymon Dompke #include <map> 15f763c9e3SSzymon Dompke #include <memory> 16f763c9e3SSzymon Dompke #include <vector> 17f763c9e3SSzymon Dompke 18f763c9e3SSzymon Dompke class DiscreteThreshold : 19f763c9e3SSzymon Dompke public interfaces::Threshold, 20f763c9e3SSzymon Dompke public interfaces::SensorListener, 21f763c9e3SSzymon Dompke public std::enable_shared_from_this<DiscreteThreshold> 22f763c9e3SSzymon Dompke { 23f763c9e3SSzymon Dompke public: 24f763c9e3SSzymon Dompke DiscreteThreshold( 25dcc4e193SKrzysztof Grobelny boost::asio::io_context& ioc, Sensors sensors, 26f763c9e3SSzymon Dompke std::vector<std::unique_ptr<interfaces::TriggerAction>> actions, 27*aa572361SSzymon Dompke Milliseconds dwellTime, const std::string& thresholdValue, 28*aa572361SSzymon Dompke const std::string& name, const discrete::Severity severity); 29f763c9e3SSzymon Dompke DiscreteThreshold(const DiscreteThreshold&) = delete; 30f763c9e3SSzymon Dompke DiscreteThreshold(DiscreteThreshold&&) = delete; 31f763c9e3SSzymon Dompke 32f763c9e3SSzymon Dompke void initialize() override; 3351f0fd50SKrzysztof Grobelny void sensorUpdated(interfaces::Sensor&, Milliseconds, double) override; 3494f71c51SSzymon Dompke LabeledThresholdParam getThresholdParam() const override; 3594f71c51SSzymon Dompke void updateSensors(Sensors newSensors) override; 36f763c9e3SSzymon Dompke 37f763c9e3SSzymon Dompke private: 38f763c9e3SSzymon Dompke boost::asio::io_context& ioc; 39f763c9e3SSzymon Dompke const std::vector<std::unique_ptr<interfaces::TriggerAction>> actions; 40dcc4e193SKrzysztof Grobelny const Milliseconds dwellTime; 41*aa572361SSzymon Dompke const std::string thresholdValue; 42*aa572361SSzymon Dompke const double numericThresholdValue; 43f763c9e3SSzymon Dompke const std::string name; 4494f71c51SSzymon Dompke const discrete::Severity severity; 4594f71c51SSzymon Dompke bool initialized = false; 46f763c9e3SSzymon Dompke 47f763c9e3SSzymon Dompke struct ThresholdDetail 48f763c9e3SSzymon Dompke { 49f763c9e3SSzymon Dompke std::string sensorName; 50f763c9e3SSzymon Dompke bool dwell; 51f763c9e3SSzymon Dompke boost::asio::steady_timer timer; 52f763c9e3SSzymon Dompke 53f763c9e3SSzymon Dompke ThresholdDetail(const std::string& name, bool dwell, 54f763c9e3SSzymon Dompke boost::asio::io_context& ioc) : 55f763c9e3SSzymon Dompke sensorName(name), 56f763c9e3SSzymon Dompke dwell(dwell), timer(ioc) 57f763c9e3SSzymon Dompke {} 58f763c9e3SSzymon Dompke }; 5994f71c51SSzymon Dompke using SensorDetails = 6094f71c51SSzymon Dompke std::unordered_map<std::shared_ptr<interfaces::Sensor>, 6194f71c51SSzymon Dompke std::shared_ptr<ThresholdDetail>>; 6294f71c51SSzymon Dompke SensorDetails sensorDetails; 63f763c9e3SSzymon Dompke 6494f71c51SSzymon Dompke friend ThresholdOperations; 6594f71c51SSzymon Dompke 6694f71c51SSzymon Dompke void startTimer(ThresholdDetail&, Milliseconds, double); 6751f0fd50SKrzysztof Grobelny void commit(const std::string&, Milliseconds, double); 6894f71c51SSzymon Dompke ThresholdDetail& getDetails(const interfaces::Sensor& sensor); 6994f71c51SSzymon Dompke std::shared_ptr<ThresholdDetail> makeDetails(const std::string& sensorName); 70f763c9e3SSzymon Dompke }; 71