added more stuff

This commit is contained in:
jussi 2018-12-24 20:42:36 +02:00
parent df6dd60db4
commit d99d5217dc
3 changed files with 242 additions and 119 deletions

View File

@ -10,9 +10,10 @@ MainWindow::MainWindow(QWidget *parent) :
{
ui->setupUi(this);
checkForProfiles();
loadProfileSettings();
queryGPUSettings();
enableFanControl();
loadProfileSettings();
queryDriverSettings();
getGPUName();
ui->frequencySlider->setRange(defCoreClk + minCoreClkOfsInt, defCoreClk + maxCoreClkOfsInt);
ui->frequencySpinBox->setRange(defCoreClk + minCoreClkOfsInt, defCoreClk + maxCoreClkOfsInt);
@ -29,17 +30,17 @@ MainWindow::MainWindow(QWidget *parent) :
ui->memClkSlider->setValue(defMemClk + memClkOfsInt);
ui->memClkSpinBox->setValue(defMemClk + memClkOfsInt);
ui->voltageSlider->setRange(voltInt + minVoltOfsInt, voltInt + maxVoltOfsInt);
ui->voltageSpinBox->setRange(voltInt + minVoltOfsInt, voltInt + maxVoltOfsInt);
ui->voltageSlider->setValue(voltInt + voltOfsInt);
ui->voltageSpinBox->setValue(voltInt + voltOfsInt);
ui->voltageSlider->setRange(minVoltOfsInt, maxVoltOfsInt);
ui->voltageSpinBox->setRange(minVoltOfsInt, maxVoltOfsInt);
ui->voltageSlider->setValue(voltOfsInt);
ui->voltageSpinBox->setValue(voltOfsInt);
ui->fanSlider->setValue(fanSpeed);
ui->fanSpinBox->setValue(fanSpeed);
ui->fanSlider->setRange(0, 100);
ui->fanSpinBox->setRange(0, 100);
QTimer *fanUpdateTimer = new QTimer(this);
//QTimer *fanUpdateTimer = new QTimer(this);
connect(fanUpdateTimer, SIGNAL(timeout()), this, SLOT(fanSpeedUpdater()));
//connect(fanUpdateTimer, SIGNAL(timeout()), this, SLOT(tempUpdater()));
fanUpdateTimer->start(2000);
@ -68,13 +69,12 @@ void MainWindow::on_actionEdit_current_profile_triggered(bool)
void MainWindow::on_pushButton_clicked()
{
qDebug() << currentProfile;
qDebug() << xCurvePoints;
//queryGPUSettings();
//loadProfileSettings();
// checkForProfiles();
//getGPUDriver();
//checkForRoot();
qDebug() << minMemClkOfsInt << maxMemClkOfsInt;
}
void MainWindow::checkForRoot()
@ -137,15 +137,13 @@ void MainWindow::getGPUDriver()
gpuDriver = "nvidia";
}
}
void MainWindow::enableFanControl()
void MainWindow::getGPUName()
{
QProcess process;
process.start("nvidia-settings -a GPUFanControlState=1");
process.start(queryGPUName);
process.waitForFinished(-1);
}
void MainWindow::getGPUInfo()
{
ui->GPUNameLabel->setText(process.readLine());
}
void MainWindow::fanSpeedUpdater()
@ -175,6 +173,10 @@ void MainWindow::resetTimer()
resettimer->setSingleShot(true);
resettimer->start(10000);
}
void MainWindow::resetStatusLabel()
{
ui->statusLabel->clear();
}
void MainWindow::resetChanges()
{
// If the settings haven't been applied in 10 seconds, reset all values to their latest values
@ -184,8 +186,8 @@ void MainWindow::resetChanges()
ui->powerLimSlider->setValue(latestPowerLim);
ui->powerLimSpinBox->setValue(latestPowerLim);
ui->voltageSlider->setValue(voltInt + latestVoltOfs);
ui->voltageSpinBox->setValue(voltInt + latestVoltOfs);
ui->voltageSlider->setValue(latestVoltOfs);
ui->voltageSpinBox->setValue(latestVoltOfs);
ui->memClkSlider->setValue(curMaxMemClkInt);
ui->memClkSpinBox->setValue(curMaxMemClkInt);
@ -194,6 +196,50 @@ void MainWindow::resetChanges()
ui->memClkSpinBox->setValue(defMemClk + latestMemClkOfs);
qDebug() << "timer";
}
void MainWindow::queryDriverSettings()
{
QProcess process;
process.start(nvFanCtlStateQ);
process.waitForFinished(-1);
if (process.readLine().toInt() == 1) {
manualFanCtl = true;
ui->fanModeComboBox->setCurrentIndex(1);
} else {
manualFanCtl = false;
ui->fanModeComboBox->setCurrentIndex(0);
}
}
void MainWindow::applyFanMode()
{
QProcess process;
switch (ui->fanModeComboBox->currentIndex()) {
case 0:
// Driver controlled mode
process.start(nvFanCtlStateSet + "0");
process.waitForFinished(-1);
ui->fanSlider->setEnabled(false);
ui->fanSpinBox->setEnabled(false);
break;
case 1:
// Static mode
process.start(nvFanCtlStateSet + "1");
process.waitForFinished(-1);
disconnect(fanUpdateTimer, SIGNAL(timeout()), this, SLOT(tempUpdater()));
process.start(nvFanSpeedSet + QString::number(ui->fanSlider->value()));
process.waitForFinished(-1);
ui->fanSlider->setEnabled(true);
ui->fanSpinBox->setEnabled(true);
break;
case 2:
// Custom mode
process.start(nvFanCtlStateSet + "1");
process.waitForFinished(-1);
connect(fanUpdateTimer, SIGNAL(timeout()), this, SLOT(tempUpdater()));
ui->fanSlider->setEnabled(false);
ui->fanSpinBox->setEnabled(false);
break;
}
}
void MainWindow::queryGPUSettings()
{
QProcess process;
@ -217,11 +263,8 @@ void MainWindow::queryGPUSettings()
}
}
QString coreFreqOfs;
process.start(nvCoreClkOfsQ);
process.waitForFinished(-1);
//coreFreqOfs = process.readLine();
//coreFreqOfs.chop(1);
coreFreqOfsInt = process.readLine().toInt();
latestClkOfs = coreFreqOfsInt;
@ -247,11 +290,11 @@ void MainWindow::queryGPUSettings()
process.waitForFinished(-1);
for (int i=0; i<process.size(); i++) {
QString line = process.readLine();
if (line.toInt()/2 > maxCoreClkOfsInt) {
maxCoreClkOfsInt = line.toInt()/2;
if (line.toInt() > maxCoreClkOfsInt) {
maxCoreClkOfsInt = line.toInt();
}
if (line.toInt()/2 <= minCoreClkOfsInt) {
minCoreClkOfsInt = line.toInt()/2;
if (line.toInt() <= minCoreClkOfsInt) {
minCoreClkOfsInt = line.toInt();
}
}
@ -328,14 +371,14 @@ void MainWindow::applyGPUSettings()
latestPowerLim = ui->powerLimSlider->value();
}
if (latestVoltOfs != ui->voltageSlider->value() - defVolt) {
offsetValue = ui->voltageSlider->value() - defVolt;
if (latestVoltOfs != ui->voltageSlider->value()) {
offsetValue = ui->voltageSlider->value();
input = nvVoltageSet;
input.append(QString::number(offsetValue*1000));
qDebug() << input;
process.start(input);
process.waitForFinished(-1);
latestVoltOfs = ui->voltageSlider->value() - defVolt;
latestVoltOfs = ui->voltageSlider->value();
}
resettimer->stop();
}
@ -346,24 +389,48 @@ void MainWindow::loadProfileSettings()
settings.beginGroup(currentProfile);
// Check for existance of the setting so zeroes don't get appended to curve point vectors
if (settings.contains("xpoints")) {
QString xPointStr = settings.value("xpoints").toString();
QString yPointStr = settings.value("ypoints").toString();
xPointStr.prepend("/bin/sh -c \"echo ");
xPointStr.append(grepStringToInt);
QString xPointStr = "/bin/sh -c \"echo " + settings.value("xpoints").toString() + grepStringToInt;
QString yPointStr = "/bin/sh -c \"echo " + settings.value("xpoints").toString() + grepStringToInt;
QProcess process;
process.start(xPointStr);
process.waitForFinished(-1);
for (int i=0; i<process.size() +1; i++) {
xCurvePoints.append(process.readLine().toInt());
}
yPointStr.prepend("/bin/sh -c \"echo ");
yPointStr.append(grepStringToInt);
process.start(yPointStr);
process.waitForFinished(-1);
for (int i=0; i<process.size() +1; i++) {
yCurvePoints.append(process.readLine().toInt());
}
QStandardItemModel *model = qobject_cast<QStandardItemModel*>(ui->fanModeComboBox->model());
QModelIndex customModeIndex = model->index(2, ui->fanModeComboBox->modelColumn());
QStandardItem *customMode = model->itemFromIndex(customModeIndex);
customMode->setEnabled(true);
customMode->setToolTip("Use your own fan curve");
} else {
// Set fan mode "Custom" unselectable if there are no custom curve points
QStandardItemModel *model = qobject_cast<QStandardItemModel*>(ui->fanModeComboBox->model());
QModelIndex customModeIndex = model->index(2, ui->fanModeComboBox->modelColumn());
QStandardItem *customMode = model->itemFromIndex(customModeIndex);
customMode->setEnabled(false);
customMode->setToolTip("To use this mode you must make a fan curve first");
}
if (settings.contains("voltageOffset")) {
latestVoltOfs = settings.value("voltageOffset").toInt();
}
if (settings.contains("powerLimit")) {
latestPowerLim = settings.value("powerLimit").toInt();
}
if (settings.contains("clockFrequencyOffset")) {
latestClkOfs = settings.value("clockFrequencyOffset").toInt();
}
if (settings.contains("memoryClockOffset")) {
latestMemClkOfs=settings.value("memoryClockOffset").toInt();
}
ui->statusLabel->setText("Profile settings loaded.");
statusLabelResetTimer->start(7000);
statusLabelResetTimer->setSingleShot(true);
connect(statusLabelResetTimer, SIGNAL(timeout()), SLOT(resetStatusLabel()));
qDebug() << xCurvePoints << yCurvePoints;
}
@ -388,7 +455,10 @@ void MainWindow::saveProfileSettings()
{
QSettings settings("nvfancurve");
settings.beginGroup(currentProfile);
settings.setValue("voltageOffset", latestVoltOfs);
settings.setValue("powerLimit", latestPowerLim);
settings.setValue("clockFrequencyOffset", latestClkOfs);
settings.setValue("memoryClockOffset", latestMemClkOfs);
}
void MainWindow::generateFanPoint()
@ -416,11 +486,9 @@ void MainWindow::generateFanPoint()
targetFanSpeed = (((yCurvePoints[index + 1] - yCurvePoints[index]) * (temp - xCurvePoints[index])) / (xCurvePoints[index + 1] - xCurvePoints[index])) + yCurvePoints[index];
}
}
qDebug() << targetFanSpeed << index << xCurvePoints << yCurvePoints;
QProcess process;
QString input = nvFanSpeedSet;
input.append(QString::number(targetFanSpeed));
qDebug() << input;
process.start(input);
process.waitForFinished(-1);
}
@ -449,48 +517,53 @@ void MainWindow::on_powerLimSlider_valueChanged(int value)
{
ui->powerLimSpinBox->setValue(value);
}
void MainWindow::on_powerLimSpinBox_valueChanged(int arg1)
{
ui->powerLimSlider->setValue(arg1);
}
void MainWindow::on_memClkSlider_valueChanged(int value)
{
ui->memClkSpinBox->setValue(value);
}
void MainWindow::on_memClkSpinBox_valueChanged(int arg1)
{
ui->memClkSlider->setValue(arg1);
}
void MainWindow::on_voltageSlider_valueChanged(int value)
{
ui->voltageSpinBox->setValue(value);
}
void MainWindow::on_voltageSpinBox_valueChanged(int arg1)
{
ui->voltageSlider->setValue(arg1);
}
void MainWindow::on_fanSlider_valueChanged(int value)
{
ui->fanSpinBox->setValue(value);
}
void MainWindow::on_fanSpinBox_valueChanged(int arg1)
{
ui->fanSlider->setValue(arg1);
}
void MainWindow::on_applyButton_clicked()
{
applyGPUSettings();
saveProfileSettings();
applyFanMode();
}
void MainWindow::on_fanModeComboBox_currentTextChanged(const QString &arg1)
void MainWindow::on_editFanCurveButton_pressed()
{
editProfile *editProf = new editProfile(this);
editProf->setAttribute(Qt::WA_DeleteOnClose);
connect(editProf, SIGNAL(destroyed(QObject*)), SLOT(on_editProfile_closed()));
editProf->setModal(true);
editProf->exec();
}
void MainWindow::on_editProfile_closed()
{
qDebug() << "fancurve dialog closed";
// Clear the existing curve points and load the new ones
xCurvePoints.clear();
yCurvePoints.clear();
loadProfileSettings();
}

