11477fe6aSWludzik, Jozef #pragma once 21477fe6aSWludzik, Jozef 3b7b7e1b6SSzymon Dompke #include "interfaces/clock.hpp" 41477fe6aSWludzik, Jozef #include "interfaces/sensor.hpp" 51477fe6aSWludzik, Jozef #include "interfaces/sensor_listener.hpp" 61477fe6aSWludzik, Jozef #include "interfaces/threshold.hpp" 71477fe6aSWludzik, Jozef #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" 111477fe6aSWludzik, Jozef 121477fe6aSWludzik, Jozef #include <boost/asio/steady_timer.hpp> 131477fe6aSWludzik, Jozef 141477fe6aSWludzik, Jozef #include <chrono> 1594f71c51SSzymon Dompke #include <map> 161477fe6aSWludzik, Jozef #include <memory> 171477fe6aSWludzik, Jozef #include <vector> 181477fe6aSWludzik, Jozef 191477fe6aSWludzik, Jozef class NumericThreshold : 201477fe6aSWludzik, Jozef public interfaces::Threshold, 211477fe6aSWludzik, Jozef public interfaces::SensorListener, 221477fe6aSWludzik, Jozef public std::enable_shared_from_this<NumericThreshold> 231477fe6aSWludzik, Jozef { 241477fe6aSWludzik, Jozef public: 251477fe6aSWludzik, Jozef NumericThreshold( 26b7b7e1b6SSzymon Dompke boost::asio::io_context& ioc, const std::string& triggerId, 27b7b7e1b6SSzymon Dompke Sensors sensors, 281477fe6aSWludzik, Jozef std::vector<std::unique_ptr<interfaces::TriggerAction>> actions, 29dcc4e193SKrzysztof Grobelny Milliseconds dwellTime, numeric::Direction direction, 30b7b7e1b6SSzymon Dompke double thresholdValue, numeric::Type type, 31b7b7e1b6SSzymon Dompke std::unique_ptr<interfaces::Clock> clock); 3241fa80d8SKrzysztof Grobelny NumericThreshold(const NumericThreshold&) = delete; 3341fa80d8SKrzysztof Grobelny NumericThreshold(NumericThreshold&&) = delete; 341477fe6aSWludzik, Jozef 351477fe6aSWludzik, Jozef 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; 391477fe6aSWludzik, Jozef 401477fe6aSWludzik, Jozef private: 411477fe6aSWludzik, Jozef boost::asio::io_context& ioc; 42b7b7e1b6SSzymon Dompke const std::string& triggerId; 431477fe6aSWludzik, Jozef const std::vector<std::unique_ptr<interfaces::TriggerAction>> actions; 44dcc4e193SKrzysztof Grobelny const Milliseconds dwellTime; 451477fe6aSWludzik, Jozef const numeric::Direction direction; 461477fe6aSWludzik, Jozef const double thresholdValue; 4794f71c51SSzymon Dompke const numeric::Type type; 4894f71c51SSzymon Dompke bool initialized = false; 49b7b7e1b6SSzymon Dompke std::unique_ptr<interfaces::Clock> clock; 501477fe6aSWludzik, Jozef 511477fe6aSWludzik, Jozef struct ThresholdDetail 521477fe6aSWludzik, Jozef { 53162b9761SSzymon Dompke std::optional<double> prevValue = std::nullopt; 54162b9761SSzymon Dompke numeric::Direction prevDirection = numeric::Direction::either; 55162b9761SSzymon Dompke bool dwell = false; 561477fe6aSWludzik, Jozef boost::asio::steady_timer timer; 571477fe6aSWludzik, Jozef ThresholdDetailNumericThreshold::ThresholdDetail58162b9761SSzymon Dompke ThresholdDetail(const std::string& sensorNameIn, 591477fe6aSWludzik, Jozef boost::asio::io_context& ioc) : 60*f535cad6SPatrick Williams timer(ioc), sensorName(sensorNameIn) 611477fe6aSWludzik, Jozef {} 6241fa80d8SKrzysztof Grobelny ThresholdDetail(const ThresholdDetail&) = delete; 6341fa80d8SKrzysztof Grobelny ThresholdDetail(ThresholdDetail&&) = delete; 64162b9761SSzymon Dompke getSensorNameNumericThreshold::ThresholdDetail65162b9761SSzymon Dompke const std::string& getSensorName() 66162b9761SSzymon Dompke { 67162b9761SSzymon Dompke return sensorName; 68162b9761SSzymon Dompke } 69162b9761SSzymon Dompke 70162b9761SSzymon Dompke private: 71162b9761SSzymon Dompke std::string sensorName; 721477fe6aSWludzik, Jozef }; 7394f71c51SSzymon Dompke using SensorDetails = 7494f71c51SSzymon Dompke std::unordered_map<std::shared_ptr<interfaces::Sensor>, 7594f71c51SSzymon Dompke std::shared_ptr<ThresholdDetail>>; 7694f71c51SSzymon Dompke SensorDetails sensorDetails; 771477fe6aSWludzik, Jozef 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); 841477fe6aSWludzik, Jozef }; 85