File indexing completed on 2024-05-19 05:30:18
0001 /* 0002 SPDX-FileCopyrightText: 2020 David Redondo <kde@david-redondo.de> 0003 SPDX-FileCopyrightText: 2022 Alessio Bonfiglio <alessio.bonfiglio@mail.polimi.it> 0004 0005 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0006 */ 0007 0008 #include "cpu.h" 0009 0010 #include <functional> 0011 #include <iterator> 0012 #include <numeric> 0013 0014 #include <KLocalizedString> 0015 #include <systemstats/AggregateSensor.h> 0016 0017 BaseCpuObject::BaseCpuObject(const QString &id, const QString &name, KSysGuard::SensorContainer *parent) 0018 : SensorObject(id, name, parent) 0019 { 0020 } 0021 0022 void BaseCpuObject::makeSensors() 0023 { 0024 m_usage = new KSysGuard::SensorProperty(QStringLiteral("usage"), QStringLiteral("usage"), 0, this); 0025 m_system = new KSysGuard::SensorProperty(QStringLiteral("system"), QStringLiteral("system"), 0, this); 0026 m_user = new KSysGuard::SensorProperty(QStringLiteral("user"), QStringLiteral("user"), 0, this); 0027 m_wait = new KSysGuard::SensorProperty(QStringLiteral("wait"), QStringLiteral("wait"), 0, this); 0028 auto n = new KSysGuard::SensorProperty(QStringLiteral("name"), i18nc("@title", "Name"), name(), this); 0029 n->setVariantType(QVariant::String); 0030 } 0031 0032 0033 void BaseCpuObject::initialize() 0034 { 0035 makeSensors(); 0036 0037 m_usage->setPrefix(name()); 0038 m_usage->setName(i18nc("@title", "Total Usage")); 0039 m_usage->setShortName(i18nc("@title, Short for 'Total Usage'", "Usage")); 0040 m_usage->setUnit(KSysGuard::UnitPercent); 0041 m_usage->setVariantType(QVariant::Double); 0042 m_usage->setMax(100); 0043 0044 m_system->setPrefix(name()); 0045 m_system->setName(i18nc("@title", "System Usage")); 0046 m_system->setShortName(i18nc("@title, Short for 'System Usage'", "System")); 0047 m_system->setUnit(KSysGuard::UnitPercent); 0048 m_system->setVariantType(QVariant::Double); 0049 m_system->setMax(100); 0050 0051 m_user->setPrefix(name()); 0052 m_user->setName(i18nc("@title", "User Usage")); 0053 m_user->setShortName(i18nc("@title, Short for 'User Usage'", "User")); 0054 m_user->setUnit(KSysGuard::UnitPercent); 0055 m_user->setVariantType(QVariant::Double); 0056 m_user->setMax(100); 0057 0058 m_wait->setPrefix(name()); 0059 m_wait->setName(i18nc("@title", "Wait Usage")); 0060 m_wait->setShortName(i18nc("@title, Short for 'Wait Load'", "Wait")); 0061 m_wait->setUnit(KSysGuard::UnitPercent); 0062 m_wait->setVariantType(QVariant::Double); 0063 m_wait->setMax(100); 0064 } 0065 0066 0067 CpuObject::CpuObject(const QString &id, const QString &name, KSysGuard::SensorContainer *parent) 0068 : BaseCpuObject(id, name, parent) 0069 { 0070 } 0071 0072 void CpuObject::makeSensors() 0073 { 0074 BaseCpuObject::makeSensors(); 0075 0076 m_frequency = new KSysGuard::SensorProperty(QStringLiteral("frequency"), QStringLiteral("frequency"), 0, this); 0077 m_temperature = new KSysGuard::SensorProperty(QStringLiteral("temperature"), QStringLiteral("temperature"), 0, this); 0078 } 0079 0080 void CpuObject::initialize() 0081 { 0082 BaseCpuObject::initialize(); 0083 0084 m_frequency->setPrefix(name()); 0085 m_frequency->setName(i18nc("@title", "Current Frequency")); 0086 m_frequency->setShortName(i18nc("@title, Short for 'Current Frequency'", "Frequency")); 0087 m_frequency->setDescription(i18nc("@info", "Current frequency of the CPU")); 0088 m_frequency->setVariantType(QVariant::Double); 0089 m_frequency->setUnit(KSysGuard::Unit::UnitMegaHertz); 0090 0091 m_temperature->setPrefix(name()); 0092 m_temperature->setName(i18nc("@title", "Current Temperature")); 0093 m_temperature->setShortName(i18nc("@title, Short for Current Temperatur", "Temperature")); 0094 m_temperature->setVariantType(QVariant::Double); 0095 m_temperature->setUnit(KSysGuard::Unit::UnitCelsius); 0096 } 0097 0098 0099 AllCpusObject::AllCpusObject(KSysGuard::SensorContainer *parent) 0100 : BaseCpuObject(QStringLiteral("all"), i18nc("@title", "All"), parent) 0101 { 0102 } 0103 0104 void AllCpusObject::makeSensors() 0105 { 0106 BaseCpuObject::makeSensors(); 0107 0108 m_cpuCount = new KSysGuard::SensorProperty(QStringLiteral("cpuCount"), this); 0109 m_coreCount = new KSysGuard::SensorProperty(QStringLiteral("coreCount"), this); 0110 0111 auto maxAggregator = [](QVariant a, QVariant b) {return std::max(a.toDouble(), b.toDouble());}; 0112 auto minAggregator = [](QVariant a, QVariant b) {return std::min(a.toDouble(), b.toDouble());}; 0113 auto avgAggregator = [](KSysGuard::AggregateSensor::SensorIterator begin, const KSysGuard::AggregateSensor::SensorIterator end) { 0114 int count = std::distance(begin, end); 0115 double sum = std::transform_reduce(begin, end, 0.0, std::plus{}, [](auto val) { return qvariant_cast<double>(val); }); 0116 return sum / count; 0117 }; 0118 0119 auto maxFrequency = new KSysGuard::AggregateSensor(this, "maximumFrequency", i18nc("@title", "Maximum CPU Frequency")); 0120 maxFrequency->setShortName(i18nc("@title, Short for 'Maximum CPU Frequency'", "Max Frequency")); 0121 maxFrequency->setDescription(i18nc("@info", "Current maximum frequency between all CPUs")); 0122 maxFrequency->setUnit(KSysGuard::Unit::UnitMegaHertz); 0123 maxFrequency->setMatchSensors(QRegularExpression("^(?!all).*$"), "frequency"); 0124 maxFrequency->setAggregateFunction(maxAggregator); 0125 0126 auto minFrequency = new KSysGuard::AggregateSensor(this, "minimumFrequency", i18nc("@title", "Minimum CPU Frequency")); 0127 minFrequency->setShortName(i18nc("@title, Short for 'Minimum CPU Frequency'", "Min Frequency")); 0128 minFrequency->setDescription(i18nc("@info", "Current minimum frequency between all CPUs")); 0129 minFrequency->setUnit(KSysGuard::Unit::UnitMegaHertz); 0130 minFrequency->setMatchSensors(QRegularExpression("^(?!all).*$"), "frequency"); 0131 minFrequency->setAggregateFunction(minAggregator); 0132 0133 auto avgFrequency = new KSysGuard::AggregateSensor(this, "averageFrequency", i18nc("@title", "Average CPU Frequency")); 0134 avgFrequency ->setShortName(i18nc("@title, Short for 'Average CPU Frequency'", "Average Frequency")); 0135 avgFrequency ->setDescription(i18nc("@info", "Current average frequency between all CPUs")); 0136 avgFrequency ->setUnit(KSysGuard::Unit::UnitMegaHertz); 0137 avgFrequency ->setMatchSensors(QRegularExpression("^(?!all).*$"), "frequency"); 0138 avgFrequency ->setAggregateFunction(avgAggregator); 0139 0140 auto maxTemp = new KSysGuard::AggregateSensor(this, "maximumTemperature", i18nc("@title", "Maximum CPU Temperature")); 0141 maxTemp->setShortName(i18nc("@title, Short for 'Maximum CPU Temperature'", "Max Temperature")); 0142 maxTemp->setVariantType(QVariant::Double); 0143 maxTemp->setUnit(KSysGuard::Unit::UnitCelsius); 0144 maxTemp->setMatchSensors(QRegularExpression("^(?!all).*$"), "temperature"); 0145 maxTemp->setAggregateFunction(maxAggregator); 0146 0147 auto minTemp = new KSysGuard::AggregateSensor(this, "minimumTemperature", i18nc("@title", "Minimum CPU Temperature")); 0148 minTemp->setShortName(i18nc("@title, Short for 'Minimum CPU Temperature'", "Min Temperature")); 0149 minTemp->setVariantType(QVariant::Double); 0150 minTemp->setUnit(KSysGuard::Unit::UnitCelsius); 0151 minTemp->setMatchSensors(QRegularExpression("^(?!all).*$"), "temperature"); 0152 minTemp->setAggregateFunction(minAggregator); 0153 0154 auto avgTemp = new KSysGuard::AggregateSensor(this, "averageTemperature", i18nc("@title", "Average CPU Temperature")); 0155 avgTemp->setShortName(i18nc("@title, Short for 'Average CPU Temperature'", "Average Temperature")); 0156 avgTemp->setVariantType(QVariant::Double); 0157 avgTemp->setUnit(KSysGuard::Unit::UnitCelsius); 0158 avgTemp->setMatchSensors(QRegularExpression("^(?!all).*$"), "temperature"); 0159 avgTemp->setAggregateFunction(avgAggregator); 0160 } 0161 0162 void AllCpusObject::initialize() 0163 { 0164 BaseCpuObject::initialize(); 0165 0166 m_usage->setPrefix(QString()); 0167 m_system->setPrefix(QString()); 0168 m_user->setPrefix(QString()); 0169 m_wait->setPrefix(QString()); 0170 0171 m_cpuCount->setName(i18nc("@title", "Number of CPUs")); 0172 m_cpuCount->setShortName(i18nc("@title, Short fort 'Number of CPUs'", "CPUs")); 0173 m_cpuCount->setDescription(i18nc("@info", "Number of physical CPUs installed in the system")); 0174 0175 m_coreCount->setName(i18nc("@title", "Number of Cores")); 0176 m_coreCount->setShortName(i18nc("@title, Short fort 'Number of Cores'", "Cores")); 0177 m_coreCount->setDescription(i18nc("@info", "Number of CPU cores across all physical CPUS")); 0178 } 0179 0180 void AllCpusObject::setCounts(unsigned int cpuCount, unsigned int coreCount) 0181 { 0182 m_cpuCount->setValue(cpuCount); 0183 m_coreCount->setValue(coreCount); 0184 }