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