blob: 82b17471e719a9b10db4b56a5a08e8bf5d549ead [file] [log] [blame]
Patrick Venture863b9242018-03-08 08:29:23 -08001#pragma once
2
Patrick Ventureda4a5dd2018-08-31 09:42:48 -07003#include "sensor.hpp"
Patrick Venture863b9242018-03-08 08:29:23 -08004
Patrick Ventureda4a5dd2018-08-31 09:42:48 -07005#include <memory>
6#include <mutex>
7#include <sdbusplus/bus.hpp>
8#include <sdbusplus/server.hpp>
James Feist8154e322020-06-22 17:12:18 -07009#include <type_traits>
Patrick Venture1248b152018-10-30 19:09:54 -070010#include <xyz/openbmc_project/Sensor/Value/server.hpp>
Patrick Venture863b9242018-03-08 08:29:23 -080011
12template <typename... T>
13using ServerObject = typename sdbusplus::server::object::object<T...>;
14
15using ValueInterface = sdbusplus::xyz::openbmc_project::Sensor::server::Value;
16using ValueObject = ServerObject<ValueInterface>;
17
James Feist8154e322020-06-22 17:12:18 -070018class ValueHelper : public ValueInterface
19{
20
21 public:
22 auto operator()() const
23 {
24 return value();
25 }
26};
27
28constexpr bool usingDouble =
29 std::is_same_v<std::result_of_t<ValueHelper()>, double>;
30using ValueType = std::conditional_t<usingDouble, double, int64_t>;
31
Patrick Venture863b9242018-03-08 08:29:23 -080032/*
33 * HostSensor object is a Sensor derivative that also implements a ValueObject,
34 * which comes from the dbus as an object that implements Sensor.Value.
35 */
36class HostSensor : public Sensor, public ValueObject
37{
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070038 public:
Patrick Venture563a3562018-10-30 09:31:26 -070039 static std::unique_ptr<Sensor> createTemp(const std::string& name,
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070040 int64_t timeout,
41 sdbusplus::bus::bus& bus,
42 const char* objPath, bool defer);
Patrick Venture863b9242018-03-08 08:29:23 -080043
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070044 HostSensor(const std::string& name, int64_t timeout,
45 sdbusplus::bus::bus& bus, const char* objPath, bool defer) :
46 Sensor(name, timeout),
47 ValueObject(bus, objPath, defer)
48 {
49 }
Patrick Venture863b9242018-03-08 08:29:23 -080050
James Feist8154e322020-06-22 17:12:18 -070051 ValueType value(ValueType value) override;
Patrick Venture863b9242018-03-08 08:29:23 -080052
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070053 ReadReturn read(void) override;
54 void write(double value) override;
Patrick Venture863b9242018-03-08 08:29:23 -080055
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070056 private:
57 /*
58 * _lock will be used to make sure _updated & _value are updated
59 * together.
60 */
61 std::mutex _lock;
62 std::chrono::high_resolution_clock::time_point _updated;
63 double _value = 0;
Patrick Venture863b9242018-03-08 08:29:23 -080064};