blob: fce95aeb0fde0fa3473c71126518711eb8d65171 [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 Ventureaadb30d2020-08-10 09:17:11 -070017#include "dbuswrite.hpp"
18
19#include "dbushelper_interface.hpp"
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070020
Patrick Venture76ce5d72018-10-30 18:39:50 -070021#include <phosphor-logging/log.hpp>
James Feist7136a5a2018-07-19 09:52:05 -070022#include <sdbusplus/bus.hpp>
Patrick Venturea83a3ec2020-08-04 09:52:05 -070023
Patrick Venture8729eb92020-08-10 10:38:44 -070024#include <exception>
Patrick Venturea83a3ec2020-08-04 09:52:05 -070025#include <iostream>
26#include <memory>
Patrick Venturef5e770b2018-10-30 12:28:53 -070027#include <string>
James Feist1f802f52019-02-08 13:51:43 -080028#include <variant>
Patrick Venturef5e770b2018-10-30 12:28:53 -070029
Patrick Venturea0764872020-08-08 07:48:43 -070030namespace pid_control
31{
32
Patrick Venturef5e770b2018-10-30 12:28:53 -070033constexpr const char* pwmInterface = "xyz.openbmc_project.Control.FanPwm";
James Feist7136a5a2018-07-19 09:52:05 -070034
Patrick Venture76ce5d72018-10-30 18:39:50 -070035using namespace phosphor::logging;
36
Patrick Venture8729eb92020-08-10 10:38:44 -070037std::unique_ptr<WriteInterface> DbusWritePercent::createDbusWrite(
38 const std::string& path, int64_t min, int64_t max,
39 std::unique_ptr<DbusHelperInterface> helper)
Patrick Venturef5e770b2018-10-30 12:28:53 -070040{
Patrick Venturef5e770b2018-10-30 12:28:53 -070041 std::string connectionName;
42
43 try
44 {
Patrick Venture9b936922020-08-10 11:28:39 -070045 connectionName = helper->getService(pwmInterface, path);
Patrick Venturef5e770b2018-10-30 12:28:53 -070046 }
47 catch (const std::exception& e)
48 {
49 return nullptr;
50 }
51
52 return std::make_unique<DbusWritePercent>(path, min, max, connectionName);
53}
54
James Feist7136a5a2018-07-19 09:52:05 -070055void DbusWritePercent::write(double value)
56{
Josh Lehan2400ce42020-10-01 01:50:39 -070057 return write(value, false, nullptr);
58}
59
60void DbusWritePercent::write(double value, bool force, int64_t* written)
61{
Patrick Venture5f59c0f2018-11-11 12:55:14 -080062 double minimum = getMin();
63 double maximum = getMax();
James Feist7136a5a2018-07-19 09:52:05 -070064
Patrick Venture5f59c0f2018-11-11 12:55:14 -080065 double range = maximum - minimum;
66 double offset = range * value;
67 double ovalue = offset + minimum;
James Feistcd9e1092018-10-08 13:06:41 -070068
69 if (oldValue == static_cast<int64_t>(ovalue))
70 {
Josh Lehan2400ce42020-10-01 01:50:39 -070071 if (!force)
72 {
73 if (written)
74 {
75 *written = oldValue;
76 }
77 return;
78 }
James Feistcd9e1092018-10-08 13:06:41 -070079 }
James Feist80b5d9a2019-01-15 12:51:09 -080080 auto writeBus = sdbusplus::bus::new_default();
James Feist7136a5a2018-07-19 09:52:05 -070081 auto mesg =
James Feist80b5d9a2019-01-15 12:51:09 -080082 writeBus.new_method_call(connectionName.c_str(), path.c_str(),
83 "org.freedesktop.DBus.Properties", "Set");
Andrew Geissler77ac8562020-05-20 21:09:23 -050084 mesg.append(pwmInterface, "Target",
85 std::variant<uint64_t>(static_cast<uint64_t>(ovalue)));
Patrick Venture76ce5d72018-10-30 18:39:50 -070086
87 try
James Feist7136a5a2018-07-19 09:52:05 -070088 {
Patrick Venture76ce5d72018-10-30 18:39:50 -070089 // TODO: if we don't use the reply, call_noreply()
James Feist80b5d9a2019-01-15 12:51:09 -080090 auto resp = writeBus.call(mesg);
James Feist7136a5a2018-07-19 09:52:05 -070091 }
Patrick Venture76ce5d72018-10-30 18:39:50 -070092 catch (const sdbusplus::exception::SdBusError& ex)
93 {
94 log<level::ERR>("Dbus Call Failure", entry("PATH=%s", path.c_str()),
95 entry("WHAT=%s", ex.what()));
96 }
97
James Feistcd9e1092018-10-08 13:06:41 -070098 oldValue = static_cast<int64_t>(ovalue);
Josh Lehan2400ce42020-10-01 01:50:39 -070099 if (written)
100 {
101 *written = oldValue;
102 }
James Feist7136a5a2018-07-19 09:52:05 -0700103 return;
104}
105
Patrick Venturef5e770b2018-10-30 12:28:53 -0700106std::unique_ptr<WriteInterface>
107 DbusWrite::createDbusWrite(const std::string& path, int64_t min,
Patrick Venture8729eb92020-08-10 10:38:44 -0700108 int64_t max,
109 std::unique_ptr<DbusHelperInterface> helper)
Patrick Venturef5e770b2018-10-30 12:28:53 -0700110{
Patrick Venturef5e770b2018-10-30 12:28:53 -0700111 std::string connectionName;
112
113 try
114 {
Patrick Venture9b936922020-08-10 11:28:39 -0700115 connectionName = helper->getService(pwmInterface, path);
Patrick Venturef5e770b2018-10-30 12:28:53 -0700116 }
117 catch (const std::exception& e)
118 {
119 return nullptr;
120 }
121
122 return std::make_unique<DbusWrite>(path, min, max, connectionName);
123}
124
James Feist7136a5a2018-07-19 09:52:05 -0700125void DbusWrite::write(double value)
126{
Josh Lehan2400ce42020-10-01 01:50:39 -0700127 return write(value, false, nullptr);
128}
129
130void DbusWrite::write(double value, bool force, int64_t* written)
131{
James Feistcd9e1092018-10-08 13:06:41 -0700132 if (oldValue == static_cast<int64_t>(value))
133 {
Josh Lehan2400ce42020-10-01 01:50:39 -0700134 if (!force)
135 {
136 if (written)
137 {
138 *written = oldValue;
139 }
140 return;
141 }
James Feistcd9e1092018-10-08 13:06:41 -0700142 }
James Feist80b5d9a2019-01-15 12:51:09 -0800143 auto writeBus = sdbusplus::bus::new_default();
James Feist7136a5a2018-07-19 09:52:05 -0700144 auto mesg =
James Feist80b5d9a2019-01-15 12:51:09 -0800145 writeBus.new_method_call(connectionName.c_str(), path.c_str(),
146 "org.freedesktop.DBus.Properties", "Set");
Andrew Geissler77ac8562020-05-20 21:09:23 -0500147 mesg.append(pwmInterface, "Target",
148 std::variant<uint64_t>(static_cast<uint64_t>(value)));
Patrick Venture76ce5d72018-10-30 18:39:50 -0700149
150 try
James Feist7136a5a2018-07-19 09:52:05 -0700151 {
Patrick Venture76ce5d72018-10-30 18:39:50 -0700152 // TODO: consider call_noreplly
James Feist80b5d9a2019-01-15 12:51:09 -0800153 auto resp = writeBus.call(mesg);
James Feist7136a5a2018-07-19 09:52:05 -0700154 }
Patrick Venture76ce5d72018-10-30 18:39:50 -0700155 catch (const sdbusplus::exception::SdBusError& ex)
156 {
157 log<level::ERR>("Dbus Call Failure", entry("PATH=%s", path.c_str()),
158 entry("WHAT=%s", ex.what()));
159 }
160
James Feistcd9e1092018-10-08 13:06:41 -0700161 oldValue = static_cast<int64_t>(value);
Josh Lehan2400ce42020-10-01 01:50:39 -0700162 if (written)
163 {
164 *written = oldValue;
165 }
James Feist7136a5a2018-07-19 09:52:05 -0700166 return;
167}
Patrick Venturea0764872020-08-08 07:48:43 -0700168
169} // namespace pid_control