blob: 86058ca27d8593df23c2d10271c27bda5f4b8e7e [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
Matt Spinler0a8de642017-05-11 10:59:39 -050037 *
38 * @return A shared pointer to the target interface object
39 * Will be empty if no interface was created
Matthew Barthbf7b7b12017-03-07 15:46:59 -060040 */
41template <typename T>
Matt Spinler0a8de642017-05-11 10:59:39 -050042std::shared_ptr<T> addTarget(const SensorSet::key_type& sensor,
43 const std::string& hwmonRoot,
44 const std::string& instance,
45 ObjectInfo& info)
Matthew Barthbf7b7b12017-03-07 15:46:59 -060046{
Matt Spinler0a8de642017-05-11 10:59:39 -050047 std::shared_ptr<T> target;
Matthew Barthbf7b7b12017-03-07 15:46:59 -060048 namespace fs = std::experimental::filesystem;
49 static constexpr bool deferSignals = true;
50
51 auto& bus = *std::get<sdbusplus::bus::bus*>(info);
52 auto& obj = std::get<Object>(info);
53 auto& objPath = std::get<std::string>(info);
54
55 // Check if target sysfs file exists
56 auto targetPath = hwmonRoot + '/' + instance;
Patrick Venture1e6324f2017-06-01 14:07:05 -070057 auto sysfsFullPath = sysfs::make_sysfs_path(targetPath,
58 sensor.first,
59 sensor.second,
60 hwmon::entry::target);
Matthew Barth048ac872017-03-09 14:36:08 -060061 if (fs::exists(sysfsFullPath))
Matthew Barthbf7b7b12017-03-07 15:46:59 -060062 {
Matt Spinler0a8de642017-05-11 10:59:39 -050063 target = std::make_shared<T>(hwmonRoot,
64 instance,
65 sensor.second,
66 bus,
67 objPath.c_str(),
68 deferSignals);
Matthew Barthbf7b7b12017-03-07 15:46:59 -060069 auto type = Targets<T>::type;
Matt Spinler0a8de642017-05-11 10:59:39 -050070 obj[type] = target;
Matthew Barthbf7b7b12017-03-07 15:46:59 -060071 }
Matt Spinler0a8de642017-05-11 10:59:39 -050072
73 return target;
Matthew Barthbf7b7b12017-03-07 15:46:59 -060074}