File indexing completed on 2024-05-12 17:00:14

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{}, qvariant_cast<double>);
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 }