X-Git-Url: https://git.wpitchoune.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Flmsensor.c;h=ccd2fd5115ed4a91dbffbe9646fd0baf10f32ba0;hb=912b5d1986633786a656bb3361f7ae9c1263acef;hp=cf9f0be61407fbe3d28b786365309d47fb64efa5;hpb=2291a5e288aab0c29e2886ae2e60aa254d698e0e;p=psensor.git diff --git a/src/lib/lmsensor.c b/src/lib/lmsensor.c index cf9f0be..ccd2fd5 100644 --- a/src/lib/lmsensor.c +++ b/src/lib/lmsensor.c @@ -27,10 +27,41 @@ #include #include -#include "psensor.h" +#include static int init_done; +static const char *PROVIDER_NAME = "lmsensor"; + +struct lmsensor_data { + const sensors_chip_name *chip; + + const sensors_feature *feature; +}; + +static const sensors_chip_name *get_chip_name(struct psensor *s) +{ + return ((struct lmsensor_data *)s->provider_data)->chip; +} + +static const sensors_feature *get_feature(struct psensor *s) +{ + return ((struct lmsensor_data *)s->provider_data)->feature; +} + +static void lmsensor_data_set(struct psensor *s, + const struct sensors_chip_name *chip, + const struct sensors_feature *feature) +{ + struct lmsensor_data *data; + + data = malloc(sizeof(struct lmsensor_data)); + data->chip = chip; + data->feature = feature; + + s->provider_data = data; +} + static double get_value(const sensors_chip_name *name, const sensors_subfeature *sub) { @@ -39,8 +70,10 @@ static double get_value(const sensors_chip_name *name, err = sensors_get_value(name, sub->number, &val); if (err) { - log_err(_("lmsensor: cannot get value of subfeature %s: %s."), - sub->name, sensors_strerror(err)); + log_err(_("%s: Cannot get value of subfeature %s: %s."), + PROVIDER_NAME, + sub->name, + sensors_strerror(err)); val = UNKNOWN_DBL_VALUE; } return val; @@ -50,12 +83,16 @@ static double get_temp_input(struct psensor *sensor) { const sensors_subfeature *sf; - const sensors_chip_name *chip = sensor->iname; + const sensors_chip_name *chip; + + const sensors_feature *feature; - const sensors_feature *feature = sensor->feature; + chip = get_chip_name(sensor); + feature = get_feature(sensor); sf = sensors_get_subfeature(chip, - feature, SENSORS_SUBFEATURE_TEMP_INPUT); + feature, + SENSORS_SUBFEATURE_TEMP_INPUT); if (sf) return get_value(chip, sf); @@ -64,13 +101,18 @@ static double get_temp_input(struct psensor *sensor) static double get_fan_input(struct psensor *sensor) { - const sensors_chip_name *chip = sensor->iname; - const sensors_feature *feature = sensor->feature; + const sensors_chip_name *chip; + const sensors_feature *feature; const sensors_subfeature *sf; + chip = get_chip_name(sensor); + feature = get_feature(sensor); + sf = sensors_get_subfeature(chip, - feature, SENSORS_SUBFEATURE_FAN_INPUT); + feature, + SENSORS_SUBFEATURE_FAN_INPUT); + if (sf) return get_value(chip, sf); @@ -79,24 +121,28 @@ static double get_fan_input(struct psensor *sensor) void lmsensor_psensor_list_update(struct psensor **sensors) { - struct psensor **s_ptr = sensors; + struct psensor *s; + double v; if (!init_done) return; - while (*s_ptr) { - struct psensor *s = *s_ptr; + while (*sensors) { + s = *sensors; if (!(s->type & SENSOR_TYPE_REMOTE) && s->type & SENSOR_TYPE_LMSENSOR) { + if (s->type & SENSOR_TYPE_TEMP) - psensor_set_current_value(s, - get_temp_input(s)); - else if (s->type & SENSOR_TYPE_RPM) - psensor_set_current_value(s, get_fan_input(s)); + v = get_temp_input(s); + else /* s->type & SENSOR_TYPE_RPM */ + v = get_fan_input(s); + + if (v != UNKNOWN_DBL_VALUE) + psensor_set_current_value(s, v); } - s_ptr++; + sensors++; } } @@ -120,8 +166,7 @@ lmsensor_psensor_create(const sensors_chip_name *chip, } else if (feature->type == SENSORS_FEATURE_FAN) { fault_subfeature = SENSORS_SUBFEATURE_FAN_FAULT; } else { - log_err(_( -"lmsensor: lmsensor_psensor_create failure: wrong feature type.")); + log_err(_("%s: Wrong feature type."), PROVIDER_NAME); return NULL; } @@ -141,9 +186,13 @@ lmsensor_psensor_create(const sensors_chip_name *chip, else return NULL; - id = malloc(strlen("lmsensor ") + 1 + strlen(name) + 1 + strlen(label) + - 1); - sprintf(id, "lmsensor %s %s", name, label); + id = malloc(strlen(PROVIDER_NAME) + + 1 + + strlen(name) + + 1 + + strlen(label) + + 1); + sprintf(id, "%s %s %s", PROVIDER_NAME, name, label); if (!strcmp(chip->prefix, "coretemp")) cname = strdup(_("Intel CPU")); @@ -162,8 +211,15 @@ lmsensor_psensor_create(const sensors_chip_name *chip, psensor = psensor_create(id, label, cname, type, values_max_length); - psensor->iname = chip; - psensor->feature = feature; + sf = sensors_get_subfeature(chip, feature, SENSORS_SUBFEATURE_TEMP_MAX); + if (sf) + psensor->max = get_value(chip, sf); + + sf = sensors_get_subfeature(chip, feature, SENSORS_SUBFEATURE_TEMP_MIN); + if (sf) + psensor->min = get_value(chip, sf); + + lmsensor_data_set(psensor, chip, feature); if (feature->type == SENSORS_FEATURE_TEMP && (get_temp_input(psensor) == UNKNOWN_DBL_VALUE)) { @@ -174,12 +230,15 @@ lmsensor_psensor_create(const sensors_chip_name *chip, return psensor; } -void lmsensor_init() +static void lmsensor_init(void) { - int err = sensors_init(NULL); + int err; + + err = sensors_init(NULL); if (err) { - log_err(_("lmsensor: initialization failure: %s."), + log_err(_("%s: initialization failure: %s."), + PROVIDER_NAME, sensors_strerror(err)); init_done = 0; } else { @@ -190,10 +249,9 @@ void lmsensor_init() void lmsensor_psensor_list_append(struct psensor ***sensors, int vn) { const sensors_chip_name *chip; - int chip_nr = 0; + int chip_nr, i; const sensors_feature *feature; struct psensor *s; - int i; if (!init_done) lmsensor_init(); @@ -201,6 +259,7 @@ void lmsensor_psensor_list_append(struct psensor ***sensors, int vn) if (!init_done) return; + chip_nr = 0; while ((chip = sensors_get_detected_chips(NULL, &chip_nr))) { i = 0; @@ -217,7 +276,7 @@ void lmsensor_psensor_list_append(struct psensor ***sensors, int vn) } } -void lmsensor_cleanup() +void lmsensor_cleanup(void) { if (init_done) sensors_cleanup();