/*
- 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 <stdlib.h>
#include <string.h>
-#include <sensors/sensors.h>
-#include <sensors/error.h>
+#include <locale.h>
+#include <libintl.h>
+#define _(str) gettext(str)
-#include "hdd.h"
-#include "psensor.h"
-#include "lmsensor.h"
+#include <stdio.h>
-struct psensor *psensor_create(char *id, char *name,
- unsigned int type, int values_max_length)
+#include <hdd.h>
+#include <psensor.h>
+#include <temperature.h>
+
+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_VALUE;
- psensor->max = UNKNOWN_VALUE;
+ psensor->chip = chip;
+ psensor->sess_lowest = UNKNOWN_DBL_VALUE;
+ psensor->sess_highest = UNKNOWN_DBL_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_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;
}
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;
+
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]);
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)
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;
- struct psensor **result
- = malloc((size + 1 + 1) * sizeof(struct psensor *));
+ size = psensor_list_size(sensors);
+
+ result = malloc((size + 1 + 1) * sizeof(struct psensor *));
if (sensors)
memcpy(result, sensors, size * sizeof(struct psensor *));
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;
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
- 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;
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->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)
- s->min = v;
+ if (s->sess_lowest == UNKNOWN_DBL_VALUE || v < s->sess_lowest)
+ s->sess_lowest = v;
- if (s->max == UNKNOWN_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;
}
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_VALUE;
+ double m = UNKNOWN_DBL_VALUE;
struct psensor **s = sensors;
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;
- 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;
}
}
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) {
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;
- 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;
}
}
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;
- int count = 0;
- const sensors_chip_name *chip;
- int chip_nr = 0;
- struct psensor **tmp_psensors;
- const sensors_feature *feature;
- struct psensor *psensor;
- int i;
+ 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";
+ }
- while ((chip = sensors_get_detected_chips(NULL, &chip_nr))) {
- i = 0;
- while ((feature = sensors_get_features(chip, &i))) {
+ 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 (feature->type == SENSORS_FEATURE_TEMP
- || feature->type == SENSORS_FEATURE_FAN) {
+ if ((type & SENSOR_TYPE_HDD_TEMP) == SENSOR_TYPE_HDD_TEMP)
+ return "HDD Temperature";
- psensor = lmsensor_psensor_create
- (chip, feature, values_max_length);
+ if ((type & SENSOR_TYPE_CPU_USAGE) == SENSOR_TYPE_CPU_USAGE)
+ return "CPU Usage";
- if (psensor) {
- tmp_psensors
- = psensor_list_add(psensors,
- psensor);
+ if (type & SENSOR_TYPE_TEMP)
+ return "Temperature";
- free(psensors);
+ if (type & SENSOR_TYPE_RPM)
+ return "Fan";
- psensors = tmp_psensors;
+ if (type & SENSOR_TYPE_CPU)
+ return "CPU";
- count++;
- }
- }
- }
- }
+ if (type & SENSOR_TYPE_REMOTE)
+ return "Remote";
- tmp_psensors = hdd_psensor_list_add(psensors, values_max_length);
+ if (type & SENSOR_TYPE_MEMORY)
+ return "Memory";
- if (tmp_psensors != psensors) {
- free(psensors);
- psensors = tmp_psensors;
- }
+ return "N/A";
+}
- if (!psensors) { /* there is no detected sensors */
- psensors = malloc(sizeof(struct psensor *));
- *psensors = NULL;
- }
- return psensors;
+const char *psensor_type_to_unit_str(unsigned int type, int use_celsius)
+{
+ if (is_temp_type(type)) {
+ if (use_celsius)
+ return "\302\260C";
+ return "\302\260F";
+ } else if (type & SENSOR_TYPE_RPM) {
+ return _("RPM");
+ } else if (type & SENSOR_TYPE_PERCENT) {
+ return _("%");
+ }
+ return _("N/A");
}
-const char *psensor_type_to_str(unsigned int type)
+void psensor_log_measures(struct psensor **sensors)
{
- if (type & SENSOR_TYPE_REMOTE)
- return "Remote";
+ if (log_level == LOG_DEBUG)
+ while (*sensors) {
+ log_debug("Measure: %s %.2f",
+ (*sensors)->name,
+ psensor_get_current_value(*sensors));
- if (type & SENSOR_TYPE_LMSENSOR_TEMP)
- return "Temperature";
-
- if (type & SENSOR_TYPE_LMSENSOR_FAN)
- return "Fan";
+ sensors++;
+ }
+}
- if (type & SENSOR_TYPE_NVIDIA)
- return "NVidia GPU Temperature";
+struct psensor **psensor_list_copy(struct psensor **sensors)
+{
+ struct psensor **result;
+ int n, i;
- if (type & SENSOR_TYPE_HDD_TEMP)
- return "HDD Temperature";
+ 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 "N/A"; /* should not be possible */
+ return result;
}
-void psensor_list_update_measures(struct psensor **sensors)
+char *
+psensor_current_value_to_str(const struct psensor *s, unsigned int use_celsius)
{
- lmsensor_psensor_list_update(sensors);
- hdd_psensor_list_update(sensors);
+ return psensor_value_to_str(s->type,
+ psensor_get_current_value(s),
+ use_celsius);
}