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