X-Git-Url: http://wpitchoune.net/gitweb/?p=psensor-pkg-debian.git;a=blobdiff_plain;f=src%2Flib%2Fpsensor.c;h=f8c0a83a79a367d2ce6ec8eade3df2d30b46273a;hp=a4f1eb5cba4fb53d24faf389e5e6fdd335ff083f;hb=3361fda8735c65887a859c9faf287cb105ae6bc8;hpb=f055e7507526592d3a74c652f5f053701614c9c0 diff --git a/src/lib/psensor.c b/src/lib/psensor.c index a4f1eb5..f8c0a83 100644 --- a/src/lib/psensor.c +++ b/src/lib/psensor.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010-2012 jeanfi@gmail.com + * 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 @@ -23,43 +23,50 @@ #include #define _(str) gettext(str) -#include "hdd.h" -#include "psensor.h" -#include "lmsensor.h" +#include -#ifdef HAVE_GTOP -#include "cpu.h" -#endif +#include +#include +#include - -struct psensor *psensor_create(char *id, char *name, - unsigned int type, int values_max_length) +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)); + struct psensor *psensor; + + psensor = (struct psensor *)malloc(sizeof(struct psensor)); psensor->id = id; psensor->name = name; - psensor->enabled = 1; - psensor->min = UNKNOWN_DBL_VALUE; - psensor->max = UNKNOWN_DBL_VALUE; + psensor->chip = chip; + psensor->sess_lowest = UNKNOWN_DBL_VALUE; + psensor->sess_highest = UNKNOWN_DBL_VALUE; + + if (type & SENSOR_TYPE_PERCENT) { + psensor->min = 0; + psensor->max = 100; + } else { + psensor->min = UNKNOWN_DBL_VALUE; + psensor->max = UNKNOWN_DBL_VALUE; + } psensor->type = type; psensor->values_max_length = values_max_length; psensor->measures = measures_dbl_create(values_max_length); - psensor->alarm_limit = 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->provider_data = NULL; + psensor->provider_data_free_fct = &free; return psensor; } @@ -75,6 +82,7 @@ void psensor_values_resize(struct psensor *s, int new_size) if (cur_ms) { int i; + for (i = 0; i < new_size - 1 && i < cur_size - 1; i++) measure_copy(&cur_ms[cur_size - i - 1], &new_ms[new_size - i - 1]); @@ -86,21 +94,25 @@ void psensor_values_resize(struct psensor *s, int new_size) s->measures = new_ms; } -void psensor_free(struct psensor *sensor) +void psensor_free(struct psensor *s) { - if (sensor) { - free(sensor->name); - free(sensor->id); + if (!s) + return; - if (sensor->color) - free(sensor->color); + log_debug("Cleanup %s", s->id); - measures_free(sensor->measures); + free(s->name); + free(s->id); - free(sensor->url); + if (s->chip) + free(s->chip); - free(sensor); - } + measures_free(s->measures); + + if (s->provider_data && s->provider_data_free_fct) + s->provider_data_free_fct(s->provider_data); + + free(s); } void psensor_list_free(struct psensor **sensors) @@ -140,30 +152,15 @@ int psensor_list_size(struct psensor **sensors) return size; } -int psensor_list_contains_type(struct psensor **sensors, unsigned int type) -{ - struct psensor **s; - - if (!sensors) - return 0; - - s = sensors; - while (*s) { - if ((*s)->type == type) - return 1; - s++; - } - - return 0; -} - struct psensor **psensor_list_add(struct psensor **sensors, struct psensor *sensor) { - int size = psensor_list_size(sensors); + int size; + struct psensor **result; + + size = psensor_list_size(sensors); - struct psensor **result - = malloc((size + 1 + 1) * sizeof(struct psensor *)); + result = malloc((size + 1 + 1) * sizeof(struct psensor *)); if (sensors) memcpy(result, sensors, size * sizeof(struct psensor *)); @@ -174,6 +171,22 @@ struct psensor **psensor_list_add(struct psensor **sensors, return result; } +void psensor_list_append(struct psensor ***sensors, struct psensor *sensor) +{ + struct psensor **tmp; + + if (!sensor) + return; + + tmp = psensor_list_add(*sensors, sensor); + + if (tmp != *sensors) { + free(*sensors); + *sensors = tmp; + } +} + + struct psensor *psensor_list_get_by_id(struct psensor **sensors, const char *id) { struct psensor **sensors_cur = sensors; @@ -193,31 +206,36 @@ int is_temp_type(unsigned int type) return type & SENSOR_TYPE_TEMP; } -int is_fan_type(unsigned int type) +char * +psensor_value_to_str(unsigned int type, double value, int use_celsius) { - return type & SENSOR_TYPE_FAN; -} + char *str; + const char *unit; -char *psensor_value_to_string(unsigned int type, double value) -{ - /* should not be possible to exceed 20 characters with temp or - rpm values the .x part is never displayed */ - char *str = malloc(20); + /* + * should not be possible to exceed 20 characters with temp or + * rpm values the .x part is never displayed + */ + str = malloc(20); - char *unit; + unit = psensor_type_to_unit_str(type, use_celsius); - if (is_temp_type(type)) - unit = "C"; - else if (type & SENSOR_TYPE_CPU_USAGE) - unit = "%"; - else - unit = ""; + if (is_temp_type(type) && !use_celsius) + value = celsius_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_celsius) +{ + return psensor_value_to_str(type, m->value, use_celsius); +} + void psensor_set_current_value(struct psensor *sensor, double value) { struct timeval tv; @@ -228,39 +246,34 @@ void psensor_set_current_value(struct psensor *sensor, double value) psensor_set_current_measure(sensor, value, tv); } -void -psensor_set_current_measure(struct psensor *s, - double v, struct timeval tv) +void psensor_set_current_measure(struct psensor *s, double v, struct timeval tv) { memmove(s->measures, &s->measures[1], (s->values_max_length - 1) * sizeof(struct measure)); - s->measures[s->values_max_length - 1].value.d_num = v; + s->measures[s->values_max_length - 1].value = v; s->measures[s->values_max_length - 1].time = tv; - if (s->min == UNKNOWN_DBL_VALUE || v < s->min) - s->min = v; + if (s->sess_lowest == UNKNOWN_DBL_VALUE || v < s->sess_lowest) + s->sess_lowest = v; - if (s->max == UNKNOWN_DBL_VALUE || v > s->max) - s->max = v; + if (s->sess_highest == UNKNOWN_DBL_VALUE || v > s->sess_highest) + s->sess_highest = v; - if (s->alarm_limit && s->alarm_enabled) { - if (v > s->alarm_limit) { - if (!s->alarm_raised && s->cb_alarm_raised) - s->cb_alarm_raised(s, - s->cb_alarm_raised_data); - - s->alarm_raised = 1; - } else { - s->alarm_raised = 0; + if (v > s->alarm_high_threshold || v < s->alarm_low_threshold) { + if (!s->alarm_raised && s->cb_alarm_raised) { + s->alarm_raised = true; + s->cb_alarm_raised(s, s->cb_alarm_raised_data); } + } else { + s->alarm_raised = false; } } -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.d_num; + return sensor->measures[sensor->values_max_length - 1].value; } struct measure *psensor_get_current_measure(struct psensor *sensor) @@ -269,10 +282,10 @@ struct measure *psensor_get_current_measure(struct psensor *sensor) } /* - Returns the minimal value of a given 'type' (SENSOR_TYPE_TEMP or - SENSOR_TYPE_FAN) + * Returns the minimal value of a given 'type' (SENSOR_TYPE_TEMP or + * SENSOR_TYPE_FAN) */ -double get_min_value(struct psensor **sensors, int type) +static double get_min_value(struct psensor **sensors, int type) { double m = UNKNOWN_DBL_VALUE; struct psensor **s = sensors; @@ -280,12 +293,12 @@ double get_min_value(struct psensor **sensors, int type) while (*s) { struct psensor *sensor = *s; - if (sensor->enabled && (sensor->type & type)) { + if (sensor->type & type) { int i; double t; for (i = 0; i < sensor->values_max_length; i++) { - t = sensor->measures[i].value.d_num; + t = sensor->measures[i].value; if (t == UNKNOWN_DBL_VALUE) continue; @@ -301,8 +314,8 @@ double get_min_value(struct psensor **sensors, int type) } /* - Returns the maximal value of a given 'type' (SENSOR_TYPE_TEMP or - SENSOR_TYPE_FAN) + * Returns the maximal value of a given 'type' (SENSOR_TYPE_TEMP or + * SENSOR_TYPE_FAN) */ double get_max_value(struct psensor **sensors, int type) { @@ -312,11 +325,12 @@ double get_max_value(struct psensor **sensors, int type) while (*s) { struct psensor *sensor = *s; - if (sensor->enabled && (sensor->type & type)) { + if (sensor->type & type) { int i; double t; + for (i = 0; i < sensor->values_max_length; i++) { - t = sensor->measures[i].value.d_num; + t = sensor->measures[i].value; if (t == UNKNOWN_DBL_VALUE) continue; @@ -331,28 +345,6 @@ double get_max_value(struct psensor **sensors, int type) return m; } -double -psensor_get_max_current_value(struct psensor **sensors, unsigned int type) -{ - double m = UNKNOWN_DBL_VALUE; - struct psensor **s_cur = sensors; - - while (*s_cur) { - struct psensor *s = *s_cur; - - if (s->enabled && (s->type & type)) { - double v = psensor_get_current_value(s); - - if (m == UNKNOWN_DBL_VALUE || v > m) - m = v; - } - - s_cur++; - } - - return m; -} - double get_min_temp(struct psensor **sensors) { return get_min_value(sensors, SENSOR_TYPE_TEMP); @@ -373,89 +365,105 @@ double get_max_temp(struct psensor **sensors) return get_max_value(sensors, SENSOR_TYPE_TEMP); } -struct psensor **get_all_sensors(int values_max_length) +const char *psensor_type_to_str(unsigned int type) { - struct psensor **psensors = NULL; - struct psensor **tmp_psensors; - - psensors = lmsensor_psensor_list_add(NULL, values_max_length); - - tmp_psensors = hdd_psensor_list_add(psensors, values_max_length); - if (tmp_psensors != psensors) { - free(psensors); - psensors = tmp_psensors; + if (type & SENSOR_TYPE_NVCTRL) { + if (type & SENSOR_TYPE_TEMP) + return "Temperature"; + else if (type & SENSOR_TYPE_GRAPHICS) + return "Graphics usage"; + else if (type & SENSOR_TYPE_VIDEO) + return "Video usage"; + else if (type & SENSOR_TYPE_MEMORY) + return "Memory usage"; + else if (type & SENSOR_TYPE_PCIE) + return "PCIe usage"; + + return "NVIDIA GPU"; } - if (!psensors) { /* there is no detected sensors */ - psensors = malloc(sizeof(struct psensor *)); - *psensors = NULL; + 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"; } - return psensors; -} - -const char *psensor_type_to_str(unsigned int type) -{ - if ((type & SENSOR_TYPE_NVIDIA_TEMP) == SENSOR_TYPE_NVIDIA_TEMP) - return "NVidia GPU Temperature"; - - if ((type & SENSOR_TYPE_AMD_TEMP) == SENSOR_TYPE_AMD_TEMP) - return "AMD GPU Temperature"; - - if ((type & SENSOR_TYPE_AMD_FAN) == SENSOR_TYPE_AMD_FAN) - return "AMD GPU Fan Speed"; - if ((type & SENSOR_TYPE_HDD_TEMP) == SENSOR_TYPE_HDD_TEMP) return "HDD Temperature"; - if (type & SENSOR_TYPE_CPU_USAGE) + if ((type & SENSOR_TYPE_CPU_USAGE) == SENSOR_TYPE_CPU_USAGE) return "CPU Usage"; if (type & SENSOR_TYPE_TEMP) return "Temperature"; - if (type & SENSOR_TYPE_FAN) + if (type & SENSOR_TYPE_RPM) return "Fan"; + if (type & SENSOR_TYPE_CPU) + return "CPU"; + if (type & SENSOR_TYPE_REMOTE) return "Remote"; - return "N/A"; /* should not be possible */ + if (type & SENSOR_TYPE_MEMORY) + return "Memory"; + + 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_celsius) { - if (type & SENSOR_TYPE_TEMP) - return _("C"); - - if (type & SENSOR_TYPE_FAN) + if (is_temp_type(type)) { + if (use_celsius) + return "\302\260C"; + return "\302\260F"; + } else if (type & SENSOR_TYPE_RPM) { return _("RPM"); - - if (type & SENSOR_TYPE_CPU_USAGE) + } else if (type & SENSOR_TYPE_PERCENT) { return _("%"); - - return "N/A"; + } + return _("N/A"); } -void psensor_list_update_measures(struct psensor **sensors) +void psensor_log_measures(struct psensor **sensors) { - lmsensor_psensor_list_update(sensors); + if (log_level == LOG_DEBUG) { + if (!sensors) + return; -#ifdef HAVE_GTOP - cpu_psensor_list_update(sensors); -#endif + while (*sensors) { + log_debug("Measure: %s %.2f", + (*sensors)->name, + psensor_get_current_value(*sensors)); - if (psensor_list_contains_type(sensors, SENSOR_TYPE_HDD_TEMP)) - hdd_psensor_list_update(sensors); + sensors++; + } + } } -void psensor_init() +struct psensor **psensor_list_copy(struct psensor **sensors) { - lmsensor_init(); + 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; } -void psensor_cleanup() +char * +psensor_current_value_to_str(const struct psensor *s, unsigned int use_celsius) { - lmsensor_cleanup(); + return psensor_value_to_str(s->type, + psensor_get_current_value(s), + use_celsius); }