Files
CpuPowerRegulator/CpuPowerRegulator.cpp
2024-02-05 23:22:57 +08:00

207 lines
7.1 KiB
C++

#include "CpuPowerRegulator.h"
#include <windows.h>
#include <iostream>
#include <format>
#include <fstream>
#include <filesystem>
#include <QCloseEvent>
#include <QMenu>
#include <QAction>
#include "json.hpp"
#include "AwSystem.h"
CpuPowerRegulator::CpuPowerRegulator(QWidget *parent) :
QDialog(parent),
cpuLoading()
{
ui.setupUi(this);
this->loadPreference();
this->pollingTimer.start(1000);
this->checkBox_autoAdjustPowerIndex_stateChanged(this->ui.checkBox_autoAdjustPowerIndex->checkState());
connect(&this->pollingTimer, SIGNAL(timeout()), this, SLOT(cpuPolling()));
connect(this->ui.checkBox_autoAdjustPowerIndex, SIGNAL(stateChanged(int)), this, SLOT(checkBox_autoAdjustPowerIndex_stateChanged(int)));
connect(this->ui.horizontalSlider_manualPowerIndex, SIGNAL(valueChanged(int)), this, SLOT(horizontalSlider_manualPowerIndex_valueChanged(int)));
connect(this->ui.pushButton_information, SIGNAL(clicked()), this, SLOT(showInfoDialog()));
}
CpuPowerRegulator::~CpuPowerRegulator()
{
this->pollingTimer.stop();
this->savePerference();
}
void CpuPowerRegulator::cpuPolling() {
auto powerIndex = AwSystem::getCpuPowerIndex();
auto cpuLoadingValue = cpuLoading.getValue();
auto cpuFrequency = AwSystem::getCpuFrequency();
this->ui.lcdNumber_currentPowerIndex->display(int(powerIndex));
this->ui.lcdNumber_currentCpuFrequency->display(int(cpuFrequency));
this->ui.lcdNumber_currentCpuLoading->display(int(cpuLoadingValue));
auto cpuLoadingThreshold = this->ui.spinBox_cpuLoadingThreshold->value();
auto cpuLoadingUpStep = this->ui.spinBox_cpuLoadingUpStep->value();
auto cpuLoadingDownStep = this->ui.spinBox_cpuLoadingDownStep->value();
auto powerIndexMin = ui.spinBox_cpuPowerIndexMin->value();
auto powerIndexMax = ui.spinBox_cpuPowerIndexMax->value();
if (cpuLoadingValue > cpuLoadingThreshold) {
powerIndex = min(powerIndex + cpuLoadingUpStep, 100);
} else {
powerIndex = max(powerIndex - cpuLoadingDownStep, 1);
}
if (powerIndex > powerIndexMax) {
powerIndex = powerIndexMax;
}
if (powerIndex < powerIndexMin) {
powerIndex = powerIndexMin;
}
if (this->ui.checkBox_autoAdjustPowerIndex->checkState() == Qt::Checked) {
AwSystem::setCpuPowerIndex(powerIndex);
this->ui.horizontalSlider_manualPowerIndex->setSliderPosition(powerIndex);
}
}
void CpuPowerRegulator::checkBox_autoAdjustPowerIndex_stateChanged(int state) {
switch (state) {
case Qt::Checked:
this->ui.horizontalSlider_manualPowerIndex->setEnabled(false);
this->ui.label_manualPowerIndexValue->setEnabled(false);
this->ui.spinBox_cpuLoadingThreshold->setEnabled(true);
this->ui.spinBox_cpuLoadingUpStep->setEnabled(true);
this->ui.spinBox_cpuLoadingDownStep->setEnabled(true);
this->ui.spinBox_cpuPowerIndexMin->setEnabled(true);
this->ui.spinBox_cpuPowerIndexMax->setEnabled(true);
break;
case Qt::Unchecked:
this->ui.horizontalSlider_manualPowerIndex->setEnabled(true);
this->ui.label_manualPowerIndexValue->setEnabled(true);
this->ui.spinBox_cpuLoadingThreshold->setEnabled(false);
this->ui.spinBox_cpuLoadingUpStep->setEnabled(false);
this->ui.spinBox_cpuLoadingDownStep->setEnabled(false);
this->ui.spinBox_cpuPowerIndexMin->setEnabled(false);
this->ui.spinBox_cpuPowerIndexMax->setEnabled(false);
break;
}
}
void CpuPowerRegulator::horizontalSlider_manualPowerIndex_valueChanged(int value) {
if (value < 1 || value > 100) {
return;
}
this->ui.lcdNumber_currentPowerIndex->display(value);
AwSystem::setCpuPowerIndex(value);
}
void CpuPowerRegulator::showDialog() {
this->hideTrayIcon();
this->show();
}
void CpuPowerRegulator::exitApp() {
this->exitAppFlag = true;
this->close();
}
void CpuPowerRegulator::showInfoDialog() {
if (infoDlg == nullptr) {
infoDlg = new infoDialog(this);
}
if (infoDlg) {
infoDlg->show();
}
}
void CpuPowerRegulator::closeEvent(QCloseEvent* event) {
if (this->exitAppFlag) {
event->accept();
return;
}
this->showTrayIcon();
this->hide();
event->ignore();
}
void CpuPowerRegulator::loadPreference() {
nlohmann::json data;
if (!std::filesystem::exists("pref.json")) {
data = nlohmann::json::object();
} else {
std::ifstream f("pref.json");
data = nlohmann::json::parse(f);
}
bool autoAdjust = data.contains("autoAdjust") ? data["autoAdjust"].get<bool>() : true;
Qt::CheckState checkState = autoAdjust ? Qt::Checked : Qt::Unchecked;
this->ui.checkBox_autoAdjustPowerIndex->setCheckState(checkState);
this->checkBox_autoAdjustPowerIndex_stateChanged(checkState);
int cpuLoadingThreshold = data.contains("cpuLoadingThreshold") ? data["cpuLoadingThreshold"].get<int>() : 10;
this->ui.spinBox_cpuLoadingThreshold->setValue(cpuLoadingThreshold);
int cpuLoadingUpStep = data.contains("cpuLoadingUpStep") ? data["cpuLoadingUpStep"].get<int>() : 10;
this->ui.spinBox_cpuLoadingUpStep->setValue(cpuLoadingUpStep);
int cpuLoadingDownStep = data.contains("cpuLoadingDownStep") ? data["cpuLoadingDownStep"].get<int>() : 20;
this->ui.spinBox_cpuLoadingDownStep->setValue(cpuLoadingDownStep);
int cpuPowerIndexMin = data.contains("cpuPowerIndexMin") ? data["cpuPowerIndexMin"].get<int>() : 50;
this->ui.spinBox_cpuPowerIndexMin->setValue(cpuPowerIndexMin);
int cpuPowerIndexMax = data.contains("cpuPowerIndexMax") ? data["cpuPowerIndexMax"].get<int>() : 100;
this->ui.spinBox_cpuPowerIndexMax->setValue(cpuPowerIndexMax);
}
void CpuPowerRegulator::savePerference() {
nlohmann::json j;
j["autoAdjust"] = this->ui.checkBox_autoAdjustPowerIndex->checkState() == Qt::Checked ? true : false;
j["cpuLoadingThreshold"] = this->ui.spinBox_cpuLoadingThreshold->value();
j["cpuLoadingUpStep"] = this->ui.spinBox_cpuLoadingUpStep->value();
j["cpuLoadingDownStep"] = this->ui.spinBox_cpuLoadingDownStep->value();
j["cpuPowerIndexMin"] = this->ui.spinBox_cpuPowerIndexMin->value();
j["cpuPowerIndexMax"] = this->ui.spinBox_cpuPowerIndexMax->value();
std::ofstream out("pref.json");
out << j.dump();;
out.close();
}
void CpuPowerRegulator::showTrayIcon() {
if (trayIcon == nullptr) {
trayIcon = new QSystemTrayIcon(QIcon(":/CpuPowerRegulator/icon/frequency-64x64.png"), this);
}
if (trayIconMenu == nullptr) {
trayIconMenu = new QMenu("PowerRegulator", this);
}
if (actionShowDialog == nullptr) {
actionShowDialog = new QAction("Show Dialog", this);
connect(actionShowDialog, SIGNAL(triggered()), this, SLOT(showDialog()));
}
if (actionExit == nullptr) {
actionExit = new QAction("Exit", this);
connect(actionExit, SIGNAL(triggered()), this, SLOT(exitApp()));
}
trayIconMenu->addAction(actionShowDialog);
trayIconMenu->addAction(actionExit);
trayIcon->setContextMenu(trayIconMenu);
trayIcon->show();
}
void CpuPowerRegulator::hideTrayIcon() {
if (trayIcon == nullptr) {
return;
}
trayIcon->hide();
}