Set failsafePwm by pid configuration

<motivation>
Current phosphor-pid-control service supports one zone with
one failsafepwm. However, for some platforms there are
different pluggable cards in a zone. Different combinations
may require different failsafe pwm settings. Why not just
use one zone failsafepwm for all the combinations? because if
we take power consumption or acoustic into consideration,
we will find that not all the cases need the same high
failsafepwm. Each case just need high enough failsafepwm
to cool down the system in that condition.

For example
case1:  zone0 : gpuA card + motherboard in zone0
=>requires failsafepwm = 80

case2:  zone1 : gpuB card + motherboard in zone0
=>requires failsafepwm = 60

In order to solve the problem described above , we propose
the design that. Each pidloop has its own failsafepwm.
The final failsafepwm will be calculated during building
zone process. The detailed design concept is described in
design concept section.

<design concept>
a zone has several pid loops, each one has its own pid
failsafe pwm defined in its configuration.

The calculation flow goes as below:
1.Take failsafepwm of the pidloops and the zone from the configuration
  files, if any is missing , set it to zero.
2.Take max value of (zone failsafepwm and pid loops failsafepwm).
3.If the max value from 'step 2' is zero indicates none of failsafepwm
  is configured, set it to default setting 100%.

<note>
1.this is intended for dbus configuration method, since one zone
  may have different pidloops from different pluggable boards
  entity json, but this design also works for static configuration
  method, therefore, the zone with different boards will need
  different failsafepwm.
2.keep it back compatible with original design , also take zone
  failsafepwm into calculation.

Working example as below

Case1
Zone0:
zone0 pidloop failsafepwm = 60
gpuA pidloop failsafepwm = 70
Motherboard failsafepwm = 40

=>final failsafepwm = 70

Case2
Zone0:
zone0 pidloop failsafepwm = 60
gpuB pidloop failsafepwm = 80
Motherboard failsafepwm = 40

=>final failsafepwm = 80

Change-Id: I5aa1c6a7108f4520f41de5d8eba3075d021bbe79
Signed-off-by: ykchiu <Chiu.YK@inventec.com>
diff --git a/test/pid_zone_unittest.cpp b/test/pid_zone_unittest.cpp
index 4eb3487..8c55a70 100644
--- a/test/pid_zone_unittest.cpp
+++ b/test/pid_zone_unittest.cpp
@@ -53,7 +53,7 @@
     const char* objPath = "/path/";
     int64_t zone = 1;
     double minThermalOutput = 1000.0;
-    double failSafePercent = 0.75;
+    double failSafePercent = 0;
     conf::CycleTime cycleTime;
 
     double d;
@@ -122,7 +122,7 @@
     sdbusplus::SdBusMock sdbus_mock_enable;
     int64_t zoneId = 1;
     double minThermalOutput = 1000.0;
-    double failSafePercent = 0.75;
+    double failSafePercent = 0;
     bool defer = true;
     const char* objPath = "/path/";
     SensorManager mgr;
@@ -291,7 +291,42 @@
 TEST_F(PidZoneTest, GetFailSafePercent_ReturnsExpected)
 {
     // Verify the value used to create the object is stored.
-    EXPECT_EQ(failSafePercent, zone->getFailSafePercent());
+    // when the final failsafe percent is zero , it indicate
+    // no failsafe percent is configured  , set it to 100% as
+    // the default setting.
+
+    std::vector<double> values = {0, 0, 0};
+    int64_t defaultPercent = 100;
+
+    zone->addPidFailSafePercent("temp1", values[0]);
+    zone->addPidFailSafePercent("temp2", values[1]);
+    zone->addPidFailSafePercent("temp3", values[2]);
+
+    zone->initPidFailSafePercent();
+
+    EXPECT_EQ(defaultPercent, zone->getFailSafePercent());
+}
+
+TEST_F(PidZoneTest, GetFailSafePercent_VerifyReturnsExpected)
+{
+    // Tests adding PID controller with FailSafePercent to the zone,
+    // and verifies it's returned as expected.
+
+    std::vector<double> values = {60, 80, 70};
+    double max_value = 0;
+
+    for (const auto& value : values)
+    {
+        max_value = std::max(max_value, value);
+    }
+
+    zone->addPidFailSafePercent("temp1", values[0]);
+    zone->addPidFailSafePercent("temp2", values[1]);
+    zone->addPidFailSafePercent("temp3", values[2]);
+
+    zone->initPidFailSafePercent();
+
+    EXPECT_EQ(max_value, zone->getFailSafePercent());
 }
 
 TEST_F(PidZoneTest, ThermalInputs_FailsafeToValid_ReadsSensors)