View File

@ -6,7 +6,8 @@
#include <QFileInfo>
#include "editprofile.h"
#include <QProcess>
#include <NVCtrl/NVCtrl.h>
//#include "/opt/cuda/include/nvml.h"
//#include <NVCtrl/NVCtrl.h>
namespace Ui {
class MainWindow;
@ -20,7 +21,7 @@ public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
QString currentProfile;
QString nvFanQ = "/bin/sh -c \"nvidia-smi --query-gpu=fan.speed --format=csv | egrep -o '[1-9]{1,4}'\"";
QString nvFanQ = "/bin/sh -c \"nvidia-smi --query-gpu=fan.speed --format=csv | egrep -o '[0-9]{1,4}'\"";
QString nvVoltQ = "nvidia-settings -q GPUCurrentCoreVoltage -t";
QString nvVoltOfsQ = "nvidia-settings -q GPUOverVoltageOffset -t";
QString nvVoltOfsLimQ = "/bin/sh -c \"nvidia-settings -a GPUOverVoltageOffset=99999999 | egrep -o '[0-9]{1,9}'\"";
@ -41,9 +42,14 @@ public:
QString nvFanSpeedSet = "nvidia-settings -a GPUTargetFanSpeed=";
QString nvVoltageSet = "nvidia-settings -a GPUOverVoltageOffset=";
QString nvFanCtlStateSet = "nvidia-settings -a GPUFanControlState=";
QString nvFanCtlStateQ = "nvidia-settings -q GPUFanControlState -t";
QString grepStringToInt = " | egrep -o '[0-9]{0,100}'\"";
QString queryForNvidiaProp = "/bin/sh -c \"lspci -vnn | grep -c 'Kernel driver in use: nvidia'\"";
QString queryGPUName = "/bin/sh -c \"nvidia-smi --query-gpu=gpu_name --format=csv | grep '[0-9]'\"";
QString gpuDriver;
QVector <int> xCurvePoints, yCurvePoints;
@ -79,6 +85,7 @@ public:
int latestVoltOfs;
bool isRoot;
bool manualFanCtl;
public slots:
void saveProfileSettings();
void loadProfileSettings();
@ -90,7 +97,7 @@ private slots:
void on_profileComboBox_activated(const QString &arg1);
void queryGPUSettings();
void getGPUInfo();
void getGPUName();
void on_frequencySlider_valueChanged(int value);
void on_frequencySpinBox_valueChanged(int arg1);
@ -121,16 +128,22 @@ private slots:
void generateFanPoint();
void checkForRoot();
void tempUpdater();
void enableFanControl();
void resetChanges();
void resetTimer();
void on_fanModeComboBox_currentTextChanged(const QString &arg1);
void queryDriverSettings();
void on_editFanCurveButton_pressed();
void on_editProfile_closed();
void applyFanMode();
void resetStatusLabel();
private:
Ui::MainWindow *ui;
bool noProfiles = true;
QVector <int> compXPoints, compYPoints;
QTimer *resettimer = new QTimer(this);
QTimer *fanUpdateTimer = new QTimer(this);
QTimer *statusLabelResetTimer = new QTimer(this);
};
#endif // MAINWINDOW_H

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>440</width>
<height>670</height>
<width>427</width>
<height>623</height>
</rect>
</property>
<property name="windowTitle">
@ -15,6 +15,25 @@
</property>
<widget class="QWidget" name="centralWidget">
<layout class="QGridLayout" name="gridLayout">
<item row="7" column="3">
<widget class="QSpinBox" name="memClkSpinBox"/>
</item>
<item row="9" column="3">
<widget class="QSpinBox" name="powerLimSpinBox"/>
</item>
<item row="5" column="3">
<widget class="QSpinBox" name="voltageSpinBox"/>
</item>
<item row="3" column="3">
<widget class="QSpinBox" name="fanSpinBox"/>
</item>
<item row="12" column="0">
<widget class="QPushButton" name="applyButton">
<property name="text">
<string>Apply changes</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QPushButton" name="pushButton">
<property name="text">
@ -22,60 +41,37 @@
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Fan Speed (%)</string>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QSpinBox" name="fanSpinBox"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="voltgeLabel">
<property name="text">
<string>Voltage (mV)</string>
</property>
</widget>
</item>
<item row="4" column="3">
<widget class="QSpinBox" name="voltageSpinBox"/>
</item>
<item row="5" column="0" colspan="2">
<item row="6" column="0" colspan="2">
<widget class="QLabel" name="memClockLabel">
<property name="text">
<string>Memory Clock (MHz)</string>
</property>
</widget>
</item>
<item row="6" column="3">
<widget class="QSpinBox" name="memClkSpinBox"/>
</item>
<item row="7" column="0" colspan="2">
<widget class="QLabel" name="powerLimLabel">
<property name="text">
<string>Power Limit (W)</string>
<item row="3" column="0" colspan="3">
<widget class="QSlider" name="fanSlider">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="8" column="3">
<widget class="QSpinBox" name="powerLimSpinBox"/>
</item>
<item row="9" column="0" colspan="2">
<widget class="QLabel" name="clockFreqLabel">
<property name="text">
<string>Clock Frequency (MHz)</string>
<item row="11" column="0" colspan="3">
<widget class="QSlider" name="frequencySlider">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="10" column="3">
<widget class="QSpinBox" name="frequencySpinBox"/>
</item>
<item row="0" column="1">
<widget class="QLabel" name="fanModeLabel">
<item row="1" column="0">
<widget class="QLabel" name="GPUNameLabel">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>52</height>
</size>
</property>
<property name="text">
<string>Fan mode:</string>
<string/>
</property>
</widget>
</item>
@ -98,58 +94,99 @@
</item>
</widget>
</item>
<item row="10" column="0" colspan="3">
<widget class="QSlider" name="frequencySlider">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="11" column="0">
<widget class="QPushButton" name="applyButton">
<property name="text">
<string>Apply changes</string>
</property>
</widget>
</item>
<item row="11" column="1">
<item row="12" column="1">
<widget class="QPushButton" name="newProfile">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="11" column="2">
<item row="11" column="3">
<widget class="QSpinBox" name="frequencySpinBox"/>
</item>
<item row="2" column="3">
<widget class="QPushButton" name="editFanCurveButton">
<property name="maximumSize">
<size>
<width>87</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset>
<normaloff>../../../Pictures/cog.png</normaloff>../../../Pictures/cog.png</iconset>
</property>
</widget>
</item>
<item row="12" column="2">
<widget class="QComboBox" name="profileComboBox"/>
</item>
<item row="4" column="0" colspan="3">
<item row="2" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Fan Speed (%)</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="fanModeLabel">
<property name="text">
<string>Fan mode:</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="3">
<widget class="QSlider" name="voltageSlider">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="2" column="0" colspan="3">
<widget class="QSlider" name="fanSlider">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<item row="10" column="0" colspan="2">
<widget class="QLabel" name="clockFreqLabel">
<property name="text">
<string>Clock Frequency (MHz)</string>
</property>
</widget>
</item>
<item row="6" column="0" colspan="3">
<item row="4" column="0">
<widget class="QLabel" name="voltgeLabel">
<property name="text">
<string>Voltage Offset (mV)</string>
</property>
</widget>
</item>
<item row="8" column="0" colspan="2">
<widget class="QLabel" name="powerLimLabel">
<property name="text">
<string>Power Limit (W)</string>
</property>
</widget>
</item>
<item row="7" column="0" colspan="3">
<widget class="QSlider" name="memClkSlider">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="8" column="0" colspan="3">
<item row="9" column="0" colspan="3">
<widget class="QSlider" name="powerLimSlider">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="13" column="0">
<widget class="QLabel" name="statusLabel">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menuBar">
@ -157,7 +194,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>440</width>
<width>427</width>
<height>28</height>
</rect>
</property>