1 #pragma once 2 3 #include <experimental/filesystem> 4 #include "fan_speed.hpp" 5 6 /** @class Targets 7 * @brief Target type traits. 8 * 9 * @tparam T - The target type. 10 */ 11 template <typename T> 12 struct Targets 13 { 14 static void fail() 15 { 16 static_assert(sizeof(Targets) == -1, "Unsupported Target type"); 17 } 18 }; 19 20 /**@brief Targets specialization for fan speed. */ 21 template <> 22 struct Targets<hwmon::FanSpeed> 23 { 24 static constexpr InterfaceType type = InterfaceType::FAN_SPEED; 25 }; 26 27 /** @brief addTarget 28 * 29 * Creates the target type interface 30 * 31 * @tparam T - The target type 32 * 33 * @param[in] sensor - A sensor type and name 34 * @param[in] hwmonRoot - The root hwmon path 35 * @param[in] instance - The target instance name 36 * @param[in] info - The sdbusplus server connection and interfaces 37 */ 38 template <typename T> 39 void addTarget(const SensorSet::key_type& sensor, 40 const std::string& hwmonRoot, 41 const std::string& instance, 42 ObjectInfo& info) 43 { 44 namespace fs = std::experimental::filesystem; 45 static constexpr bool deferSignals = true; 46 47 auto& bus = *std::get<sdbusplus::bus::bus*>(info); 48 auto& obj = std::get<Object>(info); 49 auto& objPath = std::get<std::string>(info); 50 51 // Check if target sysfs file exists 52 auto targetPath = hwmonRoot + '/' + instance; 53 auto sysfsFullPath = make_sysfs_path(targetPath, 54 sensor.first, 55 sensor.second, 56 hwmon::entry::target); 57 if (fs::exists(sysfsFullPath)) 58 { 59 auto iface = std::make_shared<T>(hwmonRoot, 60 instance, 61 sensor.second, 62 bus, 63 objPath.c_str(), 64 deferSignals); 65 auto type = Targets<T>::type; 66 obj[type] = iface; 67 } 68 } 69