$OpenBSD: patch-src_print_cpu_temperature_c,v 1.5 2012/10/09 17:12:31 jasper Exp $ - Default to acpitz(4) for temperature readings, instead of cpu(4). The acpitz(4) values are eventually used by the kernel to determine if the machine is getting too hot. Other devices can be used by setting 'path' in the config file to the sysctl(3) device node. - Temperature sensors can now set a 'max_threshold' value to color the output red if exceeded. --- src/print_cpu_temperature.c.orig Wed Oct 3 13:44:44 2012 +++ src/print_cpu_temperature.c Tue Oct 9 20:36:23 2012 @@ -23,6 +23,8 @@ #include #include #include + +#define MUKTOC(v) ((v - 273150000) / 1000000.0) #endif static char *thermal_zone; @@ -32,11 +34,11 @@ static char *thermal_zone; * returns the temperature in degree celcius. * */ -void print_cpu_temperature_info(yajl_gen json_gen, char *buffer, int zone, const char *path, const char *format) { +void print_cpu_temperature_info(yajl_gen json_gen, char *buffer, int zone, const char *path, const char *format, int max_threshold) { #ifdef THERMAL_ZONE const char *walk; char *outwalk = buffer; - static char buf[16]; + bool colorful_output; if (path == NULL) asprintf(&thermal_zone, THERMAL_ZONE, zone); @@ -54,6 +56,7 @@ void print_cpu_temperature_info(yajl_gen json_gen, cha if (BEGINS_WITH(walk+1, "degrees")) { #if defined(LINUX) + static char buf[16]; long int temp; if (!slurp(path, buf, sizeof(buf))) goto error; @@ -87,21 +90,27 @@ void print_cpu_temperature_info(yajl_gen json_gen, cha break; goto error; } - /* - * 'path' is actually the node within the full path (eg, cpu0). - * XXX: Extend the API to allow a string instead of just an int for path, this would - * allow us to have a path of 'acpitz0' for example. - */ + /* 'path' is the node within the full path (defaults to acpitz0). */ if (strncmp(sensordev.xname, path, strlen(path)) == 0) { mib[3] = SENSOR_TEMP; - for (numt = 0; numt < sensordev.maxnumt[SENSOR_TEMP]; numt++) { + /* Limit to temo0, but should retrieve from a full path... */ + for (numt = 0; numt < 1 /*sensordev.maxnumt[SENSOR_TEMP]*/; numt++) { mib[4] = numt; if (sysctl(mib, 5, &sensor, &slen, NULL, 0) == -1) { - if (errno != ENOENT) + if (errno != ENOENT) { warn("sysctl"); - continue; + continue; + } } - outwalk += sprintf(outwalk, "%.2f", (sensor.value - 273150000) / 1000000.0 ); + if ((int)MUKTOC(sensor.value) >= max_threshold) { + START_COLOR("color_bad"); + colorful_output = true; + } + + outwalk += sprintf(outwalk, "%.2f", MUKTOC(sensor.value)); + + if (colorful_output) + END_COLOR; } } } @@ -109,9 +118,9 @@ void print_cpu_temperature_info(yajl_gen json_gen, cha walk += strlen("degrees"); } } +error: OUTPUT_FULL_TEXT(buffer); return; -error: #endif OUTPUT_FULL_TEXT("cant read temp"); (void)fputs("i3status: Cannot read temperature. Verify that you have a thermal zone in /sys/class/thermal or disable the cpu_temperature module in your i3status config.\n", stderr);