blob: 288cb1a7eadc61234e2ea89ab14907187bc21a31 [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{
Patrick Venture5f59c0f2018-11-11 12:55:14 -080057 double minimum = getMin();
58 double maximum = getMax();
James Feist7136a5a2018-07-19 09:52:05 -070059
Patrick Venture5f59c0f2018-11-11 12:55:14 -080060 double range = maximum - minimum;
61 double offset = range * value;
62 double ovalue = offset + minimum;
James Feistcd9e1092018-10-08 13:06:41 -070063
64 if (oldValue == static_cast<int64_t>(ovalue))
65 {
66 return;
67 }
James Feist80b5d9a2019-01-15 12:51:09 -080068 auto writeBus = sdbusplus::bus::new_default();
James Feist7136a5a2018-07-19 09:52:05 -070069 auto mesg =
James Feist80b5d9a2019-01-15 12:51:09 -080070 writeBus.new_method_call(connectionName.c_str(), path.c_str(),
71 "org.freedesktop.DBus.Properties", "Set");
Andrew Geissler77ac8562020-05-20 21:09:23 -050072 mesg.append(pwmInterface, "Target",
73 std::variant<uint64_t>(static_cast<uint64_t>(ovalue)));
Patrick Venture76ce5d72018-10-30 18:39:50 -070074
75 try
James Feist7136a5a2018-07-19 09:52:05 -070076 {
Patrick Venture76ce5d72018-10-30 18:39:50 -070077 // TODO: if we don't use the reply, call_noreply()
James Feist80b5d9a2019-01-15 12:51:09 -080078 auto resp = writeBus.call(mesg);
James Feist7136a5a2018-07-19 09:52:05 -070079 }
Patrick Venture76ce5d72018-10-30 18:39:50 -070080 catch (const sdbusplus::exception::SdBusError& ex)
81 {
82 log<level::ERR>("Dbus Call Failure", entry("PATH=%s", path.c_str()),
83 entry("WHAT=%s", ex.what()));
84 }
85
James Feistcd9e1092018-10-08 13:06:41 -070086 oldValue = static_cast<int64_t>(ovalue);
James Feist7136a5a2018-07-19 09:52:05 -070087 return;
88}
89
Patrick Venturef5e770b2018-10-30 12:28:53 -070090std::unique_ptr<WriteInterface>
91 DbusWrite::createDbusWrite(const std::string& path, int64_t min,
Patrick Venture8729eb92020-08-10 10:38:44 -070092 int64_t max,
93 std::unique_ptr<DbusHelperInterface> helper)
Patrick Venturef5e770b2018-10-30 12:28:53 -070094{
Patrick Venturef5e770b2018-10-30 12:28:53 -070095 std::string connectionName;
96
97 try
98 {
Patrick Venture9b936922020-08-10 11:28:39 -070099 connectionName = helper->getService(pwmInterface, path);
Patrick Venturef5e770b2018-10-30 12:28:53 -0700100 }
101 catch (const std::exception& e)
102 {
103 return nullptr;
104 }
105
106 return std::make_unique<DbusWrite>(path, min, max, connectionName);
107}
108
James Feist7136a5a2018-07-19 09:52:05 -0700109void DbusWrite::write(double value)
110{
James Feistcd9e1092018-10-08 13:06:41 -0700111 if (oldValue == static_cast<int64_t>(value))
112 {
113 return;
114 }
James Feist80b5d9a2019-01-15 12:51:09 -0800115 auto writeBus = sdbusplus::bus::new_default();
James Feist7136a5a2018-07-19 09:52:05 -0700116 auto mesg =
James Feist80b5d9a2019-01-15 12:51:09 -0800117 writeBus.new_method_call(connectionName.c_str(), path.c_str(),
118 "org.freedesktop.DBus.Properties", "Set");
Andrew Geissler77ac8562020-05-20 21:09:23 -0500119 mesg.append(pwmInterface, "Target",
120 std::variant<uint64_t>(static_cast<uint64_t>(value)));
Patrick Venture76ce5d72018-10-30 18:39:50 -0700121
122 try
James Feist7136a5a2018-07-19 09:52:05 -0700123 {
Patrick Venture76ce5d72018-10-30 18:39:50 -0700124 // TODO: consider call_noreplly
James Feist80b5d9a2019-01-15 12:51:09 -0800125 auto resp = writeBus.call(mesg);
James Feist7136a5a2018-07-19 09:52:05 -0700126 }
Patrick Venture76ce5d72018-10-30 18:39:50 -0700127 catch (const sdbusplus::exception::SdBusError& ex)
128 {
129 log<level::ERR>("Dbus Call Failure", entry("PATH=%s", path.c_str()),
130 entry("WHAT=%s", ex.what()));
131 }
132
James Feistcd9e1092018-10-08 13:06:41 -0700133 oldValue = static_cast<int64_t>(value);
James Feist7136a5a2018-07-19 09:52:05 -0700134 return;
135}
Patrick Venturea0764872020-08-08 07:48:43 -0700136
137} // namespace pid_control