X-Git-Url: http://wpitchoune.net/gitweb/?p=psensor-pkg-debian.git;a=blobdiff_plain;f=src%2Flib%2Flmsensor.c;h=6f3845d95bcd798e74bb5f3f1ff3ebfd8585676a;hp=baa97efb5c23af41b744309759f54b6d78e963b9;hb=bd7036af56a4b61b2b473dccbeac5e26f78b57da;hpb=48da1ac5531838d157762882ee455cec4da05728;ds=sidebyside diff --git a/src/lib/lmsensor.c b/src/lib/lmsensor.c index baa97ef..6f3845d 100644 --- a/src/lib/lmsensor.c +++ b/src/lib/lmsensor.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010-2014 jeanfi@gmail.com + * Copyright (C) 2010-2016 jeanfi@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -27,12 +27,41 @@ #include #include -#include +#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) { @@ -58,10 +87,10 @@ static double get_temp_input(struct psensor *sensor) const sensors_feature *feature; - chip = sensor->iname; - feature = sensor->feature; + chip = get_chip_name(sensor); + feature = get_feature(sensor); - sf = sensors_get_subfeature(sensor->iname, + sf = sensors_get_subfeature(chip, feature, SENSORS_SUBFEATURE_TEMP_INPUT); if (sf) @@ -72,11 +101,14 @@ 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); @@ -92,7 +124,7 @@ void lmsensor_psensor_list_update(struct psensor **sensors) struct psensor *s; double v; - if (!init_done) + if (!init_done || !sensors) return; while (*sensors) { @@ -124,15 +156,20 @@ lmsensor_psensor_create(const sensors_chip_name *chip, int type; char *id, *label, *cname; struct psensor *psensor; - sensors_subfeature_type fault_subfeature; + sensors_subfeature_type fault_subfeature, min_subfeature, + max_subfeature; if (sensors_snprintf_chip_name(name, 200, chip) < 0) return NULL; if (feature->type == SENSORS_FEATURE_TEMP) { fault_subfeature = SENSORS_SUBFEATURE_TEMP_FAULT; + max_subfeature = SENSORS_SUBFEATURE_TEMP_MAX; + min_subfeature = SENSORS_SUBFEATURE_TEMP_MIN; } else if (feature->type == SENSORS_FEATURE_FAN) { fault_subfeature = SENSORS_SUBFEATURE_FAN_FAULT; + max_subfeature = SENSORS_SUBFEATURE_FAN_MAX; + min_subfeature = SENSORS_SUBFEATURE_FAN_MIN; } else { log_err(_("%s: Wrong feature type."), PROVIDER_NAME); return NULL; @@ -179,8 +216,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, max_subfeature); + if (sf) + psensor->max = get_value(chip, sf); + + sf = sensors_get_subfeature(chip, feature, min_subfeature); + 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)) { @@ -191,7 +235,7 @@ lmsensor_psensor_create(const sensors_chip_name *chip, return psensor; } -void lmsensor_init() +static void lmsensor_init(void) { int err; @@ -237,7 +281,7 @@ void lmsensor_psensor_list_append(struct psensor ***sensors, int vn) } } -void lmsensor_cleanup() +void lmsensor_cleanup(void) { if (init_done) sensors_cleanup();