Add basic FanCurve implementation, docs
This commit is contained in:
27
app/include/fan/FanCurve.h
Normal file
27
app/include/fan/FanCurve.h
Normal file
@@ -0,0 +1,27 @@
|
||||
#ifndef FANCURVE_H_
|
||||
#define FANCURVE_H_
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include <fan/HwmonFan.h>
|
||||
#include <sensor/Sensor.h>
|
||||
|
||||
struct FanStep {
|
||||
int Temp;
|
||||
int Percent;
|
||||
};
|
||||
|
||||
class FanCurve {
|
||||
public:
|
||||
void DoFanControl();
|
||||
|
||||
private:
|
||||
int AggregateTemperature();
|
||||
|
||||
std::vector<FanStep> mSteps;
|
||||
std::vector<std::shared_ptr<Sensor>> mTempSensors;
|
||||
std::vector<std::shared_ptr<HwmonFan>> mFans;
|
||||
};
|
||||
|
||||
#endif // FANCURVE_H_
|
||||
45
app/src/fan/FanCurve.cxx
Normal file
45
app/src/fan/FanCurve.cxx
Normal file
@@ -0,0 +1,45 @@
|
||||
#include <fan/FanCurve.h>
|
||||
|
||||
#include <array>
|
||||
|
||||
using namespace std;
|
||||
|
||||
void FanCurve::DoFanControl() {
|
||||
int temp = AggregateTemperature();
|
||||
|
||||
int t0, t1, p0, p1;
|
||||
|
||||
if (temp <= mSteps[0].Temp) {
|
||||
t0 = t1 = mSteps[0].Temp;
|
||||
p0 = p1 = mSteps[0].Percent;
|
||||
} else if (temp > mSteps[mSteps.size() - 1].Temp) {
|
||||
t0 = t1 = mSteps[mSteps.size() - 1].Temp;
|
||||
p0 = p1 = mSteps[mSteps.size() - 1].Percent;
|
||||
} else {
|
||||
for (int i = 0; i < mSteps.size(); i++) {
|
||||
if (temp > mSteps[i].Temp) {
|
||||
t0 = mSteps[i].Temp;
|
||||
p0 = mSteps[i].Percent;
|
||||
|
||||
t1 = mSteps[i + 1].Temp;
|
||||
p1 = mSteps[i + 1].Percent;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int targetFanSpeed = p0 + ((p1 - p0) / (t1 - t0)) * (temp - t0);
|
||||
|
||||
for (auto f : mFans) {
|
||||
f->pwm(targetFanSpeed);
|
||||
}
|
||||
}
|
||||
|
||||
// Dummy Implementation using AVG
|
||||
int FanCurve::AggregateTemperature() {
|
||||
int sum;
|
||||
for (auto s : mTempSensors) {
|
||||
sum += s->value();
|
||||
}
|
||||
|
||||
return sum / mTempSensors.size();
|
||||
}
|
||||
@@ -56,36 +56,33 @@ class FanGenerator
|
||||
+ FanList FindFans(List<RPMSensor>, List<PWMControl>)
|
||||
}
|
||||
|
||||
struct Coordinate
|
||||
struct FanStep
|
||||
{
|
||||
int X
|
||||
int Y
|
||||
}
|
||||
|
||||
enum SensorAggregateFunction
|
||||
{
|
||||
MIN
|
||||
MAX
|
||||
AVG
|
||||
int Temp
|
||||
int Percent
|
||||
}
|
||||
|
||||
class FanCurve
|
||||
{
|
||||
- List<Coordinate> Steps
|
||||
- List<FanStep> Steps
|
||||
- List<Sensor> TempSensor
|
||||
- SensorAggregateFunction Fun
|
||||
- HWMONFan Fan
|
||||
- List<HWMONFan> Fan
|
||||
|
||||
+ int TargetPWMPercent()
|
||||
+ DoFanControl()
|
||||
}
|
||||
|
||||
class FanController
|
||||
{
|
||||
- List<HWMONFan>
|
||||
- List<FanCurve>
|
||||
|
||||
+ void StartFanControlLoop()
|
||||
}
|
||||
|
||||
class ConfigManager
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
HWMONFan -- Sensor
|
||||
HWMONFan -- PWMControl
|
||||
HWMONFan - FanCurve
|
||||
@@ -107,7 +104,7 @@ FanGenerator - SensorManager
|
||||
FanGenerator - PWMControl
|
||||
|
||||
Sensor - FanCurve
|
||||
FanCurve -- Coordinate
|
||||
FanCurve -- FanStep
|
||||
FanCurve -- SensorAggregateFunction
|
||||
|
||||
FanController -- FanCurve
|
||||
|
||||
Reference in New Issue
Block a user