From 78a77164fb984aecb3772a5458b12c91735cf0ec Mon Sep 17 00:00:00 2001 From: drath Date: Fri, 14 Aug 2026 01:50:58 +0200 Subject: [PATCH] experiment --- include/utils.h | 19 +++++++++++++++++++ src/sys.c | 15 +++++++++++++-- src/utils.c | 34 +++++++++++++++++++++++++++++++++- 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/include/utils.h b/include/utils.h index f85b5c7..f484e19 100644 --- a/include/utils.h +++ b/include/utils.h @@ -1,6 +1,7 @@ #ifndef LINUXSMARTIE_UTILS_H #define LINUXSMARTIE_UTILS_H +#include #include #if __STDC_VERSION__ >= 202000L @@ -21,6 +22,18 @@ #define P_BYTES(bytes, start) pretty_bytes((bytes), (start), (char[16]){0}, 16) #define P_NUM(num) pretty_num((num), (char[16]){0}, 16) +typedef enum { + SENSOR_I16, +} sensor_type_t; + +typedef struct { + char path[256]; + int fd; + void* value; + uint32_t divider; + sensor_type_t type; +} sensor_t; + int get_instance_lock(); void timespec_add_ms(struct timespec *ts, uint16_t ms); @@ -45,4 +58,10 @@ void fast_read_num_i16(const char *dir, const char *file, char *buf, int16_t *re void fast_read_num_f(const char *dir, const char *file, char *buf, float *result, uint32_t divider); +void open_sensor(sensor_t* s, const char* dir, const char *file, void* value, uint32_t divider, sensor_type_t type); + +void fast_read_sensor_i16(const sensor_t *s); + +void close_sensor(const sensor_t* s); + #endif diff --git a/src/sys.c b/src/sys.c index 6135fba..ce727f6 100644 --- a/src/sys.c +++ b/src/sys.c @@ -8,6 +8,8 @@ #include "sys.h" #include "utils.h" +static sensor_t sensors[1]; + char *sys_get_time_string(char *buf, const size_t bufsz, const time_t t) { const struct tm *tm = localtime(&t); snprintf(buf, bufsz, "%02d:%02d:%02d", tm->tm_hour, tm->tm_min, tm->tm_sec); @@ -88,13 +90,22 @@ void sys_detect(struct syssensors_t *s, const char *platform) { return; } applog(LOG_INF, "Detected system sensors in %s", s->hwmon); + + open_sensor(&sensors[0], s->hwmon, "/temp5_input", &s->t_sensor, 1000, SENSOR_I16); } void sys_update_sensors(struct syssensors_t *s) { if (!s->hwmon[0]) return; - static char buf[8]; + + static size_t num_sensors = 0; + if (num_sensors == 0) + num_sensors = sizeof(sensors) / sizeof(sensors[0]); + + // static char buf[8]; // fast_read_num_u16(s->hwmon, "/fan2_input", buf, &s->fan_speed[0], 1); // cpu fan, aka aio pump now // fast_read_num_u16(s->hwmon, "/fan7_input", buf, &s->fan_speed[1], 1); // cpu opt - fast_read_num_i16(s->hwmon, "/temp5_input", buf, &s->t_sensor, 1000); + // fast_read_num_i16(s->hwmon, "/temp5_input", buf, &s->t_sensor, 1000); + for (size_t i = 0; i < num_sensors; i++) + fast_read_sensor_i16(&sensors[i]); } diff --git a/src/utils.c b/src/utils.c index 91985af..123dc4e 100644 --- a/src/utils.c +++ b/src/utils.c @@ -96,7 +96,7 @@ inline ssize_t read_file(const char *dir, const char *file, char *buffer, const return 0; } const ssize_t len = read(fd, buffer, n); - if (len >= 0 && buffer) + if (len > 0 && buffer) buffer[len] = '\0'; close(fd); return len; @@ -126,4 +126,36 @@ inline void fast_read_num_f(const char *dir, const char *file, char *buf, float read_file(dir, file, buf, 32); const uint64_t val = strtoull(buf, nullptr, 10); *result = (float)val / (float)divider; +} + +void open_sensor(sensor_t* s, const char* dir, const char *file, void* value, const uint32_t divider, const sensor_type_t type) { + char *nt = stpcpy(s->path, dir); // nt is a pointer to the null terminator of the copied string + strcpy(nt, file); // copy to the null terminator of prev copy, append basically + s->divider = divider; + s->value = value; + s->type = type; + s->fd = open(s->path, O_RDONLY | O_CLOEXEC); +} + +inline void fast_read_sensor_i16(const sensor_t *s) { + char buf[32]; + lseek(s->fd, 0, SEEK_SET); + const ssize_t len = read(s->fd, buf, sizeof(buf)); + if (len > 0) + buf[len] = '\0'; + // return if read failed + + switch (s->type) { + case SENSOR_I16: + *(int16_t*)s->value = (int16_t)(strtol(buf, nullptr, 10) / s->divider); + break; + + default: + return; + } + +} + +void close_sensor(const sensor_t* s) { + close(s->fd); } \ No newline at end of file