1 #pragma once 2 3 #include "interfaces/clock.hpp" 4 #include "interfaces/sensor.hpp" 5 #include "interfaces/sensor_listener.hpp" 6 #include "interfaces/threshold.hpp" 7 #include "interfaces/trigger_action.hpp" 8 #include "types/duration_types.hpp" 9 #include "types/trigger_types.hpp" 10 #include "utils/threshold_operations.hpp" 11 12 #include <boost/asio/steady_timer.hpp> 13 14 #include <chrono> 15 #include <map> 16 #include <memory> 17 #include <vector> 18 19 class NumericThreshold : 20 public interfaces::Threshold, 21 public interfaces::SensorListener, 22 public std::enable_shared_from_this<NumericThreshold> 23 { 24 public: 25 NumericThreshold( 26 boost::asio::io_context& ioc, const std::string& triggerId, 27 Sensors sensors, 28 std::vector<std::unique_ptr<interfaces::TriggerAction>> actions, 29 Milliseconds dwellTime, numeric::Direction direction, 30 double thresholdValue, numeric::Type type, 31 std::unique_ptr<interfaces::Clock> clock); 32 ~NumericThreshold() = default; 33 NumericThreshold(const NumericThreshold&) = delete; 34 NumericThreshold& operator=(const NumericThreshold&) = delete; 35 NumericThreshold(NumericThreshold&&) = delete; 36 NumericThreshold& operator=(NumericThreshold&&) = delete; 37 38 void initialize() override; 39 void sensorUpdated(interfaces::Sensor&, Milliseconds, double) override; 40 LabeledThresholdParam getThresholdParam() const override; 41 void updateSensors(Sensors newSensors) override; 42 43 private: 44 boost::asio::io_context& ioc; 45 const std::string& triggerId; 46 const std::vector<std::unique_ptr<interfaces::TriggerAction>> actions; 47 const Milliseconds dwellTime; 48 const numeric::Direction direction; 49 const double thresholdValue; 50 const numeric::Type type; 51 bool initialized = false; 52 std::unique_ptr<interfaces::Clock> clock; 53 54 struct ThresholdDetail 55 { 56 std::optional<double> prevValue = std::nullopt; 57 numeric::Direction prevDirection = numeric::Direction::either; 58 bool dwell = false; 59 boost::asio::steady_timer timer; 60 ThresholdDetailNumericThreshold::ThresholdDetail61 ThresholdDetail(const std::string& sensorNameIn, 62 boost::asio::io_context& ioc) : 63 timer(ioc), sensorName(sensorNameIn) 64 {} 65 ~ThresholdDetail() = default; 66 ThresholdDetail(const ThresholdDetail&) = delete; 67 ThresholdDetail& operator=(const ThresholdDetail&) = delete; 68 ThresholdDetail(ThresholdDetail&&) = delete; 69 ThresholdDetail& operator=(ThresholdDetail&&) = delete; 70 getSensorNameNumericThreshold::ThresholdDetail71 const std::string& getSensorName() 72 { 73 return sensorName; 74 } 75 76 private: 77 std::string sensorName; 78 }; 79 using SensorDetails = 80 std::unordered_map<std::shared_ptr<interfaces::Sensor>, 81 std::shared_ptr<ThresholdDetail>>; 82 SensorDetails sensorDetails; 83 84 friend ThresholdOperations; 85 86 void startTimer(ThresholdDetail&, double); 87 void commit(const std::string&, double); 88 ThresholdDetail& getDetails(const interfaces::Sensor& sensor); 89 std::shared_ptr<ThresholdDetail> makeDetails(const std::string& sensorName); 90 }; 91