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>)
|
+ 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
|
||||||
|
|||||||
Reference in New Issue
Block a user