xref: /openbmc/telemetry/src/sensor.hpp (revision 39cc6ac9)
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