1 #pragma once
2 
3 #include "dbushelper_interface.hpp"
4 
5 #include <phosphor-logging/log.hpp>
6 #include <sdbusplus/bus.hpp>
7 
8 #include <string>
9 #include <variant>
10 
11 namespace pid_control
12 {
13 
14 class DbusHelper : public DbusHelperInterface
15 {
16   public:
17     static constexpr char sensorintf[] = "xyz.openbmc_project.Sensor.Value";
18     static constexpr char propertiesintf[] = "org.freedesktop.DBus.Properties";
19     static constexpr char criticalThreshInf[] =
20         "xyz.openbmc_project.Sensor.Threshold.Critical";
21 
22     DbusHelper() = default;
23     ~DbusHelper() = default;
24     DbusHelper(const DbusHelper&) = default;
25     DbusHelper& operator=(const DbusHelper&) = default;
26     DbusHelper(DbusHelper&&) = default;
27     DbusHelper& operator=(DbusHelper&&) = default;
28 
29     std::string getService(sdbusplus::bus::bus& bus, const std::string& intf,
30                            const std::string& path) override;
31 
32     void getProperties(sdbusplus::bus::bus& bus, const std::string& service,
33                        const std::string& path,
34                        struct SensorProperties* prop) override;
35 
36     bool thresholdsAsserted(sdbusplus::bus::bus& bus,
37                             const std::string& service,
38                             const std::string& path) override;
39 
40     template <typename T>
41     void getProperty(sdbusplus::bus::bus& bus, const std::string& service,
42                      const std::string& path, const std::string& interface,
43                      const std::string& propertyName, T& prop)
44     {
45         namespace log = phosphor::logging;
46 
47         auto msg = bus.new_method_call(service.c_str(), path.c_str(),
48                                        propertiesintf, "Get");
49 
50         msg.append(interface, propertyName);
51 
52         std::variant<T> result;
53         try
54         {
55             auto valueResponseMsg = bus.call(msg);
56             valueResponseMsg.read(result);
57         }
58         catch (const sdbusplus::exception::SdBusError& ex)
59         {
60             log::log<log::level::ERR>("Get Property Failed",
61                                       log::entry("WHAT=%s", ex.what()));
62             throw;
63         }
64 
65         prop = std::get<T>(result);
66     }
67 };
68 
69 } // namespace pid_control
70