X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fmainwindow.cpp;h=cf212370768673f815bde224a79e29851d955a8d;hb=33c5e252b2b68c87e27379050fc7fd5401b021c2;hp=318f471eeb858733f28373555c6ff2af947c791a;hpb=eb1a5ae41a6b840d332ad78bbc8b715e353f0c11;p=qcpufreq diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 318f471..cf21237 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -28,7 +28,7 @@ #endif #define APPNAME "QCPUFreq" -#define APPVERSION "0.3.99" +#define APPVERSION "0.4.2" MainWindow::MainWindow(QWidget *parent) : @@ -54,11 +54,24 @@ MainWindow::MainWindow(QWidget *parent) : settings = new Settings; settings->hide(); - init(); - refresh(); + //load preset dialog + loadPresetDialog = new LoadPreset; + loadPresetDialog->hide(); - // setup auto rotation - setAutoRotation(); + //enable save and load option on power kernels + if (settings->usePowerKernel() && settings->isKernelConfigInstalled()) { + ui->actionSave->setEnabled(true); + //loading presets may cause overclocking - only enable it if overclokcing is enabled + if (settings->useOverclocking()) { + ui->actionLoad->setEnabled(true); + } + } + + //display the correct minimum frequency + calculateMinFreq(); + + //applies the settings from the settings dialog + applySettings(); //initialize orientation orientationChanged(); @@ -78,17 +91,22 @@ MainWindow::MainWindow(QWidget *parent) : //connect signals and slots connect(ui->actionHelp, SIGNAL(triggered()), this, SLOT(showHelp())); connect( ui->actionAbout, SIGNAL(triggered()), this, SLOT(about()) ); - connect( ui->freq_adjust, SIGNAL(valueChanged(int)), this, SLOT(adjustFreq()) ); + connect( ui->freq_adjust, SIGNAL(sliderReleased()), this, SLOT(adjustFreq()) ); + connect(ui->freq_adjust, SIGNAL(valueChanged(int)), this, SLOT(showTemporaryMaxFreq())); connect(QApplication::desktop(), SIGNAL(resized(int)), this, SLOT(orientationChanged())); connect(ui->sr_box, SIGNAL(clicked()), this, SLOT(setSmartReflex())); connect(&refreshTimer, SIGNAL(timeout()), this, SLOT(refresh())); + connect(ui->actionSave, SIGNAL(triggered()), this, SLOT(save())); + connect(ui->actionLoad, SIGNAL(triggered()), loadPresetDialog, SLOT(show())); connect(ui->actionSettings, SIGNAL(triggered()), this, SLOT(showSettings())); - connect(settings, SIGNAL(settingsChanged()), this, SLOT(setAutoRotation())); + connect(settings, SIGNAL(settingsChanged()), this, SLOT(applySettings())); + connect(loadPresetDialog, SIGNAL(load(QString)), this, SLOT(loadPreset(QString))); } MainWindow::~MainWindow() { + delete loadPresetDialog; delete settings; delete ui; } @@ -133,13 +151,97 @@ void MainWindow::adjustFreq() } #endif + //check for 599MHz <-> 600MHz problem on power kernels + if (max == "600000" && settings->usePowerKernel()) { + //we really need to set the maximum to 599MHz + max = "599000"; + } + + if (settings->useConfirmation()) { + QMessageBox box; + box.setAttribute(Qt::WA_Maemo5AutoOrientation, settings->useAutoRotate()); + box.setStandardButtons(QMessageBox::Apply | QMessageBox::Cancel); + box.setDefaultButton(QMessageBox::Apply); + box.setIcon(QMessageBox::Question); + QString verboseMax; + verboseMax.setNum( newmax/1000 ); + box.setText( tr("Do you really want to use %1 MHz as the new maximum frequency?").arg(verboseMax) ); + int ret = box.exec(); + + if (ret != QMessageBox::Apply) { + refresh(); + return; + } + } + callHelper( "set_maxfreq", max ); + refresh(); + +} + +/** + * SLOT: applies the settings from the Settings dialog. + */ +void MainWindow::applySettings() +{ + setAutoRotation(); + setAdvancedTemperature(); + + //if overclocking is/was enabled we can also enable the "Load preset" option + if (settings->useOverclocking() && settings->usePowerKernel() && settings->isKernelConfigInstalled()) { + ui->actionLoad->setEnabled(true); + } else { + ui->actionLoad->setEnabled(false); + } + + //refresh the GUI after applying the settings refresh(); } /** + * Calculates the minimum frequency according to scaling_min_freq and avoid_frequencies. + * + * Since this is a somewhat complex calculation it sould only be performed when it is + * really necessary (on startup, after loading presets, etc.). + */ +void MainWindow::calculateMinFreq() +{ + this->minFreq = 0; + QString freqs = readSysFile( "devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies" ); + QStringList freqList = freqs.split( " " ); + //change the order of the QStringList - last element becomes first + for (int i=freqList.size() - 1; i>=0; --i) { + if (freqList.at(i) != "") + this->scalingFrequencies << freqList.at(i); + } + this->scalingSteps = (this->scalingFrequencies.size()); + + //set minFreq and check avoid_frequencies + QString min = readSysFile( "devices/system/cpu/cpu0/cpufreq/scaling_min_freq" ); + //check if avoid file exists (only on power kernel) + QFile file( "/sys/devices/system/cpu/cpu0/cpufreq/ondemand/avoid_frequencies" ); + if (file.exists()) { + QString avoid = readSysFile( "devices/system/cpu/cpu0/cpufreq/ondemand/avoid_frequencies" ); + QStringList avoidList = avoid.split( " " ); + + //check if min is in avoid_frequencies + for (int i = getScalingStep( min.toInt() ); i <= this->scalingSteps; ++i) { + min.setNum( getScalingFreq(i) ); + if (!avoidList.contains(min)) { + this->minFreq = min.toInt(); + break; + } + } + } else { + this->minFreq = min.toInt(); + } + file.close(); +} + + +/** * Calls the QCPUFreq helper script with "sudo action param" * * @param action : the action of the helper script @@ -162,7 +264,7 @@ int MainWindow::callHelper(QString action, QString param) helperProcess.start( "sudo", arguments, QIODevice::NotOpen ); - if ( showSudoError && !helperProcess.waitForFinished( 400 )) { + if ( showSudoError && !helperProcess.waitForFinished( 2000 )) { //do not show this error again showSudoError = false; QMessageBox::critical(this, tr("QCPUFreq"), tr("There seems to be a problem with your sudo setup!")); @@ -301,42 +403,22 @@ int MainWindow::getSmartReflexState() /** - * Initializes internal variables, such as: - * - scalingSteps - * - scalingFrequencies - * - minFreq + * Loads a voltage preset by calling kernel-config. + * + * Available presets are: + * - default + * - ideal + * - lv + * - ulv + * - xlv + * - custom -> any preset named "custom" */ -void MainWindow::init() +void MainWindow::loadPreset(QString presetName) { - this->minFreq = 0; - QString freqs = readSysFile( "devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies" ); - QStringList freqList = freqs.split( " " ); - //change the order of the QStringList - last element becomes first - for (int i=freqList.size() - 1; i>=0; --i) { - if (freqList.at(i) != "") - this->scalingFrequencies << freqList.at(i); - } - this->scalingSteps = (this->scalingFrequencies.size()); - - //set minFreq and check avoid_frequencies - QString min = readSysFile( "devices/system/cpu/cpu0/cpufreq/scaling_min_freq" ); - //check if avoid file exists (only on power kernel) - QFile file( "/sys/devices/system/cpu/cpu0/cpufreq/ondemand/avoid_frequencies" ); - if (file.exists()) { - QString avoid = readSysFile( "devices/system/cpu/cpu0/cpufreq/ondemand/avoid_frequencies" ); - QStringList avoidList = avoid.split( " " ); - - //check if min is in avoid_frequencies - for (int i = getScalingStep( min.toInt() ); i <= this->scalingSteps; ++i) { - min.setNum( getScalingFreq(i) ); - if (!avoidList.contains(min)) { - this->minFreq = min.toInt(); - break; - } - } - } else { - this->minFreq = min.toInt(); - } + #if defined(Q_WS_MAEMO_5) + callHelper("loadpreset", presetName); + QMaemo5InformationBox::information(this, tr( "The preset was loaded." ), QMaemo5InformationBox::DefaultTimeout); + #endif } @@ -435,12 +517,39 @@ void MainWindow::orientationChanged() /** + * Saves the current maximim frequency as default (only on power kernel). + */ +void MainWindow::save() +{ + if (settings->usePowerKernel()) { + callHelper( "save", "null" ); + #if defined(Q_WS_MAEMO_5) + QMaemo5InformationBox::information(this, tr( "The current frequency settings have been saved as default." ), QMaemo5InformationBox::DefaultTimeout); + #endif + } +} + + +/** + * Checks the settings if the "bq27x00_battery" needs to be loaded. + */ +void MainWindow::setAdvancedTemperature() +{ + if (settings->usePowerKernel() && settings->useAdvancedTemperature()) { + callHelper( "load_bq27", "null" ); + } +} + + +/** * Enables or disables the auto-rotation feature of Maemo5 devices. */ void MainWindow::setAutoRotation() { #if defined(Q_WS_MAEMO_5) setAttribute(Qt::WA_Maemo5AutoOrientation, settings->useAutoRotate()); + loadPresetDialog->setAttribute(Qt::WA_Maemo5AutoOrientation, settings->useAutoRotate()); + settings->setAttribute(Qt::WA_Maemo5AutoOrientation, settings->useAutoRotate()); #endif } @@ -485,6 +594,22 @@ void MainWindow::showSettings() /** + * SLOT: This temporarily updates the maximum frequency while using the + * maxFreq slider. + */ +void MainWindow::showTemporaryMaxFreq() +{ + //calulate frequency from slider position + int newmax = getScalingFreq( ui->freq_adjust->sliderPosition() ) / 1000; + //convert it to a string and display it in the UI + QString display; + display.setNum( newmax ); + display.append( " MHz" ); + ui->freq_max->setText( display ); +} + + +/** * Returns true when the device is in portrait mode */ bool MainWindow::usePortrait()