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>)
}
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