94 lines
2.0 KiB
C++
94 lines
2.0 KiB
C++
#include <boost/log/attributes/named_scope.hpp>
|
|
#include <iostream>
|
|
|
|
#include <boost/log/trivial.hpp>
|
|
|
|
#include <fan/FanCurve.h>
|
|
|
|
using namespace std;
|
|
|
|
FanCurve::FanCurve(std::vector<FanStep> steps,
|
|
std::vector<std::shared_ptr<Sensor>> sensors,
|
|
std::vector<std::shared_ptr<Fan>> fans)
|
|
: mSteps(steps), mTempSensors(sensors), mFans(fans) {
|
|
PrintInfo();
|
|
}
|
|
|
|
void FanCurve::DoFanControl() {
|
|
BOOST_LOG_FUNCTION();
|
|
|
|
int temp = AggregateTemperature();
|
|
|
|
int t0, t1, p0, p1;
|
|
int targetFanPower;
|
|
|
|
if (temp <= mSteps[0].Temp) {
|
|
targetFanPower = mSteps[0].Percent;
|
|
} else if (temp > mSteps[mSteps.size() - 1].Temp) {
|
|
targetFanPower = 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;
|
|
}
|
|
}
|
|
|
|
targetFanPower = p0 + ((p1 - p0) / (t1 - t0)) * (temp - t0);
|
|
}
|
|
|
|
for (auto f : mFans) {
|
|
if (f->RPM() <= 0) {
|
|
BOOST_LOG_TRIVIAL(warning) << "Fan stopped completely!";
|
|
f->PWM(f->StartPWM());
|
|
f->AdjustPWMLimits();
|
|
} else {
|
|
f->PWM(targetFanPower);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Dummy Implementation using AVG
|
|
int FanCurve::AggregateTemperature() {
|
|
int sum = 0;
|
|
for (auto s : mTempSensors) {
|
|
sum += s->value();
|
|
}
|
|
|
|
return sum / mTempSensors.size();
|
|
}
|
|
|
|
void FanCurve::PrintInfo() {
|
|
BOOST_LOG_FUNCTION()
|
|
|
|
BOOST_LOG_TRIVIAL(info) << "### Fan curve:";
|
|
|
|
stringstream sStream;
|
|
sStream << "Steps: ";
|
|
for (auto s : mSteps) {
|
|
sStream << "[ " << s.Temp << "C, " << s.Percent << "% ] ";
|
|
}
|
|
BOOST_LOG_TRIVIAL(info) << sStream.str();
|
|
|
|
sStream.str(string());
|
|
|
|
sStream << "Sensors: ";
|
|
for (auto s : mTempSensors) {
|
|
sStream << s->toString() << ", ";
|
|
}
|
|
|
|
BOOST_LOG_TRIVIAL(info) << sStream.str();
|
|
|
|
sStream.str(string());
|
|
|
|
sStream << "Fans: ";
|
|
for (auto s : mFans) {
|
|
sStream << s->toString() << ", ";
|
|
}
|
|
|
|
BOOST_LOG_TRIVIAL(info) << sStream.str();
|
|
}
|