test: pid: zone
Add unit-tests for the PID zone module.
Add zone_mock.
Tested: Ran on quanta-q71l board and it behaved as expected.
Change-Id: I51185b2d2daacea6ffb687e8f38c4fe2b2a1bed3
Signed-off-by: Patrick Venture <venture@google.com>
diff --git a/pid/controller.hpp b/pid/controller.hpp
index d02f9cc..fa89ad1 100644
--- a/pid/controller.hpp
+++ b/pid/controller.hpp
@@ -6,7 +6,7 @@
#include "fan.hpp"
#include "ec/pid.hpp"
-class PIDZone;
+class ZoneInterface;
/*
* Base class for PID controllers. Each PID that implements this needs to
@@ -15,7 +15,7 @@
class PIDController
{
public:
- PIDController(const std::string& id, PIDZone* owner)
+ PIDController(const std::string& id, ZoneInterface* owner)
: _owner(owner),
_id(id)
{ }
@@ -47,7 +47,7 @@
}
protected:
- PIDZone* _owner;
+ ZoneInterface* _owner;
private:
// parameters
diff --git a/pid/fancontroller.cpp b/pid/fancontroller.cpp
index 340c6d0..c2dee74 100644
--- a/pid/fancontroller.cpp
+++ b/pid/fancontroller.cpp
@@ -22,7 +22,7 @@
#include "zone.hpp"
std::unique_ptr<PIDController> FanController::CreateFanPid(
- PIDZone* owner,
+ ZoneInterface* owner,
const std::string& id,
std::vector<std::string>& inputs,
ec::pidinfo initial)
@@ -133,7 +133,7 @@
// PidSensorMap for writing.
for (auto& it : _inputs)
{
- auto& sensor = _owner->getSensor(it);
+ auto sensor = _owner->getSensor(it);
sensor->write(static_cast<double>(percent));
}
diff --git a/pid/fancontroller.hpp b/pid/fancontroller.hpp
index b627915..b9b015c 100644
--- a/pid/fancontroller.hpp
+++ b/pid/fancontroller.hpp
@@ -18,14 +18,14 @@
{
public:
static std::unique_ptr<PIDController> CreateFanPid(
- PIDZone* owner,
+ ZoneInterface* owner,
const std::string& id,
std::vector<std::string>& inputs,
ec::pidinfo initial);
FanController(const std::string& id,
std::vector<std::string>& inputs,
- PIDZone* owner)
+ ZoneInterface* owner)
: PIDController(id, owner),
_inputs(inputs),
_direction(FanSpeedDirection::NEUTRAL)
diff --git a/pid/thermalcontroller.cpp b/pid/thermalcontroller.cpp
index 61e5ca9..dee2d4e 100644
--- a/pid/thermalcontroller.cpp
+++ b/pid/thermalcontroller.cpp
@@ -20,7 +20,7 @@
std::unique_ptr<PIDController> ThermalController::CreateThermalPid(
- PIDZone* owner,
+ ZoneInterface* owner,
const std::string& id,
std::vector<std::string>& inputs,
float setpoint,
diff --git a/pid/thermalcontroller.hpp b/pid/thermalcontroller.hpp
index dbfcfc9..32d4a7f 100644
--- a/pid/thermalcontroller.hpp
+++ b/pid/thermalcontroller.hpp
@@ -16,7 +16,7 @@
{
public:
static std::unique_ptr<PIDController> CreateThermalPid(
- PIDZone* owner,
+ ZoneInterface* owner,
const std::string& id,
std::vector<std::string>& inputs,
float setpoint,
@@ -24,7 +24,7 @@
ThermalController(const std::string& id,
std::vector<std::string>& inputs,
- PIDZone* owner)
+ ZoneInterface* owner)
: PIDController(id, owner),
_inputs(inputs)
{ }
diff --git a/pid/zone.cpp b/pid/zone.cpp
index 26bff6a..fdf16fc 100644
--- a/pid/zone.cpp
+++ b/pid/zone.cpp
@@ -208,7 +208,7 @@
for (auto& f : _fanInputs)
{
- auto& sensor = _mgr.getSensor(f);
+ auto sensor = _mgr.getSensor(f);
ReadReturn r = sensor->read();
_cachedValuesByName[f] = r.value;
@@ -240,7 +240,7 @@
for (auto& t : _thermalInputs)
{
- auto& sensor = _mgr.getSensor(t);
+ auto sensor = _mgr.getSensor(t);
ReadReturn r = sensor->read();
int64_t timeout = sensor->GetTimeout();
@@ -316,7 +316,7 @@
}
}
-const std::unique_ptr<Sensor>& PIDZone::getSensor(std::string name)
+Sensor* PIDZone::getSensor(std::string name)
{
return _mgr.getSensor(name);
}
diff --git a/pid/zone.hpp b/pid/zone.hpp
index f6ee5e8..1934a66 100644
--- a/pid/zone.hpp
+++ b/pid/zone.hpp
@@ -23,12 +23,25 @@
sdbusplus::xyz::openbmc_project::Control::server::Mode;
using ModeObject = ServerObject<ModeInterface>;
+class ZoneInterface
+{
+ public:
+ virtual ~ZoneInterface() = default;
+
+ virtual double getCachedValue(const std::string& name) = 0;
+ virtual void addRPMSetPoint(float setpoint) = 0;
+ virtual float getMaxRPMRequest() const = 0;
+ virtual bool getFailSafeMode() const = 0;
+ virtual float getFailSafePercent() const = 0;
+ virtual Sensor* getSensor(std::string name) = 0;
+};
+
/*
* The PIDZone inherits from the Mode object so that it can listen for control
* mode changes. It primarily holds all PID loops and holds the sensor value
* cache that's used per iteration of the PID loops.
*/
-class PIDZone : public ModeObject
+class PIDZone : public ZoneInterface, public ModeObject
{
public:
PIDZone(int64_t zone,
@@ -50,21 +63,21 @@
#endif
}
- float getMaxRPMRequest(void) const;
+ float getMaxRPMRequest(void) const override;
bool getManualMode(void) const;
/* Could put lock around this since it's accessed from two threads, but
* only one reader/one writer.
*/
void setManualMode(bool mode);
- bool getFailSafeMode(void) const;
+ bool getFailSafeMode(void) const override;
int64_t getZoneId(void) const;
- void addRPMSetPoint(float setpoint);
+ void addRPMSetPoint(float setpoint) override;
void clearRPMSetPoints(void);
- float getFailSafePercent(void) const;
+ float getFailSafePercent(void) const override;
float getMinThermalRpmSetPt(void) const;
- const std::unique_ptr<Sensor>& getSensor(std::string name);
+ Sensor* getSensor(std::string name) override;
void determineMaxRPMRequest(void);
void updateFanTelemetry(void);
void updateSensors(void);
@@ -75,7 +88,7 @@
void addFanPID(std::unique_ptr<PIDController> pid);
void addThermalPID(std::unique_ptr<PIDController> pid);
- double getCachedValue(const std::string& name);
+ double getCachedValue(const std::string& name) override;
void addFanInput(std::string fan);
void addThermalInput(std::string therm);