aboutsummaryrefslogtreecommitdiffstats
path: root/CPUMeter.c
diff options
context:
space:
mode:
Diffstat (limited to 'CPUMeter.c')
-rw-r--r--CPUMeter.c154
1 files changed, 102 insertions, 52 deletions
diff --git a/CPUMeter.c b/CPUMeter.c
index d84e4db..28fb730 100644
--- a/CPUMeter.c
+++ b/CPUMeter.c
@@ -10,7 +10,6 @@ in the source distribution for its full text.
#include "CPUMeter.h"
#include <math.h>
-#include <stdint.h>
#include <stdlib.h>
#include <string.h>
@@ -35,37 +34,48 @@ static const int CPUMeter_attributes[] = {
};
typedef struct CPUMeterData_ {
- int cpus;
+ unsigned int cpus;
Meter** meters;
} CPUMeterData;
static void CPUMeter_init(Meter* this) {
- int cpu = this->param;
- if (this->pl->cpuCount > 1) {
+ unsigned int cpu = this->param;
+ if (cpu == 0) {
+ Meter_setCaption(this, "Avg");
+ } else if (this->pl->activeCPUs > 1) {
char caption[10];
- xSnprintf(caption, sizeof(caption), "%3d", Settings_cpuId(this->pl->settings, cpu - 1));
+ xSnprintf(caption, sizeof(caption), "%3u", Settings_cpuId(this->pl->settings, cpu - 1));
Meter_setCaption(this, caption);
}
- if (this->param == 0)
- Meter_setCaption(this, "Avg");
}
-static void CPUMeter_updateValues(Meter* this, char* buffer, size_t size) {
- int cpu = this->param;
- if (cpu > this->pl->cpuCount) {
- xSnprintf(buffer, size, "absent");
- for (uint8_t i = 0; i < this->curItems; i++)
- this->values[i] = 0;
+// Custom uiName runtime logic to include the param (processor)
+static void CPUMeter_getUiName(const Meter* this, char* buffer, size_t length) {
+ if (this->param > 0)
+ xSnprintf(buffer, length, "%s %u", Meter_uiName(this), this->param);
+ else
+ xSnprintf(buffer, length, "%s", Meter_uiName(this));
+}
+
+static void CPUMeter_updateValues(Meter* this) {
+ memset(this->values, 0, sizeof(double) * CPU_METER_ITEMCOUNT);
+
+ unsigned int cpu = this->param;
+ if (cpu > this->pl->existingCPUs) {
+ xSnprintf(this->txtBuffer, sizeof(this->txtBuffer), "absent");
+ return;
+ }
+
+ double percent = Platform_setCPUValues(this, cpu);
+ if (isnan(percent)) {
+ xSnprintf(this->txtBuffer, sizeof(this->txtBuffer), "offline");
return;
}
- memset(this->values, 0, sizeof(double) * CPU_METER_ITEMCOUNT);
char cpuUsageBuffer[8] = { 0 };
char cpuFrequencyBuffer[16] = { 0 };
char cpuTemperatureBuffer[16] = { 0 };
- double percent = Platform_setCPUValues(this, cpu);
-
if (this->pl->settings->showCPUUsage) {
xSnprintf(cpuUsageBuffer, sizeof(cpuUsageBuffer), "%.1f%%", percent);
}
@@ -79,7 +89,7 @@ static void CPUMeter_updateValues(Meter* this, char* buffer, size_t size) {
}
}
- #ifdef HAVE_SENSORS_SENSORS_H
+ #ifdef BUILD_WITH_CPU_TEMP
if (this->pl->settings->showCPUTemperature) {
double cpuTemperature = this->values[CPU_METER_TEMPERATURE];
if (isnan(cpuTemperature))
@@ -91,7 +101,7 @@ static void CPUMeter_updateValues(Meter* this, char* buffer, size_t size) {
}
#endif
- xSnprintf(buffer, size, "%s%s%s%s%s",
+ xSnprintf(this->txtBuffer, sizeof(this->txtBuffer), "%s%s%s%s%s",
cpuUsageBuffer,
(cpuUsageBuffer[0] && (cpuFrequencyBuffer[0] || cpuTemperatureBuffer[0])) ? " " : "",
cpuFrequencyBuffer,
@@ -101,75 +111,82 @@ static void CPUMeter_updateValues(Meter* this, char* buffer, size_t size) {
static void CPUMeter_display(const Object* cast, RichString* out) {
char buffer[50];
+ int len;
const Meter* this = (const Meter*)cast;
- RichString_prune(out);
- if (this->param > this->pl->cpuCount) {
- RichString_appendAscii(out, CRT_colors[METER_TEXT], "absent");
+
+ if (this->param > this->pl->existingCPUs) {
+ RichString_appendAscii(out, CRT_colors[METER_SHADOW], " absent");
return;
}
- xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_NORMAL]);
+
+ if (this->curItems == 0) {
+ RichString_appendAscii(out, CRT_colors[METER_SHADOW], " offline");
+ return;
+ }
+
+ len = xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_NORMAL]);
RichString_appendAscii(out, CRT_colors[METER_TEXT], ":");
- RichString_appendAscii(out, CRT_colors[CPU_NORMAL], buffer);
+ RichString_appendnAscii(out, CRT_colors[CPU_NORMAL], buffer, len);
if (this->pl->settings->detailedCPUTime) {
- xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_KERNEL]);
+ len = xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_KERNEL]);
RichString_appendAscii(out, CRT_colors[METER_TEXT], "sy:");
- RichString_appendAscii(out, CRT_colors[CPU_SYSTEM], buffer);
- xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_NICE]);
+ RichString_appendnAscii(out, CRT_colors[CPU_SYSTEM], buffer, len);
+ len = xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_NICE]);
RichString_appendAscii(out, CRT_colors[METER_TEXT], "ni:");
- RichString_appendAscii(out, CRT_colors[CPU_NICE_TEXT], buffer);
- xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_IRQ]);
+ RichString_appendnAscii(out, CRT_colors[CPU_NICE_TEXT], buffer, len);
+ len = xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_IRQ]);
RichString_appendAscii(out, CRT_colors[METER_TEXT], "hi:");
- RichString_appendAscii(out, CRT_colors[CPU_IRQ], buffer);
- xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_SOFTIRQ]);
+ RichString_appendnAscii(out, CRT_colors[CPU_IRQ], buffer, len);
+ len = xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_SOFTIRQ]);
RichString_appendAscii(out, CRT_colors[METER_TEXT], "si:");
- RichString_appendAscii(out, CRT_colors[CPU_SOFTIRQ], buffer);
+ RichString_appendnAscii(out, CRT_colors[CPU_SOFTIRQ], buffer, len);
if (!isnan(this->values[CPU_METER_STEAL])) {
- xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_STEAL]);
+ len = xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_STEAL]);
RichString_appendAscii(out, CRT_colors[METER_TEXT], "st:");
- RichString_appendAscii(out, CRT_colors[CPU_STEAL], buffer);
+ RichString_appendnAscii(out, CRT_colors[CPU_STEAL], buffer, len);
}
if (!isnan(this->values[CPU_METER_GUEST])) {
- xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_GUEST]);
+ len = xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_GUEST]);
RichString_appendAscii(out, CRT_colors[METER_TEXT], "gu:");
- RichString_appendAscii(out, CRT_colors[CPU_GUEST], buffer);
+ RichString_appendnAscii(out, CRT_colors[CPU_GUEST], buffer, len);
}
- xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_IOWAIT]);
+ len = xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_IOWAIT]);
RichString_appendAscii(out, CRT_colors[METER_TEXT], "wa:");
- RichString_appendAscii(out, CRT_colors[CPU_IOWAIT], buffer);
+ RichString_appendnAscii(out, CRT_colors[CPU_IOWAIT], buffer, len);
} else {
- xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_KERNEL]);
+ len = xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_KERNEL]);
RichString_appendAscii(out, CRT_colors[METER_TEXT], "sys:");
- RichString_appendAscii(out, CRT_colors[CPU_SYSTEM], buffer);
- xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_NICE]);
+ RichString_appendnAscii(out, CRT_colors[CPU_SYSTEM], buffer, len);
+ len = xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_NICE]);
RichString_appendAscii(out, CRT_colors[METER_TEXT], "low:");
- RichString_appendAscii(out, CRT_colors[CPU_NICE_TEXT], buffer);
+ RichString_appendnAscii(out, CRT_colors[CPU_NICE_TEXT], buffer, len);
if (!isnan(this->values[CPU_METER_IRQ])) {
- xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_IRQ]);
+ len = xSnprintf(buffer, sizeof(buffer), "%5.1f%% ", this->values[CPU_METER_IRQ]);
RichString_appendAscii(out, CRT_colors[METER_TEXT], "vir:");
- RichString_appendAscii(out, CRT_colors[CPU_GUEST], buffer);
+ RichString_appendnAscii(out, CRT_colors[CPU_GUEST], buffer, len);
}
}
- #ifdef HAVE_SENSORS_SENSORS_H
+ #ifdef BUILD_WITH_CPU_TEMP
if (this->pl->settings->showCPUTemperature) {
char cpuTemperatureBuffer[10];
double cpuTemperature = this->values[CPU_METER_TEMPERATURE];
if (isnan(cpuTemperature)) {
- xSnprintf(cpuTemperatureBuffer, sizeof(cpuTemperatureBuffer), "N/A");
+ len = xSnprintf(cpuTemperatureBuffer, sizeof(cpuTemperatureBuffer), "N/A");
} else if (this->pl->settings->degreeFahrenheit) {
- xSnprintf(cpuTemperatureBuffer, sizeof(cpuTemperatureBuffer), "%5.1f%sF", cpuTemperature * 9 / 5 + 32, CRT_degreeSign);
+ len = xSnprintf(cpuTemperatureBuffer, sizeof(cpuTemperatureBuffer), "%5.1f%sF", cpuTemperature * 9 / 5 + 32, CRT_degreeSign);
} else {
- xSnprintf(cpuTemperatureBuffer, sizeof(cpuTemperatureBuffer), "%5.1f%sC", cpuTemperature, CRT_degreeSign);
+ len = xSnprintf(cpuTemperatureBuffer, sizeof(cpuTemperatureBuffer), "%5.1f%sC", cpuTemperature, CRT_degreeSign);
}
RichString_appendAscii(out, CRT_colors[METER_TEXT], "temp:");
- RichString_appendWide(out, CRT_colors[METER_VALUE], cpuTemperatureBuffer);
+ RichString_appendnWide(out, CRT_colors[METER_VALUE], cpuTemperatureBuffer, len);
}
#endif
}
-static void AllCPUsMeter_getRange(Meter* this, int* start, int* count) {
- CPUMeterData* data = this->meterData;
- int cpus = data->cpus;
+static void AllCPUsMeter_getRange(const Meter* this, int* start, int* count) {
+ const CPUMeterData* data = this->meterData;
+ unsigned int cpus = data->cpus;
switch(Meter_name(this)[0]) {
default:
case 'A': // All
@@ -187,8 +204,17 @@ static void AllCPUsMeter_getRange(Meter* this, int* start, int* count) {
}
}
+static void AllCPUsMeter_updateValues(Meter* this) {
+ CPUMeterData* data = this->meterData;
+ Meter** meters = data->meters;
+ int start, count;
+ AllCPUsMeter_getRange(this, &start, &count);
+ for (int i = 0; i < count; i++)
+ Meter_updateValues(meters[i]);
+}
+
static void CPUMeterCommonInit(Meter* this, int ncol) {
- int cpus = this->pl->cpuCount;
+ unsigned int cpus = this->pl->existingCPUs;
CPUMeterData* data = this->meterData;
if (!data) {
data = this->meterData = xMalloc(sizeof(CPUMeterData));
@@ -316,6 +342,7 @@ const MeterClass CPUMeter_class = {
.display = CPUMeter_display
},
.updateValues = CPUMeter_updateValues,
+ .getUiName = CPUMeter_getUiName,
.defaultMode = BAR_METERMODE,
.maxItems = CPU_METER_ITEMCOUNT,
.total = 100.0,
@@ -332,6 +359,7 @@ const MeterClass AllCPUsMeter_class = {
.delete = Meter_delete,
.display = CPUMeter_display
},
+ .updateValues = AllCPUsMeter_updateValues,
.defaultMode = CUSTOM_METERMODE,
.total = 100.0,
.attributes = CPUMeter_attributes,
@@ -351,7 +379,9 @@ const MeterClass AllCPUs2Meter_class = {
.delete = Meter_delete,
.display = CPUMeter_display
},
+ .updateValues = AllCPUsMeter_updateValues,
.defaultMode = CUSTOM_METERMODE,
+ .isMultiColumn = true,
.total = 100.0,
.attributes = CPUMeter_attributes,
.name = "AllCPUs2",
@@ -370,7 +400,9 @@ const MeterClass LeftCPUsMeter_class = {
.delete = Meter_delete,
.display = CPUMeter_display
},
+ .updateValues = AllCPUsMeter_updateValues,
.defaultMode = CUSTOM_METERMODE,
+ .isMultiColumn = true,
.total = 100.0,
.attributes = CPUMeter_attributes,
.name = "LeftCPUs",
@@ -389,7 +421,9 @@ const MeterClass RightCPUsMeter_class = {
.delete = Meter_delete,
.display = CPUMeter_display
},
+ .updateValues = AllCPUsMeter_updateValues,
.defaultMode = CUSTOM_METERMODE,
+ .isMultiColumn = true,
.total = 100.0,
.attributes = CPUMeter_attributes,
.name = "RightCPUs",
@@ -408,7 +442,9 @@ const MeterClass LeftCPUs2Meter_class = {
.delete = Meter_delete,
.display = CPUMeter_display
},
+ .updateValues = AllCPUsMeter_updateValues,
.defaultMode = CUSTOM_METERMODE,
+ .isMultiColumn = true,
.total = 100.0,
.attributes = CPUMeter_attributes,
.name = "LeftCPUs2",
@@ -427,7 +463,9 @@ const MeterClass RightCPUs2Meter_class = {
.delete = Meter_delete,
.display = CPUMeter_display
},
+ .updateValues = AllCPUsMeter_updateValues,
.defaultMode = CUSTOM_METERMODE,
+ .isMultiColumn = true,
.total = 100.0,
.attributes = CPUMeter_attributes,
.name = "RightCPUs2",
@@ -446,7 +484,9 @@ const MeterClass AllCPUs4Meter_class = {
.delete = Meter_delete,
.display = CPUMeter_display
},
+ .updateValues = AllCPUsMeter_updateValues,
.defaultMode = CUSTOM_METERMODE,
+ .isMultiColumn = true,
.total = 100.0,
.attributes = CPUMeter_attributes,
.name = "AllCPUs4",
@@ -465,7 +505,9 @@ const MeterClass LeftCPUs4Meter_class = {
.delete = Meter_delete,
.display = CPUMeter_display
},
+ .updateValues = AllCPUsMeter_updateValues,
.defaultMode = CUSTOM_METERMODE,
+ .isMultiColumn = true,
.total = 100.0,
.attributes = CPUMeter_attributes,
.name = "LeftCPUs4",
@@ -484,7 +526,9 @@ const MeterClass RightCPUs4Meter_class = {
.delete = Meter_delete,
.display = CPUMeter_display
},
+ .updateValues = AllCPUsMeter_updateValues,
.defaultMode = CUSTOM_METERMODE,
+ .isMultiColumn = true,
.total = 100.0,
.attributes = CPUMeter_attributes,
.name = "RightCPUs4",
@@ -503,7 +547,9 @@ const MeterClass AllCPUs8Meter_class = {
.delete = Meter_delete,
.display = CPUMeter_display
},
+ .updateValues = AllCPUsMeter_updateValues,
.defaultMode = CUSTOM_METERMODE,
+ .isMultiColumn = true,
.total = 100.0,
.attributes = CPUMeter_attributes,
.name = "AllCPUs8",
@@ -522,7 +568,9 @@ const MeterClass LeftCPUs8Meter_class = {
.delete = Meter_delete,
.display = CPUMeter_display
},
+ .updateValues = AllCPUsMeter_updateValues,
.defaultMode = CUSTOM_METERMODE,
+ .isMultiColumn = true,
.total = 100.0,
.attributes = CPUMeter_attributes,
.name = "LeftCPUs8",
@@ -541,7 +589,9 @@ const MeterClass RightCPUs8Meter_class = {
.delete = Meter_delete,
.display = CPUMeter_display
},
+ .updateValues = AllCPUsMeter_updateValues,
.defaultMode = CUSTOM_METERMODE,
+ .isMultiColumn = true,
.total = 100.0,
.attributes = CPUMeter_attributes,
.name = "RightCPUs8",

© 2014-2024 Faster IT GmbH | imprint | privacy policy