Allow disabling PID loops at runtime
<design concept>
Add the map of object enable interface to pid loops
in the zone then we can disable/enable each pid loop
process in a zone by dbus command.
[note]
Enable = true : enable process (default)
Enable = false : disable process
Tested:
In this case: we set Enable = false to disable
pidloop:Zone_Temp_0, and see how it affects
the zone final pwm, when pidloop: Zone_Temp_0
in zone 0 is disabled.
then even we are trying to heat up the temperature
of a sensor: Temp_0 in pidloop: Zone_Temp_0, this
set point of the pidloop will not be taken into the
calculation for the final set point of the whole zone.
```
<service object>
root@openbmc:/tmp# busctl tree xyz.openbmc_project.State.FanCtrl
`-/xyz
`-/xyz/openbmc_project
`-/xyz/openbmc_project/settings
`-/xyz/openbmc_project/settings/fanctrl
|-/xyz/openbmc_project/settings/fanctrl/zone0
| |-/xyz/openbmc_project/settings/fanctrl/zone0/Zone_Temp
| |-/xyz/openbmc_project/settings/fanctrl/zone0/Zone_Temp_0
| `-/xyz/openbmc_project/settings/fanctrl/zone0/Zone_Temp_1
====Enable process for pidloop:Zone_Temp_0 with p-switch temperature sensor:Temp_0 at runtime====
root@openbmc:~# busctl introspect xyz.openbmc_project.State.FanCtrl /xyz/openbmc_project/settings/fanctrl/zone0/Zone_Temp_0
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
xyz.openbmc_project.Object.Enable interface - - -
.Enabled property b true emits-change writable
====Disable process for pidloop:Zone_Temp_0 with p-switch temperature sensor: Temp_0====
root@openbmc:~# busctl set-property xyz.openbmc_project.State.FanCtrl /xyz/openbmc_project/settings/fanctrl/zone0/Zone_Temp_0 xyz.openbmc_project.Object.Enable Enabled b false
root@openbmc:~# busctl introspect xyz.openbmc_project.State.FanCtrl /xyz/openbmc_project/settings/fanctrl/zone0/Zone_Temp_0
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
xyz.openbmc_project.Object.Enable interface - - -
.Enabled property b false emits-change writable
```
when Disable the process of the pidloop: Zone_Temp_0,
the requester switches from Zone_Temp_0 to the others,
when you enable the pidloop: Zone_Temp_0, the setpoint
of Zone_Temp_0 will be take into consideration again
Change-Id: I95ae700144f0d16049fff8b309f05ae690a7ef72
Signed-off-by: ykchiu <Chiu.YK@inventec.com>
diff --git a/dbus/dbusconfiguration.cpp b/dbus/dbusconfiguration.cpp
index 7bb96f1..4f86ff6 100644
--- a/dbus/dbusconfiguration.cpp
+++ b/dbus/dbusconfiguration.cpp
@@ -634,7 +634,8 @@
{
const auto& base =
configuration.second.at(pidConfigurationInterface);
- const std::string pidName = std::get<std::string>(base.at("Name"));
+ const std::string pidName =
+ sensorNameToDbusName(std::get<std::string>(base.at("Name")));
const std::string pidClass =
std::get<std::string>(base.at("Class"));
const std::vector<std::string>& zones =
@@ -833,8 +834,7 @@
if (offsetType.empty())
{
- conf::ControllerInfo& info =
- conf[std::get<std::string>(base.at("Name"))];
+ conf::ControllerInfo& info = conf[pidName];
info.inputs = std::move(inputSensorNames);
populatePidInfo(bus, base, info, nullptr, sensorConfig);
}
@@ -857,6 +857,8 @@
if (findStepwise != configuration.second.end())
{
const auto& base = findStepwise->second;
+ const std::string pidName =
+ sensorNameToDbusName(std::get<std::string>(base.at("Name")));
const std::vector<std::string>& zones =
std::get<std::vector<std::string>>(base.at("Zones"));
for (const std::string& zone : zones)
@@ -913,8 +915,7 @@
{
continue;
}
- conf::ControllerInfo& info =
- conf[std::get<std::string>(base.at("Name"))];
+ conf::ControllerInfo& info = conf[pidName];
info.inputs = std::move(inputs);
info.type = "stepwise";