From 4b0600d8f8f1f6aaae6fc2e59e8697ff8779cf64 Mon Sep 17 00:00:00 2001 From: Arnavion Date: Fri, 9 Aug 2019 21:34:48 -0700 Subject: Add new display option to also show CPU frequency in CPU meters. The option is only implemented on Linux. On other platforms, and on Linuxes that do not expose the relevant sysfs file, the frequency will be 0. The "CPU average" meter does not show a frequency, only the individual per-CPU meters. --- CPUMeter.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'CPUMeter.c') diff --git a/CPUMeter.c b/CPUMeter.c index de5490df..6f9419b5 100644 --- a/CPUMeter.c +++ b/CPUMeter.c @@ -28,7 +28,8 @@ typedef enum { CPU_METER_STEAL = 5, CPU_METER_GUEST = 6, CPU_METER_IOWAIT = 7, - CPU_METER_ITEMCOUNT = 8, // number of entries in this enum + CPU_METER_FREQUENCY = 8, + CPU_METER_ITEMCOUNT = 9, // number of entries in this enum } CPUMeterValues; }*/ @@ -63,7 +64,22 @@ static void CPUMeter_updateValues(Meter* this, char* buffer, int size) { } memset(this->values, 0, sizeof(double) * CPU_METER_ITEMCOUNT); double percent = Platform_setCPUValues(this, cpu); - xSnprintf(buffer, size, "%5.1f%%", percent); + if (cpu != 0 && this->pl->settings->showCPUFrequency) { + /* Initial frequency is in KHz. Divide it by 1024 till it's less than 1024, and emit unit accordingly */ + double cpuFrequency = this->values[CPU_METER_FREQUENCY]; + char unit = 'K'; + if (cpuFrequency > 1024) { + cpuFrequency /= 1024; + unit = 'M'; + } + if (cpuFrequency > 1024) { + cpuFrequency /= 1024; + unit = 'G'; + } + xSnprintf(buffer, size, "%5.1f%% %.1f%cHz", percent, cpuFrequency, unit); + } else { + xSnprintf(buffer, size, "%5.1f%%", percent); + } } static void CPUMeter_display(Object* cast, RichString* out) { -- cgit v1.2.3