blob: 550d34a1de37f39c3d625ee579a5343f4719a395 [file] [log] [blame]
Matt Spinlere2b25cb2017-04-10 14:33:35 -05001/**
2 * Copyright © 2017 IBM Corporation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#include <phosphor-logging/log.hpp>
17#include <string>
18#include "fan.hpp"
19#include "utility.hpp"
20
21namespace phosphor
22{
23namespace fan
24{
25namespace control
26{
27
28constexpr auto PROPERTY_INTERFACE = "org.freedesktop.DBus.Properties";
29constexpr auto FAN_SENSOR_PATH = "/xyz/openbmc_project/sensors/fan_tach/";
30constexpr auto FAN_SENSOR_CONTROL_INTF = "xyz.openbmc_project.Control.FanSpeed";
31constexpr auto FAN_TARGET_PROPERTY = "Target";
32
33
34Fan::Fan(sdbusplus::bus::bus& bus, const FanDefinition& def):
35 _bus(bus),
36 _name(std::get<fanNamePos>(def))
37{
38 auto sensors = std::get<sensorListPos>(def);
39 for (auto& s : sensors)
40 {
41 _sensors.emplace_back(FAN_SENSOR_PATH + s);
42 }
43}
44
45
46//TODO openbmc/openbmc#1524 Can cache this value when
47//openbmc/openbmc#1496 is resolved.
48std::string Fan::getService(const std::string& sensor)
49{
50 return phosphor::fan::util::getService(sensor,
51 FAN_SENSOR_CONTROL_INTF,
52 _bus);
53}
54
55
56void Fan::setSpeed(uint64_t speed)
57{
58 sdbusplus::message::variant<uint64_t> value = speed;
59 std::string property{FAN_TARGET_PROPERTY};
60
61 for (auto& sensor : _sensors)
62 {
63 try
64 {
65 auto service = getService(sensor);
66
67 auto method = _bus.new_method_call(service.c_str(),
68 sensor.c_str(),
69 PROPERTY_INTERFACE,
70 "Set");
71 method.append(FAN_SENSOR_CONTROL_INTF, property, value);
72
73 auto response = _bus.call(method);
74 if (response.is_method_error())
75 {
76 throw std::runtime_error(
77 "Failed call to set fan speed on " + sensor);
78 }
79 }
80 catch (std::exception& e)
81 {
82 //Other applications will handle reporting errors for this
83 phosphor::logging::log<phosphor::logging::level::INFO>(e.what());
84 }
85 }
86}
87
88}
89}
90}