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 10 #include <boost/asio/steady_timer.hpp> 11 12 #include <chrono> 13 #include <memory> 14 #include <vector> 15 16 class NumericThreshold : 17 public interfaces::Threshold, 18 public interfaces::SensorListener, 19 public std::enable_shared_from_this<NumericThreshold> 20 { 21 public: 22 NumericThreshold( 23 boost::asio::io_context& ioc, Sensors sensors, 24 std::vector<std::string> sensorNames, 25 std::vector<std::unique_ptr<interfaces::TriggerAction>> actions, 26 Milliseconds dwellTime, numeric::Direction direction, 27 double thresholdValue); 28 ~NumericThreshold(); 29 30 void initialize() override; 31 void sensorUpdated(interfaces::Sensor&, Milliseconds) override; 32 void sensorUpdated(interfaces::Sensor&, Milliseconds, double) override; 33 34 private: 35 boost::asio::io_context& ioc; 36 const Sensors sensors; 37 const std::vector<std::unique_ptr<interfaces::TriggerAction>> actions; 38 const Milliseconds dwellTime; 39 const numeric::Direction direction; 40 const double thresholdValue; 41 42 struct ThresholdDetail 43 { 44 std::string sensorName; 45 double prevValue; 46 bool dwell; 47 boost::asio::steady_timer timer; 48 49 ThresholdDetail(const std::string& name, double prevValue, bool dwell, 50 boost::asio::io_context& ioc) : 51 sensorName(name), 52 prevValue(prevValue), dwell(dwell), timer(ioc) 53 {} 54 }; 55 std::vector<ThresholdDetail> details; 56 57 void startTimer(const std::string&, Milliseconds, double, bool&, 58 boost::asio::steady_timer&); 59 void commit(const std::string&, Milliseconds, double); 60 ThresholdDetail& getDetails(interfaces::Sensor& sensor); 61 }; 62