mirror of
https://github.com/arcan1s/awesome-widgets.git
synced 2025-04-24 15:37:23 +00:00
gpu support
This commit is contained in:
parent
7b60e8a42f
commit
0b2b58bd33
@ -9,10 +9,7 @@ arch=('x86_64')
|
||||
url="https://arcanis.me/projects/awesome-widgets"
|
||||
license=('GPL3')
|
||||
depends=('plasma-workspace')
|
||||
optdepends=("hddtemp: for HDD temperature monitor"
|
||||
"smartmontools: for HDD temperature monitor"
|
||||
"mpd: for music player monitor"
|
||||
"nvidia-utils: for GPU monitor")
|
||||
optdepends=("mpd: for music player monitor")
|
||||
makedepends=('cmake' 'extra-cmake-modules' 'python')
|
||||
source=(https://github.com/arcan1s/awesome-widgets/releases/download/${pkgver}/${_pkgname}-${pkgver}-src.tar.xz)
|
||||
install="$pkgname.install"
|
||||
|
@ -58,57 +58,6 @@ Item {
|
||||
}
|
||||
}
|
||||
|
||||
GroupBox {
|
||||
height: implicitHeight
|
||||
width: parent.width
|
||||
title: i18n("GPU")
|
||||
ComboBoxSelector {
|
||||
model: [
|
||||
{
|
||||
'label': "auto",
|
||||
'name': "auto"
|
||||
},
|
||||
{
|
||||
'label': "disable",
|
||||
'name': "disable"
|
||||
},
|
||||
{
|
||||
'label': "ati",
|
||||
'name': "ati"
|
||||
},
|
||||
{
|
||||
'label': "nvidia",
|
||||
'name': "nvidia"
|
||||
}
|
||||
]
|
||||
text: i18n("GPU device")
|
||||
value: cfg_dataengine["GPUDEV"]
|
||||
onValueEdited: newValue => cfg_dataengine["GPUDEV"] = newValue
|
||||
}
|
||||
}
|
||||
|
||||
GroupBox {
|
||||
height: implicitHeight
|
||||
width: parent.width
|
||||
title: i18n("HDD temperature")
|
||||
Column {
|
||||
height: implicitHeight
|
||||
width: parent.width
|
||||
ComboBoxSelector {
|
||||
id: hdd
|
||||
text: i18n("HDD")
|
||||
value: cfg_dataengine["HDDDEV"]
|
||||
onValueEdited: newValue => cfg_dataengine["HDDDEV"] = newValue
|
||||
}
|
||||
|
||||
LineSelector {
|
||||
text: i18n("hddtemp cmd")
|
||||
value: cfg_dataengine["HDDTEMPCMD"]
|
||||
onValueEdited: newValue => cfg_dataengine["HDDTEMPCMD"] = newValue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GroupBox {
|
||||
height: implicitHeight
|
||||
width: parent.width
|
||||
|
@ -19,7 +19,7 @@
|
||||
"Id": "org.kde.plasma.awesomewidget",
|
||||
"License": "GPLv3",
|
||||
"Name": "Awesome Widget",
|
||||
"Version": "3.5.1",
|
||||
"Version": "4.0.0",
|
||||
"Website": "https://arcanis.me/projects/awesome-widgets/"
|
||||
},
|
||||
"X-Plasma-API-Minimum-Version": "6.0"
|
||||
|
@ -170,9 +170,6 @@ QVariantMap AWConfigHelper::readDataEngineConfiguration()
|
||||
|
||||
settings.beginGroup("Configuration");
|
||||
configuration["ACPIPATH"] = settings.value("ACPIPATH", "/sys/class/power_supply/");
|
||||
configuration["GPUDEV"] = settings.value("GPUDEV", "auto");
|
||||
configuration["HDDDEV"] = settings.value("HDDDEV", "all");
|
||||
configuration["HDDTEMPCMD"] = settings.value("HDDTEMPCMD", "sudo smartctl -a");
|
||||
configuration["MPDADDRESS"] = settings.value("MPDADDRESS", "localhost");
|
||||
configuration["MPDPORT"] = settings.value("MPDPORT", "6600");
|
||||
configuration["MPRIS"] = settings.value("MPRIS", "auto");
|
||||
@ -197,9 +194,6 @@ bool AWConfigHelper::writeDataEngineConfiguration(const QVariantMap &_configurat
|
||||
|
||||
settings.beginGroup("Configuration");
|
||||
settings.setValue("ACPIPATH", _configuration["ACPIPATH"]);
|
||||
settings.setValue("GPUDEV", _configuration["GPUDEV"]);
|
||||
settings.setValue("HDDDEV", _configuration["HDDDEV"]);
|
||||
settings.setValue("HDDTEMPCMD", _configuration["HDDTEMPCMD"]);
|
||||
settings.setValue("MPDADDRESS", _configuration["MPDADDRESS"]);
|
||||
settings.setValue("MPDPORT", _configuration["MPDPORT"]);
|
||||
settings.setValue("MPRIS", _configuration["MPRIS"]);
|
||||
|
@ -89,6 +89,9 @@ void AWDataEngineAggregator::loadSources()
|
||||
auto sensors = response.value();
|
||||
updateSensors(sensors);
|
||||
connectSources();
|
||||
|
||||
for (auto &sensor : m_sensors.keys())
|
||||
emit(deviceAdded(sensor));
|
||||
}
|
||||
|
||||
|
||||
@ -121,6 +124,9 @@ void AWDataEngineAggregator::sensorAdded(const QString &_sensor)
|
||||
m_interface->subscribe({_sensor}).waitForFinished();
|
||||
m_subscribed.insert(_sensor);
|
||||
}
|
||||
|
||||
// notify about new device
|
||||
emit(deviceAdded(_sensor));
|
||||
}
|
||||
|
||||
|
||||
|
@ -85,6 +85,8 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
|
||||
auto cpuRegExp = QRegularExpression("^cpu/cpu.*/usage$");
|
||||
auto cpuclRegExp = QRegularExpression("^cpu/cpu.*/frequency$");
|
||||
auto cpuTempRegExp = QRegularExpression("^cpu/cpu.*/temperature$");
|
||||
auto gpuRegExp = QRegularExpression("^gpu/gpu.*/usage$");
|
||||
auto gpuTempRegExp = QRegularExpression("^gpu/gpu.*/temperature$");
|
||||
auto hddrRegExp = QRegularExpression("^disk/.*/read$");
|
||||
auto hddwRegExp = QRegularExpression("^disk/.*/write$");
|
||||
auto mountFillRegExp = QRegularExpression("^disk/.*/usedPercent$");
|
||||
@ -99,7 +101,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
|
||||
m_formatter["ac"] = AWKeysAggregator::FormatterType::ACFormat;
|
||||
} else if (_source.startsWith("extsysmon/battery/")) {
|
||||
// battery stats
|
||||
QString key = _source;
|
||||
auto key = _source;
|
||||
key.remove("extsysmon/battery/");
|
||||
m_map.insert(_source, key);
|
||||
m_formatter[key] = _source.contains("rate") ? AWKeysAggregator::FormatterType::Float
|
||||
@ -110,7 +112,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
|
||||
m_formatter["cpu"] = AWKeysAggregator::FormatterType::Float;
|
||||
} else if (_source.contains(cpuRegExp)) {
|
||||
// cpus
|
||||
QString key = _source;
|
||||
auto key = _source;
|
||||
key.remove("cpu/").remove("/usage");
|
||||
m_map.insert(_source, key);
|
||||
m_formatter[key] = AWKeysAggregator::FormatterType::Float;
|
||||
@ -120,14 +122,14 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
|
||||
m_formatter["cpucl"] = AWKeysAggregator::FormatterType::Integer;
|
||||
} else if (_source.contains(cpuclRegExp)) {
|
||||
// cpucls
|
||||
QString key = _source;
|
||||
auto key = _source;
|
||||
key.remove("cpu/cpu").remove("/frequency");
|
||||
key = QString("cpucl%1").arg(key);
|
||||
m_map.insert(_source, key);
|
||||
m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
|
||||
} else if (_source.startsWith("extsysmon/custom")) {
|
||||
// custom
|
||||
QString key = _source;
|
||||
auto key = _source;
|
||||
key.remove("extsysmon/custom/");
|
||||
m_map.insert(_source, key);
|
||||
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
|
||||
@ -145,9 +147,9 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
|
||||
m_formatter["tdesktops"] = AWKeysAggregator::FormatterType::NoFormat;
|
||||
} else if (_source.contains(hddrRegExp)) {
|
||||
// read speed
|
||||
QString device = _source;
|
||||
auto device = _source;
|
||||
device.remove("disk/").remove("/read");
|
||||
int index = m_devices["disk"].indexOf(device);
|
||||
auto index = m_devices["disk"].indexOf(device);
|
||||
if (index > -1) {
|
||||
QString key = QString("hddr%1").arg(index);
|
||||
m_map.insert(_source, key);
|
||||
@ -155,29 +157,45 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
|
||||
}
|
||||
} else if (_source.contains(hddwRegExp)) {
|
||||
// write speed
|
||||
QString device = _source;
|
||||
auto device = _source;
|
||||
device.remove("disk/").remove("/write");
|
||||
int index = m_devices["disk"].indexOf(device);
|
||||
auto index = m_devices["disk"].indexOf(device);
|
||||
if (index > -1) {
|
||||
QString key = QString("hddw%1").arg(index);
|
||||
m_map.insert(_source, key);
|
||||
m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
|
||||
}
|
||||
} else if (_source == "extsysmon/gpuload/load") {
|
||||
} else if (_source == "gpu/all/usage") {
|
||||
// gpu load
|
||||
m_map.insert(_source, "gpu");
|
||||
m_formatter["gpu"] = AWKeysAggregator::FormatterType::Float;
|
||||
} else if (_source == "extsysmon/gputemp/temperature") {
|
||||
// gpu temperature
|
||||
m_map.insert(_source, "gputemp");
|
||||
m_formatter["gputemp"] = AWKeysAggregator::FormatterType::Temperature;
|
||||
} else if (_source.contains(gpuRegExp)) {
|
||||
// gpus
|
||||
auto device = _source;
|
||||
device.remove("gpu/").remove("/usage");
|
||||
auto index = m_devices["gpu"].indexOf(device);
|
||||
if (index > -1) {
|
||||
auto key = QString("gpu%1").arg(index);
|
||||
m_map.insert(_source, key);
|
||||
m_formatter[key] = AWKeysAggregator::FormatterType::Float;
|
||||
}
|
||||
} else if (_source.contains(gpuTempRegExp)) {
|
||||
// gpus temps
|
||||
auto device = _source;
|
||||
device.remove("gpu/").remove("/temperature");
|
||||
auto index = m_devices["gpu"].indexOf(device);
|
||||
if (index > -1) {
|
||||
auto key = QString("gputemp%1").arg(index);
|
||||
m_map.insert(_source, key);
|
||||
m_formatter[key] = AWKeysAggregator::FormatterType::Temperature;
|
||||
}
|
||||
} else if (_source.contains(mountFillRegExp)) {
|
||||
// fill level
|
||||
QString device = _source;
|
||||
auto device = _source;
|
||||
device.remove("disk/").remove("/usedPercent");
|
||||
int index = m_devices["mount"].indexOf(device);
|
||||
auto index = m_devices["mount"].indexOf(device);
|
||||
if (index > -1) {
|
||||
QString key = QString("hdd%1").arg(index);
|
||||
auto key = QString("hdd%1").arg(index);
|
||||
m_map.insert(_source, key);
|
||||
m_formatter[key] = AWKeysAggregator::FormatterType::Float;
|
||||
// additional keys
|
||||
@ -186,9 +204,9 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
|
||||
}
|
||||
} else if (_source.contains(mountFreeRegExp)) {
|
||||
// free space
|
||||
QString device = _source;
|
||||
auto device = _source;
|
||||
device.remove("disk/").remove("/free");
|
||||
int index = m_devices["mount"].indexOf(device);
|
||||
auto index = m_devices["mount"].indexOf(device);
|
||||
if (index > -1) {
|
||||
// mb
|
||||
QString key = QString("hddfreemb%1").arg(index);
|
||||
@ -201,9 +219,9 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
|
||||
}
|
||||
} else if (_source.contains(mountUsedRegExp)) {
|
||||
// used
|
||||
QString device = _source;
|
||||
auto device = _source;
|
||||
device.remove("disk/").remove("/used");
|
||||
int index = m_devices["mount"].indexOf(device);
|
||||
auto index = m_devices["mount"].indexOf(device);
|
||||
if (index > -1) {
|
||||
// mb
|
||||
QString key = QString("hddmb%1").arg(index);
|
||||
@ -214,21 +232,11 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
|
||||
m_map.insert(_source, key);
|
||||
m_formatter[key] = AWKeysAggregator::FormatterType::MemGBFormat;
|
||||
}
|
||||
} else if (_source.startsWith("extsysmon/hdd/temperature")) {
|
||||
// hdd temperature
|
||||
QString device = _source;
|
||||
device.remove("extsysmon/hdd/temperature");
|
||||
int index = m_devices["hdd"].indexOf(device);
|
||||
if (index > -1) {
|
||||
QString key = QString("hddtemp%1").arg(index);
|
||||
m_map.insert(_source, key);
|
||||
m_formatter[key] = AWKeysAggregator::FormatterType::Temperature;
|
||||
}
|
||||
} else if (_source.startsWith("cpu/loadaverages/loadaverage")) {
|
||||
// load average
|
||||
QString time = _source;
|
||||
auto time = _source;
|
||||
time.remove("cpu/loadaverages/loadaverage");
|
||||
QString key = QString("la%1").arg(time);
|
||||
auto key = QString("la%1").arg(time);
|
||||
m_map.insert(_source, key);
|
||||
m_formatter[key] = AWKeysAggregator::FormatterType::FloatTwoSymbols;
|
||||
} else if (_source == "memory/physical/application") {
|
||||
@ -265,17 +273,17 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
|
||||
m_formatter["ssid"] = AWKeysAggregator::FormatterType::NoFormat;
|
||||
} else if (_source.startsWith("extsysmon/requests/response")) {
|
||||
// network response
|
||||
QString key = _source;
|
||||
auto key = _source;
|
||||
key.remove("extsysmon/requests/");
|
||||
m_map.insert(_source, key);
|
||||
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
|
||||
} else if (_source.contains(netRegExp)) {
|
||||
// network speed
|
||||
QString type = _source.contains("download") ? "down" : "up";
|
||||
int index = m_devices["net"].indexOf(_source.split('/')[2]);
|
||||
auto type = _source.endsWith("download") ? "down" : "up";
|
||||
auto index = m_devices["net"].indexOf(_source.split('/')[1]);
|
||||
if (index > -1) {
|
||||
// kb
|
||||
QString key = QString("%1kb%2").arg(type).arg(index);
|
||||
auto key = QString("%1kb%2").arg(type).arg(index);
|
||||
m_map.insert(_source, key);
|
||||
m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
|
||||
// smart
|
||||
@ -289,11 +297,11 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
|
||||
}
|
||||
} else if (_source.contains(netTotalRegExp)) {
|
||||
// network data total
|
||||
QString type = _source.contains("download") ? "down" : "up";
|
||||
int index = m_devices["net"].indexOf(_source.split('/')[2]);
|
||||
auto type = _source.endsWith("Download") ? "down" : "up";
|
||||
auto index = m_devices["net"].indexOf(_source.split('/')[1]);
|
||||
if (index > -1) {
|
||||
// kb
|
||||
QString key = QString("%1totkb%2").arg(type).arg(index);
|
||||
auto key = QString("%1totkb%2").arg(type).arg(index);
|
||||
m_map.insert(_source, key);
|
||||
m_formatter[key] = AWKeysAggregator::FormatterType::Integer;
|
||||
// mb
|
||||
@ -303,13 +311,13 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
|
||||
}
|
||||
} else if (_source.startsWith("extsysmon/upgrade")) {
|
||||
// package manager
|
||||
QString key = _source;
|
||||
auto key = _source;
|
||||
key.remove("extsysmon/upgrade/");
|
||||
m_map.insert(_source, key);
|
||||
m_formatter[key] = AWKeysAggregator::FormatterType::IntegerThree;
|
||||
} else if (_source.startsWith("extsysmon/player")) {
|
||||
// player
|
||||
QString key = _source;
|
||||
auto key = _source;
|
||||
key.remove("extsysmon/player/");
|
||||
m_map.insert(_source, key);
|
||||
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
|
||||
@ -327,7 +335,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
|
||||
m_formatter["pstot"] = AWKeysAggregator::FormatterType::NoFormat;
|
||||
} else if (_source.startsWith("extsysmon/quotes")) {
|
||||
// quotes
|
||||
QString key = _source;
|
||||
auto key = _source;
|
||||
key.remove("extsysmon/quotes/");
|
||||
m_map.insert(_source, key);
|
||||
m_formatter[key] = AWKeysAggregator::FormatterType::Quotes;
|
||||
@ -355,7 +363,7 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
|
||||
if (_units == KSysGuard::UnitInvalid)
|
||||
return QStringList({QString("temp%1").arg(index)});
|
||||
if (index > -1) {
|
||||
QString key = QString("temp%1").arg(index);
|
||||
auto key = QString("temp%1").arg(index);
|
||||
m_map.insert(_source, key);
|
||||
m_formatter[key] = _units == KSysGuard::UnitCelsius ? AWKeysAggregator::FormatterType::Temperature
|
||||
: AWKeysAggregator::FormatterType::Integer;
|
||||
@ -394,19 +402,19 @@ QStringList AWDataEngineMapper::registerSource(const QString &_source, const KSy
|
||||
m_formatter["cuptime"] = AWKeysAggregator::FormatterType::UptimeCustom;
|
||||
} else if (_source.startsWith("extsysmon/weather/temperature")) {
|
||||
// temperature
|
||||
QString key = _source;
|
||||
auto key = _source;
|
||||
key.remove("extsysmon/weather/");
|
||||
m_map.insert(_source, key);
|
||||
m_formatter[key] = AWKeysAggregator::FormatterType::Temperature;
|
||||
} else if (_source.startsWith("extsysmon/weather/")) {
|
||||
// other weather
|
||||
QString key = _source;
|
||||
auto key = _source;
|
||||
key.remove("extsysmon/weather/");
|
||||
m_map.insert(_source, key);
|
||||
m_formatter[key] = AWKeysAggregator::FormatterType::NoFormat;
|
||||
} else if (_source.startsWith("extsysmon/load/load")) {
|
||||
// load source
|
||||
QString key = _source;
|
||||
auto key = _source;
|
||||
key.remove("extsysmon/load/");
|
||||
m_map.insert(_source, key);
|
||||
m_formatter[key] = AWKeysAggregator::FormatterType::Temperature;
|
||||
|
@ -31,7 +31,7 @@ bool AWKeyCache::addKeyToCache(const QString &_type, const QString &_key)
|
||||
{
|
||||
qCDebug(LOG_AW) << "Key" << _key << "with type" << _type;
|
||||
|
||||
QString fileName
|
||||
auto fileName
|
||||
= QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation));
|
||||
qCInfo(LOG_AW) << "Cache file" << fileName;
|
||||
QSettings cache(fileName, QSettings::IniFormat);
|
||||
@ -41,19 +41,8 @@ bool AWKeyCache::addKeyToCache(const QString &_type, const QString &_key)
|
||||
for (auto &number : cache.allKeys())
|
||||
cachedValues.append(cache.value(number).toString());
|
||||
|
||||
if (_type == "hdd") {
|
||||
QStringList allDevices = QDir("/dev").entryList(QDir::System, QDir::Name);
|
||||
QStringList devices = allDevices.filter(QRegularExpression("^[hms]d[a-z]$"));
|
||||
for (auto &dev : devices) {
|
||||
QString device = QString("/dev/%1").arg(dev);
|
||||
if (cachedValues.contains(device))
|
||||
continue;
|
||||
qCInfo(LOG_AW) << "Found new key" << device << "for type" << _type;
|
||||
cachedValues.append(device);
|
||||
cache.setValue(QString("%1").arg(cache.allKeys().count(), 3, 10, QChar('0')), device);
|
||||
}
|
||||
} else if (_type == "net") {
|
||||
QList<QNetworkInterface> rawInterfaceList = QNetworkInterface::allInterfaces();
|
||||
if (_type == "net") {
|
||||
auto rawInterfaceList = QNetworkInterface::allInterfaces();
|
||||
for (auto &interface : rawInterfaceList) {
|
||||
QString device = interface.name();
|
||||
if (cachedValues.contains(device))
|
||||
@ -98,7 +87,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
|
||||
if (!used.contains(key))
|
||||
continue;
|
||||
key.remove("hddtotmb");
|
||||
int index = key.toInt();
|
||||
auto index = key.toInt();
|
||||
used << QString("hddfreemb%1").arg(index) << QString("hddmb%1").arg(index);
|
||||
}
|
||||
// hddtotgb*
|
||||
@ -106,7 +95,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
|
||||
if (!used.contains(key))
|
||||
continue;
|
||||
key.remove("hddtotgb");
|
||||
int index = key.toInt();
|
||||
auto index = key.toInt();
|
||||
used << QString("hddfreegb%1").arg(index) << QString("hddgb%1").arg(index);
|
||||
}
|
||||
// mem
|
||||
@ -139,7 +128,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
|
||||
for (auto &key : netKeys) {
|
||||
if (!used.contains(key))
|
||||
continue;
|
||||
QStringList filt = _allKeys.filter(QRegularExpression(QString("^%1[0-9]{1,}").arg(key)));
|
||||
auto filt = _allKeys.filter(QRegularExpression(QString("^%1[0-9]{1,}").arg(key)));
|
||||
for (auto &filtered : filt)
|
||||
used << filtered;
|
||||
}
|
||||
@ -158,7 +147,7 @@ QStringList AWKeyCache::getRequiredKeys(const QStringList &_keys, const QStringL
|
||||
|
||||
QHash<QString, QStringList> AWKeyCache::loadKeysFromCache()
|
||||
{
|
||||
QString fileName
|
||||
auto fileName
|
||||
= QString("%1/awesomewidgets.ndx").arg(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation));
|
||||
qCInfo(LOG_AW) << "Cache file" << fileName;
|
||||
QSettings cache(fileName, QSettings::IniFormat);
|
||||
|
@ -72,7 +72,6 @@ QHash<QString, QStringList> AWKeyOperations::devices() const
|
||||
void AWKeyOperations::updateCache()
|
||||
{
|
||||
// update network and hdd list
|
||||
addKeyToCache("hdd");
|
||||
addKeyToCache("net");
|
||||
}
|
||||
|
||||
@ -90,15 +89,20 @@ QStringList AWKeyOperations::dictKeys() const
|
||||
allKeys.append(item->tag("timestamp"));
|
||||
}
|
||||
// cpuclock & cpu
|
||||
for (int i = 0; i < QThread::idealThreadCount(); i++) {
|
||||
for (auto i = 0; i < QThread::idealThreadCount(); i++) {
|
||||
allKeys.append(QString("cpucl%1").arg(i));
|
||||
allKeys.append(QString("cpu%1").arg(i));
|
||||
}
|
||||
// temperature
|
||||
for (int i = 0; i < m_devices["temp"].count(); i++)
|
||||
for (auto i = 0; i < m_devices["temp"].count(); i++)
|
||||
allKeys.append(QString("temp%1").arg(i));
|
||||
// gpu
|
||||
for (auto i = 0; i < m_devices["gpu"].count(); i++) {
|
||||
allKeys.append(QString("gpu%1").arg(i));
|
||||
allKeys.append(QString("gputemp%1").arg(i));
|
||||
}
|
||||
// hdd
|
||||
for (int i = 0; i < m_devices["mount"].count(); i++) {
|
||||
for (auto i = 0; i < m_devices["mount"].count(); i++) {
|
||||
allKeys.append(QString("hddmb%1").arg(i));
|
||||
allKeys.append(QString("hddgb%1").arg(i));
|
||||
allKeys.append(QString("hddfreemb%1").arg(i));
|
||||
@ -108,15 +112,12 @@ QStringList AWKeyOperations::dictKeys() const
|
||||
allKeys.append(QString("hdd%1").arg(i));
|
||||
}
|
||||
// hdd speed
|
||||
for (int i = 0; i < m_devices["disk"].count(); i++) {
|
||||
for (auto i = 0; i < m_devices["disk"].count(); i++) {
|
||||
allKeys.append(QString("hddr%1").arg(i));
|
||||
allKeys.append(QString("hddw%1").arg(i));
|
||||
}
|
||||
// hdd temp
|
||||
for (int i = 0; i < m_devices["hdd"].count(); i++)
|
||||
allKeys.append(QString("hddtemp%1").arg(i));
|
||||
// network
|
||||
for (int i = 0; i < m_devices["net"].count(); i++) {
|
||||
for (auto i = 0; i < m_devices["net"].count(); i++) {
|
||||
allKeys.append(QString("downunits%1").arg(i));
|
||||
allKeys.append(QString("upunits%1").arg(i));
|
||||
allKeys.append(QString("downtotkb%1").arg(i));
|
||||
@ -129,7 +130,7 @@ QStringList AWKeyOperations::dictKeys() const
|
||||
allKeys.append(QString("up%1").arg(i));
|
||||
}
|
||||
// battery
|
||||
QStringList allBatteryDevices
|
||||
auto allBatteryDevices
|
||||
= QDir("/sys/class/power_supply")
|
||||
.entryList(QStringList({"BAT*"}), QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name);
|
||||
for (int i = 0; i < allBatteryDevices.count(); i++) {
|
||||
@ -205,52 +206,48 @@ QString AWKeyOperations::infoByKey(const QString &_key) const
|
||||
{
|
||||
qCDebug(LOG_AW) << "Requested key" << _key;
|
||||
|
||||
QString stripped = _key;
|
||||
auto stripped = _key;
|
||||
stripped.remove(QRegularExpression("\\d+"));
|
||||
QString output;
|
||||
|
||||
if (_key.startsWith("bar")) {
|
||||
AbstractExtItem *item = m_graphicalItems->itemByTag(_key, stripped);
|
||||
auto *item = m_graphicalItems->itemByTag(_key, stripped);
|
||||
if (item)
|
||||
output = item->uniq();
|
||||
} else if (_key.startsWith("custom")) {
|
||||
AbstractExtItem *item = m_extScripts->itemByTag(_key, stripped);
|
||||
auto *item = m_extScripts->itemByTag(_key, stripped);
|
||||
if (item)
|
||||
output = item->uniq();
|
||||
} else if (_key.contains(QRegularExpression("^hdd[rw]"))) {
|
||||
QString index = _key;
|
||||
auto index = _key;
|
||||
index.remove(QRegularExpression("hdd[rw]"));
|
||||
output = m_devices["disk"][index.toInt()];
|
||||
} else if (_key.contains(QRegularExpression("^hdd([0-9]|mb|gb|freemb|freegb|totmb|totgb)"))) {
|
||||
QString index = _key;
|
||||
auto index = _key;
|
||||
index.remove(QRegularExpression("^hdd(|mb|gb|freemb|freegb|totmb|totgb)"));
|
||||
output = m_devices["mount"][index.toInt()];
|
||||
} else if (_key.startsWith("hddtemp")) {
|
||||
QString index = _key;
|
||||
index.remove("hddtemp");
|
||||
output = m_devices["hdd"][index.toInt()];
|
||||
} else if (_key.contains(QRegularExpression("^(down|up)[0-9]"))) {
|
||||
QString index = _key;
|
||||
auto index = _key;
|
||||
index.remove(QRegularExpression("^(down|up)"));
|
||||
output = m_devices["net"][index.toInt()];
|
||||
} else if (_key.startsWith("pkgcount")) {
|
||||
AbstractExtItem *item = m_extUpgrade->itemByTag(_key, stripped);
|
||||
auto *item = m_extUpgrade->itemByTag(_key, stripped);
|
||||
if (item)
|
||||
output = item->uniq();
|
||||
} else if (_key.contains(QRegularExpression("(^|perc)(ask|bid|price)(chg|)"))) {
|
||||
AbstractExtItem *item = m_extQuotes->itemByTag(_key, stripped);
|
||||
auto *item = m_extQuotes->itemByTag(_key, stripped);
|
||||
if (item)
|
||||
output = item->uniq();
|
||||
} else if (_key.contains(QRegularExpression("(weather|weatherId|humidity|pressure|temperature)"))) {
|
||||
AbstractExtItem *item = m_extWeather->itemByTag(_key, stripped);
|
||||
auto *item = m_extWeather->itemByTag(_key, stripped);
|
||||
if (item)
|
||||
output = item->uniq();
|
||||
} else if (_key.startsWith("temp")) {
|
||||
QString index = _key;
|
||||
auto index = _key;
|
||||
index.remove("temp");
|
||||
output = m_devices["temp"][index.toInt()];
|
||||
} else if (_key.startsWith("response")) {
|
||||
AbstractExtItem *item = m_extNetRequest->itemByTag(_key, stripped);
|
||||
auto *item = m_extNetRequest->itemByTag(_key, stripped);
|
||||
if (item)
|
||||
output = item->uniq();
|
||||
} else {
|
||||
@ -302,9 +299,10 @@ void AWKeyOperations::addDevice(const QString &_source)
|
||||
{
|
||||
qCDebug(LOG_AW) << "Source" << _source;
|
||||
|
||||
auto diskRegexp = QRegularExpression("disk/.*/read");
|
||||
auto mountRegexp = QRegularExpression("disk/.*/usedPercent");
|
||||
auto diskRegexp = QRegularExpression("^disk/.*/read$");
|
||||
auto mountRegexp = QRegularExpression("^disk/.*/usedPercent$");
|
||||
auto cpuTempRegExp = QRegularExpression("^cpu/cpu.*/temperature$");
|
||||
auto gpuRegExp = QRegularExpression("^gpu/gpu.*/usage$");
|
||||
|
||||
if (_source.contains(diskRegexp)) {
|
||||
auto device = _source;
|
||||
@ -317,6 +315,10 @@ void AWKeyOperations::addDevice(const QString &_source)
|
||||
} else if (_source.startsWith("lmsensors") || _source.contains(cpuTempRegExp)
|
||||
|| _source == "cpu/all/averageTemperature") {
|
||||
addKeyToCache("temp", _source);
|
||||
} else if (_source.contains(gpuRegExp)) {
|
||||
auto device = _source;
|
||||
device.remove("gpu/").remove("/usage");
|
||||
addKeyToCache("gpu", device);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -103,7 +103,7 @@ void AWKeys::initKeys(const QString &_currentPattern, const int _interval, const
|
||||
m_aggregator->initFormatters();
|
||||
m_keyOperator->setPattern(_currentPattern);
|
||||
m_keyOperator->updateCache();
|
||||
m_dataEngineAggregator->connectSources();
|
||||
m_dataEngineAggregator->loadSources();
|
||||
|
||||
// timer
|
||||
m_timer->setInterval(_interval);
|
||||
|
@ -46,9 +46,8 @@ ExtQuotes::ExtQuotes(QObject *_parent, const QString &_filePath)
|
||||
// HACK declare as child of nullptr to avoid crash with plasmawindowed
|
||||
// in the destructor
|
||||
m_manager = new QNetworkAccessManager(nullptr);
|
||||
connect(m_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(quotesReplyReceived(QNetworkReply *)));
|
||||
|
||||
connect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest()));
|
||||
connect(m_manager, &QNetworkAccessManager::finished, this, &ExtQuotes::quotesReplyReceived);
|
||||
connect(this, &ExtQuotes::requestDataUpdate, this, &ExtQuotes::sendRequest);
|
||||
}
|
||||
|
||||
|
||||
@ -56,8 +55,8 @@ ExtQuotes::~ExtQuotes()
|
||||
{
|
||||
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
|
||||
|
||||
disconnect(m_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(quotesReplyReceived(QNetworkReply *)));
|
||||
disconnect(this, SIGNAL(requestDataUpdate()), this, SLOT(sendRequest()));
|
||||
disconnect(m_manager, &QNetworkAccessManager::finished, this, &ExtQuotes::quotesReplyReceived);
|
||||
disconnect(this, &ExtQuotes::requestDataUpdate, this, &ExtQuotes::sendRequest);
|
||||
|
||||
m_manager->deleteLater();
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Name=AAPL.NASDAQ
|
||||
Name=AAPL
|
||||
Comment=Apple Inc
|
||||
X-AW-Ticker="AAPL"
|
||||
X-AW-Ticker="AAPL.US"
|
||||
X-AW-Active=false
|
||||
X-AW-ApiVersion=5
|
||||
X-AW-Interval=60
|
||||
|
@ -1,8 +1,8 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Name=GOOG.NASDAQ
|
||||
Name=GOOG
|
||||
Comment=Google Inc
|
||||
X-AW-Ticker="GOOG"
|
||||
X-AW-Ticker="GOOG.US"
|
||||
X-AW-Active=false
|
||||
X-AW-ApiVersion=5
|
||||
X-AW-Interval=60
|
||||
|
@ -1,8 +1,8 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
Name=MSFT.NASDAQ
|
||||
Name=MSFT
|
||||
Comment=Microsoft Corp
|
||||
X-AW-Ticker="MSFT"
|
||||
X-AW-Ticker="MSFT.US"
|
||||
X-AW-Active=false
|
||||
X-AW-ApiVersion=5
|
||||
X-AW-Interval=60
|
||||
|
@ -54,7 +54,7 @@ QVariantHash StooqQuotesProvider::parse(const QByteArray &_source, const QVarian
|
||||
|
||||
QVariantHash values;
|
||||
|
||||
QStringList sourceValues = QString::fromUtf8(_source).trimmed().split(',');
|
||||
auto sourceValues = QString::fromUtf8(_source).trimmed().split(',');
|
||||
if (sourceValues.count() != 2) {
|
||||
qCWarning(LOG_LIB) << "Parse error" << sourceValues;
|
||||
return values;
|
||||
@ -67,12 +67,12 @@ QVariantHash StooqQuotesProvider::parse(const QByteArray &_source, const QVarian
|
||||
// last trade
|
||||
auto price = sourceValues.at(0).toDouble();
|
||||
values[tag("pricechg")] = oldPrice == 0.0 ? 0.0 : price - oldPrice;
|
||||
values[tag("percpricechg")] = 100.0 * values[tag("pricechg")].toDouble() / price;
|
||||
values[tag("percpricechg")] = 100.0 * values[tag("pricechg")].toDouble() / oldPrice;
|
||||
values[tag("price")] = price;
|
||||
// volume
|
||||
auto volume = sourceValues.at(1).toInt();
|
||||
values[tag("volumechg")] = oldVolume == 0 ? 0 : volume - oldVolume;
|
||||
values[tag("percvolumechg")] = 100.0 * values[tag("volumechg")].toDouble() / volume;
|
||||
values[tag("percvolumechg")] = 100.0 * values[tag("volumechg")].toDouble() / oldVolume;
|
||||
values[tag("volume")] = volume;
|
||||
|
||||
return values;
|
||||
|
@ -19,7 +19,7 @@
|
||||
"Id": "org.kde.plasma.desktoppanel",
|
||||
"License": "GPLv3",
|
||||
"Name": "Desktop Panel",
|
||||
"Version": "3.5.1",
|
||||
"Version": "4.0.0",
|
||||
"Website": "https://arcanis.me/projects/awesome-widgets/"
|
||||
},
|
||||
"X-Plasma-API-Minimum-Version": "6.0"
|
||||
|
@ -27,8 +27,6 @@
|
||||
|
||||
#include "awdebug.h"
|
||||
#include "extsysmonaggregator.h"
|
||||
#include "gpuloadsource.h"
|
||||
#include "hddtempsource.h"
|
||||
|
||||
|
||||
ExtendedSysMon::ExtendedSysMon(QObject *_parent, const QVariantList &_args)
|
||||
@ -53,9 +51,6 @@ void ExtendedSysMon::readConfiguration()
|
||||
|
||||
settings.beginGroup("Configuration");
|
||||
rawConfig["ACPIPATH"] = settings.value("ACPIPATH", "/sys/class/power_supply/").toString();
|
||||
rawConfig["GPUDEV"] = settings.value("GPUDEV", "auto").toString();
|
||||
rawConfig["HDDDEV"] = settings.value("HDDDEV", "all").toString();
|
||||
rawConfig["HDDTEMPCMD"] = settings.value("HDDTEMPCMD", "sudo smartctl -a").toString();
|
||||
rawConfig["MPDADDRESS"] = settings.value("MPDADDRESS", "localhost").toString();
|
||||
rawConfig["MPDPORT"] = settings.value("MPDPORT", "6600").toString();
|
||||
rawConfig["MPRIS"] = settings.value("MPRIS", "auto").toString();
|
||||
@ -71,31 +66,6 @@ QHash<QString, QString> ExtendedSysMon::updateConfiguration(QHash<QString, QStri
|
||||
{
|
||||
qCDebug(LOG_ESM) << "Raw configuration" << _rawConfig;
|
||||
|
||||
// gpudev
|
||||
if (_rawConfig["GPUDEV"] == "disable")
|
||||
;
|
||||
else if (_rawConfig["GPUDEV"] == "auto")
|
||||
_rawConfig["GPUDEV"] = GPULoadSource::autoGpu();
|
||||
else if ((_rawConfig["GPUDEV"] != "ati") && (_rawConfig["GPUDEV"] != "nvidia"))
|
||||
_rawConfig["GPUDEV"] = GPULoadSource::autoGpu();
|
||||
// hdddev
|
||||
auto allHddDevices = HDDTemperatureSource::allHdd();
|
||||
if (_rawConfig["HDDDEV"] == "all") {
|
||||
_rawConfig["HDDDEV"] = allHddDevices.join(',');
|
||||
} else if (_rawConfig["HDDDEV"] == "disable") {
|
||||
_rawConfig["HDDDEV"] = "";
|
||||
} else {
|
||||
auto deviceList = _rawConfig["HDDDEV"].split(',', Qt::SkipEmptyParts);
|
||||
QStringList devices;
|
||||
auto diskRegexp = QRegularExpression("^/dev/[hms]d[a-z]$");
|
||||
for (auto &device : deviceList)
|
||||
if ((QFile::exists(device)) && (device.contains(diskRegexp)))
|
||||
devices.append(device);
|
||||
if (devices.isEmpty())
|
||||
_rawConfig["HDDDEV"] = allHddDevices.join(',');
|
||||
else
|
||||
_rawConfig["HDDDEV"] = devices.join(',');
|
||||
}
|
||||
// player
|
||||
if ((_rawConfig["PLAYER"] != "mpd") && (_rawConfig["PLAYER"] != "mpris") && (_rawConfig["PLAYER"] != "disable"))
|
||||
_rawConfig["PLAYER"] = "mpris";
|
||||
|
@ -22,9 +22,6 @@
|
||||
#include "customsource.h"
|
||||
#include "desktopsource.h"
|
||||
#include "extsysmonsensor.h"
|
||||
#include "gpuloadsource.h"
|
||||
#include "gputempsource.h"
|
||||
#include "hddtempsource.h"
|
||||
#include "loadsource.h"
|
||||
#include "networksource.h"
|
||||
#include "playersource.h"
|
||||
@ -66,13 +63,6 @@ void ExtSysMonAggregator::init(const QHash<QString, QString> &_config)
|
||||
// desktop
|
||||
// FIXME causes segfault in kde libs
|
||||
// createSensor("desktop", i18n("Desktop"), new DesktopSource(this, {}));
|
||||
// gpu load
|
||||
createSensor("gpuload", i18n("GPU load"), new GPULoadSource(this, {_config["GPUDEV"]}));
|
||||
// gpu temperature
|
||||
createSensor("gputemp", i18n("GPU temperature"), new GPUTemperatureSource(this, {_config["GPUDEV"]}));
|
||||
// hdd temperature
|
||||
createSensor("hdd", i18n("HDD temperature"),
|
||||
new HDDTemperatureSource(this, {_config["HDDDEV"], _config["HDDTEMPCMD"]}));
|
||||
// network
|
||||
createSensor("network", i18n("Network"), new NetworkSource(this, {}));
|
||||
// player
|
||||
|
@ -1,13 +1,6 @@
|
||||
[Configuration]
|
||||
# ACPI devices
|
||||
ACPIPATH=/sys/class/power_supply/
|
||||
# May be 'nvidia' (for nvidia), 'ati' (for ATI RADEON), 'disable' or 'auto'
|
||||
GPUDEV=auto
|
||||
# HDD temperature
|
||||
## Set block device for hddtemp comma separated or use 'all' or 'disable'
|
||||
HDDDEV=all
|
||||
# cmd
|
||||
HDDTEMPCMD=sudo smartctl -a
|
||||
# mpd server settings
|
||||
MPDADDRESS=localhost
|
||||
MPDPORT=6600
|
||||
|
@ -1,151 +0,0 @@
|
||||
/***************************************************************************
|
||||
* This file is part of awesome-widgets *
|
||||
* *
|
||||
* awesome-widgets 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 3 of the *
|
||||
* License, or (at your option) any later version. *
|
||||
* *
|
||||
* awesome-widgets 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 awesome-widgets. If not, see http://www.gnu.org/licenses/ *
|
||||
***************************************************************************/
|
||||
#include "gpuloadsource.h"
|
||||
|
||||
#include <ksysguard/formatter/Unit.h>
|
||||
#include <ksysguard/systemstats/SensorInfo.h>
|
||||
|
||||
#include <QFile>
|
||||
#include <QProcess>
|
||||
|
||||
#include "awdebug.h"
|
||||
|
||||
|
||||
GPULoadSource::GPULoadSource(QObject *_parent, const QStringList &_args)
|
||||
: AbstractExtSysMonSource(_parent, _args)
|
||||
{
|
||||
Q_ASSERT(_args.count() == 1);
|
||||
qCDebug(LOG_ESS) << __PRETTY_FUNCTION__;
|
||||
|
||||
m_device = _args.at(0);
|
||||
|
||||
m_process = new QProcess(nullptr);
|
||||
// fucking magic from http://doc.qt.io/qt-5/qprocess.html#finished
|
||||
connect(m_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
|
||||
[this](int, QProcess::ExitStatus) { return updateValue(); });
|
||||
m_process->waitForFinished(0);
|
||||
}
|
||||
|
||||
|
||||
GPULoadSource::~GPULoadSource()
|
||||
{
|
||||
qCDebug(LOG_ESS) << __PRETTY_FUNCTION__;
|
||||
|
||||
m_process->kill();
|
||||
m_process->deleteLater();
|
||||
}
|
||||
|
||||
|
||||
QString GPULoadSource::autoGpu()
|
||||
{
|
||||
QString gpu = "disable";
|
||||
QFile moduleFile("/proc/modules");
|
||||
if (!moduleFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||
qCWarning(LOG_AW) << "Could not open file as text" << moduleFile.fileName();
|
||||
return gpu;
|
||||
}
|
||||
|
||||
QString output = moduleFile.readAll();
|
||||
moduleFile.close();
|
||||
if (output.contains("fglrx"))
|
||||
gpu = "ati";
|
||||
else if (output.contains("nvidia"))
|
||||
gpu = "nvidia";
|
||||
|
||||
qCInfo(LOG_ESM) << "Device" << gpu;
|
||||
return gpu;
|
||||
}
|
||||
|
||||
|
||||
QVariant GPULoadSource::data(const QString &_source)
|
||||
{
|
||||
qCDebug(LOG_ESS) << "Source" << _source;
|
||||
|
||||
if (_source == "load")
|
||||
run();
|
||||
|
||||
return m_values[_source];
|
||||
}
|
||||
|
||||
|
||||
KSysGuard::SensorInfo *GPULoadSource::initialData(const QString &_source) const
|
||||
{
|
||||
qCDebug(LOG_ESS) << "Source" << _source;
|
||||
|
||||
auto data = new KSysGuard::SensorInfo();
|
||||
if (_source == "load") {
|
||||
data->min = 0.0;
|
||||
data->max = 100.0;
|
||||
data->name = "GPU usage";
|
||||
data->variantType = QVariant::Double;
|
||||
data->unit = KSysGuard::UnitPercent;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
void GPULoadSource::run()
|
||||
{
|
||||
if ((m_device != "nvidia") && (m_device != "ati"))
|
||||
return;
|
||||
// build cmd
|
||||
QString cmd = m_device == "nvidia" ? "nvidia-smi" : "aticonfig";
|
||||
auto args = m_device == "nvidia" ? QStringList({"-q", "-x"}) : QStringList({"--od-getclocks"});
|
||||
qCInfo(LOG_ESS) << "cmd" << cmd;
|
||||
|
||||
m_process->start(cmd, args);
|
||||
}
|
||||
|
||||
|
||||
QStringList GPULoadSource::sources() const
|
||||
{
|
||||
QStringList sources;
|
||||
sources.append("load");
|
||||
|
||||
return sources;
|
||||
}
|
||||
|
||||
|
||||
void GPULoadSource::updateValue()
|
||||
{
|
||||
qCInfo(LOG_ESS) << "Cmd returns" << m_process->exitCode();
|
||||
QString qdebug = QString::fromUtf8(m_process->readAllStandardError()).trimmed();
|
||||
qCInfo(LOG_ESS) << "Error" << qdebug;
|
||||
QString qoutput = QString::fromUtf8(m_process->readAllStandardOutput()).trimmed();
|
||||
qCInfo(LOG_ESS) << "Output" << qoutput;
|
||||
|
||||
if (m_device == "nvidia") {
|
||||
for (auto &str : qoutput.split('\n', Qt::SkipEmptyParts)) {
|
||||
if (!str.contains("<gpu_util>"))
|
||||
continue;
|
||||
auto load = str.remove("<gpu_util>").remove("</gpu_util>").remove('%');
|
||||
m_values["load"] = load.toFloat();
|
||||
break;
|
||||
}
|
||||
} else if (m_device == "ati") {
|
||||
for (auto &str : qoutput.split('\n', Qt::SkipEmptyParts)) {
|
||||
if (!str.contains("load"))
|
||||
continue;
|
||||
QString load = str.split(' ', Qt::SkipEmptyParts)[3].remove('%');
|
||||
m_values["load"] = load.toFloat();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
emit(dataReceived(m_values));
|
||||
}
|
@ -1,52 +0,0 @@
|
||||
/***************************************************************************
|
||||
* This file is part of awesome-widgets *
|
||||
* *
|
||||
* awesome-widgets 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 3 of the *
|
||||
* License, or (at your option) any later version. *
|
||||
* *
|
||||
* awesome-widgets 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 awesome-widgets. If not, see http://www.gnu.org/licenses/ *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef GPULOADSOURCE_H
|
||||
#define GPULOADSOURCE_H
|
||||
|
||||
#include <QObject>
|
||||
|
||||
#include "abstractextsysmonsource.h"
|
||||
|
||||
|
||||
class QProcess;
|
||||
|
||||
class GPULoadSource : public AbstractExtSysMonSource
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit GPULoadSource(QObject *_parent, const QStringList &_args);
|
||||
~GPULoadSource() override;
|
||||
static QString autoGpu();
|
||||
QVariant data(const QString &_source) override;
|
||||
[[nodiscard]] KSysGuard::SensorInfo *initialData(const QString &_source) const override;
|
||||
void run() override;
|
||||
[[nodiscard]] QStringList sources() const override;
|
||||
|
||||
private slots:
|
||||
void updateValue();
|
||||
|
||||
private:
|
||||
// configuration and values
|
||||
QString m_device;
|
||||
QProcess *m_process = nullptr;
|
||||
QVariantHash m_values;
|
||||
};
|
||||
|
||||
|
||||
#endif /* GPULOADSOURCE_H */
|
@ -1,131 +0,0 @@
|
||||
/***************************************************************************
|
||||
* This file is part of awesome-widgets *
|
||||
* *
|
||||
* awesome-widgets 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 3 of the *
|
||||
* License, or (at your option) any later version. *
|
||||
* *
|
||||
* awesome-widgets 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 awesome-widgets. If not, see http://www.gnu.org/licenses/ *
|
||||
***************************************************************************/
|
||||
|
||||
#include "gputempsource.h"
|
||||
|
||||
#include <ksysguard/formatter/Unit.h>
|
||||
#include <ksysguard/systemstats/SensorInfo.h>
|
||||
|
||||
#include <QFile>
|
||||
#include <QProcess>
|
||||
|
||||
#include "awdebug.h"
|
||||
|
||||
|
||||
GPUTemperatureSource::GPUTemperatureSource(QObject *_parent, const QStringList &_args)
|
||||
: AbstractExtSysMonSource(_parent, _args)
|
||||
{
|
||||
Q_ASSERT(_args.count() == 1);
|
||||
qCDebug(LOG_ESS) << __PRETTY_FUNCTION__;
|
||||
|
||||
m_device = _args.at(0);
|
||||
|
||||
m_process = new QProcess(nullptr);
|
||||
// fucking magic from http://doc.qt.io/qt-5/qprocess.html#finished
|
||||
connect(m_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
|
||||
[this](int, QProcess::ExitStatus) { return updateValue(); });
|
||||
m_process->waitForFinished(0);
|
||||
}
|
||||
|
||||
|
||||
GPUTemperatureSource::~GPUTemperatureSource()
|
||||
{
|
||||
qCDebug(LOG_ESS) << __PRETTY_FUNCTION__;
|
||||
|
||||
m_process->kill();
|
||||
m_process->deleteLater();
|
||||
}
|
||||
|
||||
|
||||
QVariant GPUTemperatureSource::data(const QString &_source)
|
||||
{
|
||||
qCDebug(LOG_ESS) << "Source" << _source;
|
||||
|
||||
if (_source == "temperature")
|
||||
run();
|
||||
|
||||
return m_values[_source];
|
||||
}
|
||||
|
||||
|
||||
KSysGuard::SensorInfo *GPUTemperatureSource::initialData(const QString &_source) const
|
||||
{
|
||||
qCDebug(LOG_ESS) << "Source" << _source;
|
||||
|
||||
auto data = new KSysGuard::SensorInfo();
|
||||
if (_source == "temperature") {
|
||||
data->min = 0.0;
|
||||
data->max = 0.0;
|
||||
data->name = "GPU temperature";
|
||||
data->variantType = QVariant::Double;
|
||||
data->unit = KSysGuard::UnitCelsius;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
void GPUTemperatureSource::run()
|
||||
{
|
||||
if ((m_device != "nvidia") && (m_device != "ati"))
|
||||
return;
|
||||
// build cmd
|
||||
QString cmd = m_device == "nvidia" ? "nvidia-smi" : "aticonfig";
|
||||
auto args = m_device == "nvidia" ? QStringList({"-q", "-x"}) : QStringList({"--od-gettemperature"});
|
||||
qCInfo(LOG_ESS) << "cmd" << cmd;
|
||||
|
||||
m_process->start(cmd, args);
|
||||
}
|
||||
|
||||
|
||||
QStringList GPUTemperatureSource::sources() const
|
||||
{
|
||||
QStringList sources;
|
||||
sources.append("temperature");
|
||||
|
||||
return sources;
|
||||
}
|
||||
|
||||
|
||||
void GPUTemperatureSource::updateValue()
|
||||
{
|
||||
qCInfo(LOG_ESS) << "Cmd returns" << m_process->exitCode();
|
||||
QString qdebug = QString::fromUtf8(m_process->readAllStandardError()).trimmed();
|
||||
qCInfo(LOG_ESS) << "Error" << qdebug;
|
||||
QString qoutput = QString::fromUtf8(m_process->readAllStandardOutput()).trimmed();
|
||||
qCInfo(LOG_ESS) << "Output" << qoutput;
|
||||
|
||||
if (m_device == "nvidia") {
|
||||
for (auto &str : qoutput.split('\n', Qt::SkipEmptyParts)) {
|
||||
if (!str.contains("<gpu_temp>"))
|
||||
continue;
|
||||
QString temp = str.remove("<gpu_temp>").remove("C</gpu_temp>");
|
||||
m_values["temperature"] = temp.toFloat();
|
||||
break;
|
||||
}
|
||||
} else if (m_device == "ati") {
|
||||
for (auto &str : qoutput.split('\n', Qt::SkipEmptyParts)) {
|
||||
if (!str.contains("Temperature"))
|
||||
continue;
|
||||
QString temp = str.split(' ', Qt::SkipEmptyParts).at(4);
|
||||
m_values["temperature"] = temp.toFloat();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
emit(dataReceived(m_values));
|
||||
}
|
@ -1,51 +0,0 @@
|
||||
/***************************************************************************
|
||||
* This file is part of awesome-widgets *
|
||||
* *
|
||||
* awesome-widgets 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 3 of the *
|
||||
* License, or (at your option) any later version. *
|
||||
* *
|
||||
* awesome-widgets 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 awesome-widgets. If not, see http://www.gnu.org/licenses/ *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef GPUTEMPSOURCE_H
|
||||
#define GPUTEMPSOURCE_H
|
||||
|
||||
#include <QObject>
|
||||
|
||||
#include "abstractextsysmonsource.h"
|
||||
|
||||
|
||||
class QProcess;
|
||||
|
||||
class GPUTemperatureSource : public AbstractExtSysMonSource
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit GPUTemperatureSource(QObject *_parent, const QStringList &_args);
|
||||
~GPUTemperatureSource() override;
|
||||
QVariant data(const QString &_source) override;
|
||||
[[nodiscard]] KSysGuard::SensorInfo *initialData(const QString &_source) const override;
|
||||
void run() override;
|
||||
[[nodiscard]] QStringList sources() const override;
|
||||
|
||||
private slots:
|
||||
void updateValue();
|
||||
|
||||
private:
|
||||
// configuration and values
|
||||
QString m_device;
|
||||
QProcess *m_process = nullptr;
|
||||
QVariantHash m_values;
|
||||
};
|
||||
|
||||
|
||||
#endif /* GPUTEMPSOURCE_H */
|
@ -1,152 +0,0 @@
|
||||
/***************************************************************************
|
||||
* This file is part of awesome-widgets *
|
||||
* *
|
||||
* awesome-widgets 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 3 of the *
|
||||
* License, or (at your option) any later version. *
|
||||
* *
|
||||
* awesome-widgets 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 awesome-widgets. If not, see http://www.gnu.org/licenses/ *
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
#include "hddtempsource.h"
|
||||
|
||||
#include <ksysguard/formatter/Unit.h>
|
||||
#include <ksysguard/systemstats/SensorInfo.h>
|
||||
|
||||
#include <QDir>
|
||||
#include <QProcess>
|
||||
|
||||
#include "awdebug.h"
|
||||
|
||||
|
||||
HDDTemperatureSource::HDDTemperatureSource(QObject *_parent, const QStringList &_args)
|
||||
: AbstractExtSysMonSource(_parent, _args)
|
||||
{
|
||||
Q_ASSERT(_args.count() == 2);
|
||||
qCDebug(LOG_ESS) << __PRETTY_FUNCTION__;
|
||||
|
||||
m_devices = _args.at(0).split(',', Qt::SkipEmptyParts);
|
||||
m_cmd = _args.at(1).split(' '); // lets hope no one put cmd with spaces here lol
|
||||
|
||||
m_smartctl = m_cmd.contains("smartctl");
|
||||
qCInfo(LOG_ESS) << "Parse as smartctl" << m_smartctl;
|
||||
|
||||
for (auto &device : m_devices) {
|
||||
m_processes[device] = new QProcess(nullptr);
|
||||
// fucking magic from http://doc.qt.io/qt-5/qprocess.html#finished
|
||||
connect(m_processes[device], QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
|
||||
[this, &device](int, QProcess::ExitStatus) { return updateValue(device); });
|
||||
m_processes[device]->waitForFinished(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
HDDTemperatureSource::~HDDTemperatureSource()
|
||||
{
|
||||
qCDebug(LOG_ESS) << __PRETTY_FUNCTION__;
|
||||
|
||||
for (auto &device : m_devices) {
|
||||
m_processes[device]->kill();
|
||||
m_processes[device]->deleteLater();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
QStringList HDDTemperatureSource::allHdd()
|
||||
{
|
||||
QStringList allDevices = QDir("/dev").entryList(QDir::System, QDir::Name);
|
||||
QStringList devices = allDevices.filter(QRegularExpression("^[hms]d[a-z]$"));
|
||||
for (int i = 0; i < devices.count(); i++)
|
||||
devices[i] = QString("/dev/%1").arg(devices.at(i));
|
||||
|
||||
qCInfo(LOG_ESS) << "Device list" << devices;
|
||||
return devices;
|
||||
}
|
||||
|
||||
|
||||
QVariant HDDTemperatureSource::data(const QString &_source)
|
||||
{
|
||||
qCDebug(LOG_ESS) << "Source" << _source;
|
||||
|
||||
QString device = _source;
|
||||
device.remove("temperature");
|
||||
// run cmd
|
||||
if (m_processes[device]->state() == QProcess::NotRunning) {
|
||||
auto cmd = m_cmd.first();
|
||||
auto args = m_cmd.mid(1);
|
||||
args.append(device);
|
||||
m_processes[device]->start(cmd, args);
|
||||
}
|
||||
|
||||
return m_values[device];
|
||||
}
|
||||
|
||||
|
||||
KSysGuard::SensorInfo *HDDTemperatureSource::initialData(const QString &_source) const
|
||||
{
|
||||
qCDebug(LOG_ESS) << "Source" << _source;
|
||||
|
||||
auto device = _source;
|
||||
device.remove("temperature");
|
||||
|
||||
auto data = new KSysGuard::SensorInfo();
|
||||
data->min = 0.0;
|
||||
data->max = 0.0;
|
||||
data->name = QString("HDD '%1' temperature").arg(device);
|
||||
data->variantType = QVariant::Double;
|
||||
data->unit = KSysGuard::UnitCelsius;
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
QStringList HDDTemperatureSource::sources() const
|
||||
{
|
||||
QStringList sources;
|
||||
for (auto &device : m_devices)
|
||||
sources.append(QString("temperature%1").arg(device));
|
||||
|
||||
return sources;
|
||||
}
|
||||
|
||||
|
||||
void HDDTemperatureSource::updateValue(const QString &_device)
|
||||
{
|
||||
qCDebug(LOG_ESS) << "Called with device" << _device;
|
||||
|
||||
qCInfo(LOG_ESS) << "Cmd returns" << m_processes[_device]->exitCode();
|
||||
QString qdebug = QString::fromUtf8(m_processes[_device]->readAllStandardError()).trimmed();
|
||||
qCInfo(LOG_ESS) << "Error" << qdebug;
|
||||
QString qoutput = QString::fromUtf8(m_processes[_device]->readAllStandardOutput()).trimmed();
|
||||
qCInfo(LOG_ESS) << "Output" << qoutput;
|
||||
|
||||
// parse
|
||||
if (m_smartctl) {
|
||||
QStringList lines = qoutput.split('\n', Qt::SkipEmptyParts);
|
||||
for (auto &str : lines) {
|
||||
if (!str.startsWith("194"))
|
||||
continue;
|
||||
if (str.split(' ', Qt::SkipEmptyParts).count() < 9)
|
||||
continue;
|
||||
m_values[_device] = str.split(' ', Qt::SkipEmptyParts).at(9).toFloat();
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
QStringList lines = qoutput.split(':', Qt::SkipEmptyParts);
|
||||
if (lines.count() >= 3) {
|
||||
QString temp = lines.at(2);
|
||||
temp.remove(QChar(0260)).remove('C');
|
||||
m_values[_device] = temp.toFloat();
|
||||
}
|
||||
}
|
||||
|
||||
emit(dataReceived(m_values));
|
||||
}
|
@ -1,55 +0,0 @@
|
||||
/***************************************************************************
|
||||
* This file is part of awesome-widgets *
|
||||
* *
|
||||
* awesome-widgets 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 3 of the *
|
||||
* License, or (at your option) any later version. *
|
||||
* *
|
||||
* awesome-widgets 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 awesome-widgets. If not, see http://www.gnu.org/licenses/ *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef HDDTEMPSOURCE_H
|
||||
#define HDDTEMPSOURCE_H
|
||||
|
||||
#include <QObject>
|
||||
|
||||
#include "abstractextsysmonsource.h"
|
||||
|
||||
|
||||
class QProcess;
|
||||
|
||||
class HDDTemperatureSource : public AbstractExtSysMonSource
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit HDDTemperatureSource(QObject *_parent, const QStringList &_args);
|
||||
~HDDTemperatureSource() override;
|
||||
static QStringList allHdd();
|
||||
QVariant data(const QString &_source) override;
|
||||
[[nodiscard]] KSysGuard::SensorInfo *initialData(const QString &_source) const override;
|
||||
void run() override{};
|
||||
[[nodiscard]] QStringList sources() const override;
|
||||
|
||||
private slots:
|
||||
void updateValue(const QString &_device);
|
||||
|
||||
private:
|
||||
// properties
|
||||
QHash<QString, QProcess *> m_processes;
|
||||
// configuration and values
|
||||
QStringList m_cmd;
|
||||
QStringList m_devices;
|
||||
bool m_smartctl;
|
||||
QHash<QString, QVariant> m_values;
|
||||
};
|
||||
|
||||
|
||||
#endif /* HDDTEMPSOURCE_H */
|
@ -29,7 +29,7 @@ set(TEST_MODULES
|
||||
abstractextitem extquotes extscript extupgrade extweather
|
||||
abstractformatter datetimeformatter floatformatter jsonformatter listformatter noformatter scriptformatter stringformatter
|
||||
extitemaggregator
|
||||
batterysource desktopsource gpuloadsource gputempsource hddtempsource networksource playersource processessource
|
||||
batterysource desktopsource networksource playersource processessource
|
||||
awbugreporter awconfighelper awkeycache awkeys awpatternfunctions awtelemetryhandler awupdatehelper
|
||||
dpplugin)
|
||||
foreach (TEST_MODULE ${TEST_MODULES})
|
||||
|
@ -1,66 +0,0 @@
|
||||
/***************************************************************************
|
||||
* This file is part of awesome-widgets *
|
||||
* *
|
||||
* awesome-widgets 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 3 of the *
|
||||
* License, or (at your option) any later version. *
|
||||
* *
|
||||
* awesome-widgets 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 awesome-widgets. If not, see http://www.gnu.org/licenses/ *
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
#include "testgpuloadsource.h"
|
||||
|
||||
#include <QtTest>
|
||||
|
||||
#include "awtestlibrary.h"
|
||||
#include "gpuloadsource.h"
|
||||
|
||||
|
||||
void TestGPULoadSource::initTestCase()
|
||||
{
|
||||
AWTestLibrary::init();
|
||||
device = GPULoadSource::autoGpu();
|
||||
QVERIFY(!device.isEmpty());
|
||||
|
||||
source = new GPULoadSource(this, QStringList() << device);
|
||||
}
|
||||
|
||||
|
||||
void TestGPULoadSource::cleanupTestCase()
|
||||
{
|
||||
delete source;
|
||||
}
|
||||
|
||||
|
||||
void TestGPULoadSource::test_sources()
|
||||
{
|
||||
QCOMPARE(source->sources(), QStringList() << src);
|
||||
}
|
||||
|
||||
|
||||
void TestGPULoadSource::test_gpuload()
|
||||
{
|
||||
if (device == "disable")
|
||||
QSKIP("Not supported device, test will be skipped");
|
||||
|
||||
QSignalSpy spy(source, SIGNAL(dataReceived(const QVariantHash &)));
|
||||
float firstValue = source->data(src).toFloat();
|
||||
|
||||
QVERIFY(spy.wait(5000));
|
||||
QVariantHash arguments = spy.takeFirst().at(0).toHash();
|
||||
float secondValue = arguments[src].toFloat();
|
||||
|
||||
QCOMPARE(firstValue, 0.0f);
|
||||
QVERIFY((secondValue >= load.first) && (secondValue <= load.second));
|
||||
}
|
||||
|
||||
|
||||
QTEST_MAIN(TestGPULoadSource);
|
@ -1,48 +0,0 @@
|
||||
/***************************************************************************
|
||||
* This file is part of awesome-widgets *
|
||||
* *
|
||||
* awesome-widgets 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 3 of the *
|
||||
* License, or (at your option) any later version. *
|
||||
* *
|
||||
* awesome-widgets 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 awesome-widgets. If not, see http://www.gnu.org/licenses/ *
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
#ifndef TESTGPULOADSOURCE_H
|
||||
#define TESTGPULOADSOURCE_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QPair>
|
||||
|
||||
|
||||
class GPULoadSource;
|
||||
|
||||
class TestGPULoadSource : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private slots:
|
||||
// initialization
|
||||
void initTestCase();
|
||||
void cleanupTestCase();
|
||||
// test
|
||||
void test_sources();
|
||||
void test_gpuload();
|
||||
|
||||
private:
|
||||
GPULoadSource *source = nullptr;
|
||||
QString device;
|
||||
QString src = "gpu/load";
|
||||
QPair<float, float> load = QPair<float, float>(0.0f, 100.0f);
|
||||
};
|
||||
|
||||
|
||||
#endif /* TESTGPULOADSOURCE_H */
|
@ -1,67 +0,0 @@
|
||||
/***************************************************************************
|
||||
* This file is part of awesome-widgets *
|
||||
* *
|
||||
* awesome-widgets 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 3 of the *
|
||||
* License, or (at your option) any later version. *
|
||||
* *
|
||||
* awesome-widgets 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 awesome-widgets. If not, see http://www.gnu.org/licenses/ *
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
#include "testgputempsource.h"
|
||||
|
||||
#include <QtTest>
|
||||
|
||||
#include "awtestlibrary.h"
|
||||
#include "gpuloadsource.h"
|
||||
#include "gputempsource.h"
|
||||
|
||||
|
||||
void TestGPUTemperatureSource::initTestCase()
|
||||
{
|
||||
AWTestLibrary::init();
|
||||
device = GPULoadSource::autoGpu();
|
||||
QVERIFY(!device.isEmpty());
|
||||
|
||||
source = new GPUTemperatureSource(this, QStringList() << device);
|
||||
}
|
||||
|
||||
|
||||
void TestGPUTemperatureSource::cleanupTestCase()
|
||||
{
|
||||
delete source;
|
||||
}
|
||||
|
||||
|
||||
void TestGPUTemperatureSource::test_sources()
|
||||
{
|
||||
QCOMPARE(source->sources(), QStringList() << src);
|
||||
}
|
||||
|
||||
|
||||
void TestGPUTemperatureSource::test_gputemp()
|
||||
{
|
||||
if (device == "disable")
|
||||
QSKIP("Not supported device, test will be skipped");
|
||||
|
||||
QSignalSpy spy(source, SIGNAL(dataReceived(const QVariantHash &)));
|
||||
float firstValue = source->data(src).toFloat();
|
||||
|
||||
QVERIFY(spy.wait(5000));
|
||||
QVariantHash arguments = spy.takeFirst().at(0).toHash();
|
||||
float secondValue = arguments[src].toFloat();
|
||||
|
||||
QCOMPARE(firstValue, 0.0f);
|
||||
QVERIFY((secondValue >= temp.first) && (secondValue <= temp.second));
|
||||
}
|
||||
|
||||
|
||||
QTEST_MAIN(TestGPUTemperatureSource);
|
@ -1,48 +0,0 @@
|
||||
/***************************************************************************
|
||||
* This file is part of awesome-widgets *
|
||||
* *
|
||||
* awesome-widgets 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 3 of the *
|
||||
* License, or (at your option) any later version. *
|
||||
* *
|
||||
* awesome-widgets 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 awesome-widgets. If not, see http://www.gnu.org/licenses/ *
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
#ifndef TESTGPUTEMPSOURCE_H
|
||||
#define TESTGPUTEMPSOURCE_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QPair>
|
||||
|
||||
|
||||
class GPUTemperatureSource;
|
||||
|
||||
class TestGPUTemperatureSource : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private slots:
|
||||
// initialization
|
||||
void initTestCase();
|
||||
void cleanupTestCase();
|
||||
// test
|
||||
void test_sources();
|
||||
void test_gputemp();
|
||||
|
||||
private:
|
||||
GPUTemperatureSource *source = nullptr;
|
||||
QString device;
|
||||
QString src = "gpu/temperature";
|
||||
QPair<float, float> temp = QPair<float, float>(0.0f, 120.0f);
|
||||
};
|
||||
|
||||
|
||||
#endif /* TESTGPUTEMPSOURCE_H */
|
@ -1,96 +0,0 @@
|
||||
/***************************************************************************
|
||||
* This file is part of awesome-widgets *
|
||||
* *
|
||||
* awesome-widgets 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 3 of the *
|
||||
* License, or (at your option) any later version. *
|
||||
* *
|
||||
* awesome-widgets 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 awesome-widgets. If not, see http://www.gnu.org/licenses/ *
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
#include "testhddtempsource.h"
|
||||
|
||||
#include <QtTest>
|
||||
|
||||
#include "awtestlibrary.h"
|
||||
#include "hddtempsource.h"
|
||||
|
||||
|
||||
void TestHDDTemperatureSource::initTestCase()
|
||||
{
|
||||
AWTestLibrary::init();
|
||||
devices = HDDTemperatureSource::allHdd();
|
||||
|
||||
hddtempSource = new HDDTemperatureSource(this, QStringList() << devices.join(',') << hddtempCmd);
|
||||
smartctlSource = new HDDTemperatureSource(this, QStringList() << devices.join(',') << smartctlCmd);
|
||||
}
|
||||
|
||||
|
||||
void TestHDDTemperatureSource::cleanupTestCase()
|
||||
{
|
||||
delete hddtempSource;
|
||||
delete smartctlSource;
|
||||
}
|
||||
|
||||
|
||||
void TestHDDTemperatureSource::test_sources()
|
||||
{
|
||||
if (devices.isEmpty())
|
||||
QSKIP("No hdd devices found, test will be skipped");
|
||||
|
||||
std::for_each(devices.begin(), devices.end(), [](QString &device) { device.prepend("hdd/temperature"); });
|
||||
|
||||
QCOMPARE(hddtempSource->sources(), devices);
|
||||
QCOMPARE(smartctlSource->sources(), devices);
|
||||
}
|
||||
|
||||
|
||||
void TestHDDTemperatureSource::test_hddtemp()
|
||||
{
|
||||
if (devices.isEmpty())
|
||||
QSKIP("No hdd devices found, test will be skipped");
|
||||
|
||||
std::for_each(devices.begin(), devices.end(), [this](QString device) {
|
||||
QSignalSpy spy(hddtempSource, SIGNAL(dataReceived(const QVariantHash &)));
|
||||
float firstValue = hddtempSource->data(device).toFloat();
|
||||
|
||||
QVERIFY(spy.wait(5000));
|
||||
QVariantHash arguments = spy.takeFirst().at(0).toHash();
|
||||
device.remove("hdd/temperature");
|
||||
float secondValue = arguments[device].toFloat();
|
||||
|
||||
QCOMPARE(firstValue, 0.0f);
|
||||
QVERIFY((secondValue >= temp.first) && (secondValue <= temp.second));
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
void TestHDDTemperatureSource::test_smartctl()
|
||||
{
|
||||
if (devices.isEmpty())
|
||||
QSKIP("No hdd devices found, test will be skipped");
|
||||
|
||||
std::for_each(devices.begin(), devices.end(), [this](QString &device) {
|
||||
QSignalSpy spy(smartctlSource, SIGNAL(dataReceived(const QVariantHash &)));
|
||||
float firstValue = smartctlSource->data(device).toFloat();
|
||||
|
||||
QVERIFY(spy.wait(5000));
|
||||
QVariantHash arguments = spy.takeFirst().at(0).toHash();
|
||||
device.remove("hdd/temperature");
|
||||
float secondValue = arguments[device].toFloat();
|
||||
|
||||
QCOMPARE(firstValue, 0.0f);
|
||||
QVERIFY((secondValue >= temp.first) && (secondValue <= temp.second));
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
QTEST_MAIN(TestHDDTemperatureSource);
|
@ -1,51 +0,0 @@
|
||||
/***************************************************************************
|
||||
* This file is part of awesome-widgets *
|
||||
* *
|
||||
* awesome-widgets 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 3 of the *
|
||||
* License, or (at your option) any later version. *
|
||||
* *
|
||||
* awesome-widgets 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 awesome-widgets. If not, see http://www.gnu.org/licenses/ *
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
#ifndef TESTHDDTEMPSOURCE_H
|
||||
#define TESTHDDTEMPSOURCE_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QPair>
|
||||
|
||||
|
||||
class HDDTemperatureSource;
|
||||
|
||||
class TestHDDTemperatureSource : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private slots:
|
||||
// initialization
|
||||
void initTestCase();
|
||||
void cleanupTestCase();
|
||||
// test
|
||||
void test_sources();
|
||||
void test_hddtemp();
|
||||
void test_smartctl();
|
||||
|
||||
private:
|
||||
HDDTemperatureSource *hddtempSource = nullptr;
|
||||
HDDTemperatureSource *smartctlSource = nullptr;
|
||||
QStringList devices;
|
||||
QString hddtempCmd = "sudo hddtemp";
|
||||
QString smartctlCmd = "sudo smartctl -a";
|
||||
QPair<float, float> temp = QPair<float, float>(0.0f, 120.0f);
|
||||
};
|
||||
|
||||
|
||||
#endif /* TESTHDDTEMPSOURCE_H */
|
@ -54,7 +54,7 @@ const char STATIC_FUNCTIONS[] = "{{\n\n}},template{{\n\n}},aw_all<>{{}},aw_"
|
||||
"count<>{{}},aw_keys<>{{}},aw_macro<>{{}},aw_"
|
||||
"names<>{{}}";
|
||||
const char STATIC_KEYS[] = "time,isotime,shorttime,longtime,tstime,ctime,uptime,cuptime,cpucl,cpu,"
|
||||
"gputemp,gpu,memmb,memgb,memfreemb,memfreegb,memtotmb,memtotgb,memusedmb,"
|
||||
"gpu,memmb,memgb,memfreemb,memfreegb,memtotmb,memtotgb,memusedmb,"
|
||||
"memusedgb,mem,swapmb,swapgb,swapfreemb,swapfreegb,swaptotmb,swaptotgb,"
|
||||
"swap,downunits,upunits,downkb,downtotkb,downtot,down,uptotkb,uptot,upkb,"
|
||||
"up,netdev,ac,bat,batleft,batnow,batrate,battotal,album,artist,duration,"
|
||||
|
Loading…
Reference in New Issue
Block a user