1 #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" 7 #include "types/duration_types.hpp" 8 #include "types/trigger_types.hpp" 9 #include "utils/threshold_operations.hpp" 10 11 #include <boost/asio/steady_timer.hpp> 12 13 #include <chrono> 14 #include <map> 15 #include <memory> 16 #include <vector> 17 18 class DiscreteThreshold : 19 public interfaces::Threshold, 20 public interfaces::SensorListener, 21 public std::enable_shared_from_this<DiscreteThreshold> 22 { 23 public: 24 DiscreteThreshold( 25 boost::asio::io_context& ioc, Sensors sensors, 26 std::vector<std::unique_ptr<interfaces::TriggerAction>> actions, 27 Milliseconds dwellTime, double thresholdValue, const std::string& name, 28 const discrete::Severity severity); 29 DiscreteThreshold(const DiscreteThreshold&) = delete; 30 DiscreteThreshold(DiscreteThreshold&&) = delete; 31 32 void initialize() override; 33 void sensorUpdated(interfaces::Sensor&, Milliseconds) override; 34 void sensorUpdated(interfaces::Sensor&, Milliseconds, double) override; 35 LabeledThresholdParam getThresholdParam() const override; 36 void updateSensors(Sensors newSensors) override; 37 38 private: 39 boost::asio::io_context& ioc; 40 const std::vector<std::unique_ptr<interfaces::TriggerAction>> actions; 41 const Milliseconds dwellTime; 42 const double thresholdValue; 43 const std::string name; 44 const discrete::Severity severity; 45 bool initialized = false; 46 47 struct ThresholdDetail 48 { 49 std::string sensorName; 50 bool dwell; 51 boost::asio::steady_timer timer; 52 53 ThresholdDetail(const std::string& name, bool dwell, 54 boost::asio::io_context& ioc) : 55 sensorName(name), 56 dwell(dwell), timer(ioc) 57 {} 58 }; 59 using SensorDetails = 60 std::unordered_map<std::shared_ptr<interfaces::Sensor>, 61 std::shared_ptr<ThresholdDetail>>; 62 SensorDetails sensorDetails; 63 64 friend ThresholdOperations; 65 66 void startTimer(ThresholdDetail&, Milliseconds, double); 67 void commit(const std::string&, Milliseconds, double); 68 ThresholdDetail& getDetails(const interfaces::Sensor& sensor); 69 std::shared_ptr<ThresholdDetail> makeDetails(const std::string& sensorName); 70 }; 71