8 Commits

Author SHA1 Message Date
596a30b76a Improve logic to handle fans stopping 2022-10-10 00:25:09 +02:00
0f91960ef9 Adapt version 2022-10-06 10:47:55 +02:00
d9192f10be Add SIGTERM handling, adjust limit finding step 2022-10-06 10:39:43 +02:00
f606a1e450 Update version 2022-10-04 09:55:23 +02:00
2d744245fc Fix segmentation fault on shutdown 2022-10-04 09:53:57 +02:00
bd1695b4a7 Update version 2022-10-04 09:42:40 +02:00
987e65fd90 Add stuff to .gitignore 2022-10-04 09:42:14 +02:00
e567ede3ef Add logic to adjust minPWM on fan stop 2022-10-04 09:41:04 +02:00
10 changed files with 61 additions and 22 deletions

5
.gitignore vendored
View File

@@ -1,3 +1,8 @@
oot/
compile_commands.json
.cache/
pkg/
rel_oot/
src/
*.pkg.tar.zst
*.tar.gz

View File

@@ -1,5 +1,5 @@
pkgname=fantasize
pkgver=0.1.2
pkgver=0.1.6
pkgrel=1
pkgdesc='C++ fan control for Linux'
url='https://github.com/Tabascl/fantasize.git'

View File

@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.0)
project(fantasize VERSION 0.1.2)
project(fantasize VERSION 0.1.6)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

View File

@@ -27,6 +27,8 @@ private:
FanGenerator mFanGenerator;
std::unique_ptr<Controller> mController;
std::vector<std::shared_ptr<Fan>> mFans;
};
#endif // APP_H_

View File

@@ -18,6 +18,7 @@ public:
virtual int StartPWM() = 0;
virtual void FindPWMLimits() = 0;
virtual void AdjustPWMLimits() = 0;
};
#endif // FAN_H_

View File

@@ -1,9 +1,11 @@
#ifndef HWMONFAN_H_
#define HWMONFAN_H_
#include <boost/json/object.hpp>
#include <chrono>
#include <memory>
#include <boost/json/object.hpp>
#include <fan/Fan.h>
#include <pwm/PWMControl.h>
#include <sensor/Sensor.h>
@@ -25,6 +27,7 @@ public:
int StartPWM() override;
void FindPWMLimits() override;
void AdjustPWMLimits() override;
json toJson() const override;
@@ -37,6 +40,7 @@ private:
int mMinPWM;
int mStartPWM;
std::chrono::time_point<std::chrono::steady_clock> mLastAdjustmentTime;
};
#endif // HWMONFAN_H_

View File

