/*
- * 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
#include <libintl.h>
#define _(str) gettext(str)
-#include "hdd.h"
-#include "psensor.h"
-#include "lmsensor.h"
+#include <hdd.h>
+#include <psensor.h>
+#include <lmsensor.h>
+#include <temperature.h>
#ifdef HAVE_GTOP
-#include "cpu.h"
+#include <cpu.h>
+#include <pmem.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));
+ 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;
psensor->color = NULL;
+ psensor->graph_enabled = 1;
psensor->appindicator_enabled = 0;
return psensor;
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]);
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 *));
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)
-{
- 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;
*/
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);
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)
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],
}
}
-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_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;
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;
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)
}
#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;
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";
+
+ 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";
+ /*else type & SENSOR_TYPE_USAGE */
+ return "AMD GPU Usage";
}
if ((type & SENSOR_TYPE_HDD_TEMP) == SENSOR_TYPE_HDD_TEMP)
if (type & SENSOR_TYPE_TEMP)
return "Temperature";
- if (type & SENSOR_TYPE_FAN)
+ if (type & SENSOR_TYPE_RPM)
return "Fan";
if (type & SENSOR_TYPE_CPU)
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)) {
+ return "\302\260F";
+ } 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");
}
+ return _("N/A");
}
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))
{
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;
+}