Created
March 23, 2013 13:32
-
-
Save rstemmer/5227747 to your computer and use it in GitHub Desktop.
Adds a new Meter to htop that displays your core temperatures. You need the lm_sensors package to use this meter. After applying this patch, you have to call ./autogen.sh before configuring and compiling.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff -urN htop-1.0.2-orig/CRT.c htop-1.0.2/CRT.c | |
--- htop-1.0.2-orig/CRT.c 2013-03-23 14:10:29.500604247 +0100 | |
+++ htop-1.0.2/CRT.c 2013-03-23 14:11:01.916663508 +0100 | |
@@ -59,6 +59,9 @@ | |
UPTIME, | |
BATTERY, | |
TASKS_RUNNING, | |
+ TEMPERATURE_COOL, | |
+ TEMPERATURE_MEDIUM, | |
+ TEMPERATURE_HOT, | |
SWAP, | |
PROCESS, | |
PROCESS_SHADOW, | |
@@ -255,6 +258,9 @@ | |
CRT_colors[METER_VALUE] = A_BOLD; | |
CRT_colors[LED_COLOR] = A_NORMAL; | |
CRT_colors[TASKS_RUNNING] = A_BOLD; | |
+ CRT_colors[TEMPERATURE_COOL] = A_DIM; | |
+ CRT_colors[TEMPERATURE_MEDIUM] = A_NORMAL; | |
+ CRT_colors[TEMPERATURE_HOT] = A_BOLD; | |
CRT_colors[PROCESS] = A_NORMAL; | |
CRT_colors[PROCESS_SHADOW] = A_DIM; | |
CRT_colors[PROCESS_TAG] = A_BOLD; | |
@@ -316,6 +322,9 @@ | |
CRT_colors[METER_VALUE] = ColorPair(Black,White); | |
CRT_colors[LED_COLOR] = ColorPair(Green,White); | |
CRT_colors[TASKS_RUNNING] = ColorPair(Green,White); | |
+ CRT_colors[TEMPERATURE_COOL] = ColorPair(Green,White); | |
+ CRT_colors[TEMPERATURE_MEDIUM] = ColorPair(Yellow,White); | |
+ CRT_colors[TEMPERATURE_HOT] = A_BOLD | ColorPair(Red,White); | |
CRT_colors[PROCESS] = ColorPair(Black,White); | |
CRT_colors[PROCESS_SHADOW] = A_BOLD | ColorPair(Black,White); | |
CRT_colors[PROCESS_TAG] = ColorPair(White,Blue); | |
@@ -377,6 +386,9 @@ | |
CRT_colors[METER_VALUE] = ColorPair(Black,Black); | |
CRT_colors[LED_COLOR] = ColorPair(Green,Black); | |
CRT_colors[TASKS_RUNNING] = ColorPair(Green,Black); | |
+ CRT_colors[TEMPERATURE_COOL] = ColorPair(Green,Black); | |
+ CRT_colors[TEMPERATURE_MEDIUM] = ColorPair(Yellow,Black); | |
+ CRT_colors[TEMPERATURE_HOT] = A_BOLD | ColorPair(Red,Black); | |
CRT_colors[PROCESS] = ColorPair(Black,Black); | |
CRT_colors[PROCESS_SHADOW] = A_BOLD | ColorPair(Black,Black); | |
CRT_colors[PROCESS_TAG] = ColorPair(White,Blue); | |
@@ -438,6 +450,9 @@ | |
CRT_colors[METER_VALUE] = A_BOLD | ColorPair(Cyan,Blue); | |
CRT_colors[LED_COLOR] = ColorPair(Green,Blue); | |
CRT_colors[TASKS_RUNNING] = A_BOLD | ColorPair(Green,Blue); | |
+ CRT_colors[TEMPERATURE_COOL] = ColorPair(Green,Blue); | |
+ CRT_colors[TEMPERATURE_MEDIUM] = ColorPair(Yellow,Blue); | |
+ CRT_colors[TEMPERATURE_HOT] = A_BOLD | ColorPair(Red,Blue); | |
CRT_colors[PROCESS] = ColorPair(White,Blue); | |
CRT_colors[PROCESS_SHADOW] = A_BOLD | ColorPair(Black,Blue); | |
CRT_colors[PROCESS_TAG] = A_BOLD | ColorPair(Yellow,Blue); | |
@@ -499,6 +514,9 @@ | |
CRT_colors[METER_VALUE] = ColorPair(Green,Black); | |
CRT_colors[LED_COLOR] = ColorPair(Green,Black); | |
CRT_colors[TASKS_RUNNING] = A_BOLD | ColorPair(Green,Black); | |
+ CRT_colors[TEMPERATURE_COOL] = ColorPair(Cyan,Black); | |
+ CRT_colors[TEMPERATURE_MEDIUM] = ColorPair(Yellow,Black); | |
+ CRT_colors[TEMPERATURE_HOT] = A_BOLD | ColorPair(Red,Black); | |
CRT_colors[PROCESS] = ColorPair(Cyan,Black); | |
CRT_colors[PROCESS_SHADOW] = A_BOLD | ColorPair(Black,Black); | |
CRT_colors[PROCESS_TAG] = A_BOLD | ColorPair(Yellow,Black); | |
@@ -561,6 +579,9 @@ | |
CRT_colors[METER_VALUE] = A_BOLD | ColorPair(Cyan,Black); | |
CRT_colors[LED_COLOR] = ColorPair(Green,Black); | |
CRT_colors[TASKS_RUNNING] = A_BOLD | ColorPair(Green,Black); | |
+ CRT_colors[TEMPERATURE_COOL] = A_BOLD | ColorPair(Green,Black); | |
+ CRT_colors[TEMPERATURE_MEDIUM] = A_BOLD | ColorPair(Yellow,Black); | |
+ CRT_colors[TEMPERATURE_HOT] = A_BOLD | ColorPair(Red,Black); | |
CRT_colors[PROCESS] = A_NORMAL; | |
CRT_colors[PROCESS_SHADOW] = A_BOLD | ColorPair(Black,Black); | |
CRT_colors[PROCESS_TAG] = A_BOLD | ColorPair(Yellow,Black); | |
diff -urN htop-1.0.2-orig/Header.c htop-1.0.2/Header.c | |
--- htop-1.0.2-orig/Header.c 2013-03-23 14:10:29.496604239 +0100 | |
+++ htop-1.0.2/Header.c 2013-03-23 14:11:01.916663508 +0100 | |
@@ -12,6 +12,7 @@ | |
#include "MemoryMeter.h" | |
#include "SwapMeter.h" | |
#include "TasksMeter.h" | |
+#include "TemperatureMeter.h" | |
#include "LoadAverageMeter.h" | |
#include "UptimeMeter.h" | |
#include "BatteryMeter.h" | |
@@ -151,6 +152,7 @@ | |
Vector_add(this->leftMeters, Meter_new(this->pl, 0, &MemoryMeter)); | |
Vector_add(this->leftMeters, Meter_new(this->pl, 0, &SwapMeter)); | |
Vector_add(this->rightMeters, Meter_new(this->pl, 0, &TasksMeter)); | |
+// Vector_add(this->rightMeters, Meter_new(this->pl, 0, &TemperatureMeter)); | |
Vector_add(this->rightMeters, Meter_new(this->pl, 0, &LoadAverageMeter)); | |
Vector_add(this->rightMeters, Meter_new(this->pl, 0, &UptimeMeter)); | |
} | |
diff -urN htop-1.0.2-orig/Makefile.am htop-1.0.2/Makefile.am | |
--- htop-1.0.2-orig/Makefile.am 2013-03-23 14:10:29.499604245 +0100 | |
+++ htop-1.0.2/Makefile.am 2013-03-23 14:12:23.748812438 +0100 | |
@@ -20,7 +20,7 @@ | |
BatteryMeter.c Process.c ProcessList.c RichString.c ScreenManager.c Settings.c \ | |
IOPriorityPanel.c SignalsPanel.c String.c SwapMeter.c TasksMeter.c TraceScreen.c \ | |
UptimeMeter.c UsersTable.c Vector.c AvailableColumnsPanel.c AffinityPanel.c \ | |
-HostnameMeter.c OpenFilesScreen.c Affinity.c IOPriority.c | |
+HostnameMeter.c OpenFilesScreen.c Affinity.c IOPriority.c TemperatureMeter.c | |
myhtopheaders = AvailableColumnsPanel.h AvailableMetersPanel.h \ | |
CategoriesPanel.h CheckItem.h ClockMeter.h ColorsPanel.h ColumnsPanel.h \ | |
@@ -29,7 +29,7 @@ | |
BatteryMeter.h Meter.h MetersPanel.h Object.h Panel.h ProcessList.h RichString.h \ | |
ScreenManager.h Settings.h SignalsPanel.h String.h \ | |
SwapMeter.h TasksMeter.h TraceScreen.h UptimeMeter.h UsersTable.h Vector.h \ | |
-Process.h AffinityPanel.h HostnameMeter.h OpenFilesScreen.h Affinity.h IOPriority.h | |
+Process.h AffinityPanel.h HostnameMeter.h OpenFilesScreen.h Affinity.h IOPriority.h TemperatureMeter.h | |
SUFFIXES = .h | |
diff -urN htop-1.0.2-orig/Meter.c htop-1.0.2/Meter.c | |
--- htop-1.0.2-orig/Meter.c 2013-03-23 14:10:29.499604245 +0100 | |
+++ htop-1.0.2/Meter.c 2013-03-23 14:11:01.917663509 +0100 | |
@@ -11,6 +11,7 @@ | |
#include "MemoryMeter.h" | |
#include "SwapMeter.h" | |
#include "TasksMeter.h" | |
+#include "TemperatureMeter.h" | |
#include "LoadAverageMeter.h" | |
#include "UptimeMeter.h" | |
#include "BatteryMeter.h" | |
@@ -126,6 +127,7 @@ | |
&MemoryMeter, | |
&SwapMeter, | |
&TasksMeter, | |
+ &TemperatureMeter, | |
&UptimeMeter, | |
&BatteryMeter, | |
&HostnameMeter, | |
diff -urN htop-1.0.2-orig/TemperatureMeter.c htop-1.0.2/TemperatureMeter.c | |
--- htop-1.0.2-orig/TemperatureMeter.c 1970-01-01 01:00:00.000000000 +0100 | |
+++ htop-1.0.2/TemperatureMeter.c 2013-03-23 14:11:01.917663509 +0100 | |
@@ -0,0 +1,97 @@ | |
+/* | |
+htop - TemperatureMeter.c | |
+(C) 2013 Ralf Stemmer | |
+Released under the GNU GPL, see the COPYING file | |
+in the source distribution for its full text. | |
+*/ | |
+ | |
+#include "TemperatureMeter.h" | |
+ | |
+#include "ProcessList.h" | |
+#include "CRT.h" | |
+ | |
+#define _GNU_SOURCE | |
+#include <stdio.h> | |
+#include <stdlib.h> | |
+#include <string.h> | |
+#include <limits.h> | |
+ | |
+/*{ | |
+#include "Meter.h" | |
+}*/ | |
+ | |
+int TemperatureMeter_attributes[] = { | |
+ TEMPERATURE_COOL, | |
+ TEMPERATURE_MEDIUM, | |
+ TEMPERATURE_HOT, | |
+}; | |
+ | |
+static void TemperatureMeter_setValues(Meter* this, char* buffer, int len) { | |
+ ProcessList* pl = this->pl; | |
+ this->total = pl->totalTasks; | |
+ this->values[0] = pl->runningTasks; | |
+ snprintf(buffer, len, "%d/%d", (int) this->values[0], (int) this->total); | |
+} | |
+ | |
+static void TemperatureMeter_display(Object* cast, RichString* out) { | |
+ FILE *p; | |
+ p = popen("sensors", "r"); | |
+ if(p == NULL) return 1; | |
+ | |
+ int textColor = CRT_colors[METER_TEXT]; | |
+ int coolColor = CRT_colors[TEMPERATURE_COOL]; | |
+ int mediumColor = CRT_colors[TEMPERATURE_MEDIUM]; | |
+ int hotColor = CRT_colors[TEMPERATURE_HOT]; | |
+ | |
+ size_t read, len; | |
+ char *line = NULL; | |
+ char *entry = NULL; | |
+ char *tstart = NULL, *tend = NULL; | |
+ int temperature; | |
+ while ((read = getline(&line, &len, p)) != -1) { | |
+ // contains this line a core-temperature? | |
+ entry = strstr(line, "Core "); | |
+ if (entry == NULL) continue; | |
+ | |
+ // find the begin of the temperature value | |
+ tstart = strchr(entry, '+'); // no negative temperatures expected :) | |
+ if (tstart == NULL) continue; | |
+ tstart++; // jump over the '+' | |
+ | |
+ // find the end of the temperature. Remember, it can be above 99°C ;) | |
+ tend = strchr(tstart, '.'); // just the integer | |
+ if (tend == NULL) continue; | |
+ | |
+ // convert the string into an integer, this is necessary for further steps | |
+ temperature = strtol(tstart, &tend, 10); | |
+ if (temperature == LONG_MAX || temperature == LONG_MIN) continue; | |
+ if (tstart == tend) continue; | |
+ | |
+ // choose the color for the temperature | |
+ int tempColor; | |
+ if (temperature < 80) tempColor = coolColor; | |
+ else if (temperature >= 80 && temperature < 90) tempColor = mediumColor; | |
+ else tempColor = hotColor; | |
+ | |
+ // output the temperature | |
+ char buffer[20]; | |
+ sprintf(buffer, "%d", temperature); | |
+ RichString_append(out, tempColor, buffer); | |
+ RichString_append(out, textColor, "°C "); | |
+ } | |
+ | |
+ free(line); | |
+ pclose(p); | |
+} | |
+ | |
+MeterType TemperatureMeter = { | |
+ .setValues = TemperatureMeter_setValues, | |
+ .display = TemperatureMeter_display, | |
+ .mode = TEXT_METERMODE, | |
+ .items = 1, | |
+ .total = 100.0, | |
+ .attributes = TemperatureMeter_attributes, | |
+ .name = "Temperature", | |
+ .uiName = "Temperature Sensors", | |
+ .caption = "Temperature: " | |
+}; |
I want to adapt this to make it display temperatures, but for orange pi pc, the way i can see temperatures now is by "cat /path/to/file" would it be possible ?
if yes, can you help?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I have added a fork which updates this to work with htop 1.0.3.