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