blob: faba2c6feac84443a61a1c7d999c9e49082cd44e [file] [log] [blame]
Vijay Khemka7452a862020-08-11 16:01:23 -07001#include "dbusUtils.hpp"
2
3#include <sdbusplus/bus.hpp>
Vijay Khemka51f898e2020-09-09 22:24:18 -07004#include <sdbusplus/server.hpp>
Vijay Khemka7452a862020-08-11 16:01:23 -07005
6const char* sensorIntf = "xyz.openbmc_project.Sensor.Value";
7
Vijay Khemka51f898e2020-09-09 22:24:18 -07008int handleDbusSignal(sd_bus_message* msg, void* usrData, sd_bus_error* err);
9
Vijay Khemka7452a862020-08-11 16:01:23 -070010class 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 */
Vijay Khemka51f898e2020-09-09 22:24:18 -070021 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)
Vijay Khemka7452a862020-08-11 16:01:23 -070027 {
28 servName = getService(bus, path, sensorIntf);
29 }
30
31 /** @brief Get sensor value property from D-bus interface */
32 double getSensorValue()
33 {
Matt Spinlerf8db7222020-11-10 08:15:03 -060034 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
Vijay Khemka7452a862020-08-11 16:01:23 -070043 return getDbusProperty<double>(bus, servName, path, sensorIntf,
44 "Value");
45 }
46
47 private:
48 /** @brief sdbusplus bus client connection. */
49 sdbusplus::bus::bus& bus;
50 /** @brief complete path for sensor */
51 std::string path;
52 /** @brief service name for the sensor daemon */
53 std::string servName;
Vijay Khemka51f898e2020-09-09 22:24:18 -070054 /** @brief signal for sensor value change */
55 sdbusplus::server::match::match signal;
Vijay Khemka7452a862020-08-11 16:01:23 -070056};