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