mirror of
https://github.com/Llewellynvdm/conky.git
synced 2024-12-25 12:10:03 +00:00
sysfs objects: merge init and print routines
This commit is contained in:
parent
da7876468f
commit
700a32b2e7
45
src/conky.c
45
src/conky.c
@ -1935,52 +1935,13 @@ static void generate_text_internal(char *p, int p_max_size,
|
|||||||
}
|
}
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
OBJ(i2c) {
|
OBJ(i2c) {
|
||||||
double r;
|
print_sysfs_sensor(obj, p, p_max_size);
|
||||||
|
|
||||||
r = get_sysfs_info(&obj->data.sysfs.fd, obj->data.sysfs.arg,
|
|
||||||
obj->data.sysfs.devtype, obj->data.sysfs.type);
|
|
||||||
|
|
||||||
r = r * obj->data.sysfs.factor + obj->data.sysfs.offset;
|
|
||||||
|
|
||||||
if (!strncmp(obj->data.sysfs.type, "temp", 4)) {
|
|
||||||
temp_print(p, p_max_size, r, TEMP_CELSIUS);
|
|
||||||
} else if (r >= 100.0 || r == 0) {
|
|
||||||
snprintf(p, p_max_size, "%d", (int) r);
|
|
||||||
} else {
|
|
||||||
snprintf(p, p_max_size, "%.1f", r);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
OBJ(platform) {
|
OBJ(platform) {
|
||||||
double r;
|
print_sysfs_sensor(obj, p, p_max_size);
|
||||||
|
|
||||||
r = get_sysfs_info(&obj->data.sysfs.fd, obj->data.sysfs.arg,
|
|
||||||
obj->data.sysfs.devtype, obj->data.sysfs.type);
|
|
||||||
|
|
||||||
r = r * obj->data.sysfs.factor + obj->data.sysfs.offset;
|
|
||||||
|
|
||||||
if (!strncmp(obj->data.sysfs.type, "temp", 4)) {
|
|
||||||
temp_print(p, p_max_size, r, TEMP_CELSIUS);
|
|
||||||
} else if (r >= 100.0 || r == 0) {
|
|
||||||
snprintf(p, p_max_size, "%d", (int) r);
|
|
||||||
} else {
|
|
||||||
snprintf(p, p_max_size, "%.1f", r);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
OBJ(hwmon) {
|
OBJ(hwmon) {
|
||||||
double r;
|
print_sysfs_sensor(obj, p, p_max_size);
|
||||||
|
|
||||||
r = get_sysfs_info(&obj->data.sysfs.fd, obj->data.sysfs.arg,
|
|
||||||
obj->data.sysfs.devtype, obj->data.sysfs.type);
|
|
||||||
|
|
||||||
r = r * obj->data.sysfs.factor + obj->data.sysfs.offset;
|
|
||||||
|
|
||||||
if (!strncmp(obj->data.sysfs.type, "temp", 4)) {
|
|
||||||
temp_print(p, p_max_size, r, TEMP_CELSIUS);
|
|
||||||
} else if (r >= 100.0 || r == 0) {
|
|
||||||
snprintf(p, p_max_size, "%d", (int) r);
|
|
||||||
} else {
|
|
||||||
snprintf(p, p_max_size, "%.1f", r);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif /* __linux__ */
|
#endif /* __linux__ */
|
||||||
OBJ(alignr) {
|
OBJ(alignr) {
|
||||||
|
75
src/core.c
75
src/core.c
@ -772,79 +772,12 @@ struct text_object *construct_text_object(const char *s, const char *arg, long
|
|||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
END OBJ_ARG(i2c, 0, "i2c needs arguments")
|
END OBJ_ARG(i2c, 0, "i2c needs arguments")
|
||||||
char buf1[64], buf2[64];
|
parse_i2c_sensor(obj, arg);
|
||||||
float factor, offset;
|
|
||||||
int n, found = 0;
|
|
||||||
|
|
||||||
#define HWMON_RESET() {\
|
|
||||||
buf1[0] = 0; \
|
|
||||||
factor = 1.0; \
|
|
||||||
offset = 0.0; }
|
|
||||||
|
|
||||||
if (sscanf(arg, "%63s %d %f %f", buf2, &n, &factor, &offset) == 4) found = 1; else HWMON_RESET();
|
|
||||||
if (!found && sscanf(arg, "%63s %63s %d %f %f", buf1, buf2, &n, &factor, &offset) == 5) found = 1; else if (!found) HWMON_RESET();
|
|
||||||
if (!found && sscanf(arg, "%63s %63s %d", buf1, buf2, &n) == 3) found = 1; else if (!found) HWMON_RESET();
|
|
||||||
if (!found && sscanf(arg, "%63s %d", buf2, &n) == 2) found = 1; else if (!found) HWMON_RESET();
|
|
||||||
|
|
||||||
if (!found) {
|
|
||||||
NORM_ERR("i2c failed to parse arguments");
|
|
||||||
obj->type = OBJ_text;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
DBGP("parsed i2c args: '%s' '%s' %d %f %f\n", buf1, buf2, n, factor, offset);
|
|
||||||
obj->data.sysfs.fd = open_i2c_sensor((*buf1) ? buf1 : 0, buf2, n,
|
|
||||||
&obj->data.sysfs.arg, obj->data.sysfs.devtype);
|
|
||||||
strncpy(obj->data.sysfs.type, buf2, 63);
|
|
||||||
obj->data.sysfs.factor = factor;
|
|
||||||
obj->data.sysfs.offset = offset;
|
|
||||||
|
|
||||||
END OBJ_ARG(platform, 0, "platform needs arguments")
|
END OBJ_ARG(platform, 0, "platform needs arguments")
|
||||||
char buf1[64], buf2[64];
|
parse_platform_sensor(obj, arg);
|
||||||
float factor, offset;
|
|
||||||
int n, found = 0;
|
|
||||||
|
|
||||||
if (sscanf(arg, "%63s %d %f %f", buf2, &n, &factor, &offset) == 4) found = 1; else HWMON_RESET();
|
|
||||||
if (!found && sscanf(arg, "%63s %63s %d %f %f", buf1, buf2, &n, &factor, &offset) == 5) found = 1; else if (!found) HWMON_RESET();
|
|
||||||
if (!found && sscanf(arg, "%63s %63s %d", buf1, buf2, &n) == 3) found = 1; else if (!found) HWMON_RESET();
|
|
||||||
if (!found && sscanf(arg, "%63s %d", buf2, &n) == 2) found = 1; else if (!found) HWMON_RESET();
|
|
||||||
|
|
||||||
if (!found) {
|
|
||||||
NORM_ERR("platform failed to parse arguments");
|
|
||||||
obj->type = OBJ_text;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
DBGP("parsed platform args: '%s' '%s' %d %f %f", buf1, buf2, n, factor, offset);
|
|
||||||
obj->data.sysfs.fd = open_platform_sensor((*buf1) ? buf1 : 0, buf2, n,
|
|
||||||
&obj->data.sysfs.arg, obj->data.sysfs.devtype);
|
|
||||||
strncpy(obj->data.sysfs.type, buf2, 63);
|
|
||||||
obj->data.sysfs.factor = factor;
|
|
||||||
obj->data.sysfs.offset = offset;
|
|
||||||
|
|
||||||
END OBJ_ARG(hwmon, 0, "hwmon needs argumanets")
|
END OBJ_ARG(hwmon, 0, "hwmon needs argumanets")
|
||||||
char buf1[64], buf2[64];
|
parse_hwmon_sensor(obj, arg);
|
||||||
float factor, offset;
|
#endif /* __linux__ */
|
||||||
int n, found = 0;
|
|
||||||
|
|
||||||
if (sscanf(arg, "%63s %d %f %f", buf2, &n, &factor, &offset) == 4) found = 1; else HWMON_RESET();
|
|
||||||
if (!found && sscanf(arg, "%63s %63s %d %f %f", buf1, buf2, &n, &factor, &offset) == 5) found = 1; else if (!found) HWMON_RESET();
|
|
||||||
if (!found && sscanf(arg, "%63s %63s %d", buf1, buf2, &n) == 3) found = 1; else if (!found) HWMON_RESET();
|
|
||||||
if (!found && sscanf(arg, "%63s %d", buf2, &n) == 2) found = 1; else if (!found) HWMON_RESET();
|
|
||||||
|
|
||||||
#undef HWMON_RESET
|
|
||||||
|
|
||||||
if (!found) {
|
|
||||||
NORM_ERR("hwmon failed to parse arguments");
|
|
||||||
obj->type = OBJ_text;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
DBGP("parsed hwmon args: '%s' '%s' %d %f %f\n", buf1, buf2, n, factor, offset);
|
|
||||||
obj->data.sysfs.fd = open_hwmon_sensor((*buf1) ? buf1 : 0, buf2, n,
|
|
||||||
&obj->data.sysfs.arg, obj->data.sysfs.devtype);
|
|
||||||
strncpy(obj->data.sysfs.type, buf2, 63);
|
|
||||||
obj->data.sysfs.factor = factor;
|
|
||||||
obj->data.sysfs.offset = offset;
|
|
||||||
|
|
||||||
#endif /* !__OpenBSD__ */
|
|
||||||
|
|
||||||
END
|
END
|
||||||
/* we have four different types of top (top, top_mem, top_time and top_io). To
|
/* we have four different types of top (top, top_mem, top_time and top_io). To
|
||||||
|
62
src/linux.c
62
src/linux.c
@ -34,6 +34,7 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "linux.h"
|
#include "linux.h"
|
||||||
#include "diskio.h"
|
#include "diskio.h"
|
||||||
|
#include "temphelper.h"
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@ -836,7 +837,7 @@ static int get_first_file_in_a_directory(const char *dir, char *s, int *rep)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int open_sysfs_sensor(const char *dir, const char *dev, const char *type, int n,
|
static int open_sysfs_sensor(const char *dir, const char *dev, const char *type, int n,
|
||||||
int *divisor, char *devtype)
|
int *divisor, char *devtype)
|
||||||
{
|
{
|
||||||
char path[256];
|
char path[256];
|
||||||
@ -933,7 +934,7 @@ int open_sysfs_sensor(const char *dir, const char *dev, const char *type, int n,
|
|||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
double get_sysfs_info(int *fd, int divisor, char *devtype, char *type)
|
static double get_sysfs_info(int *fd, int divisor, char *devtype, char *type)
|
||||||
{
|
{
|
||||||
int val = 0;
|
int val = 0;
|
||||||
|
|
||||||
@ -992,6 +993,63 @@ double get_sysfs_info(int *fd, int divisor, char *devtype, char *type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define HWMON_RESET() {\
|
||||||
|
buf1[0] = 0; \
|
||||||
|
factor = 1.0; \
|
||||||
|
offset = 0.0; }
|
||||||
|
|
||||||
|
static void parse_sysfs_sensor(struct text_object *obj, const char *arg, const char *path, const char *type)
|
||||||
|
{
|
||||||
|
char buf1[64], buf2[64];
|
||||||
|
float factor, offset;
|
||||||
|
int n, found = 0;
|
||||||
|
|
||||||
|
if (sscanf(arg, "%63s %d %f %f", buf2, &n, &factor, &offset) == 4) found = 1; else HWMON_RESET();
|
||||||
|
if (!found && sscanf(arg, "%63s %63s %d %f %f", buf1, buf2, &n, &factor, &offset) == 5) found = 1; else if (!found) HWMON_RESET();
|
||||||
|
if (!found && sscanf(arg, "%63s %63s %d", buf1, buf2, &n) == 3) found = 1; else if (!found) HWMON_RESET();
|
||||||
|
if (!found && sscanf(arg, "%63s %d", buf2, &n) == 2) found = 1; else if (!found) HWMON_RESET();
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
NORM_ERR("i2c failed to parse arguments");
|
||||||
|
obj->type = OBJ_text;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
DBGP("parsed %s args: '%s' '%s' %d %f %f\n", type, buf1, buf2, n, factor, offset);
|
||||||
|
obj->data.sysfs.fd = open_sysfs_sensor(path, (*buf1) ? buf1 : 0, buf2, n,
|
||||||
|
&obj->data.sysfs.arg, obj->data.sysfs.devtype);
|
||||||
|
strncpy(obj->data.sysfs.type, buf2, 63);
|
||||||
|
obj->data.sysfs.factor = factor;
|
||||||
|
obj->data.sysfs.offset = offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define PARSER_GENERATOR(name, path) \
|
||||||
|
void parse_##name##_sensor(struct text_object *obj, const char *arg) \
|
||||||
|
{ \
|
||||||
|
parse_sysfs_sensor(obj, arg, path, #name); \
|
||||||
|
}
|
||||||
|
|
||||||
|
PARSER_GENERATOR(i2c, "/sys/bus/i2c/devices/")
|
||||||
|
PARSER_GENERATOR(hwmon, "/sys/class/hwmon/")
|
||||||
|
PARSER_GENERATOR(platform, "/sys/bus/platform/devices/")
|
||||||
|
|
||||||
|
void print_sysfs_sensor(struct text_object *obj, char *p, int p_max_size)
|
||||||
|
{
|
||||||
|
double r;
|
||||||
|
|
||||||
|
r = get_sysfs_info(&obj->data.sysfs.fd, obj->data.sysfs.arg,
|
||||||
|
obj->data.sysfs.devtype, obj->data.sysfs.type);
|
||||||
|
|
||||||
|
r = r * obj->data.sysfs.factor + obj->data.sysfs.offset;
|
||||||
|
|
||||||
|
if (!strncmp(obj->data.sysfs.type, "temp", 4)) {
|
||||||
|
temp_print(p, p_max_size, r, TEMP_CELSIUS);
|
||||||
|
} else if (r >= 100.0 || r == 0) {
|
||||||
|
snprintf(p, p_max_size, "%d", (int) r);
|
||||||
|
} else {
|
||||||
|
snprintf(p, p_max_size, "%.1f", r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Prior to kernel version 2.6.12, the CPU fan speed was available in
|
/* Prior to kernel version 2.6.12, the CPU fan speed was available in
|
||||||
* ADT746X_FAN_OLD, whereas later kernel versions provide this information in
|
* ADT746X_FAN_OLD, whereas later kernel versions provide this information in
|
||||||
* ADT746X_FAN. */
|
* ADT746X_FAN. */
|
||||||
|
15
src/linux.h
15
src/linux.h
@ -29,16 +29,9 @@ void update_gateway_info(void);
|
|||||||
enum { PB_BATT_STATUS, PB_BATT_PERCENT, PB_BATT_TIME };
|
enum { PB_BATT_STATUS, PB_BATT_PERCENT, PB_BATT_TIME };
|
||||||
void get_powerbook_batt_info(char *, size_t, int);
|
void get_powerbook_batt_info(char *, size_t, int);
|
||||||
|
|
||||||
int open_sysfs_sensor(const char *dir, const char *dev, const char *type, int n,
|
void parse_i2c_sensor(struct text_object *, const char *);
|
||||||
int *divisor, char *devtype);
|
void parse_hwmon_sensor(struct text_object *, const char *);
|
||||||
|
void parse_platform_sensor(struct text_object *, const char *);
|
||||||
#define open_i2c_sensor(dev, type, n, divisor, devtype) \
|
void print_sysfs_sensor(struct text_object *, char *, int );
|
||||||
open_sysfs_sensor("/sys/bus/i2c/devices/", dev, type, n, divisor, devtype)
|
|
||||||
#define open_platform_sensor(dev, type, n, divisor, devtype) \
|
|
||||||
open_sysfs_sensor("/sys/bus/platform/devices/", dev, type, n, divisor, devtype)
|
|
||||||
#define open_hwmon_sensor(dev, type, n, divisor, devtype) \
|
|
||||||
open_sysfs_sensor("/sys/class/hwmon/", dev, type, n, divisor, devtype)
|
|
||||||
|
|
||||||
double get_sysfs_info(int *fd, int arg, char *devtype, char *type);
|
|
||||||
|
|
||||||
#endif /* _LINUX_H */
|
#endif /* _LINUX_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user