X-Git-Url: https://git.wpitchoune.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fpsensor.c;h=bf7765bcfa31757b891cde5fa01d04326e476173;hb=dcf1b53921f5f9fdab59295be938c766bb572793;hp=96560db150c060394d0d969513f70d906bea53c4;hpb=89f933625c13ceb825059b5499484de9664e0d2e;p=psensor.git diff --git a/src/lib/psensor.c b/src/lib/psensor.c index 96560db..bf7765b 100644 --- a/src/lib/psensor.c +++ b/src/lib/psensor.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-2013 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 @@ -24,42 +23,49 @@ #include #define _(str) gettext(str) -#include -#include - #include "hdd.h" #include "psensor.h" #include "lmsensor.h" -struct psensor *psensor_create(char *id, char *name, - unsigned int type, int values_max_length) +#ifdef HAVE_GTOP +#include "cpu.h" +#endif + +struct psensor *psensor_create(char *id, + char *name, + char *chip, + unsigned int type, + int values_max_length) { struct psensor *psensor = (struct psensor *)malloc(sizeof(struct psensor)); psensor->id = id; psensor->name = name; + psensor->chip = chip; psensor->enabled = 1; - psensor->min = UNKNOWN_VALUE; - psensor->max = UNKNOWN_VALUE; + psensor->min = UNKNOWN_DBL_VALUE; + psensor->max = UNKNOWN_DBL_VALUE; psensor->type = type; psensor->values_max_length = values_max_length; - psensor->measures = measures_create(values_max_length); + psensor->measures = measures_dbl_create(values_max_length); - psensor->alarm_limit = 0; + psensor->alarm_enabled = 0; + psensor->alarm_high_threshold = 0; + psensor->alarm_low_threshold = 0; psensor->cb_alarm_raised = NULL; psensor->cb_alarm_raised_data = NULL; psensor->alarm_raised = 0; - psensor->alarm_enabled = 0; - psensor->url = NULL; psensor->color = NULL; + psensor->appindicator_enabled = 0; + return psensor; } @@ -70,7 +76,7 @@ void psensor_values_resize(struct psensor *s, int new_size) cur_size = s->values_max_length; cur_ms = s->measures; - new_ms = measures_create(new_size); + new_ms = measures_dbl_create(new_size); if (cur_ms) { int i; @@ -88,9 +94,14 @@ void psensor_values_resize(struct psensor *s, int new_size) void psensor_free(struct psensor *sensor) { if (sensor) { + log_debug("Cleanup %s", sensor->id); + free(sensor->name); free(sensor->id); + if (sensor->chip) + free(sensor->chip); + if (sensor->color) free(sensor->color); @@ -148,7 +159,7 @@ int psensor_list_contains_type(struct psensor **sensors, unsigned int type) s = sensors; while (*s) { - if ((*s)->type == type) + if ((*s)->type & type) return 1; s++; } @@ -197,24 +208,46 @@ int is_fan_type(unsigned int type) return type & SENSOR_TYPE_FAN; } -char *psensor_value_to_string(unsigned int type, double value) +double celcius_to_fahrenheit(double c) +{ + return c * (9.0/5.0) + 32; +} + +double fahrenheit_to_celcius(double f) +{ + return (f - 32) * (5.0/9.0); +} + +char * +psensor_value_to_str(unsigned int type, double value, int use_celcius) { - /* should not be possible to exceed 20 characters with temp or - rpm values the .x part is never displayed */ - char *str = malloc(20); + char *str; + const char *unit; - char *unit; + /* + * should not be possible to exceed 20 characters with temp or + * rpm values the .x part is never displayed + */ + str = malloc(20); - if (is_temp_type(type)) - unit = "C"; - else - unit = ""; + unit = psensor_type_to_unit_str(type, use_celcius); + + if (is_temp_type(type) && !use_celcius) + value = celcius_to_fahrenheit(value); sprintf(str, "%.0f%s", value, unit); return str; } +char * +psensor_measure_to_str(const struct measure *m, + unsigned int type, + unsigned int use_celcius) +{ + return psensor_value_to_str(type, m->value, use_celcius); +} + void psensor_set_current_value(struct psensor *sensor, double value) { struct timeval tv; @@ -236,17 +269,16 @@ psensor_set_current_measure(struct psensor *s, s->measures[s->values_max_length - 1].value = v; s->measures[s->values_max_length - 1].time = tv; - if (s->min == UNKNOWN_VALUE || v < s->min) + if (s->min == UNKNOWN_DBL_VALUE || v < s->min) s->min = v; - if (s->max == UNKNOWN_VALUE || v > s->max) + if (s->max == UNKNOWN_DBL_VALUE || v > s->max) s->max = v; - if (s->alarm_limit && s->alarm_enabled) { - if (v > s->alarm_limit) { + if (s->alarm_enabled) { + if (v > s->alarm_high_threshold || v < s->alarm_low_threshold) { if (!s->alarm_raised && s->cb_alarm_raised) - s->cb_alarm_raised(s, - s->cb_alarm_raised_data); + s->cb_alarm_raised(s, s->cb_alarm_raised_data); s->alarm_raised = 1; } else { @@ -255,7 +287,7 @@ psensor_set_current_measure(struct psensor *s, } } -double psensor_get_current_value(struct psensor *sensor) +double psensor_get_current_value(const struct psensor *sensor) { return sensor->measures[sensor->values_max_length - 1].value; } @@ -271,7 +303,7 @@ struct measure *psensor_get_current_measure(struct psensor *sensor) */ double get_min_value(struct psensor **sensors, int type) { - double m = UNKNOWN_VALUE; + double m = UNKNOWN_DBL_VALUE; struct psensor **s = sensors; while (*s) { @@ -284,10 +316,10 @@ double get_min_value(struct psensor **sensors, int type) for (i = 0; i < sensor->values_max_length; i++) { t = sensor->measures[i].value; - if (t == UNKNOWN_VALUE) + if (t == UNKNOWN_DBL_VALUE) continue; - if (m == UNKNOWN_VALUE || t < m) + if (m == UNKNOWN_DBL_VALUE || t < m) m = t; } } @@ -301,9 +333,9 @@ double get_min_value(struct psensor **sensors, int type) Returns the maximal value of a given 'type' (SENSOR_TYPE_TEMP or SENSOR_TYPE_FAN) */ -static double get_max_value(struct psensor **sensors, int type) +double get_max_value(struct psensor **sensors, int type) { - double m = UNKNOWN_VALUE; + double m = UNKNOWN_DBL_VALUE; struct psensor **s = sensors; while (*s) { @@ -315,10 +347,10 @@ static double get_max_value(struct psensor **sensors, int type) for (i = 0; i < sensor->values_max_length; i++) { t = sensor->measures[i].value; - if (t == UNKNOWN_VALUE) + if (t == UNKNOWN_DBL_VALUE) continue; - if (m == UNKNOWN_VALUE || t > m) + if (m == UNKNOWN_DBL_VALUE || t > m) m = t; } } @@ -331,7 +363,7 @@ static double get_max_value(struct psensor **sensors, int type) double psensor_get_max_current_value(struct psensor **sensors, unsigned int type) { - double m = UNKNOWN_VALUE; + double m = UNKNOWN_DBL_VALUE; struct psensor **s_cur = sensors; while (*s_cur) { @@ -340,7 +372,7 @@ psensor_get_max_current_value(struct psensor **sensors, unsigned int type) if (s->enabled && (s->type & type)) { double v = psensor_get_current_value(s); - if (m == UNKNOWN_VALUE || v > m) + if (m == UNKNOWN_DBL_VALUE || v > m) m = v; } @@ -370,48 +402,31 @@ double get_max_temp(struct psensor **sensors) return get_max_value(sensors, SENSOR_TYPE_TEMP); } -struct psensor **get_all_sensors(int values_max_length) +struct psensor **get_all_sensors(int use_libatasmart, int values_max_length) { - struct psensor **psensors = NULL; - int count = 0; - const sensors_chip_name *chip; - int chip_nr = 0; + struct psensor **psensors; struct psensor **tmp_psensors; - const sensors_feature *feature; - struct psensor *psensor; - int i; - - 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) { - - psensor = lmsensor_psensor_create - (chip, feature, values_max_length); - - if (psensor) { - tmp_psensors - = psensor_list_add(psensors, - psensor); - - free(psensors); - psensors = tmp_psensors; + psensors = lmsensor_psensor_list_add(NULL, values_max_length); - count++; - } - } + if (!use_libatasmart) { + tmp_psensors = hddtemp_psensor_list_add(psensors, + values_max_length); + if (tmp_psensors != psensors) { + free(psensors); + psensors = tmp_psensors; } } - - tmp_psensors = hdd_psensor_list_add(psensors, values_max_length); - - if (tmp_psensors != psensors) { - free(psensors); - psensors = tmp_psensors; - } +#ifdef HAVE_ATASMART + else { + tmp_psensors = hdd_psensor_list_add(psensors, + values_max_length); + if (tmp_psensors != psensors) { + free(psensors); + psensors = tmp_psensors; + } + } +#endif if (!psensors) { /* there is no detected sensors */ psensors = malloc(sizeof(struct psensor *)); @@ -423,40 +438,113 @@ struct psensor **get_all_sensors(int values_max_length) const char *psensor_type_to_str(unsigned int type) { - if (type & SENSOR_TYPE_REMOTE) - return "Remote"; + if (type & SENSOR_TYPE_NVCTRL) + return "NVidia GPU"; + + if (type & SENSOR_TYPE_ATIADL) { + if (type & SENSOR_TYPE_TEMP) + return "AMD GPU Temperature"; + else if (type & SENSOR_TYPE_RPM) + return "AMD GPU Fan Speed"; + else /* type & SENSOR_TYPE_USAGE */ + return "AMD GPU Usage"; + } - if (type & SENSOR_TYPE_LMSENSOR_TEMP) + if ((type & SENSOR_TYPE_HDD_TEMP) == SENSOR_TYPE_HDD_TEMP) + return "HDD Temperature"; + + if ((type & SENSOR_TYPE_CPU_USAGE) == SENSOR_TYPE_CPU_USAGE) + return "CPU Usage"; + + if (type & SENSOR_TYPE_TEMP) return "Temperature"; - if (type & SENSOR_TYPE_LMSENSOR_FAN) + if (type & SENSOR_TYPE_FAN) return "Fan"; - if (type & SENSOR_TYPE_NVIDIA) - return "NVidia GPU Temperature"; + if (type & SENSOR_TYPE_CPU) + return "CPU"; - if (type & SENSOR_TYPE_HDD_TEMP) - return "HDD Temperature"; + if (type & SENSOR_TYPE_REMOTE) + return "Remote"; - return "N/A"; /* should not be possible */ + return "N/A"; } -const char *psensor_type_to_unit_str(unsigned int type) +const char *psensor_type_to_unit_str(unsigned int type, int use_celcius) { - if (type & SENSOR_TYPE_TEMP) - return _("C"); - - if (type & SENSOR_TYPE_FAN) + if (is_temp_type(type)) { + if (use_celcius) + return "\302\260C"; + else + return "\302\260F"; + } else if (is_fan_type(type)) { return _("RPM"); - - return "N/A"; + } else if (type & SENSOR_TYPE_CPU_USAGE) { + return _("%"); + } else { + return _("N/A"); + } } void psensor_list_update_measures(struct psensor **sensors) { lmsensor_psensor_list_update(sensors); - if (psensor_list_contains_type(sensors, SENSOR_TYPE_HDD_TEMP)) +#ifdef HAVE_GTOP + cpu_psensor_list_update(sensors); +#endif + + if (psensor_list_contains_type(sensors, SENSOR_TYPE_HDDTEMP)) + hddtemp_psensor_list_update(sensors); + +#ifdef HAVE_ATASMART + if (psensor_list_contains_type(sensors, SENSOR_TYPE_ATASMART)) hdd_psensor_list_update(sensors); +#endif +} + +void psensor_log_measures(struct psensor **sensors) +{ + if (log_level == LOG_DEBUG) + while (*sensors) { + log_debug("Measure: %s %.2f", + (*sensors)->name, + psensor_get_current_value(*sensors)); + + sensors++; + } +} + +void psensor_init() +{ + lmsensor_init(); +} + +void psensor_cleanup() +{ + lmsensor_cleanup(); +} + +struct psensor **psensor_list_copy(struct psensor **sensors) +{ + struct psensor **result; + int n, i; + + n = psensor_list_size(sensors); + result = malloc((n+1) * sizeof(struct psensor *)); + for (i = 0; i < n; i++) + result[i] = sensors[i]; + result[n] = NULL; + + return result; +} + +char * +psensor_current_value_to_str(const struct psensor *s, unsigned int celcius) +{ + return psensor_value_to_str(s->type, + psensor_get_current_value(s), + celcius); }