blob: 381ba75a1b476e50db4d58d71e756a3725a98531 [file] [log] [blame]
Matthew Barthbf7b7b12017-03-07 15:46:59 -06001#pragma once
2
3#include <experimental/filesystem>
Matthew Barth048ac872017-03-09 14:36:08 -06004#include "fan_speed.hpp"
Matthew Barthbf7b7b12017-03-07 15:46:59 -06005
6/** @class Targets
7 * @brief Target type traits.
8 *
9 * @tparam T - The target type.
10 */
11template <typename T>
12struct 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. */
21template <>
Matthew Barth048ac872017-03-09 14:36:08 -060022struct Targets<hwmon::FanSpeed>
Matthew Barthbf7b7b12017-03-07 15:46:59 -060023{
24 static constexpr InterfaceType type = InterfaceType::FAN_SPEED;
Matthew Barthbf7b7b12017-03-07 15:46:59 -060025};
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 */
38template <typename T>
39void 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;
Matthew Barth048ac872017-03-09 14:36:08 -060053 auto sysfsFullPath = make_sysfs_path(targetPath,
54 sensor.first,
55 sensor.second,
56 hwmon::entry::target);
57 if (fs::exists(sysfsFullPath))
Matthew Barthbf7b7b12017-03-07 15:46:59 -060058 {
Matthew Barth048ac872017-03-09 14:36:08 -060059 auto iface = std::make_shared<T>(hwmonRoot,
60 instance,
61 sensor.second,
62 bus,
63 objPath.c_str(),
64 deferSignals);
Matthew Barthbf7b7b12017-03-07 15:46:59 -060065 auto type = Targets<T>::type;
66 obj[type] = iface;
67 }
68}