blob: 2cff7ea0baccc2d96f37bd826b1db7b505bf0800 [file] [log] [blame]
James Feist7136a5a2018-07-19 09:52:05 -07001/*
2// Copyright (c) 2018 Intel 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
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070017#include "dbus/dbuswrite.hpp"
18
Patrick Venture76ce5d72018-10-30 18:39:50 -070019#include <phosphor-logging/log.hpp>
James Feist7136a5a2018-07-19 09:52:05 -070020#include <sdbusplus/bus.hpp>
Patrick Venturea83a3ec2020-08-04 09:52:05 -070021
22#include <iostream>
23#include <memory>
Patrick Venturef5e770b2018-10-30 12:28:53 -070024#include <string>
James Feist1f802f52019-02-08 13:51:43 -080025#include <variant>
Patrick Venturef5e770b2018-10-30 12:28:53 -070026
27constexpr const char* pwmInterface = "xyz.openbmc_project.Control.FanPwm";
James Feist7136a5a2018-07-19 09:52:05 -070028
Patrick Venture76ce5d72018-10-30 18:39:50 -070029using namespace phosphor::logging;
30
Patrick Venturef5e770b2018-10-30 12:28:53 -070031std::unique_ptr<WriteInterface>
32 DbusWritePercent::createDbusWrite(const std::string& path, int64_t min,
33 int64_t max, DbusHelperInterface& helper)
34{
James Feist9fa90c12019-01-11 15:35:22 -080035 auto tempBus = sdbusplus::bus::new_system();
Patrick Venturef5e770b2018-10-30 12:28:53 -070036 std::string connectionName;
37
38 try
39 {
40 connectionName = helper.getService(tempBus, pwmInterface, path);
41 }
42 catch (const std::exception& e)
43 {
44 return nullptr;
45 }
46
47 return std::make_unique<DbusWritePercent>(path, min, max, connectionName);
48}
49
James Feist7136a5a2018-07-19 09:52:05 -070050void DbusWritePercent::write(double value)
51{
Patrick Venture5f59c0f2018-11-11 12:55:14 -080052 double minimum = getMin();
53 double maximum = getMax();
James Feist7136a5a2018-07-19 09:52:05 -070054
Patrick Venture5f59c0f2018-11-11 12:55:14 -080055 double range = maximum - minimum;
56 double offset = range * value;
57 double ovalue = offset + minimum;
James Feistcd9e1092018-10-08 13:06:41 -070058
59 if (oldValue == static_cast<int64_t>(ovalue))
60 {
61 return;
62 }
James Feist80b5d9a2019-01-15 12:51:09 -080063 auto writeBus = sdbusplus::bus::new_default();
James Feist7136a5a2018-07-19 09:52:05 -070064 auto mesg =
James Feist80b5d9a2019-01-15 12:51:09 -080065 writeBus.new_method_call(connectionName.c_str(), path.c_str(),
66 "org.freedesktop.DBus.Properties", "Set");
Andrew Geissler77ac8562020-05-20 21:09:23 -050067 mesg.append(pwmInterface, "Target",
68 std::variant<uint64_t>(static_cast<uint64_t>(ovalue)));
Patrick Venture76ce5d72018-10-30 18:39:50 -070069
70 try
James Feist7136a5a2018-07-19 09:52:05 -070071 {
Patrick Venture76ce5d72018-10-30 18:39:50 -070072 // TODO: if we don't use the reply, call_noreply()
James Feist80b5d9a2019-01-15 12:51:09 -080073 auto resp = writeBus.call(mesg);
James Feist7136a5a2018-07-19 09:52:05 -070074 }
Patrick Venture76ce5d72018-10-30 18:39:50 -070075 catch (const sdbusplus::exception::SdBusError& ex)
76 {
77 log<level::ERR>("Dbus Call Failure", entry("PATH=%s", path.c_str()),
78 entry("WHAT=%s", ex.what()));
79 }
80
James Feistcd9e1092018-10-08 13:06:41 -070081 oldValue = static_cast<int64_t>(ovalue);
James Feist7136a5a2018-07-19 09:52:05 -070082 return;
83}
84
Patrick Venturef5e770b2018-10-30 12:28:53 -070085std::unique_ptr<WriteInterface>
86 DbusWrite::createDbusWrite(const std::string& path, int64_t min,
87 int64_t max, DbusHelperInterface& helper)
88{
James Feist9fa90c12019-01-11 15:35:22 -080089 auto tempBus = sdbusplus::bus::new_system();
Patrick Venturef5e770b2018-10-30 12:28:53 -070090 std::string connectionName;
91
92 try
93 {
94 connectionName = helper.getService(tempBus, pwmInterface, path);
95 }
96 catch (const std::exception& e)
97 {
98 return nullptr;
99 }
100
101 return std::make_unique<DbusWrite>(path, min, max, connectionName);
102}
103
James Feist7136a5a2018-07-19 09:52:05 -0700104void DbusWrite::write(double value)
105{
James Feistcd9e1092018-10-08 13:06:41 -0700106 if (oldValue == static_cast<int64_t>(value))
107 {
108 return;
109 }
James Feist80b5d9a2019-01-15 12:51:09 -0800110 auto writeBus = sdbusplus::bus::new_default();
James Feist7136a5a2018-07-19 09:52:05 -0700111 auto mesg =
James Feist80b5d9a2019-01-15 12:51:09 -0800112 writeBus.new_method_call(connectionName.c_str(), path.c_str(),
113 "org.freedesktop.DBus.Properties", "Set");
Andrew Geissler77ac8562020-05-20 21:09:23 -0500114 mesg.append(pwmInterface, "Target",
115 std::variant<uint64_t>(static_cast<uint64_t>(value)));
Patrick Venture76ce5d72018-10-30 18:39:50 -0700116
117 try
James Feist7136a5a2018-07-19 09:52:05 -0700118 {
Patrick Venture76ce5d72018-10-30 18:39:50 -0700119 // TODO: consider call_noreplly
James Feist80b5d9a2019-01-15 12:51:09 -0800120 auto resp = writeBus.call(mesg);
James Feist7136a5a2018-07-19 09:52:05 -0700121 }
Patrick Venture76ce5d72018-10-30 18:39:50 -0700122 catch (const sdbusplus::exception::SdBusError& ex)
123 {
124 log<level::ERR>("Dbus Call Failure", entry("PATH=%s", path.c_str()),
125 entry("WHAT=%s", ex.what()));
126 }
127
James Feistcd9e1092018-10-08 13:06:41 -0700128 oldValue = static_cast<int64_t>(value);
James Feist7136a5a2018-07-19 09:52:05 -0700129 return;
130}