Support for chip/feature/subfeature selection
Added -cp/-sp command line options which allow finer control on which sensor is to be used as a data source for CPU or system, respectively.
This commit is contained in:
parent
5acfc0aed4
commit
947b14d1b7
3 changed files with 132 additions and 69 deletions
45
main.c
45
main.c
|
@ -64,6 +64,7 @@ static void switch_light(void);
|
|||
static void draw_cpudigit(int per);
|
||||
static void draw_sysdigit(int per);
|
||||
static void parse_arguments(int argc, char **argv);
|
||||
static void parse_sensor_path(sensor_path_t *path, char *argument);
|
||||
static void print_help(char *prog);
|
||||
|
||||
int main(int argc, char **argv)
|
||||
|
@ -363,11 +364,11 @@ static void parse_arguments(int argc, char **argv)
|
|||
i++;
|
||||
}
|
||||
else if (!strcmp(argv[i], "-s")) {
|
||||
char *t;
|
||||
sensor_path_t t;
|
||||
|
||||
t = cpu_feature_name;
|
||||
cpu_feature_name = sys_feature_name;
|
||||
sys_feature_name = t;
|
||||
t = cpu_sensor_path;
|
||||
cpu_sensor_path = sys_sensor_path;
|
||||
sys_sensor_path = t;
|
||||
}
|
||||
else if (!strcmp(argv[i], "-cf")) {
|
||||
if (argc == i + 1) {
|
||||
|
@ -375,7 +376,7 @@ static void parse_arguments(int argc, char **argv)
|
|||
exit(1);
|
||||
}
|
||||
|
||||
cpu_feature_name = argv[i + 1];
|
||||
cpu_sensor_path.subfeature = argv[i + 1];
|
||||
i++;
|
||||
}
|
||||
else if (!strcmp(argv[i], "-sf")) {
|
||||
|
@ -384,7 +385,16 @@ static void parse_arguments(int argc, char **argv)
|
|||
exit(1);
|
||||
}
|
||||
|
||||
sys_feature_name = argv[i + 1];
|
||||
sys_sensor_path.subfeature = argv[i + 1];
|
||||
i++;
|
||||
}
|
||||
else if (!strcmp(argv[i], "-cp") || !strcmp(argv[i], "-sp")) {
|
||||
if (argc == i + 1) {
|
||||
fprintf(stderr, "%s: error parsing argument for option %s\n", argv[0], argv[i]);
|
||||
exit(1);
|
||||
}
|
||||
parse_sensor_path(argv[i][1] == 'c' ? &cpu_sensor_path : &sys_sensor_path,
|
||||
argv[i + 1]);
|
||||
i++;
|
||||
}
|
||||
else if (!strcmp(argv[i], "-f"))
|
||||
|
@ -398,6 +408,25 @@ static void parse_arguments(int argc, char **argv)
|
|||
}
|
||||
}
|
||||
|
||||
static void parse_sensor_path(sensor_path_t *path, char *argument)
|
||||
{
|
||||
char const ** parts[] = { &path->chip, &path->feature, &path->subfeature };
|
||||
int i = 0;
|
||||
char * next;
|
||||
while (i < 3) {
|
||||
next = strchr(argument, '/');
|
||||
if (next != argument) {
|
||||
*parts[i] = argument;
|
||||
}
|
||||
if (!next) {
|
||||
break;
|
||||
}
|
||||
*next = '\0';
|
||||
argument = next + 1;
|
||||
i ++;
|
||||
}
|
||||
}
|
||||
|
||||
static void print_help(char *prog)
|
||||
{
|
||||
printf("Usage : %s [OPTIONS]\n", prog);
|
||||
|
@ -422,6 +451,10 @@ static void print_help(char *prog)
|
|||
printf(" ('temp1_input' is default)\n");
|
||||
printf(" -sf <feature> which feature to use for sys temperature\n");
|
||||
printf(" ('temp2_input' is default)\n");
|
||||
printf(" -cp <chip/feature/subft.> full cpu temperature sensor path\n");
|
||||
printf(" ('//temp1_input' is default)\n");
|
||||
printf(" -sp <chip/feature/subft.> full system temperature sensor path\n");
|
||||
printf(" ('//temp2_input' is default)\n");
|
||||
printf(" -s swap the cpu and sys temperatures\n");
|
||||
printf(" (/etc/sensors.conf is default)\n");
|
||||
printf(" -f show temperatures in Fahrenheit\n");
|
||||
|
|
146
temp.c
146
temp.c
|
@ -1,25 +1,36 @@
|
|||
#define DEBUG(x) x
|
||||
#define DEBUG(x) x;
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <sensors.h>
|
||||
#include <sensors/error.h>
|
||||
|
||||
#include "temp.h"
|
||||
|
||||
sensor_path_t cpu_sensor_path = { NULL, NULL, NULL };
|
||||
sensor_path_t sys_sensor_path = { NULL, NULL, NULL };
|
||||
|
||||
temperature_t t_type = CELCIUS;
|
||||
|
||||
typedef struct sensor_source_t {
|
||||
int valid;
|
||||
sensors_chip_name const *chip;
|
||||
int feature;
|
||||
} sensor_source_t;
|
||||
|
||||
static FILE *f = NULL;
|
||||
static char sensors = 0;
|
||||
|
||||
static const sensors_chip_name *chip_name = NULL;
|
||||
static const sensors_feature *feature;
|
||||
static sensor_source_t cpu_feature = {0, NULL, 0};
|
||||
static sensor_source_t sys_feature = {0, NULL, 0};
|
||||
|
||||
char *cpu_feature_name = "temp1_input";
|
||||
char *sys_feature_name = "temp2_input";
|
||||
|
||||
temperature_t t_type = CELCIUS;
|
||||
|
||||
static int cpu_feature = 0;
|
||||
static int sys_feature = 0;
|
||||
void temp_set_default(sensor_path_t *path, char const *subfeature)
|
||||
{
|
||||
if (!(path->chip || path->feature || path->subfeature)) {
|
||||
path->subfeature = subfeature;
|
||||
}
|
||||
}
|
||||
|
||||
void temp_deinit() {
|
||||
if (f != NULL) {
|
||||
|
@ -31,17 +42,54 @@ void temp_deinit() {
|
|||
}
|
||||
}
|
||||
|
||||
void temp_init(const char *filename) {
|
||||
const sensors_chip_name *name;
|
||||
int chip_nr = 0, f1, f2;
|
||||
|
||||
void temp_find_feature(sensor_path_t const *path, sensor_source_t *feature)
|
||||
{
|
||||
const sensors_chip_name *s_name;
|
||||
const sensors_feature *s_feature;
|
||||
const sensors_subfeature *s_subfeature;
|
||||
char *s_feat_name;
|
||||
char str[256];
|
||||
int chip_nr = 0, f_nr;
|
||||
|
||||
char *feattext = NULL;
|
||||
const sensors_subfeature *subfeature;
|
||||
while ((s_name = sensors_get_detected_chips(NULL, &chip_nr)) != NULL) {
|
||||
sensors_snprintf_chip_name(str, 256, s_name);
|
||||
DEBUG(printf("L%d - chip_nr %d, name %s\n", __LINE__, chip_nr, str));
|
||||
if (path->chip != NULL && strcasecmp(str, path->chip)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
f_nr = 0;
|
||||
while ((s_feature = sensors_get_features(s_name, &f_nr)) != NULL) {
|
||||
s_feat_name = sensors_get_label(s_name, s_feature);
|
||||
DEBUG(printf("L%d - feature #%d : %s\n", __LINE__, f_nr, s_feat_name));
|
||||
if (path->feature != NULL && strcasecmp(s_feat_name, path->feature)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
s_subfeature = sensors_get_subfeature(s_name, s_feature,
|
||||
SENSORS_SUBFEATURE_TEMP_INPUT);
|
||||
if (!s_subfeature) {
|
||||
continue;
|
||||
}
|
||||
DEBUG(printf("L%d - subfeature %s\n", __LINE__, s_subfeature->name));
|
||||
|
||||
if (path->subfeature == NULL
|
||||
|| !strcasecmp(s_subfeature->name, path->subfeature)) {
|
||||
feature->valid = 1;
|
||||
feature->chip = s_name;
|
||||
feature->feature = s_subfeature->number;
|
||||
DEBUG(printf("L%d - found\n", __LINE__));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void temp_init(const char *filename) {
|
||||
temp_set_default(&cpu_sensor_path, "temp1_input");
|
||||
temp_set_default(&sys_sensor_path, "temp2_input");
|
||||
|
||||
atexit(temp_deinit);
|
||||
|
||||
if (filename) {
|
||||
f = fopen(filename, "r");
|
||||
if (f == NULL) {
|
||||
|
@ -57,52 +105,28 @@ void temp_init(const char *filename) {
|
|||
}
|
||||
|
||||
sensors = 1;
|
||||
while ((name = sensors_get_detected_chips(NULL, &chip_nr)) != NULL &&
|
||||
chip_name == NULL) {
|
||||
f1 = f2 = 0;
|
||||
DEBUG(printf("chip_nr=%d %d\n",chip_nr,__LINE__);)
|
||||
temp_find_feature(&cpu_sensor_path, &cpu_feature);
|
||||
temp_find_feature(&sys_sensor_path, &sys_feature);
|
||||
}
|
||||
|
||||
sensors_snprintf_chip_name(str, 256, name);
|
||||
DEBUG(printf("chip name = %s (%d)\n",str,__LINE__);)
|
||||
|
||||
while ((feature = sensors_get_features( name, &f1)) != NULL) {
|
||||
|
||||
feattext = sensors_get_label( name, feature );
|
||||
DEBUG(printf("f1=%d feattext=%s (%d) \n",f1,feattext,__LINE__);)
|
||||
|
||||
if ( (subfeature = sensors_get_subfeature (name, feature, SENSORS_SUBFEATURE_TEMP_INPUT)) ) {
|
||||
DEBUG(printf("subfeature name =%s (%d) \n",subfeature->name,__LINE__);)
|
||||
if (strcmp(subfeature->name, cpu_feature_name) == 0) {
|
||||
cpu_feature = subfeature->number;
|
||||
chip_name = name;
|
||||
}
|
||||
else if (strcmp(subfeature->name, sys_feature_name) == 0) {
|
||||
sys_feature = subfeature->number;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (chip_name == NULL) {
|
||||
fprintf(stderr, "could not find a suitable chip\n");
|
||||
exit(1);
|
||||
}
|
||||
unsigned int temp_read(sensor_source_t const *source) {
|
||||
double value;
|
||||
if (source->valid) {
|
||||
if (sensors_get_value(source->chip, source->feature, &value)) {
|
||||
return 0;
|
||||
}
|
||||
if (t_type == FAHRENHEIT) {
|
||||
value = TO_FAHRENHEIT(value);
|
||||
} else if (t_type == KELVIN) {
|
||||
value = TO_KELVIN(value);
|
||||
}
|
||||
return (unsigned int)(value);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void temp_getusage(unsigned int *cpu_temp, unsigned int *sys_temp) {
|
||||
double cpu, sys;
|
||||
|
||||
sensors_get_value(chip_name, cpu_feature, &cpu);
|
||||
sensors_get_value(chip_name, sys_feature, &sys);
|
||||
|
||||
if (t_type == FAHRENHEIT) {
|
||||
cpu = TO_FAHRENHEIT(cpu);
|
||||
sys = TO_FAHRENHEIT(sys);
|
||||
} else if (t_type == KELVIN) {
|
||||
cpu = TO_KELVIN(cpu);
|
||||
sys = TO_KELVIN(sys);
|
||||
}
|
||||
|
||||
*cpu_temp = (unsigned int)(cpu);
|
||||
*sys_temp = (unsigned int)(sys);
|
||||
*cpu_temp = temp_read(&cpu_feature);
|
||||
*sys_temp = temp_read(&sys_feature);
|
||||
}
|
||||
|
|
10
temp.h
10
temp.h
|
@ -11,8 +11,14 @@ typedef enum temperature_t {
|
|||
CELCIUS, FAHRENHEIT, KELVIN
|
||||
} temperature_t;
|
||||
|
||||
extern char *cpu_feature_name;
|
||||
extern char *sys_feature_name;
|
||||
typedef struct sensor_path_t {
|
||||
char const *chip;
|
||||
char const *feature;
|
||||
char const *subfeature;
|
||||
} sensor_path_t;
|
||||
|
||||
extern sensor_path_t cpu_sensor_path;
|
||||
extern sensor_path_t sys_sensor_path;
|
||||
|
||||
extern temperature_t t_type;
|
||||
|
||||
|
|
Loading…
Reference in a new issue