monitor: Add up/down count fault detection

Create an up/down count fault determination algorithm that
could be used in place of the current timer based outOfRange()
function.
The up/down count is a different method for determining when
a fan is faulted by counting up each iteration a rotor is
out of spec and removing those counts when the rotor
returns within spec.

Tested:
    1. Remove a fan and run Mihawk, the counter add 1 when sensor
       is out of spec, and replaced the fan back before hit the
       threshold, the counter decrement back to 0.
    2. Remove a fan, counter add 1 and mark the removed fan as
       nonfunctional when counter reaches the threshold, and
       Replaced the fan back, counter will decrement back to 0
       and fan back to functional.

Change-Id: I632dd2c7553b007beb7ae6bb694a590d2cfc2a1c
Signed-off-by: Jolie Ku <jolie_ku@wistron.com>
Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
diff --git a/monitor/gen-fan-monitor-defs.py b/monitor/gen-fan-monitor-defs.py
index 7386508..4452a85 100755
--- a/monitor/gen-fan-monitor-defs.py
+++ b/monitor/gen-fan-monitor-defs.py
@@ -50,8 +50,9 @@
 {
 %for fan_data in data.get('fans', {}):
     FanDefinition{"${fan_data['inventory']}",
+                  ${fan_data.get('method', {})},
                   ${fan_data.get('functional_delay', 0)},
-                  ${fan_data['allowed_out_of_range_time']},
+                  ${fan_data.get('allowed_out_of_range_time', {})},
                   ${fan_data['deviation']},
                   ${fan_data['num_sensors_nonfunc_for_fan_nonfunc']},
                   0, // Monitor start delay - not used in YAML configs
@@ -67,12 +68,14 @@
                           'xyz.openbmc_project.Control.FanSpeed')
                       factor = sensor.get('factor', 1)
                       offset = sensor.get('offset', 0)
+                      threshold = sensor.get('threshold', 1)
                   %> \
                       SensorDefinition{"${sensor['name']}",
                                        ${has_target},
                                        "${target_interface}",
                                        ${factor},
-                                       ${offset}},
+                                       ${offset},
+                                       ${threshold}},
                   %endfor
                   },
                   %if ('condition' in fan_data) and \