blob: 3c9c746ce9b86e84c57ef69cea5c1c0455e64cbe [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:
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +010021 Sensor(interfaces::Sensor::Id sensorId, const std::string& sensorMetadata,
22 boost::asio::io_context& ioc,
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020023 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;
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +010031 std::string metadata() const override;
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020032 void registerForUpdates(
33 const std::weak_ptr<interfaces::SensorListener>& weakListener) override;
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +020034 void unregisterFromUpdates(
35 const std::weak_ptr<interfaces::SensorListener>& weakListener) override;
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020036
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;
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +010048 std::string sensorMetadata;
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020049 boost::asio::io_context& ioc;
50 std::shared_ptr<sdbusplus::asio::connection> bus;
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000051 Milliseconds timerInterval = Milliseconds(0);
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020052 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;
Patrick Williams3a62ee12021-12-03 10:13:25 -060058 std::unique_ptr<sdbusplus::bus::match_t> signalMonitor;
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020059};