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/pid/zone.hpp b/pid/zone.hpp
index 9604c73..53d90fd 100644
--- a/pid/zone.hpp
+++ b/pid/zone.hpp
@@ -48,7 +48,7 @@
                          : ModeObject::action::emit_object_added),
         _zoneId(zone), _maximumSetPoint(),
         _minThermalOutputSetPt(minThermalOutput),
-        _failSafePercent(failSafePercent), _cycleTime(cycleTime), _mgr(mgr)
+        _zoneFailSafePercent(failSafePercent), _cycleTime(cycleTime), _mgr(mgr)
     {
         if (loggingEnabled)
         {
@@ -107,6 +107,9 @@
                               std::string objPath, bool defer);
     bool isPidProcessEnabled(std::string name);
 
+    void initPidFailSafePercent(void);
+    void addPidFailSafePercent(std::string name, double percent);
+
   private:
     template <bool fanSensorLogging>
     void processSensorInputs(const std::vector<std::string>& sensorInputs,
@@ -189,7 +192,10 @@
     bool _manualMode = false;
     bool _redundantWrite = false;
     const double _minThermalOutputSetPt;
-    const double _failSafePercent;
+    // Current fail safe Percent.
+    double _failSafePercent;
+    // Zone fail safe Percent setting by configuration.
+    const double _zoneFailSafePercent;
     const conf::CycleTime _cycleTime;
 
     std::set<std::string> _failSafeSensors;
@@ -206,6 +212,11 @@
     std::vector<std::unique_ptr<Controller>> _thermals;
 
     std::map<std::string, std::unique_ptr<ProcessObject>> _pidsControlProcess;
+    /*
+     * <key = pidname, value = pid failsafe percent>
+     * Pid fail safe Percent setting by each pid controller configuration.
+     */
+    std::map<std::string, double> _pidsFailSafePercent;
 };
 
 } // namespace pid_control