| #pragma once |
| |
| #include "sensor.hpp" |
| |
| #include <sdbusplus/bus.hpp> |
| #include <sdbusplus/server.hpp> |
| #include <xyz/openbmc_project/Sensor/Value/server.hpp> |
| |
| #include <memory> |
| #include <mutex> |
| #include <type_traits> |
| |
| template <typename... T> |
| using ServerObject = typename sdbusplus::server::object::object<T...>; |
| |
| using ValueInterface = sdbusplus::xyz::openbmc_project::Sensor::server::Value; |
| using ValueObject = ServerObject<ValueInterface>; |
| |
| namespace pid_control |
| { |
| |
| class ValueHelper : public ValueInterface |
| { |
| |
| public: |
| auto operator()() const |
| { |
| return value(); |
| } |
| }; |
| |
| constexpr bool usingDouble = |
| std::is_same_v<std::result_of_t<ValueHelper()>, double>; |
| using ValueType = std::conditional_t<usingDouble, double, int64_t>; |
| |
| /* |
| * HostSensor object is a Sensor derivative that also implements a ValueObject, |
| * which comes from the dbus as an object that implements Sensor.Value. |
| */ |
| class HostSensor : public Sensor, public ValueObject |
| { |
| public: |
| static std::unique_ptr<Sensor> createTemp(const std::string& name, |
| int64_t timeout, |
| sdbusplus::bus::bus& bus, |
| const char* objPath, bool defer); |
| |
| HostSensor(const std::string& name, int64_t timeout, |
| sdbusplus::bus::bus& bus, const char* objPath, bool defer) : |
| Sensor(name, timeout), |
| ValueObject(bus, objPath, defer) |
| {} |
| |
| ValueType value(ValueType value) override; |
| |
| ReadReturn read(void) override; |
| void write(double value) override; |
| |
| private: |
| /* |
| * _lock will be used to make sure _updated & _value are updated |
| * together. |
| */ |
| std::mutex _lock; |
| std::chrono::high_resolution_clock::time_point _updated; |
| double _value = 0; |
| }; |
| |
| } // namespace pid_control |