diff --git a/lib/libsensors.map b/lib/libsensors.map index 5e2dac03..93931491 100644 --- a/lib/libsensors.map +++ b/lib/libsensors.map @@ -15,6 +15,7 @@ global: sensors_parse_chip_name; sensors_set_value; sensors_snprintf_chip_name; + sensors_get_quantity; sensors_strerror; sensors_parse_error; sensors_parse_error_wfn; diff --git a/lib/sensors.h b/lib/sensors.h index 3a25d216..c8350295 100644 --- a/lib/sensors.h +++ b/lib/sensors.h @@ -269,6 +269,13 @@ typedef enum sensors_subfeature_type { SENSORS_SUBFEATURE_UNKNOWN = INT_MAX, } sensors_subfeature_type; +typedef struct sensors_quantity { + const char * quantity; + const char * unit; +} sensors_quantity; + +const sensors_quantity *sensors_get_quantity(sensors_subfeature_type) __attribute__ ((const)); + /* Data about a single chip feature (or category leader) */ struct sensors_feature { char *name; diff --git a/lib/sysfs.c b/lib/sysfs.c index 20e8d2a3..662dd039 100644 --- a/lib/sysfs.c +++ b/lib/sysfs.c @@ -169,6 +169,73 @@ int get_type_scaling(sensors_subfeature_type type) return 1; } +static sensors_quantity none = {"", ""}; +static sensors_quantity bool = {"boolean", ""}; +static sensors_quantity voltage = {"voltage", "V"}; +static sensors_quantity rpm = {"rotation speed", "RPM"}; +static sensors_quantity temperature = {"temperature", "°C"}; +static sensors_quantity power = {"power", "W"}; +static sensors_quantity interval = {"time interval", "s"}; +static sensors_quantity energy = {"energy", "J"}; +static sensors_quantity current = {"electric current", "A"}; +static sensors_quantity humidity = {"humidity", "%RH"}; +static sensors_quantity pwm = {"pwm", "%"}; +static sensors_quantity freq = {"frequency", "Hz"}; + +const sensors_quantity* sensors_get_quantity(sensors_subfeature_type type) +{ + /* Second class subfeatures + that need their own handling */ + switch (type) { + case SENSORS_SUBFEATURE_FAN_DIV: + case SENSORS_SUBFEATURE_FAN_PULSES: + case SENSORS_SUBFEATURE_TEMP_TYPE: + case SENSORS_SUBFEATURE_TEMP_OFFSET: + case SENSORS_SUBFEATURE_PWM_MODE: + return &none; + case SENSORS_SUBFEATURE_POWER_AVERAGE_INTERVAL: + return &interval; + case SENSORS_SUBFEATURE_PWM_FREQ: + return &freq; + default: + break; + } + + /* Generic subfeatures groups */ + switch (type & 0xFF80) { + case SENSORS_SUBFEATURE_IN_ALARM: + case SENSORS_SUBFEATURE_FAN_ALARM: + case SENSORS_SUBFEATURE_TEMP_ALARM: + case SENSORS_SUBFEATURE_POWER_AVERAGE_INTERVAL: + case SENSORS_SUBFEATURE_CURR_ALARM: + case SENSORS_SUBFEATURE_PWM_ENABLE: + case SENSORS_SUBFEATURE_INTRUSION_ALARM: + case SENSORS_SUBFEATURE_BEEP_ENABLE: + return &bool; + case SENSORS_SUBFEATURE_VID: /* reported in mV and scaled */ + case SENSORS_SUBFEATURE_IN_INPUT: + return &voltage; + case SENSORS_SUBFEATURE_FAN_INPUT: + return &rpm; + case SENSORS_SUBFEATURE_TEMP_INPUT: + return &temperature; + case SENSORS_SUBFEATURE_POWER_AVERAGE: + return &power; + case SENSORS_SUBFEATURE_ENERGY_INPUT: + return &energy; + case SENSORS_SUBFEATURE_CURR_INPUT: + return ¤t; + case SENSORS_SUBFEATURE_HUMIDITY_INPUT: + return &humidity; + case SENSORS_SUBFEATURE_PWM_IO: + return &pwm; + case SENSORS_SUBFEATURE_FREQ_INPUT: + return &freq; + } + + return &none; +} + static char *get_feature_name(sensors_feature_type ftype, char *sfname) {