From 05b35a9cea5836f17ad6e4575490508a9acf5469 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 27 Sep 2022 23:43:20 +0200 Subject: [PATCH] Add basic FanCurve implementation, docs --- app/include/fan/FanCurve.h | 27 +++++++++++++++++++++++ app/src/fan/FanCurve.cxx | 45 ++++++++++++++++++++++++++++++++++++++ doc/Class.plantuml | 29 +++++++++++------------- 3 files changed, 85 insertions(+), 16 deletions(-) create mode 100644 app/include/fan/FanCurve.h create mode 100644 app/src/fan/FanCurve.cxx diff --git a/app/include/fan/FanCurve.h b/app/include/fan/FanCurve.h new file mode 100644 index 0000000..142c83d --- /dev/null +++ b/app/include/fan/FanCurve.h @@ -0,0 +1,27 @@ +#ifndef FANCURVE_H_ +#define FANCURVE_H_ + +#include +#include + +#include +#include + +struct FanStep { + int Temp; + int Percent; +}; + +class FanCurve { +public: + void DoFanControl(); + +private: + int AggregateTemperature(); + + std::vector mSteps; + std::vector> mTempSensors; + std::vector> mFans; +}; + +#endif // FANCURVE_H_ diff --git a/app/src/fan/FanCurve.cxx b/app/src/fan/FanCurve.cxx new file mode 100644 index 0000000..f4e94e7 --- /dev/null +++ b/app/src/fan/FanCurve.cxx @@ -0,0 +1,45 @@ +#include + +#include + +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(); +} diff --git a/doc/Class.plantuml b/doc/Class.plantuml index 2bb63ce..ab80c6b 100644 --- a/doc/Class.plantuml +++ b/doc/Class.plantuml @@ -56,36 +56,33 @@ class FanGenerator + FanList FindFans(List, List) } -struct Coordinate +struct FanStep { - int X - int Y -} - -enum SensorAggregateFunction -{ - MIN - MAX - AVG + int Temp + int Percent } class FanCurve { - - List Steps + - List Steps - List TempSensor - - SensorAggregateFunction Fun - - HWMONFan Fan + - List Fan - + int TargetPWMPercent() + + DoFanControl() } class FanController { - - List + - List + 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