make it more or less work with 'warning_level=everything'

This commit is contained in:
2026-07-02 13:19:42 +02:00
parent 1d2095261f
commit 4858feb4c7
11 changed files with 44 additions and 25 deletions

View File

@@ -37,7 +37,8 @@ void cpu_update(struct cpu_sensors_t *c) {
clock_gettime(CLOCK_MONOTONIC, &curr.ts);
fast_read_num_u64("/sys/class/powercap/intel-rapl:0/", "energy_uj", buf, &curr.energy, 1);
c->ptotal = (float)(curr.energy - prev.energy) / (float)timespec_diff_us(&curr.ts, &prev.ts);
const uint64_t tdiff_us = timespec_diff_us(&curr.ts, &prev.ts);
c->ptotal = (float)(curr.energy - prev.energy) / (float)tdiff_us;
prev = curr;
if (c->ptotal > 500.0f || c->ptotal < 0.0f)
c->ptotal = 0.0f;

View File

@@ -9,6 +9,10 @@
constexpr char rel_metrics_path[] = "/../../gpu_metrics"; // gpu_metrics path relative to hwmon path
constexpr uint16_t max_metrics_length = 512; // length of the metrics buffer
void fill_missing_metrics(struct gpu_sensors_t *g);
void update_from_fs(struct gpu_sensors_t *g);
void update_from_metrics(struct gpu_sensors_t *g);
void gpu_detect(struct gpu_sensors_t *t, const char *pci) {
snprintf(t->hwmon, sizeof(t->hwmon), "/sys/bus/pci/devices/%s/hwmon", pci);
const int ret = get_hwmon_dir(t->hwmon, sizeof(t->hwmon));
@@ -60,7 +64,7 @@ void update_from_metrics(struct gpu_sensors_t *g) {
switch (header->format_revision * 10 + header->content_revision) {
/* rx5700xt, rx7800xtx rx9070xt */
/* rx5700xt, rx7800xt, rx9070xt */
case 13: {
const struct gpu_metrics_v1_3 *metrics = (struct gpu_metrics_v1_3 *)raw_metrics;
g->usage_core = metrics->average_gfx_activity;

View File

@@ -10,6 +10,9 @@
#define MIN(a, b) ((a) < (b) ? (a) : (b))
int lcd_open(struct lcd_t *lcd, bool reopen);
void lcd_write(struct lcd_t *lcd, const uint8_t *cmdbuf, uint16_t len);
int lcd_open(struct lcd_t *lcd, const bool reopen) {
applog(LOG_INF, "Opening serial port at %s", lcd->port);
if (lcd->fd <= 0 || reopen)
@@ -55,7 +58,7 @@ void lcd_set_backlight(struct lcd_t *lcd, const bool enabled) {
}
void lcd_set_cursor(struct lcd_t *lcd, const uint8_t row, const uint8_t col) {
const uint8_t cmdbuf[] = {254, 71, (col + 1), (row + 1)};
const uint8_t cmdbuf[] = {254, 71, col + 1, row + 1};
lcd_write(lcd, cmdbuf, sizeof(cmdbuf));
}
@@ -84,13 +87,13 @@ void lcd_writef(struct lcd_t *lcd, const uint8_t x, const uint8_t y, const char
char tmp[LCD_COLS + 1];
va_list ap;
va_start(ap, fmt);
uint8_t len = vsnprintf(tmp, sizeof(tmp), fmt, ap); // print fmt and ap to a temporary buffer
int len = vsnprintf(tmp, sizeof(tmp), fmt, ap); // print fmt and ap to a temporary buffer
va_end(ap);
len = MIN(len, LCD_COLS - x);
int pos = 4 + x + (LCD_COLS * (y % 2)); // skip 4 bytes to leave room for set cursor command
if (y >= 2)
pos += 2 * LCD_COLS + 4; // if we're writing to disp2, skip another 4 bytes for set cursor command and 2*40 bytes of disp 1
memcpy(lcd->writebuf.text + pos, tmp, len); // copy to lcd writebuffer address + whatever pos is
memcpy(lcd->writebuf.text + pos, tmp, (size_t)len); // copy to lcd writebuffer address + whatever pos is
}
inline void lcd_clear_buf(struct lcd_t *lcd) {

View File

@@ -22,13 +22,13 @@ static constexpr char cpu_pcidev[] = "0000:00:18.3";
static constexpr char gpu_pcidev[] = "0000:0a:00.0";
struct control_t {
atomic_bool g_running;
pthread_mutex_t sensors_mtx;
pthread_cond_t sensors_ready;
atomic_bool g_running;
uint8_t _padding[7];
} control;
struct sensors_t { // NOLINT yes it is
struct time_date_t td;
struct memory_t ram;
struct disk_t home;
struct disk_t gry;
@@ -37,6 +37,7 @@ struct sensors_t { // NOLINT yes it is
struct cpu_sensors_t cpu;
struct gpu_sensors_t gpu;
struct aio_t aio;
struct time_date_t td;
double loadavg[3];
};
@@ -139,23 +140,23 @@ static void *display_thread(void *arg) {
lcd_writef(&lcd, 0, 1, "%d/%d%c", sensors->cpu.tctl, sensors->cpu.tccd1, 0);
lcd_writef(&lcd, 7, 1, "%s", P_BYTES(sensors->ram.used, 0));
lcd_writef(&lcd, 13, 1, "%.1f%c", sensors->aio.water_temp, 0);
lcd_writef(&lcd, 13, 1, "%.1f%c", (double)sensors->aio.water_temp, 0);
lcd_writef(&lcd, 18, 1, "%3d%c", sensors->sys.t_sensor, 0);
lcd_writef(&lcd, 28, 1, "%4s%c", gpudelta, 0);
lcd_writef(&lcd, 25 - gpu_pos, 1, "%6s", P_BYTES(sensors->gpu.vram_used, 1));
lcd_writef(&lcd, 34, 1, "%d/%d%c", sensors->gpu.temp_edge, sensors->gpu.temp_hotspot, 0);
lcd_writef(&lcd, 0, 2, "%.0fW", sensors->cpu.ptotal);
lcd_writef(&lcd, 0, 2, "%.0fW", (double)sensors->cpu.ptotal);
lcd_writef(&lcd, 5, 2, "%dR", avg_fan_speed);
lcd_writef(&lcd, 12, 2, "%5s%c", P_BYTES(sensors->net.upload, 1), 3);
lcd_writef(&lcd, 19, 2, "%c%s", 4, P_BYTES(sensors->net.download, 1));
lcd_writef(&lcd, 26, 2, "%4dR", sensors->gpu.fan_speed);
lcd_writef(&lcd, 32, 2, "%3d/%3dW", sensors->gpu.power_avg, sensors->gpu.power_cap);
lcd_writef(&lcd, 0, 3, "%dMHz", sensors->cpu.avg_freq);
lcd_writef(&lcd, 0, 3, "%uMHz", sensors->cpu.avg_freq);
lcd_writef(&lcd, 8, 3, "%4dR-%c", sensors->aio.pump_speed, modes[sensors->aio.pump_mode]);
lcd_writef(&lcd, 21, 3, "%12s", gpuclock);
lcd_writef(&lcd, 34, 3, "%.3fV", sensors->gpu.vcore);
lcd_writef(&lcd, 34, 3, "%.3fV", (double)sensors->gpu.vcore);
}
pthread_mutex_unlock(&control.sensors_mtx); // unlock sensor struct
@@ -173,7 +174,7 @@ static void *display_thread(void *arg) {
int main(void) {
applog(LOG_START, "linuxSmartie starting");
applog(LOG_DBG, "Compiled on %s %s with %s", __DATE__, __TIME__, C_STD);
applog(LOG_DBG, "Compiled with %s", C_STD);
/* see if another instance is up, quit if it is */
if (get_instance_lock() < 0)

View File

@@ -63,7 +63,8 @@ void sys_get_network(struct network_t *network) {
clock_gettime(CLOCK_MONOTONIC, &current.ts);
fast_read_num_u64(path, "rx_bytes", buf, &current.rx, 1);
fast_read_num_u64(path, "tx_bytes", buf, &current.tx, 1);
const double diff_s = (double)timespec_diff_us(&current.ts, &prev.ts) / 1000000.0;
const uint64_t diff_us = timespec_diff_us(&current.ts, &prev.ts);
const double diff_s = (double)diff_us / 1000000.0;
network->download = (uint32_t)((double)(current.rx - prev.rx) / diff_s);
network->upload = (uint32_t)((double)(current.tx - prev.tx) / diff_s);
prev = current;

View File

@@ -45,7 +45,7 @@ inline void timespec_add_ms(struct timespec *ts, const uint16_t ms) {
inline uint64_t timespec_diff_us(const struct timespec *a, const struct timespec *b) {
const int64_t sec = a->tv_sec - b->tv_sec;
const int64_t nsec = a->tv_nsec - b->tv_nsec;
return sec * 1000000LL + nsec / 1000LL;
return sec * 1000000ULL + nsec / 1000ULL;
}
inline char *pretty_num(const double num, char *buf, const size_t bufsz) {
@@ -108,12 +108,12 @@ inline void fast_read_num_u64(const char *dir, const char *file, char *buf, uint
inline void fast_read_num_u16(const char *dir, const char *file, char *buf, uint16_t *result, const uint32_t divider) {
read_file(dir, file, buf, 32);
*result = strtol(buf, nullptr, 10) / divider;
*result = (uint16_t)strtol(buf, nullptr, 10) / divider;
}
inline void fast_read_num_u8(const char *dir, const char *file, char *buf, uint8_t *result, const uint32_t divider) {
read_file(dir, file, buf, 32);
*result = strtol(buf, nullptr, 10) / divider;
*result = (uint8_t)strtol(buf, nullptr, 10) / divider;
}
inline void fast_read_num_i16(const char *dir, const char *file, char *buf, int16_t *result, const uint32_t divider) {
@@ -123,5 +123,6 @@ inline void fast_read_num_i16(const char *dir, const char *file, char *buf, int1
inline void fast_read_num_f(const char *dir, const char *file, char *buf, float *result, const uint32_t divider) {
read_file(dir, file, buf, 32);
*result = (float)strtoull(buf, nullptr, 10) / (float)divider;
const uint64_t val = strtoull(buf, nullptr, 10);
*result = (float)val / (float)divider;
}