1 #include "dbusUtils.hpp"
2 
3 #include <sdbusplus/bus.hpp>
4 #include <sdbusplus/server.hpp>
5 
6 const char* sensorIntf = "xyz.openbmc_project.Sensor.Value";
7 
8 int handleDbusSignal(sd_bus_message* msg, void* usrData, sd_bus_error* err);
9 
10 class DbusSensor
11 {
12   public:
13     DbusSensor() = delete;
14     virtual ~DbusSensor() = default;
15 
16     /** @brief Constructs DbusSensor
17      *
18      * @param[in] bus     - Handle to system dbus
19      * @param[in] path    - The Dbus path of sensor
20      */
21     DbusSensor(sdbusplus::bus::bus& bus, const std::string& path, void* ctx) :
22         bus(bus), path(path),
23         signal(
24             bus,
25             sdbusplus::bus::match::rules::propertiesChanged(path, sensorIntf),
26             handleDbusSignal, ctx)
27     {
28         servName = getService(bus, path, sensorIntf);
29     }
30 
31     /** @brief Get sensor value property from D-bus interface */
32     double getSensorValue()
33     {
34         if (servName.empty())
35         {
36             servName = getService(bus, path, sensorIntf);
37             if (servName.empty())
38             {
39                 return std::numeric_limits<double>::quiet_NaN();
40             }
41         }
42 
43         try
44         {
45             return getDbusProperty<double>(bus, servName, path, sensorIntf,
46                                            "Value");
47         }
48         catch (const std::exception& e)
49         {
50             return std::numeric_limits<double>::quiet_NaN();
51         }
52     }
53 
54   private:
55     /** @brief sdbusplus bus client connection. */
56     sdbusplus::bus::bus& bus;
57     /** @brief complete path for sensor */
58     std::string path;
59     /** @brief service name for the sensor daemon */
60     std::string servName;
61     /** @brief signal for sensor value change */
62     sdbusplus::server::match::match signal;
63 };
64