X-Git-Url: http://git.wpitchoune.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fpsensor.c;h=f4d96597d8206d0d383332f5f36bbc3dd9c84a1e;hb=7ac0c530e67161923db3c91252331148f713144f;hp=76a250d21e7dd52566af0753cc486146f4154d7f;hpb=94cd6e094ffb603809880f854a71dcef093257e5;p=psensor.git diff --git a/src/lib/psensor.c b/src/lib/psensor.c index 76a250d..f4d9659 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 @@ -31,16 +31,19 @@ #include "cpu.h" #endif - -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->chip = chip; psensor->min = UNKNOWN_DBL_VALUE; psensor->max = UNKNOWN_DBL_VALUE; @@ -50,7 +53,8 @@ struct psensor *psensor_create(char *id, char *name, psensor->measures = measures_dbl_create(values_max_length); psensor->alarm_enabled = 0; - psensor->alarm_high_thresold = 0; + psensor->alarm_high_threshold = 0; + psensor->alarm_low_threshold = 0; psensor->cb_alarm_raised = NULL; psensor->cb_alarm_raised_data = NULL; @@ -60,6 +64,9 @@ struct psensor *psensor_create(char *id, char *name, psensor->color = NULL; + psensor->graph_enabled = 1; + psensor->appindicator_enabled = 0; + return psensor; } @@ -93,6 +100,9 @@ void psensor_free(struct psensor *sensor) free(sensor->name); free(sensor->id); + if (sensor->chip) + free(sensor->chip); + if (sensor->color) free(sensor->color); @@ -150,7 +160,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++; } @@ -199,36 +209,32 @@ int is_fan_type(unsigned int type) return type & SENSOR_TYPE_FAN; } -double celcius_to_fahrenheit(double c) +double celsius_to_fahrenheit(double c) { return c * (9.0/5.0) + 32; } -double fahrenheit_to_celcius(double f) +double fahrenheit_to_celsius(double f) { return (f - 32) * (5.0/9.0); } char * -psensor_value_to_str(unsigned int type, double value, int use_celcius) +psensor_value_to_str(unsigned int type, double value, int use_celsius) { - /* 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)) - if (use_celcius) { - unit = "°C"; - } else { - unit = "°F"; - value = celcius_to_fahrenheit(value); - } - else if (type & SENSOR_TYPE_CPU_USAGE) - unit = "%"; - else - unit = ""; + unit = psensor_type_to_unit_str(type, use_celsius); + + if (is_temp_type(type) && !use_celsius) + value = celsius_to_fahrenheit(value); sprintf(str, "%.0f%s", value, unit); @@ -238,9 +244,9 @@ psensor_value_to_str(unsigned int type, double value, int use_celcius) char * psensor_measure_to_str(const struct measure *m, unsigned int type, - unsigned int use_celcius) + unsigned int use_celsius) { - return psensor_value_to_str(type, m->value, use_celcius); + return psensor_value_to_str(type, m->value, use_celsius); } void psensor_set_current_value(struct psensor *sensor, double value) @@ -253,9 +259,7 @@ 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], @@ -271,10 +275,9 @@ psensor_set_current_measure(struct psensor *s, s->max = v; if (s->alarm_enabled) { - if (v > s->alarm_high_thresold) { + 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 { @@ -283,7 +286,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; } @@ -297,7 +300,7 @@ struct measure *psensor_get_current_measure(struct psensor *sensor) 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; @@ -305,7 +308,7 @@ 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; @@ -337,7 +340,7 @@ 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++) { @@ -365,7 +368,7 @@ psensor_get_max_current_value(struct psensor **sensors, unsigned int type) while (*s_cur) { struct psensor *s = *s_cur; - if (s->enabled && (s->type & type)) { + if (s->graph_enabled && (s->type & type)) { double v = psensor_get_current_value(s); if (m == UNKNOWN_DBL_VALUE || v > m) @@ -400,7 +403,7 @@ double get_max_temp(struct psensor **sensors) struct psensor **get_all_sensors(int use_libatasmart, int values_max_length) { - struct psensor **psensors = NULL; + struct psensor **psensors; struct psensor **tmp_psensors; psensors = lmsensor_psensor_list_add(NULL, values_max_length); @@ -434,19 +437,22 @@ struct psensor **get_all_sensors(int use_libatasmart, int values_max_length) 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_NVCTRL) + return "NVIDIA GPU"; - if ((type & SENSOR_TYPE_AMD_FAN) == SENSOR_TYPE_AMD_FAN) - return "AMD GPU Fan Speed"; + 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_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) @@ -455,29 +461,30 @@ const char *psensor_type_to_str(unsigned int type) if (type & SENSOR_TYPE_FAN) return "Fan"; + if (type & SENSOR_TYPE_CPU) + return "CPU"; + 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, int use_celcius) +const char *psensor_type_to_unit_str(unsigned int type, int use_celsius) { - if (type & SENSOR_TYPE_TEMP) { - if (use_celcius) + if (is_temp_type(type)) { + if (use_celsius) return "\302\260C"; else return "\302\260F"; - } - - if (type & SENSOR_TYPE_FAN) + } else if (is_fan_type(type)) { return _("RPM"); - - if (type & SENSOR_TYPE_CPU_USAGE) + } else if (type & SENSOR_TYPE_CPU_USAGE) { return _("%"); - - return _("N/A"); + } else { + return _("N/A"); + } } void psensor_list_update_measures(struct psensor **sensors) @@ -488,12 +495,11 @@ void psensor_list_update_measures(struct psensor **sensors) cpu_psensor_list_update(sensors); #endif - if (psensor_list_contains_type(sensors, SENSOR_TYPE_HDD_TEMP_HDDTEMP)) + 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_HDD_TEMP_ATASMART)) + if (psensor_list_contains_type(sensors, SENSOR_TYPE_ATASMART)) hdd_psensor_list_update(sensors); #endif } @@ -519,3 +525,48 @@ 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 use_celsius) +{ + return psensor_value_to_str(s->type, + psensor_get_current_value(s), + use_celsius); +} + +struct psensor **psensor_list_filter_graph_enabled(struct psensor **sensors) +{ + int n, i; + struct psensor **result, **cur, *s; + + if (!sensors) + return NULL; + + n = psensor_list_size(sensors); + result = malloc((n+1) * sizeof(struct psensor *)); + + for (cur = sensors, i = 0; *cur; cur++) { + s = *cur; + + if (s->graph_enabled) + result[i++] = s; + } + + result[i] = NULL; + + return result; +}