blob: 5b1522ff424af34c46c246be162d17b49bac842f [file] [log] [blame]
#pragma once
#include <sdbusplus/bus.hpp>
struct SensorProperties
{
int64_t scale;
double value;
std::string unit;
};
const std::string sensorintf = "xyz.openbmc_project.Sensor.Value";
const std::string propertiesintf = "org.freedesktop.DBus.Properties";
class DbusHelperInterface
{
public:
virtual ~DbusHelperInterface() = default;
/** @brief Get the service providing the interface for the path.
*/
virtual std::string GetService(sdbusplus::bus::bus& bus,
const std::string& intf,
const std::string& path) = 0;
/** @brief Get all Sensor.Value properties for a service and path.
*
* @param[in] bus - A bus to use for the call.
* @param[in] service - The service providing the interface.
* @param[in] path - The dbus path.
* @param[out] prop - A pointer to a properties struct to fill out.
*/
virtual void GetProperties(sdbusplus::bus::bus& bus,
const std::string& service,
const std::string& path,
struct SensorProperties* prop) = 0;
};
class DbusHelper : public DbusHelperInterface
{
public:
DbusHelper() = default;
~DbusHelper() = default;
DbusHelper(const DbusHelper&) = default;
DbusHelper& operator=(const DbusHelper&) = default;
DbusHelper(DbusHelper&&) = default;
DbusHelper& operator=(DbusHelper&&) = default;
std::string GetService(sdbusplus::bus::bus& bus,
const std::string& intf,
const std::string& path) override;
void GetProperties(sdbusplus::bus::bus& bus,
const std::string& service,
const std::string& path,
struct SensorProperties* prop) override;
};
std::string GetSensorPath(const std::string& type, const std::string& id);
std::string GetMatch(const std::string& type, const std::string& id);
bool ValidType(const std::string& type);
struct VariantToFloatVisitor
{
template <typename T>
std::enable_if_t<std::is_arithmetic<T>::value, float>
operator()(const T &t) const
{
return static_cast<float>(t);
}
template <typename T>
std::enable_if_t<!std::is_arithmetic<T>::value, float>
operator()(const T &t) const
{
throw std::invalid_argument("Cannot translate type to float");
}
};
struct VariantToDoubleVisitor
{
template <typename T>
std::enable_if_t<std::is_arithmetic<T>::value, double>
operator()(const T &t) const
{
return static_cast<double>(t);
}
template <typename T>
std::enable_if_t<!std::is_arithmetic<T>::value, double>
operator()(const T &t) const
{
throw std::invalid_argument("Cannot translate type to double");
}
};