X-Git-Url: https://git.wpitchoune.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fpsensor.c;h=c37dc589e93c81d165dcd78e74f6f76162f3c6ad;hb=5f275b753e5b28de21690bd9bacb53262e59c58a;hp=c23f9dd3c1f5d7fe58902caae057d24fcacf493d;hpb=37146e0164f6b10560f88d58ee92fd4801883052;p=psensor.git diff --git a/src/lib/psensor.c b/src/lib/psensor.c index c23f9dd..c37dc58 100644 --- a/src/lib/psensor.c +++ b/src/lib/psensor.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010-2013 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,28 +23,29 @@ #include #define _(str) gettext(str) -#include "hdd.h" -#include "psensor.h" -#include "lmsensor.h" +#include +#include +#include +#include #ifdef HAVE_GTOP -#include "cpu.h" +#include +#include #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)); + struct psensor *psensor; + + psensor = (struct psensor *)malloc(sizeof(struct psensor)); psensor->id = id; psensor->name = name; psensor->chip = chip; - psensor->enabled = 1; psensor->min = UNKNOWN_DBL_VALUE; psensor->max = UNKNOWN_DBL_VALUE; @@ -65,6 +66,7 @@ struct psensor *psensor_create(char *id, psensor->color = NULL; + psensor->graph_enabled = 1; psensor->appindicator_enabled = 0; return psensor; @@ -171,7 +173,9 @@ int psensor_list_contains_type(struct psensor **sensors, unsigned int type) struct psensor **psensor_list_add(struct psensor **sensors, struct psensor *sensor) { - int size = psensor_list_size(sensors); + int size; + + size = psensor_list_size(sensors); struct psensor **result = malloc((size + 1 + 1) * sizeof(struct psensor *)); @@ -185,6 +189,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; @@ -204,23 +224,8 @@ int is_temp_type(unsigned int type) return type & SENSOR_TYPE_TEMP; } -int is_fan_type(unsigned int type) -{ - return type & SENSOR_TYPE_FAN; -} - -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) +psensor_value_to_str(unsigned int type, double value, int use_celsius) { char *str; const char *unit; @@ -231,10 +236,10 @@ psensor_value_to_str(unsigned int type, double value, int use_celcius) */ str = malloc(20); - unit = psensor_type_to_unit_str(type, use_celcius); + unit = psensor_type_to_unit_str(type, use_celsius); - if (is_temp_type(type) && !use_celcius) - value = celcius_to_fahrenheit(value); + if (is_temp_type(type) && !use_celsius) + value = celsius_to_fahrenheit(value); sprintf(str, "%.0f%s", value, unit); @@ -244,9 +249,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) @@ -259,9 +264,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], @@ -288,7 +291,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; } @@ -302,7 +305,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; @@ -310,7 +313,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; @@ -342,7 +345,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++) { @@ -370,7 +373,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) @@ -429,6 +432,10 @@ struct psensor **get_all_sensors(int use_libatasmart, int values_max_length) } #endif +#ifdef HAVE_GTOP + mem_psensor_list_add(&psensors, values_max_length); +#endif + if (!psensors) { /* there is no detected sensors */ psensors = malloc(sizeof(struct psensor *)); *psensors = NULL; @@ -439,8 +446,20 @@ 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_NVCTRL) - return "NVidia GPU"; + 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"; + else + return "NVIDIA GPU"; + } if (type & SENSOR_TYPE_ATIADL) { if (type & SENSOR_TYPE_TEMP) @@ -460,7 +479,7 @@ const char *psensor_type_to_str(unsigned int type) if (type & SENSOR_TYPE_TEMP) return "Temperature"; - if (type & SENSOR_TYPE_FAN) + if (type & SENSOR_TYPE_RPM) return "Fan"; if (type & SENSOR_TYPE_CPU) @@ -469,20 +488,23 @@ const char *psensor_type_to_str(unsigned int type) if (type & SENSOR_TYPE_REMOTE) return "Remote"; + if (type & SENSOR_TYPE_MEMORY) + return "Memory"; + 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 (is_temp_type(type)) { - if (use_celcius) + if (use_celsius) return "\302\260C"; else return "\302\260F"; - } else if (is_fan_type(type)) { + } else if (type & SENSOR_TYPE_RPM) { return _("RPM"); - } else if (type & SENSOR_TYPE_CPU_USAGE) { + } else if (type & SENSOR_TYPE_PERCENT) { return _("%"); } else { return _("N/A"); @@ -495,6 +517,7 @@ void psensor_list_update_measures(struct psensor **sensors) #ifdef HAVE_GTOP cpu_psensor_list_update(sensors); + mem_psensor_list_update(sensors); #endif if (psensor_list_contains_type(sensors, SENSOR_TYPE_HDDTEMP)) @@ -527,3 +550,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; +}