1 #pragma once 2 3 #include "interfaces/sensor.hpp" 4 #include "interfaces/sensor_listener.hpp" 5 #include "types/milliseconds.hpp" 6 #include "utils/unique_call.hpp" 7 8 #include <boost/asio/high_resolution_timer.hpp> 9 #include <sdbusplus/asio/connection.hpp> 10 #include <sdbusplus/bus/match.hpp> 11 12 #include <memory> 13 14 class Sensor final : 15 public interfaces::Sensor, 16 public std::enable_shared_from_this<Sensor> 17 { 18 using ValueVariant = std::variant<std::monostate, double>; 19 20 public: 21 Sensor(interfaces::Sensor::Id sensorId, const std::string& sensorMetadata, 22 boost::asio::io_context& ioc, 23 const std::shared_ptr<sdbusplus::asio::connection>& bus); 24 25 Sensor(const Sensor&) = delete; 26 Sensor& operator=(const Sensor&) = delete; 27 28 static Id makeId(std::string_view service, std::string_view path); 29 30 Id id() const override; 31 std::string metadata() const override; 32 void registerForUpdates( 33 const std::weak_ptr<interfaces::SensorListener>& weakListener) override; 34 void unregisterFromUpdates( 35 const std::weak_ptr<interfaces::SensorListener>& weakListener) override; 36 37 private: 38 static std::optional<double> readValue(const ValueVariant& v); 39 static void signalProc(const std::weak_ptr<Sensor>& weakSelf, 40 sdbusplus::message::message&); 41 42 void async_read(); 43 void async_read(std::shared_ptr<utils::UniqueCall::Lock>); 44 void makeSignalMonitor(); 45 void updateValue(double); 46 47 interfaces::Sensor::Id sensorId; 48 std::string sensorMetadata; 49 boost::asio::io_context& ioc; 50 std::shared_ptr<sdbusplus::asio::connection> bus; 51 Milliseconds timerInterval = Milliseconds(0); 52 std::optional<boost::asio::high_resolution_timer> timer; 53 54 utils::UniqueCall uniqueCall; 55 std::vector<std::weak_ptr<interfaces::SensorListener>> listeners; 56 uint64_t timestamp = 0; 57 std::optional<double> value; 58 std::unique_ptr<sdbusplus::bus::match_t> signalMonitor; 59 }; 60