X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fmainwindow.cpp;h=75fa2963c3f60d5e2cdd834c4bbaeb202544733d;hb=282732ae866d9fb109983671a6abe26ae8733780;hp=c9fecb49afdda28612401398632d550e4c1054ed;hpb=480b26db06bb34351d588cd0639e51713beeb47f;p=qcpufreq diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index c9fecb4..75fa296 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1,6 +1,6 @@ /* * QCPUFreq - a simple cpufreq GUI - * Copyright (C) 2010 Daniel Klaffenbach + * Copyright (C) 2010 Daniel Klaffenbach * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,25 +28,20 @@ #endif #define APPNAME "QCPUFreq" -#define APPVERSION "0.3.3" +#define APPVERSION "0.4.1" + MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), - //do not allow overclocking per default - allowOverclocking(false), //create helper process helperProcess( this ), //create a new, stackable help window helpWindow( this ), - //set minFreq to 0 - minFreq(0), //create UI refresh timer refreshTimer( this ), //create a QGraphicsScene for the little chip icon - scene( this ), - //show errors about the sudo setup only once - showSudoError( true ) + scene( this ) { //this is a stacked window on Maemo 5 #if defined(Q_WS_MAEMO_5) @@ -55,10 +50,18 @@ MainWindow::MainWindow(QWidget *parent) : ui->setupUi(this); - refresh(); + //Settings widget + settings = new Settings; + settings->hide(); - // enable auto rotation - setAutoRotation(); + //load preset dialog + loadPresetDialog = new LoadPreset; + loadPresetDialog->hide(); + + init(); + + //applies the settings from the settings dialog + applySettings(); //initialize orientation orientationChanged(); @@ -72,6 +75,9 @@ MainWindow::MainWindow(QWidget *parent) : #endif helpWindow.setWindowFlags( windowFlags() | Qt::Window ); + //show errors about the sudo setup only once + showSudoError = true; + //connect signals and slots connect(ui->actionHelp, SIGNAL(triggered()), this, SLOT(showHelp())); connect( ui->actionAbout, SIGNAL(triggered()), this, SLOT(about()) ); @@ -79,17 +85,18 @@ MainWindow::MainWindow(QWidget *parent) : 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->actionOverclocking, SIGNAL(toggled(bool)), this, SLOT(setOverclocking())); - - //disable overclocking button on vanilla kernels - if ( getScalingFreq(0) <= 600000 ) { - ui->actionOverclocking->setDisabled(true); - } + 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(applySettings())); + connect(loadPresetDialog, SIGNAL(load(QString)), this, SLOT(loadPreset(QString))); } MainWindow::~MainWindow() { + delete loadPresetDialog; + delete settings; delete ui; } @@ -126,13 +133,19 @@ void MainWindow::adjustFreq() //check for overclocking #if defined(Q_WS_MAEMO_5) - if (this->allowOverclocking == false && newmax > 600000) { - QMaemo5InformationBox::information(this, tr( "You need to enable overclocking in QCPUFreq's menu for setting frequencies above 600MHz!"), 0); + if (!settings->useOverclocking() && newmax > 600000) { + QMaemo5InformationBox::information(this, tr( "You need to enable overclocking in QCPUFreq's settings in order to set frequencies above 600MHz!"), 0); refresh(); return; } #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"; + } + callHelper( "set_maxfreq", max ); refresh(); @@ -140,6 +153,19 @@ void MainWindow::adjustFreq() /** + * SLOT: applies the settings from the Settings dialog. + */ +void MainWindow::applySettings() +{ + setAutoRotation(); + setAdvancedTemperature(); + + //refresh the GUI after applying the settings + refresh(); +} + + +/** * Calls the QCPUFreq helper script with "sudo action param" * * @param action : the action of the helper script @@ -162,7 +188,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!")); @@ -221,32 +247,7 @@ int MainWindow::getMaxFreq() */ int MainWindow::getMinFreq() { - if (this->minFreq == 0) { - 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>0; --i) { - if (!avoidList.contains(min.setNum( getScalingFreq(i) ))) { - this->minFreq = min.toInt(); - return this->minFreq; - } - } - - //should not happen at all - this->minFreq = 125000; - return this->minFreq; - } else { - this->minFreq = min.toInt(); - return this->minFreq; - } - } else { - return this->minFreq; - } + return this->minFreq; } @@ -255,16 +256,13 @@ int MainWindow::getMinFreq() */ int MainWindow::getScalingFreq(int step) { - QString tmp = readSysFile( "devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies" ); - QStringList freqs = tmp.split( " " ); step = step - 1; if ( step < 0 ) step = 0; - if ( step > getScalingSteps() ) - step = getScalingSteps(); + if ( step > getScalingSteps() - 1 ) + step = getScalingSteps() - 1; - tmp = freqs[ step ]; - return tmp.toInt(); + return this->scalingFrequencies[ step ].toInt(); } @@ -286,9 +284,7 @@ QString MainWindow::getScalingGovernor() */ int MainWindow::getScalingSteps() { - QString tmp = readSysFile( "devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies" ); - QStringList freqs = tmp.split( " " ); - return (freqs.size() - 1); + return this->scalingSteps; } @@ -299,12 +295,9 @@ int MainWindow::getScalingSteps() */ int MainWindow::getScalingStep( int freq ) { - for( int i = 1; i <= getScalingSteps(); ++i ) { - if ( getScalingFreq(i) == freq ) - return i; - } - - return 1; + QString tmp; + tmp.setNum(freq); + return this->scalingFrequencies.indexOf(tmp) + 1; } @@ -334,6 +327,77 @@ int MainWindow::getSmartReflexState() /** + * Initializes internal variables, such as: + * - scalingSteps + * - scalingFrequencies + * - minFreq + */ +void MainWindow::init() +{ + 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(); + } + + //enable save and load option on power kernels + if (settings->usePowerKernel()) { + //only enable save if /usr/sbin/kernel-config is present + file.close(); + file.setFileName("/usr/sbin/kernel-config"); + if (file.exists()) { + ui->actionSave->setEnabled(true); + ui->actionLoad->setEnabled(true); + } + } +} + + +/** + * Loads a voltage preset by calling kernel-config. + * + * Available presets are: + * - default + * - ideal + * - lv + * - ulv + * - xlv + * - custom -> any preset named "custom" + */ +void MainWindow::loadPreset(QString presetName) +{ + #if defined(Q_WS_MAEMO_5) + callHelper("loadpreset", presetName); + QMaemo5InformationBox::information(this, tr( "The preset %s was loaded." ), QMaemo5InformationBox::DefaultTimeout); + #endif +} + + +/** * Reads any file in /sys/ * * \param sys_file : full path to sys file - omit "/sys/" @@ -394,10 +458,7 @@ void MainWindow::refresh() //display frequency slider ui->freq_adjust->setMinimum( 1 ); ui->freq_adjust->setMaximum( getScalingSteps() ); - ui->freq_adjust->setInvertedAppearance( true ); ui->freq_adjust->setSliderPosition( getScalingStep(getMaxFreq()) ); - - //ui->retranslateUi(this); } @@ -431,33 +492,44 @@ void MainWindow::orientationChanged() /** - * Enables the auto-rotation feature of Maemo5 devices + * Saves the current maximim frequency as default (only on power kernel). */ -void MainWindow::setAutoRotation() +void MainWindow::save() { -#if defined(Q_WS_MAEMO_5) - setAttribute(Qt::WA_Maemo5AutoOrientation, true); -#endif + 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 + } } /** - * SLOT: enable/disable overclocking. + * Checks the settings if the "bq27x00_battery" needs to be loaded. */ -void MainWindow::setOverclocking() +void MainWindow::setAdvancedTemperature() { - if (ui->actionOverclocking->isChecked()) { - #if defined(Q_WS_MAEMO_5) - QMaemo5InformationBox::information(this, tr( "Please note that overclocking voids your warranty and may break your device! Be careful!"), 0); - #endif - this->allowOverclocking = true; - } else { - this->allowOverclocking = false; + 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 +} + + +/** * SLOT: Enables or disables Smart Reflex(tm) after pressing sr_btn */ void MainWindow::setSmartReflex() @@ -487,6 +559,16 @@ void MainWindow::showHelp() /** + * SLOT: displays the settings widget + */ +void MainWindow::showSettings() +{ + settings->reset(); + settings->show(); +} + + +/** * Returns true when the device is in portrait mode */ bool MainWindow::usePortrait()