[lm-sensors] [PATCH 3/3 v3]: sensors: Automatically scale energy/power units

Darrick J. Wong djwong at us.ibm.com
Mon Apr 14 23:53:16 CEST 2008


Automatically scale energy and power values when printing them in cooked
mode.  Fixed all the warnings and warts that were brought up by Jean in
the previous thread.

Signed-off-by: Darrick J. Wong <djwong at us.ibm.com>

Index: lm-sensors-3.0.0/prog/sensors/chips.c
===================================================================
--- lm-sensors-3.0.0.orig/prog/sensors/chips.c	2008-04-14 14:43:07.000000000 -0700
+++ lm-sensors-3.0.0/prog/sensors/chips.c	2008-04-14 14:43:49.000000000 -0700
@@ -23,6 +23,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <math.h>
 
 #include "main.h"
 #include "chips.h"
@@ -401,13 +402,44 @@
 	printf("\n");
 }
 
+struct scale_table {
+	double upper_bound;
+	const char *unit;
+};
+
+static void scale_value(double *value, const char **prefixstr)
+{
+	double abs_value = fabs(*value);
+	double divisor = 1e-9;
+	static struct scale_table prefix_scales[] = {
+		{1e-6, "n"},
+		{1e-3, "u"},
+		{1,    "m"},
+		{1e3,   ""},
+		{1e6,  "k"},
+		{1e9,  "M"},
+		{0,    "G"}, /* no upper bound */
+	};
+	struct scale_table *scale = prefix_scales;
+
+	while (scale->upper_bound && abs_value > scale->upper_bound) {
+		divisor = scale->upper_bound;
+		scale++;
+	}
+
+	*value /= divisor;
+	*prefixstr = scale->unit;
+}
+
 static void print_chip_power(const sensors_chip_name *name,
 			     const sensors_feature *feature,
 			     int label_size)
 {
+	double val;
 	int need_space = 0;
 	const sensors_subfeature *sf, *sfmin, *sfmax, *sfint;
 	char *label;
+	const char *unit;
 
 	if (!(label = sensors_get_label(name, feature))) {
 		fprintf(stderr, "ERROR: Can't get label of feature %s!\n",
@@ -419,9 +451,11 @@
 
 	sf = sensors_get_subfeature(name, feature,
 				    SENSORS_SUBFEATURE_POWER_AVERAGE);
-	if (sf)
-		printf("%6.2f W", get_value(name, sf));
-	else
+	if (sf) {
+		val = get_value(name, sf);
+		scale_value(&val, &unit);
+		printf("%6.2f %sW", val, unit);
+	} else
 		printf("     N/A");
 
 	sfmin = sensors_get_subfeature(name, feature,
@@ -434,13 +468,17 @@
 		printf("  (");
 
 		if (sfmin) {
-			printf("min = %6.2f W", get_value(name, sfmin));
+			val = get_value(name, sfmin);
+			scale_value(&val, &unit);
+			printf("min = %6.2f %sW", val, unit);
 			need_space = 1;
 		}
 
 		if (sfmax) {
-			printf("%smax = %6.2f W", (need_space ? ", " : ""),
-			       get_value(name, sfmax));
+			val = get_value(name, sfmax);
+			scale_value(&val, &unit);
+			printf("%smax = %6.2f %sW", (need_space ? ", " : ""),
+			       val, unit);
 			need_space = 1;
 		}
 
@@ -459,8 +497,10 @@
 			      const sensors_feature *feature,
 			      int label_size)
 {
+	double val;
 	const sensors_subfeature *sf;
 	char *label;
+	const char *unit;
 
 	if (!(label = sensors_get_label(name, feature))) {
 		fprintf(stderr, "ERROR: Can't get label of feature %s!\n",
@@ -472,9 +512,11 @@
 
 	sf = sensors_get_subfeature(name, feature,
 				    SENSORS_SUBFEATURE_ENERGY_INPUT);
-	if (sf)
-		printf("%6.2f J", get_value(name, sf));
-	else
+	if (sf) {
+		val = get_value(name, sf);
+		scale_value(&val, &unit);
+		printf("%6.2f %sJ", val, unit);
+	} else
 		printf("     N/A");
 
 	printf("\n");



More information about the lm-sensors mailing list