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     static constexpr char availabilityIntf[] =
22         "xyz.openbmc_project.State.Decorator.Availability";
23 
24     explicit DbusHelper(sdbusplus::bus::bus bus) : _bus(std::move(bus))
25     {}
26     ~DbusHelper() = default;
27 
28     DbusHelper(const DbusHelper&) = delete;
29     DbusHelper& operator=(const DbusHelper&) = delete;
30 
31     DbusHelper(DbusHelper&&) = default;
32     DbusHelper& operator=(DbusHelper&&) = default;
33 
34     std::string getService(const std::string& intf,
35                            const std::string& path) override;
36 
37     void getProperties(const std::string& service, const std::string& path,
38                        SensorProperties* prop) override;
39 
40     bool thresholdsAsserted(const std::string& service,
41                             const std::string& path) override;
42 
43     template <typename T>
44     void getProperty(const std::string& service, const std::string& path,
45                      const std::string& interface,
46                      const std::string& propertyName, T& prop)
47     {
48         namespace log = phosphor::logging;
49 
50         auto msg = _bus.new_method_call(service.c_str(), path.c_str(),
51                                         propertiesintf, "Get");
52 
53         msg.append(interface, propertyName);
54 
55         std::variant<T> result;
56         try
57         {
58             auto valueResponseMsg = _bus.call(msg);
59             valueResponseMsg.read(result);
60         }
61         catch (const sdbusplus::exception::exception& ex)
62         {
63             log::log<log::level::ERR>("Get Property Failed",
64                                       log::entry("WHAT=%s", ex.what()));
65             throw;
66         }
67 
68         prop = std::get<T>(result);
69     }
70 
71   private:
72     sdbusplus::bus::bus _bus;
73 };
74 
75 } // namespace pid_control
76