Add basic FanCurve implementation, docs

This commit is contained in:
2022-09-27 23:43:20 +02:00
parent 0e75299c20
commit 05b35a9cea
3 changed files with 85 additions and 16 deletions

View 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
View 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();
}

View File

@@ -56,36 +56,33 @@ class FanGenerator
+ FanList FindFans(List<RPMSensor>, List<PWMControl>) + FanList FindFans(List<RPMSensor>, List<PWMControl>)
} }
struct Coordinate struct FanStep
{ {
int X int Temp
int Y int Percent
}
enum SensorAggregateFunction
{
MIN
MAX
AVG
} }
class FanCurve class FanCurve
{ {
- List<Coordinate> Steps - List<FanStep> Steps
- List<Sensor> TempSensor - List<Sensor> TempSensor
- SensorAggregateFunction Fun - List<HWMONFan> Fan
- HWMONFan Fan
+ int TargetPWMPercent() + DoFanControl()
} }
class FanController class FanController
{ {
- List<HWMONFan> - List<FanCurve>
+ void StartFanControlLoop() + void StartFanControlLoop()
} }
class ConfigManager
{
}
HWMONFan -- Sensor HWMONFan -- Sensor
HWMONFan -- PWMControl HWMONFan -- PWMControl
HWMONFan - FanCurve HWMONFan - FanCurve
@@ -107,7 +104,7 @@ FanGenerator - SensorManager
FanGenerator - PWMControl FanGenerator - PWMControl
Sensor - FanCurve Sensor - FanCurve
FanCurve -- Coordinate FanCurve -- FanStep
FanCurve -- SensorAggregateFunction FanCurve -- SensorAggregateFunction
FanController -- FanCurve FanController -- FanCurve