blob: 3f3e688e3407777e338023fce728027ff21d2249 [file] [log] [blame]
#pragma once
#include "dbushelper_interface.hpp"
#include <phosphor-logging/log.hpp>
#include <sdbusplus/bus.hpp>
#include <string>
#include <variant>
namespace pid_control
{
class DbusHelper : public DbusHelperInterface
{
public:
static constexpr char sensorintf[] = "xyz.openbmc_project.Sensor.Value";
static constexpr char propertiesintf[] = "org.freedesktop.DBus.Properties";
static constexpr char criticalThreshInf[] =
"xyz.openbmc_project.Sensor.Threshold.Critical";
static constexpr char availabilityIntf[] =
"xyz.openbmc_project.State.Decorator.Availability";
explicit DbusHelper(sdbusplus::bus::bus bus) : _bus(std::move(bus))
{}
~DbusHelper() = default;
DbusHelper(const DbusHelper&) = delete;
DbusHelper& operator=(const DbusHelper&) = delete;
DbusHelper(DbusHelper&&) = default;
DbusHelper& operator=(DbusHelper&&) = default;
std::string getService(const std::string& intf,
const std::string& path) override;
void getProperties(const std::string& service, const std::string& path,
SensorProperties* prop) override;
bool thresholdsAsserted(const std::string& service,
const std::string& path) override;
template <typename T>
void getProperty(const std::string& service, const std::string& path,
const std::string& interface,
const std::string& propertyName, T& prop)
{
namespace log = phosphor::logging;
auto msg = _bus.new_method_call(service.c_str(), path.c_str(),
propertiesintf, "Get");
msg.append(interface, propertyName);
std::variant<T> result;
try
{
auto valueResponseMsg = _bus.call(msg);
valueResponseMsg.read(result);
}
catch (const sdbusplus::exception::exception& ex)
{
log::log<log::level::ERR>("Get Property Failed",
log::entry("WHAT=%s", ex.what()));
throw;
}
prop = std::get<T>(result);
}
private:
sdbusplus::bus::bus _bus;
};
} // namespace pid_control