summaryrefslogtreecommitdiffstats
path: root/control/fan.cpp
diff options
context:
space:
mode:
authorMatt Spinler <spinler@us.ibm.com>2017-04-10 14:33:35 -0500
committerMatt Spinler <spinler@us.ibm.com>2017-04-27 10:03:54 -0500
commite2b25cb25702490e1bd8b31ce055249f0158a944 (patch)
tree73bbb10947c59aaaee41a7471499867c5e5cf78f /control/fan.cpp
parent5cfdf94fdf0ac1167c9337cec95ba4d932ad40f7 (diff)
downloadphosphor-fan-presence-e2b25cb25702490e1bd8b31ce055249f0158a944.tar.gz
phosphor-fan-presence-e2b25cb25702490e1bd8b31ce055249f0158a944.zip
Fan control: Create Fan class
This class contains the inventory name of the fan, and the sensor names representing the rotors. Calling setSpeed on this object will set the speed on all contained sensors. Change-Id: I850e2d69067813005270105618fcf69b04382b03 Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Diffstat (limited to 'control/fan.cpp')
-rw-r--r--control/fan.cpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/control/fan.cpp b/control/fan.cpp
new file mode 100644
index 0000000..550d34a
--- /dev/null
+++ b/control/fan.cpp
@@ -0,0 +1,90 @@
+/**
+ * Copyright © 2017 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <phosphor-logging/log.hpp>
+#include <string>
+#include "fan.hpp"
+#include "utility.hpp"
+
+namespace phosphor
+{
+namespace fan
+{
+namespace control
+{
+
+constexpr auto PROPERTY_INTERFACE = "org.freedesktop.DBus.Properties";
+constexpr auto FAN_SENSOR_PATH = "/xyz/openbmc_project/sensors/fan_tach/";
+constexpr auto FAN_SENSOR_CONTROL_INTF = "xyz.openbmc_project.Control.FanSpeed";
+constexpr auto FAN_TARGET_PROPERTY = "Target";
+
+
+Fan::Fan(sdbusplus::bus::bus& bus, const FanDefinition& def):
+ _bus(bus),
+ _name(std::get<fanNamePos>(def))
+{
+ auto sensors = std::get<sensorListPos>(def);
+ for (auto& s : sensors)
+ {
+ _sensors.emplace_back(FAN_SENSOR_PATH + s);
+ }
+}
+
+
+//TODO openbmc/openbmc#1524 Can cache this value when
+//openbmc/openbmc#1496 is resolved.
+std::string Fan::getService(const std::string& sensor)
+{
+ return phosphor::fan::util::getService(sensor,
+ FAN_SENSOR_CONTROL_INTF,
+ _bus);
+}
+
+
+void Fan::setSpeed(uint64_t speed)
+{
+ sdbusplus::message::variant<uint64_t> value = speed;
+ std::string property{FAN_TARGET_PROPERTY};
+
+ for (auto& sensor : _sensors)
+ {
+ try
+ {
+ auto service = getService(sensor);
+
+ auto method = _bus.new_method_call(service.c_str(),
+ sensor.c_str(),
+ PROPERTY_INTERFACE,
+ "Set");
+ method.append(FAN_SENSOR_CONTROL_INTF, property, value);
+
+ auto response = _bus.call(method);
+ if (response.is_method_error())
+ {
+ throw std::runtime_error(
+ "Failed call to set fan speed on " + sensor);
+ }
+ }
+ catch (std::exception& e)
+ {
+ //Other applications will handle reporting errors for this
+ phosphor::logging::log<phosphor::logging::level::INFO>(e.what());
+ }
+ }
+}
+
+}
+}
+}
OpenPOWER on IntegriCloud