X-Git-Url: http://git.wpitchoune.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Flmsensor.c;h=1708f18eced3f0cfd1a1a04f6cd81ddc0d596dee;hb=7ac0c530e67161923db3c91252331148f713144f;hp=8bf9d138924d8bcd1c90a66dfa2f5f0e63d3f3ab;hpb=abc393ec7a59355835cc56dad8e67e8f54c8e262;p=psensor.git diff --git a/src/lib/lmsensor.c b/src/lib/lmsensor.c index 8bf9d13..1708f18 100644 --- a/src/lib/lmsensor.c +++ b/src/lib/lmsensor.c @@ -1,22 +1,21 @@ /* - Copyright (C) 2010-2011 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 published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301 USA -*/ - + * Copyright (C) 2010-2014 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 + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ #include #include #define _(str) gettext(str) @@ -30,6 +29,8 @@ #include "psensor.h" +static int init_done; + static double get_value(const sensors_chip_name *name, const sensors_subfeature *sub) { @@ -38,8 +39,7 @@ static double get_value(const sensors_chip_name *name, err = sensors_get_value(name, sub->number, &val); if (err) { - fprintf(stderr, - _("ERROR: Can't get value of subfeature %s: %s\n"), + log_err(_("lmsensor: cannot get value of subfeature %s: %s."), sub->name, sensors_strerror(err)); val = UNKNOWN_DBL_VALUE; } @@ -80,30 +80,34 @@ void lmsensor_psensor_list_update(struct psensor **sensors) { struct psensor **s_ptr = sensors; + if (!init_done) + return ; + while (*s_ptr) { - struct psensor *sensor = *s_ptr; + struct psensor *s = *s_ptr; - if (sensor->type == SENSOR_TYPE_LMSENSOR_TEMP) - psensor_set_current_value - (sensor, get_temp_input(sensor)); - else if (sensor->type == SENSOR_TYPE_LMSENSOR_FAN) - psensor_set_current_value(sensor, - get_fan_input(sensor)); + 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)); + } s_ptr++; } } -struct psensor * +static struct psensor * lmsensor_psensor_create(const sensors_chip_name *chip, const sensors_feature *feature, int values_max_length) { char name[200]; const sensors_subfeature *sf; - char *label; int type; - char *id; + char *id, *label, *cname; struct psensor *psensor; sensors_subfeature_type fault_subfeature; @@ -112,13 +116,11 @@ lmsensor_psensor_create(const sensors_chip_name *chip, if (feature->type == SENSORS_FEATURE_TEMP) { fault_subfeature = SENSORS_SUBFEATURE_TEMP_FAULT; - } else if (feature->type == SENSORS_FEATURE_FAN) { fault_subfeature = SENSORS_SUBFEATURE_FAN_FAULT; - } else { - fprintf(stderr, - _("ERROR: create_sensor, wrong feature type\n")); + log_err(_( +"lmsensor: lmsensor_psensor_create failure: wrong feature type.")); return NULL; } @@ -130,11 +132,11 @@ lmsensor_psensor_create(const sensors_chip_name *chip, if (!label) return NULL; - type = 0; + type = SENSOR_TYPE_LMSENSOR; if (feature->type == SENSORS_FEATURE_TEMP) - type = SENSOR_TYPE_LMSENSOR_TEMP; + type |= SENSOR_TYPE_TEMP; else if (feature->type == SENSORS_FEATURE_FAN) - type = SENSOR_TYPE_LMSENSOR_FAN; + type |= (SENSOR_TYPE_RPM|SENSOR_TYPE_FAN); else return NULL; @@ -142,7 +144,20 @@ lmsensor_psensor_create(const sensors_chip_name *chip, 1); sprintf(id, "lmsensor %s %s", name, label); - psensor = psensor_create(id, label, type, values_max_length); + if (!strcmp(chip->prefix, "coretemp")) + cname = strdup(_("Intel CPU")); + else if (!strcmp(chip->prefix, "k10temp") + || !strcmp(chip->prefix, "k8temp") + || !strcmp(chip->prefix, "fam15h_power")) + cname = strdup(_("AMD CPU")); + else if (!strcmp(chip->prefix, "nouveau")) + cname = strdup(_("NVIDIA GPU")); + else if (!strcmp(chip->prefix, "via-cputemp")) + cname = strdup(_("VIA CPU")); + else + cname = strdup(chip->prefix); + + psensor = psensor_create(id, label, cname, type, values_max_length); psensor->iname = chip; psensor->feature = feature; @@ -156,16 +171,60 @@ lmsensor_psensor_create(const sensors_chip_name *chip, return psensor; } -int lmsensor_init() +struct psensor **lmsensor_psensor_list_add(struct psensor **sensors, + int vn) +{ + const sensors_chip_name *chip; + int chip_nr = 0; + struct psensor **tmp, **result; + const sensors_feature *feature; + struct psensor *s; + int i; + + if (!init_done) + return NULL; + + result = sensors; + while ((chip = sensors_get_detected_chips(NULL, &chip_nr))) { + + i = 0; + while ((feature = sensors_get_features(chip, &i))) { + + if (feature->type == SENSORS_FEATURE_TEMP + || feature->type == SENSORS_FEATURE_FAN) { + + s = lmsensor_psensor_create(chip, feature, vn); + + if (s) { + tmp = psensor_list_add(result, s); + + if (tmp != sensors) + free(result); + + result = tmp; + } + } + } + } + + return result; +} + +void lmsensor_init() { int err = sensors_init(NULL); if (err) { - fprintf(stderr, - _("ERROR: lm-sensors initialization failure: %s\n"), + log_err(_("lmsensor: initialization failure: %s."), sensors_strerror(err)); - return 0; + init_done = 0; } else { - return 1; + init_done = 1; } } + +void lmsensor_cleanup() +{ + if (init_done) + sensors_cleanup(); +}