Allow multiple inputs to thermal and stepwise controllers
Use std::max to determine which input value to apply.
Also start throwing when inputs are empty as otherwise
there will be a nullptr dereference.
Tested-by: Added multiple inputs and application no longer
segfaults and verifed max was being used. Also added unit
tests.
Change-Id: I7c8eda45b99247b8e92e629f036c9a46c98d9fe2
Signed-off-by: James Feist <james.feist@linux.intel.com>
diff --git a/pid/stepwisecontroller.cpp b/pid/stepwisecontroller.cpp
index b81f8b1..43fd241 100644
--- a/pid/stepwisecontroller.cpp
+++ b/pid/stepwisecontroller.cpp
@@ -17,6 +17,7 @@
#include "stepwisecontroller.hpp"
#include "ec/stepwise.hpp"
+#include "errors/exception.hpp"
#include "util.hpp"
#include "zone.hpp"
@@ -66,9 +67,10 @@
ZoneInterface* owner, const std::string& id,
const std::vector<std::string>& inputs, const ec::StepwiseInfo& initial)
{
- // StepwiseController currently only supports precisely one input.
- if (inputs.size() != 1)
+ // StepwiseController requires at least 1 input
+ if (inputs.empty())
{
+ throw ControllerBuildException("Stepwise controller missing inputs");
return nullptr;
}
@@ -83,7 +85,11 @@
double StepwiseController::inputProc(void)
{
- double value = _owner->getCachedValue(_inputs.at(0));
+ double value = std::numeric_limits<double>::lowest();
+ for (const auto& in : _inputs)
+ {
+ value = std::max(value, _owner->getCachedValue(in));
+ }
return value;
}