X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmainwindow.cpp;h=44b9a7e11bc9e09d0df81067ca5897bdf526a9cc;hb=58fa039cf914e3a108fd463398bf3a39b9c6341e;hp=0875b859aedc614866e58445b2cf35f1f62409e8;hpb=0043b7164599bb887761ff67f43690ecc5eeabdd;p=qcpufreq diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp old mode 100755 new mode 100644 index 0875b85..44b9a7e --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -22,43 +22,75 @@ #include #include #include -#include #include #if defined(Q_WS_MAEMO_5) #include #endif - #define APPNAME "QCPUFreq" -#define APPVERSION "0.2" +#define APPVERSION "0.3.2" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), - ui(new Ui::MainWindow) + 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 ) { + //this is a stacked window on Maemo 5 + #if defined(Q_WS_MAEMO_5) + setAttribute(Qt::WA_Maemo5StackedWindow); + #endif + ui->setupUi(this); refresh(); // enable auto rotation - setAutoRotaion(); + setAutoRotation(); - //create a QGraphicsScene for the little chip icon - scene = new QGraphicsScene(); + //initialize orientation orientationChanged(); + //refresh UI every 10 seconds + refreshTimer.start( 10000 ); + + // initialize stackable help window + #if defined(Q_WS_MAEMO_5) + helpWindow.setAttribute(Qt::WA_Maemo5StackedWindow); + #endif + helpWindow.setWindowFlags( windowFlags() | Qt::Window ); + //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(QApplication::desktop(), SIGNAL(resized(int)), this, SLOT(orientationChanged())); - connect( ui->sr_btn, SIGNAL(clicked()), this, SLOT(setSmartReflex()) ); + 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); + } } MainWindow::~MainWindow() { delete ui; - delete scene; } @@ -79,31 +111,90 @@ void MainWindow::adjustFreq() { int newmax = getScalingFreq( ui->freq_adjust->sliderPosition() ); QString max; + + //maxfreq should not be smaller than minfreq, because we do not want to decrease minfreq + if (newmax < getMinFreq()) + newmax = getMinFreq(); + max.setNum( newmax ); - QStringList arguments; -#if defined(Q_WS_MAEMO_5) - //on Maemo5 the set_scalingmaxfreq-Script is not in $PATH - arguments.append( "/opt/usr/bin/set_scalingmaxfreq" ); -#else - arguments.append( "set_scalingmaxfreq" ); -#endif - arguments.append( max ); - //execute the scaling script - QProcess script; - script.execute( "sudo", arguments ); + //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); + refresh(); + return; + } + #endif + + callHelper( "set_maxfreq", max ); refresh(); } /** + * Calls the QCPUFreq helper script with "sudo action param" + * + * @param action : the action of the helper script + * @param param : the parameter for the action + * @return exit code + */ +int MainWindow::callHelper(QString action, QString param) +{ + QStringList arguments; + + #if defined(Q_WS_MAEMO_5) + //On Maemo 5 the helper script resides in /opt/usr/bin, which is usually not in $PATH + arguments.append( "/opt/usr/bin/QCPUFreq.helper" ); + #else + arguments.append( "QCPUFreq.helper" ); + #endif + + arguments.append( action ); + arguments.append( param ); + + helperProcess.start( "sudo", arguments, QIODevice::NotOpen ); + + if ( showSudoError && !helperProcess.waitForFinished( 400 )) { + //do not show this error again + showSudoError = false; + QMessageBox::critical(this, tr("QCPUFreq"), tr("There seems to be a problem with your sudo setup!")); + } + + return helperProcess.exitCode(); +} + + +/** * Returns the current CPU temperature */ QString MainWindow::getCPUTemp() { #if defined(Q_WS_MAEMO_5) - return readSysFile( "devices/platform/omap34xx_temp/temp1_input_raw" ); + QFile file( "/sys/class/power_supply/bq27200-0/temp" ); + + //check if we can read a more accurate temperature (only for power kernel) + if (file.exists()) + return QString( readSysFile( "class/power_supply/bq27200-0/temp" ) + " " + QString::fromUtf8("\302\260") + "C" ); + else { + /* + We actually only need to read the raw temperature, but it appears that by also reading temp1_input + the raw temperature (temp1_input_raw) is being updated more frequently. + */ + readSysFile( "devices/platform/omap34xx_temp/temp1_input" ); + + //read the current system temperature + QString tstring = readSysFile( "devices/platform/omap34xx_temp/temp1_input_raw" ); + if (tstring == "0") + return tr( "Unknown" ); + + //convert it to an integer and calculate the approx. temperature from the raw value + int tint = tstring.toInt(); + tint = ( 0.65 * tint ); + tstring.setNum(tint); + return QString( tstring + " " + QString::fromUtf8("\302\260") + "C" ); + } #endif return tr( "Unknown" ); } @@ -124,8 +215,32 @@ int MainWindow::getMaxFreq() */ int MainWindow::getMinFreq() { - QString tmp = readSysFile( "devices/system/cpu/cpu0/cpufreq/scaling_min_freq" ); - return tmp.toInt(); + 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; + } } @@ -199,6 +314,9 @@ int MainWindow::getSmartReflexState() else return 0; #else + //disable UI checkbox + ui->sr_box->setDisabled( true ); + return 0; #endif } @@ -224,6 +342,9 @@ QString MainWindow::readSysFile(QString sys_file) QTextStream in( &file ); QString txt = in.readLine(); + //close the file + file.close(); + return txt; } @@ -253,13 +374,10 @@ void MainWindow::refresh() ui->cpu_temp->setText( getCPUTemp() ); //smart reflex button - if ( getSmartReflexState() == 1 ) { - ui->sr_btn->setDown( true ); - ui->sr_btn->setText( tr( "Enabled" ) ); - } else { - ui->sr_btn->setDown( false ); - ui->sr_btn->setText( tr( "Disabled" ) ); - } + if ( getSmartReflexState() == 1 ) + ui->sr_box->setCheckState( Qt::Checked ); + else + ui->sr_box->setCheckState( Qt::Unchecked ); //display frequency slider @@ -283,18 +401,18 @@ void MainWindow::orientationChanged() if ( usePortrait() ) { //in portrait mode we want to display the large image image.load( ":/img/chip256" ); - this->scene->clear(); - this->scene->addPixmap( image ); + scene.clear(); + scene.addPixmap( image ); - ui->graphicsPortrait->setScene( this->scene ); + ui->graphicsPortrait->setScene( &scene ); ui->graphicsPortrait->setMaximumSize( 256, 256 ); ui->graphicsLandscape->setMaximumSize( 0, 0 ); } else { image.load( ":/img/chip128" ); - this->scene->clear(); - this->scene->addPixmap( image ); + scene.clear(); + scene.addPixmap( image ); - ui->graphicsLandscape->setScene( this->scene ); + ui->graphicsLandscape->setScene( &scene ); ui->graphicsLandscape->setMaximumSize( 128, 128 ); ui->graphicsPortrait->setMaximumSize( 0, 0 ); } @@ -304,7 +422,7 @@ void MainWindow::orientationChanged() /** * Enables the auto-rotation feature of Maemo5 devices */ -void MainWindow::setAutoRotaion() +void MainWindow::setAutoRotation() { #if defined(Q_WS_MAEMO_5) setAttribute(Qt::WA_Maemo5AutoOrientation, true); @@ -313,26 +431,35 @@ void MainWindow::setAutoRotaion() /** + * SLOT: enable/disable overclocking. + */ +void MainWindow::setOverclocking() +{ + 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; + } +} + + +/** * SLOT: Enables or disables Smart Reflex(tm) after pressing sr_btn */ void MainWindow::setSmartReflex() { -//SmartReflex is only supprted on Maemo5 +//SmartReflex is only supported on Maemo5 #if defined(Q_WS_MAEMO_5) - QStringList arguments; - arguments.append( "/opt/usr/bin/set_sr" ); - if ( getSmartReflexState() == 1 ) - arguments.append( "off" ); + callHelper( "set_sr", "off"); else { - QMaemo5InformationBox::information(this, tr( "SmartReflex support is known to be unstable on some devices and may cause random reboots." ), QMaemo5InformationBox::DefaultTimeout); - arguments.append( "on" ); + QMaemo5InformationBox::information(this, tr( "SmartReflex support is known to be unstable on some devices and may cause random reboots." ), QMaemo5InformationBox::DefaultTimeout); + callHelper( "set_sr", "on"); } - //execute the sr script script - QProcess script; - script.execute( "sudo", arguments ); - #endif //refresh the UI refresh(); @@ -340,13 +467,22 @@ void MainWindow::setSmartReflex() /** + * SLOT: display the help window + */ +void MainWindow::showHelp() +{ + helpWindow.show(); +} + + +/** * Returns true when the device is in portrait mode */ bool MainWindow::usePortrait() { QRect screenGeometry = QApplication::desktop()->screenGeometry(); if (screenGeometry.width() > screenGeometry.height()) - return false; + return false; else - return true; + return true; }