@@ -5,10 +5,10 @@
using namespace std;
void App::Init() {
auto fans = mSerializer.DeserializeFans(mSensorManager.RPMSensors());
mFans = mSerializer.DeserializeFans(mSensorManager.RPMSensors());
auto fanCurves = mSerializer.DeserializeFanCurves(
mSensorManager.TemperatureSensors(), fans);
mSensorManager.TemperatureSensors(), mFans);
mController = make_unique<Controller>(fanCurves);
}
@@ -23,6 +23,8 @@ void App::InitialSetup() {
mFanLabeler.RunFanLabelInteraction(fans);
mSerializer.SerializeFans(fans);
mFans = fans;
}
void App::NormalOperation() {
@@ -30,4 +32,8 @@ void App::NormalOperation() {
mController->StartFanControlLoop();
}
void App::Shutdown() { mController.reset(); }
void App::Shutdown() {
mSerializer.SerializeFans(mFans);
mFans.clear();
mController.reset();
}

View File

@@ -16,6 +16,7 @@ FanCurve::FanCurve(std::vector<FanStep> steps,
void FanCurve::DoFanControl() {
BOOST_LOG_FUNCTION();
int temp = AggregateTemperature();
int t0, t1, p0, p1;
@@ -43,8 +44,10 @@ void FanCurve::DoFanControl() {
if (f->RPM() <= 0) {
BOOST_LOG_TRIVIAL(warning) << "Fan stopped completely!";
f->PWM(f->StartPWM());
f->AdjustPWMLimits();
} else {
f->PWM(targetFanPower);
}
f->PWM(targetFanPower);
}
}

View File

@@ -1,13 +1,15 @@
#include <chrono>
#include <iostream>
#include <ostream>
#include <thread>
#include "pwm/PWMControl.h"
#include <boost/json/object.hpp>
#include <boost/log/attributes/named_scope.hpp>
#include <boost/log/trivial.hpp>
#include <fan/HwmonFan.h>
#include <pwm/PWMControl.h>
#define TIMEOUT 10
#define STEP 2
using namespace std;
@@ -33,24 +35,22 @@ void HwmonFan::MinPWM(int value) { mMinPWM = value; }
int HwmonFan::MinPWM() { return mMinPWM; }
int HwmonFan::StartPWM() { return mStartPWM; }
void HwmonFan::StartPWM(int value) { mStartPWM = value; }
int HwmonFan::StartPWM() { return mStartPWM; }
void HwmonFan::FindPWMLimits() {
cout << "Looking for minimal PWM" << endl;
int minPWM = 0;
mMinPWM = 0;
mStartPWM = 0;
for (int curPWM = 100; curPWM > 0; curPWM -= 5) {
for (int curPWM = 100; curPWM > 0; curPWM -= STEP) {
PWM(curPWM);
this_thread::sleep_for(chrono::seconds(TIMEOUT));
int curRPM = RPM();
if (curRPM <= 0) {
minPWM = curPWM + 5;
if (RPM() <= 0) {
minPWM = curPWM + STEP;
break;
}
}
@@ -64,13 +64,11 @@ void HwmonFan::FindPWMLimits() {
int startPWM = 0;
cout << "Looking for start PWM!" << endl;
for (int curPWM = minPWM - 5; curPWM < 100; curPWM += 5) {
for (int curPWM = minPWM - STEP; curPWM < 100; curPWM += STEP) {
PWM(curPWM);
this_thread::sleep_for(chrono::seconds(TIMEOUT));
int curRPM = RPM();
if (curRPM > 0) {
if (RPM() > 0) {
cout << "Setting start PWM: " << startPWM << endl;
startPWM = curPWM;
break;
@@ -81,6 +79,20 @@ void HwmonFan::FindPWMLimits() {
}
}
void HwmonFan::AdjustPWMLimits() {
BOOST_LOG_FUNCTION()
chrono::time_point now = chrono::steady_clock::now();
if ((now - mLastAdjustmentTime) >
chrono::duration(chrono::seconds(TIMEOUT))) {
BOOST_LOG_TRIVIAL(info) << "Increasing minimal fan speed";
mLastAdjustmentTime = now;
mMinPWM += 2;
}
}
json HwmonFan::toJson() const {
json obj;
obj = {mPWMControl->toJson(),

View File

@@ -1,4 +1,3 @@
#include <boost/log/expressions/formatters/named_scope.hpp>
#include <csignal>
#include <iostream>
@@ -6,6 +5,7 @@
#include <boost/log/attributes/named_scope.hpp>
#include <boost/log/core.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/expressions/formatters/named_scope.hpp>
#include <boost/log/expressions/message.hpp>
#include <boost/log/support/date_time.hpp>
#include <boost/log/trivial.hpp>
@@ -20,6 +20,8 @@
#include <App.h>
#define PROJECT_VERSION "v0.1.6"
namespace po = boost::program_options;
namespace logging = boost::log;
@@ -59,7 +61,11 @@ void InitLogging(bool verbose) {
}
int main(int argc, char **argv) {
BOOST_LOG_FUNCTION()
BOOST_LOG_TRIVIAL(info) << "Version: " << PROJECT_VERSION;
signal(SIGINT, signal_handler);
signal(SIGTERM, signal_handler);
po::options_description desc("Allowed options");
desc.add_options()("help,h", "produce help message")(