Fan floor by median sensor value within a range
Add action to set the floor speed based on sensors from within a defined
valid range and using their median value. The floor speed is selected
from the first map key entry that the median value is less than where 3
or more sensor values are valid. In the case where less than 3 sensor
values are valid, use the highest valid value and default the floor
speed when 0 sensor values are valid.
Tested:
Configured wspoon with this action & correct floor resulted:
Sensor value invalidated outside of range
Single valid ambient sensor
Default floor with no valid sensors(kill ambient service)
Highest value used w/ 2 valid sensors
Middle value used w/ odd number of valid sensors(median)
Average value of middle two valid sensors w/ even number(median)
Change-Id: Ia1599ff13e25dbd7caa7b02c9340cc3e1e9947c6
Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
diff --git a/control/utility.hpp b/control/utility.hpp
new file mode 100644
index 0000000..3458180
--- /dev/null
+++ b/control/utility.hpp
@@ -0,0 +1,35 @@
+#pragma once
+
+#include <vector>
+#include "types.hpp"
+
+namespace phosphor
+{
+namespace fan
+{
+namespace control
+{
+namespace utility
+{
+
+/**
+ * @brief A utility function to return a median value
+ * @details A median value is determined from a set of values where the middle
+ * value is returned from an odd set of values and an average of the middle
+ * two values for an even set of values.
+ *
+ * @param[in] values - Set of values to determine the median from
+ *
+ * @return A median value
+ *
+ * @throw std::out_of_range Empty list of values given
+ *
+ * Note: The set of values will be partially re-ordered
+ * https://en.cppreference.com/w/cpp/algorithm/nth_element
+ */
+int64_t getMedian(std::vector<int64_t>& values);
+
+} // namespace utility
+} // namespace control
+} // namespace fan
+} // namespace phosphor