blob: 3393b0686ac830d0592cfad434e55fb7d887ff90 [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"
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +00005#include "types/milliseconds.hpp"
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +02006#include "utils/unique_call.hpp"
7
8#include <boost/asio/high_resolution_timer.hpp>
9#include <sdbusplus/asio/connection.hpp>
Patrick Williams3a62ee12021-12-03 10:13:25 -060010#include <sdbusplus/bus/match.hpp>
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020011
12#include <memory>
13
14class 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, boost::asio::io_context& ioc,
22 const std::shared_ptr<sdbusplus::asio::connection>& bus);
23
24 Sensor(const Sensor&) = delete;
25 Sensor& operator=(const Sensor&) = delete;
26
27 static Id makeId(std::string_view service, std::string_view path);
28
29 Id id() const override;
30 void registerForUpdates(
31 const std::weak_ptr<interfaces::SensorListener>& weakListener) override;
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +020032 void unregisterFromUpdates(
33 const std::weak_ptr<interfaces::SensorListener>& weakListener) override;
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020034
35 private:
36 static std::optional<double> readValue(const ValueVariant& v);
37 static void signalProc(const std::weak_ptr<Sensor>& weakSelf,
38 sdbusplus::message::message&);
39
40 void async_read();
41 void async_read(std::shared_ptr<utils::UniqueCall::Lock>);
42 void makeSignalMonitor();
43 void updateValue(double);
44
45 interfaces::Sensor::Id sensorId;
46 boost::asio::io_context& ioc;
47 std::shared_ptr<sdbusplus::asio::connection> bus;
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000048 Milliseconds timerInterval = Milliseconds(0);
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020049 std::optional<boost::asio::high_resolution_timer> timer;
50
51 utils::UniqueCall uniqueCall;
52 std::vector<std::weak_ptr<interfaces::SensorListener>> listeners;
53 uint64_t timestamp = 0;
54 std::optional<double> value;
Patrick Williams3a62ee12021-12-03 10:13:25 -060055 std::unique_ptr<sdbusplus::bus::match_t> signalMonitor;
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020056};