1f763c9e3SSzymon Dompke #pragma once 2f763c9e3SSzymon Dompke 3b7b7e1b6SSzymon Dompke #include "interfaces/clock.hpp" 4f763c9e3SSzymon Dompke #include "interfaces/sensor.hpp" 5f763c9e3SSzymon Dompke #include "interfaces/sensor_listener.hpp" 6f763c9e3SSzymon Dompke #include "interfaces/threshold.hpp" 7f763c9e3SSzymon Dompke #include "interfaces/trigger_action.hpp" 851f0fd50SKrzysztof Grobelny #include "types/duration_types.hpp" 9dcc4e193SKrzysztof Grobelny #include "types/trigger_types.hpp" 1094f71c51SSzymon Dompke #include "utils/threshold_operations.hpp" 11f763c9e3SSzymon Dompke 12f763c9e3SSzymon Dompke #include <boost/asio/steady_timer.hpp> 13f763c9e3SSzymon Dompke 14f763c9e3SSzymon Dompke #include <chrono> 1594f71c51SSzymon Dompke #include <map> 16f763c9e3SSzymon Dompke #include <memory> 17f763c9e3SSzymon Dompke #include <vector> 18f763c9e3SSzymon Dompke 19f763c9e3SSzymon Dompke class DiscreteThreshold : 20f763c9e3SSzymon Dompke public interfaces::Threshold, 21f763c9e3SSzymon Dompke public interfaces::SensorListener, 22f763c9e3SSzymon Dompke public std::enable_shared_from_this<DiscreteThreshold> 23f763c9e3SSzymon Dompke { 24f763c9e3SSzymon Dompke public: 25f763c9e3SSzymon Dompke DiscreteThreshold( 26b7b7e1b6SSzymon Dompke boost::asio::io_context& ioc, const std::string& triggerId, 27b7b7e1b6SSzymon Dompke Sensors sensors, 28f763c9e3SSzymon Dompke std::vector<std::unique_ptr<interfaces::TriggerAction>> actions, 29aa572361SSzymon Dompke Milliseconds dwellTime, const std::string& thresholdValue, 30b7b7e1b6SSzymon Dompke const std::string& name, const discrete::Severity severity, 31b7b7e1b6SSzymon Dompke std::unique_ptr<interfaces::Clock> clock); 32f763c9e3SSzymon Dompke DiscreteThreshold(const DiscreteThreshold&) = delete; 33f763c9e3SSzymon Dompke DiscreteThreshold(DiscreteThreshold&&) = delete; 34f763c9e3SSzymon Dompke 35f763c9e3SSzymon Dompke void initialize() override; 3651f0fd50SKrzysztof Grobelny void sensorUpdated(interfaces::Sensor&, Milliseconds, double) override; 3794f71c51SSzymon Dompke LabeledThresholdParam getThresholdParam() const override; 3894f71c51SSzymon Dompke void updateSensors(Sensors newSensors) override; 39f763c9e3SSzymon Dompke 40f763c9e3SSzymon Dompke private: 41f763c9e3SSzymon Dompke boost::asio::io_context& ioc; 42b7b7e1b6SSzymon Dompke const std::string& triggerId; 43f763c9e3SSzymon Dompke const std::vector<std::unique_ptr<interfaces::TriggerAction>> actions; 44dcc4e193SKrzysztof Grobelny const Milliseconds dwellTime; 45aa572361SSzymon Dompke const std::string thresholdValue; 46aa572361SSzymon Dompke const double numericThresholdValue; 4794f71c51SSzymon Dompke const discrete::Severity severity; 48b7b7e1b6SSzymon Dompke const std::string name; 4994f71c51SSzymon Dompke bool initialized = false; 50b7b7e1b6SSzymon Dompke std::unique_ptr<interfaces::Clock> clock; 51f763c9e3SSzymon Dompke 52f763c9e3SSzymon Dompke struct ThresholdDetail 53f763c9e3SSzymon Dompke { 54*162b9761SSzymon Dompke bool dwell = false; 55f763c9e3SSzymon Dompke boost::asio::steady_timer timer; 56f763c9e3SSzymon Dompke ThresholdDetailDiscreteThreshold::ThresholdDetail57*162b9761SSzymon Dompke ThresholdDetail(const std::string& sensorNameIn, 58f763c9e3SSzymon Dompke boost::asio::io_context& ioc) : 59*162b9761SSzymon Dompke timer(ioc), 60*162b9761SSzymon Dompke sensorName(sensorNameIn) 61f763c9e3SSzymon Dompke {} 6241fa80d8SKrzysztof Grobelny ThresholdDetail(const ThresholdDetail&) = delete; 6341fa80d8SKrzysztof Grobelny ThresholdDetail(ThresholdDetail&&) = delete; 64*162b9761SSzymon Dompke getSensorNameDiscreteThreshold::ThresholdDetail65*162b9761SSzymon Dompke const std::string& getSensorName() 66*162b9761SSzymon Dompke { 67*162b9761SSzymon Dompke return sensorName; 68*162b9761SSzymon Dompke } 69*162b9761SSzymon Dompke 70*162b9761SSzymon Dompke private: 71*162b9761SSzymon Dompke std::string sensorName; 72f763c9e3SSzymon Dompke }; 7394f71c51SSzymon Dompke using SensorDetails = 7494f71c51SSzymon Dompke std::unordered_map<std::shared_ptr<interfaces::Sensor>, 7594f71c51SSzymon Dompke std::shared_ptr<ThresholdDetail>>; 7694f71c51SSzymon Dompke SensorDetails sensorDetails; 77f763c9e3SSzymon Dompke 7894f71c51SSzymon Dompke friend ThresholdOperations; 7994f71c51SSzymon Dompke 80b7b7e1b6SSzymon Dompke void startTimer(ThresholdDetail&, double); 81b7b7e1b6SSzymon Dompke void commit(const std::string&, double); 8294f71c51SSzymon Dompke ThresholdDetail& getDetails(const interfaces::Sensor& sensor); 8394f71c51SSzymon Dompke std::shared_ptr<ThresholdDetail> makeDetails(const std::string& sensorName); 84b7b7e1b6SSzymon Dompke std::string getNonEmptyName(const std::string& nameIn) const; 85f763c9e3SSzymon Dompke }; 86