Changeset 5185

Show
Ignore:
Timestamp:
04/17/08 03:30:37 (7 years ago)
Author:
djwong
Message:

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

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@…>

Location:
lm-sensors/branches/lm-sensors-3.0.0
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • lm-sensors/branches/lm-sensors-3.0.0/CHANGES

    r5184 r5185  
    33 
    44SVN-HEAD 
    5   sensors: Print energy and power sensors 
     5  sensors: Print energy and power sensors with automatically scaled units 
    66  libsensors: Use __func__ instead of __FUNCTION__ 
    77              Parse the configuration file in C locale 
  • lm-sensors/branches/lm-sensors-3.0.0/prog/sensors/chips.c

    r5184 r5185  
    2424#include <stdlib.h> 
    2525#include <string.h> 
     26#include <math.h> 
    2627 
    2728#include "main.h" 
     
    402403} 
    403404 
     405struct scale_table { 
     406        double upper_bound; 
     407        const char *unit; 
     408}; 
     409 
     410static void scale_value(double *value, const char **prefixstr) 
     411{ 
     412        double abs_value = fabs(*value); 
     413        double divisor = 1e-9; 
     414        static struct scale_table prefix_scales[] = { 
     415                {1e-6, "n"}, 
     416                {1e-3, "u"}, 
     417                {1,    "m"}, 
     418                {1e3,   ""}, 
     419                {1e6,  "k"}, 
     420                {1e9,  "M"}, 
     421                {0,    "G"}, /* no upper bound */ 
     422        }; 
     423        struct scale_table *scale = prefix_scales; 
     424 
     425        while (scale->upper_bound && abs_value > scale->upper_bound) { 
     426                divisor = scale->upper_bound; 
     427                scale++; 
     428        } 
     429 
     430        *value /= divisor; 
     431        *prefixstr = scale->unit; 
     432} 
     433 
    404434static void print_chip_power(const sensors_chip_name *name, 
    405435                             const sensors_feature *feature, 
    406436                             int label_size) 
    407437{ 
     438        double val; 
    408439        int need_space = 0; 
    409440        const sensors_subfeature *sf, *sfmin, *sfmax, *sfint; 
    410441        char *label; 
     442        const char *unit; 
    411443 
    412444        if (!(label = sensors_get_label(name, feature))) { 
     
    420452        sf = sensors_get_subfeature(name, feature, 
    421453                                    SENSORS_SUBFEATURE_POWER_AVERAGE); 
    422         if (sf) 
    423                 printf("%6.2f W", get_value(name, sf)); 
    424         else 
     454        if (sf) { 
     455                val = get_value(name, sf); 
     456                scale_value(&val, &unit); 
     457                printf("%6.2f %sW", val, unit); 
     458        } else 
    425459                printf("     N/A"); 
    426460 
     
    435469 
    436470                if (sfmin) { 
    437                         printf("min = %6.2f W", get_value(name, sfmin)); 
     471                        val = get_value(name, sfmin); 
     472                        scale_value(&val, &unit); 
     473                        printf("min = %6.2f %sW", val, unit); 
    438474                        need_space = 1; 
    439475                } 
    440476 
    441477                if (sfmax) { 
    442                         printf("%smax = %6.2f W", (need_space ? ", " : ""), 
    443                                get_value(name, sfmax)); 
     478                        val = get_value(name, sfmax); 
     479                        scale_value(&val, &unit); 
     480                        printf("%smax = %6.2f %sW", (need_space ? ", " : ""), 
     481                               val, unit); 
    444482                        need_space = 1; 
    445483                } 
     
    460498                              int label_size) 
    461499{ 
     500        double val; 
    462501        const sensors_subfeature *sf; 
    463502        char *label; 
     503        const char *unit; 
    464504 
    465505        if (!(label = sensors_get_label(name, feature))) { 
     
    473513        sf = sensors_get_subfeature(name, feature, 
    474514                                    SENSORS_SUBFEATURE_ENERGY_INPUT); 
    475         if (sf) 
    476                 printf("%6.2f J", get_value(name, sf)); 
    477         else 
     515        if (sf) { 
     516                val = get_value(name, sf); 
     517                scale_value(&val, &unit); 
     518                printf("%6.2f %sJ", val, unit); 
     519        } else 
    478520                printf("     N/A"); 
    479521