summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaptor Engineering Development Team <support@raptorengineering.com>2018-01-21 19:50:17 -0600
committerRaptor Engineering Development Team <support@raptorengineering.com>2018-01-21 19:50:17 -0600
commitc437adbfea21c06f1012cef30910edfda59f3d05 (patch)
treee4203dfcf2c5e8e86e162d4fe9666b1989a5740d
parente4338cdb856db2b71f8adf42c50603d816980f8a (diff)
downloadphosphor-fan-presence-c437adbfea21c06f1012cef30910edfda59f3d05.tar.gz
phosphor-fan-presence-c437adbfea21c06f1012cef30910edfda59f3d05.zip
Allow override of deviation with absolute minimum RPM
If the devation is less than zero, treat as an absolute minimum RPM value
-rw-r--r--monitor/fan.cpp22
-rw-r--r--monitor/fan.hpp5
-rwxr-xr-xmonitor/gen-fan-monitor-defs.py2
-rw-r--r--monitor/types.hpp2
4 files changed, 23 insertions, 8 deletions
diff --git a/monitor/fan.cpp b/monitor/fan.cpp
index a6af74a..f55ddb3 100644
--- a/monitor/fan.cpp
+++ b/monitor/fan.cpp
@@ -36,7 +36,8 @@ Fan::Fan(Mode mode,
const FanDefinition& def) :
_bus(bus),
_name(std::get<fanNameField>(def)),
- _deviation(std::get<fanDeviationField>(def)),
+ _deviation((std::get<fanDeviationField>(def) < 0)?abs(std::get<fanDeviationField>(def)):std::get<fanDeviationField>(def)),
+ _deviationIsMinRPM((std::get<fanDeviationField>(def) < 0)?true:false),
_numSensorFailsForNonFunc(std::get<numSensorFailsForNonfuncField>(def)),
_trustManager(trust)
{
@@ -179,12 +180,21 @@ bool Fan::outOfRange(const TachSensor& sensor)
auto actual = static_cast<uint64_t>(sensor.getInput());
auto target = getTargetSpeed(sensor);
- uint64_t min = target * (100 - _deviation) / 100;
- uint64_t max = target * (100 + _deviation) / 100;
-
- if ((actual < min) || (actual > max))
+ if (_deviationIsMinRPM)
{
- return true;
+ if (actual < _deviation)
+ {
+ return true;
+ }
+ }
+ else {
+ uint64_t min = target * (100 - _deviation) / 100;
+ uint64_t max = target * (100 + _deviation) / 100;
+
+ if ((actual < min) || (actual > max))
+ {
+ return true;
+ }
}
return false;
diff --git a/monitor/fan.hpp b/monitor/fan.hpp
index f22bd9f..cb50c5d 100644
--- a/monitor/fan.hpp
+++ b/monitor/fan.hpp
@@ -187,6 +187,11 @@ class Fan
const size_t _deviation;
/**
+ * @brief True if deviation indicates minimum absolute RPM
+ */
+ bool _deviationIsMinRPM;
+
+ /**
* The number of sensors that must be nonfunctional at the
* same time in order for the fan to be set to nonfunctional
* in the inventory.
diff --git a/monitor/gen-fan-monitor-defs.py b/monitor/gen-fan-monitor-defs.py
index 1590484..66dbb52 100755
--- a/monitor/gen-fan-monitor-defs.py
+++ b/monitor/gen-fan-monitor-defs.py
@@ -90,7 +90,7 @@ if __name__ == '__main__':
#Do some minor input validation
for fan in monitor_data.get('fans', {}):
- if ((fan['deviation'] < 0) or (fan['deviation'] > 100)):
+ if (fan['deviation'] > 100):
sys.exit("Invalid deviation value " + str(fan['deviation']))
output_file = os.path.join(args.output_dir, "fan_monitor_defs.cpp")
diff --git a/monitor/types.hpp b/monitor/types.hpp
index 795db00..ba6bf13 100644
--- a/monitor/types.hpp
+++ b/monitor/types.hpp
@@ -29,7 +29,7 @@ constexpr auto sensorListField = 4;
using FanDefinition = std::tuple<std::string,
size_t,
- size_t,
+ ssize_t,
size_t,
std::vector<SensorDefinition>>;
OpenPOWER on IntegriCloud