#include "CpuPowerRegulator.h" #include #include #include #include #include #include #include #include #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() : 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() : 10; this->ui.spinBox_cpuLoadingThreshold->setValue(cpuLoadingThreshold); int cpuLoadingUpStep = data.contains("cpuLoadingUpStep") ? data["cpuLoadingUpStep"].get() : 10; this->ui.spinBox_cpuLoadingUpStep->setValue(cpuLoadingUpStep); int cpuLoadingDownStep = data.contains("cpuLoadingDownStep") ? data["cpuLoadingDownStep"].get() : 20; this->ui.spinBox_cpuLoadingDownStep->setValue(cpuLoadingDownStep); int cpuPowerIndexMin = data.contains("cpuPowerIndexMin") ? data["cpuPowerIndexMin"].get() : 50; this->ui.spinBox_cpuPowerIndexMin->setValue(cpuPowerIndexMin); int cpuPowerIndexMax = data.contains("cpuPowerIndexMax") ? data["cpuPowerIndexMax"].get() : 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(); }