/*************************************************************************** * Copyright (C) 2013 by Evgeniy Alekseev * * * * 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 * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * ***************************************************************************/ #include "extsysmon.h" #include #include #include #include #include #include ExtendedSysMon::ExtendedSysMon(QObject* parent, const QVariantList& args) : Plasma::DataEngine(parent, args) { Q_UNUSED(args) setMinimumPollingInterval(333); readConfiguration(); } QStringList ExtendedSysMon::sources() const { QStringList source; source.append(QString("gpu")); source.append(QString("gputemp")); source.append(QString("hddtemp")); source.append(QString("player")); return source; } bool ExtendedSysMon::readConfiguration() { // pre-setup FILE *f_out; f_out = popen("lspci 2> /dev/null", "r"); char device[256]; QString dev; while (fgets(device, 256, f_out) != NULL) { dev = QString(device); if (dev.toLower().contains("nvidia")) gpuDev = QString("nvidia"); else if (dev.toLower().contains("radeon")) gpuDev = QString("ati"); } pclose(f_out); f_out = popen("ls -1 /dev/sd[a-z] 2> /dev/null ; ls -1 /dev/hd[a-z] 2> /dev/null", "r"); while (fgets(device, 256, f_out) != NULL) { dev = QString(device).split("\n")[0]; if (dev[0] == '/') hddDev.append(dev); } pclose(f_out); mpdAddress = QString("localhost"); mpdPort = QString("6600"); QString fileStr; // FIXME: define configuration file QString confFileName = QString(getenv("HOME")) + QString("/.kde4/share/config/extsysmon.conf"); QFile confFile(confFileName); bool exists = confFile.open(QIODevice::ReadOnly); if (!exists) { confFileName = QString("/usr/share/config/extsysmon.conf"); confFile.setFileName(confFileName); exists = confFile.open(QIODevice::ReadOnly); if (!exists) return false; } while (true) { fileStr = QString(confFile.readLine()); if (fileStr[0] != '#') { if (fileStr.split(QString("="), QString::SkipEmptyParts).count() == 2) { if (fileStr.split(QString("="), QString::SkipEmptyParts)[0] == QString("GPUDEV")) { if (fileStr.split(QString("="), QString::SkipEmptyParts)[1].trimmed() == QString("ati")) gpuDev = fileStr.split(QString("="), QString::SkipEmptyParts)[1].trimmed(); else if (fileStr.split(QString("="), QString::SkipEmptyParts)[1].trimmed() == QString("nvidia")) gpuDev = fileStr.split(QString("="), QString::SkipEmptyParts)[1].trimmed(); else if (fileStr.split(QString("="), QString::SkipEmptyParts)[1].trimmed() != QString("auto")) gpuDev = QString("ignore"); } else if (fileStr.split(QString("="), QString::SkipEmptyParts)[0] == QString("HDDDEV")) { if (fileStr.split(QString("="), QString::SkipEmptyParts)[1].trimmed() != QString("all")) { hddDev.clear(); for (int i=0; i /dev/null | grep Gpu | tail -n1", "r"); fgets (output, 256, f_out); if ((output[0] == '\0') || (QString(output).split(QString(" "), QString::SkipEmptyParts).count() < 2)) value = QString(" N\\A"); else { out = QString(output).split(QString(" "), QString::SkipEmptyParts)[2]; sprintf (val, "%5.1f", out.left(out.count()-2).toFloat(&ok)); value = QString(val); } pclose(f_out); } else if (gpuDev == QString("ati")) { f_out = popen("aticonfig --od-getclocks 2> /dev/null | grep load | tail -n1", "r"); fgets (output, 256, f_out); if ((output[0] == '\0') || (QString(output).split(QString(" "), QString::SkipEmptyParts).count() < 3)) value = QString(" N\\A"); else { out = QString(output).split(QString(" "), QString::SkipEmptyParts)[3]; sprintf (val, "%5.1f", out.left(out.count()-2).toFloat(&ok)); value = QString(val); } pclose(f_out); } else { value = QString(" N\\A"); } if (ok == false) value = QString(" N\\A"); value = value.split(QString(","), QString::SkipEmptyParts).join(QString(".")); setData(source, key, value); } else if (source == QString("gputemp")) { key = QString("GPUTemp"); if (gpuDev == QString("nvidia")) { f_out = popen("nvidia-smi -q -d TEMPERATURE 2> /dev/null | grep Gpu | tail -n1", "r"); fgets (output, 256, f_out); if ((output[0] == '\0') || (QString(output).split(QString(" "), QString::SkipEmptyParts).count() < 2)) value = QString(" N\\A"); else { out = QString(output).split(QString(" "), QString::SkipEmptyParts)[2]; sprintf (val, "%4.1f", out.toFloat(&ok)); value = QString(val); } pclose(f_out); } else if (gpuDev == QString("ati")) { f_out = popen("aticonfig --od-gettemperature 2> /dev/null | grep Temperature | tail -n1", "r"); fgets (output, 256, f_out); if ((output[0] == '\0') || (QString(output).split(QString(" "), QString::SkipEmptyParts).count() < 4)) value = QString(" N\\A"); else { out = QString(output).split(QString(" "), QString::SkipEmptyParts)[4]; sprintf (val, "%4.1f", out.toFloat(&ok)); value = QString(val); } pclose(f_out); } else { value = QString(" N\\A"); } if (ok == false) value = QString(" N\\A"); value = value.split(QString(","), QString::SkipEmptyParts).join(QString(".")); setData(source, key, value); } else if (source == QString("hddtemp")) { char command[256], *dev; QByteArray qb; for (int i=0; i /dev/null", dev); f_out = popen(command, "r"); fgets(output, 256, f_out); if ((output[0] == '\0') || (QString(output).split(QString(":"), QString::SkipEmptyParts).count() < 3)) value = QString(" N\\A"); else { out = QString(output).split(QString(":"), QString::SkipEmptyParts)[2]; sprintf (val, "%4.1f", out.left(out.count()-4).toFloat(&ok)); value = QString(val); } pclose(f_out); if (ok == false) value = QString(" N\\A"); value = value.split(QString(","), QString::SkipEmptyParts).join(QString(".")); setData(source, hddDev[i], value); } } else if (source == QString("player")) { QProcess player; QString qoutput; QString value_album, value_artist, value_progress, value_duration, qstr; // qmmp qoutput = QString(""); value = QString("N\\A"); value_album = QString("N\\A"); value_artist = QString("N\\A"); value_progress = QString("0"); value_duration = QString("0"); player.start("qmmp --status"); player.waitForFinished(-1); qoutput = QTextCodec::codecForMib(106)->toUnicode(player.readAllStandardOutput()); for (int i=0; itoUnicode(player.readAllStandardOutput()); for (int i=0; i /dev/null", \ mpdAddress.toUtf8().data(), mpdPort.toUtf8().data()); qoutput = QString(""); player.start(QString(commandStr)); player.waitForFinished(-1); qoutput = QTextCodec::codecForMib(106)->toUnicode(player.readAllStandardOutput()); for (int i=0; i