1 #pragma once 2 3 #include "interfaces/sensor.hpp" 4 #include "interfaces/sensor_listener.hpp" 5 #include "types/duration_types.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 std::string getName() const override; 33 void registerForUpdates( 34 const std::weak_ptr<interfaces::SensorListener>& weakListener) override; 35 void unregisterFromUpdates( 36 const std::weak_ptr<interfaces::SensorListener>& weakListener) override; 37 38 LabeledSensorInfo getLabeledSensorInfo() const override; 39 40 private: 41 static std::optional<double> readValue(const ValueVariant& v); 42 static void signalProc(const std::weak_ptr<Sensor>& weakSelf, 43 sdbusplus::message_t&); 44 45 void async_read(); 46 void async_read(std::shared_ptr<utils::UniqueCall::Lock>); 47 void makeSignalMonitor(); 48 void updateValue(double); 49 50 interfaces::Sensor::Id sensorId; 51 std::string sensorMetadata; 52 boost::asio::io_context& ioc; 53 std::shared_ptr<sdbusplus::asio::connection> bus; 54 Milliseconds timerInterval = Milliseconds(0); 55 std::optional<boost::asio::high_resolution_timer> timer; 56 57 utils::UniqueCall uniqueCall; 58 std::vector<std::weak_ptr<interfaces::SensorListener>> listeners; 59 Milliseconds timestamp = Milliseconds{0u}; 60 std::optional<double> value; 61 std::unique_ptr<sdbusplus::bus::match_t> signalMonitor; 62 }; 63