diff --git a/Cargo.lock b/Cargo.lock index 9d1eb96..f769842 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -26,7 +26,7 @@ dependencies = [ [[package]] name = "amdgpu-sysfs" version = "0.5.0" -source = "git+https://github.com/ilya-zlobintsev/amdgpu-sysfs-rs?branch=error#4ffd5ee0be7fb644c50a6163c3eea6b3872333cd" +source = "git+https://github.com/ilya-zlobintsev/amdgpu-sysfs-rs?branch=error#80cf493d20c36e27a54e5b34162d05767ec6c305" dependencies = [ "serde", ] diff --git a/lact-daemon/src/server/gpu_controller/mod.rs b/lact-daemon/src/server/gpu_controller/mod.rs index f48f75d..7dea638 100644 --- a/lact-daemon/src/server/gpu_controller/mod.rs +++ b/lact-daemon/src/server/gpu_controller/mod.rs @@ -21,7 +21,7 @@ use std::{ time::Duration, }; use tokio::{select, sync::Notify, task::JoinHandle, time::sleep}; -use tracing::{debug, error, info, warn}; +use tracing::{error, info, trace, warn}; type FanControlHandle = (Arc, JoinHandle<()>); @@ -212,7 +212,7 @@ impl GpuController { .remove(&temp_key) .expect("Could not get temperature by given key"); let target_rpm = curve.rpm_at_temp(temp, min_rpm, max_rpm); - debug!("Fan control tick: setting rpm to {target_rpm}"); + trace!("Fan control tick: setting rpm to {target_rpm}"); if let Err(err) = hw_mon.set_fan_target(target_rpm) { error!("Could not set fan speed: {err}, disabling fan control"); diff --git a/lact-gui/src/app/mod.rs b/lact-gui/src/app/mod.rs index 7328398..2362f9e 100644 --- a/lact-gui/src/app/mod.rs +++ b/lact-gui/src/app/mod.rs @@ -17,6 +17,9 @@ use lact_schema::DeviceStats; use root_stack::RootStack; use tracing::{debug, error, info, trace}; +// In ms +const STATS_POLL_INTERVAL: u64 = 250; + #[derive(Clone)] pub struct App { pub window: Window, @@ -98,10 +101,10 @@ impl App { let apply_revealer = self.apply_revealer.clone(); - // self.root_stack.oc_page.connect_settings_changed(move || { - // debug!("Settings changed, showing apply button"); - // apply_revealer.show(); - // }); + self.root_stack.oc_page.connect_settings_changed(move || { + debug!("Settings changed, showing apply button"); + apply_revealer.show(); + }); } { @@ -169,13 +172,13 @@ impl App { app.daemon_client .set_power_profile(gpu_id, profile) .expect("Failed to set power profile"); - } + }*/ if let Some(cap) = app.root_stack.oc_page.get_power_cap() { app.daemon_client - .set_power_cap(gpu_id, cap) + .set_power_cap(&gpu_id, Some(cap)) .expect("Failed to set power cap"); - }*/ + } app.set_info(&gpu_id); }); @@ -192,9 +195,16 @@ impl App { .get_device_info(gpu_id) .expect("Could not fetch info"); let info = info_buf.inner().unwrap(); - trace!("Setting info {info:?}"); + let stats_buf = self + .daemon_client + .get_device_stats(gpu_id) + .expect("Could not fetch stats"); + let stats = stats_buf.inner().unwrap(); + + trace!("Setting info {info:?} and stats {stats:?}"); self.root_stack.info_page.set_info(&info); + self.root_stack.oc_page.set_stats(&stats, true); // trace!("Setting clocks"); // self.root_stack.oc_page.set_info(&info); @@ -265,7 +275,7 @@ impl App { error!("Could not fetch stats: {err}"); } } - thread::sleep(Duration::from_millis(500)); + thread::sleep(Duration::from_millis(STATS_POLL_INTERVAL)); }), ); @@ -279,7 +289,7 @@ impl App { trace!("New stats received, updating {stats:?}"); root_stack.info_page.set_stats(&stats); root_stack.thermals_page.set_stats(&stats); - root_stack.oc_page.set_stats(&stats); + root_stack.oc_page.set_stats(&stats, false); } /*GuiUpdateMsg::FanControlInfo(fan_control_info) => { thermals_page.set_ventilation_info(fan_control_info) }*/ diff --git a/lact-gui/src/app/root_stack/oc_page/mod.rs b/lact-gui/src/app/root_stack/oc_page/mod.rs index ddf5b90..179232b 100644 --- a/lact-gui/src/app/root_stack/oc_page/mod.rs +++ b/lact-gui/src/app/root_stack/oc_page/mod.rs @@ -4,6 +4,7 @@ mod power_cap_frame; mod stats_grid; mod warning_frame; +use glib::clone; use gtk::prelude::*; use gtk::*; use lact_schema::{DeviceInfo, DeviceStats, PerformanceLevel, PowerStats}; @@ -56,12 +57,14 @@ impl OcPage { } } - pub fn set_stats(&self, stats: &DeviceStats) { + pub fn set_stats(&self, stats: &DeviceStats, initial: bool) { self.stats_grid.set_stats(stats); - self.power_cap_frame.set_data( - stats.power_stats.power_cap_current, - stats.power_stats.power_cap_max, - ); + if initial { + self.power_cap_frame.set_data( + stats.power_stats.power_cap_current, + stats.power_stats.power_cap_max, + ); + } } pub fn connect_clocks_reset(&self, f: F) { @@ -72,24 +75,17 @@ impl OcPage { } pub fn connect_settings_changed(&self, f: F) { - { - let f = f.clone(); - self.performance_level_frame - .connect_power_profile_changed(move || { - f(); - }); - } - { - /*let f = f.clone(); - self.clocks_frame.connect_clocks_changed(move || { - f(); - })*/ - } - { - self.power_cap_frame.connect_cap_changed(move || { - f(); - }) - } + self.performance_level_frame + .connect_power_profile_changed(clone!(@strong f => move || { + f() + })); + /*let f = f.clone(); + self.clocks_frame.connect_clocks_changed(move || { + f(); + })*/ + self.power_cap_frame.connect_cap_changed(move || { + f(); + }) } pub fn set_performance_level(&self, profile: Option) { @@ -130,7 +126,7 @@ impl OcPage { } }*/ - pub fn get_power_cap(&self) -> Option { + pub fn get_power_cap(&self) -> Option { self.power_cap_frame.get_cap() } } diff --git a/lact-gui/src/app/root_stack/oc_page/power_cap_frame.rs b/lact-gui/src/app/root_stack/oc_page/power_cap_frame.rs index f9eedd3..9ce3161 100644 --- a/lact-gui/src/app/root_stack/oc_page/power_cap_frame.rs +++ b/lact-gui/src/app/root_stack/oc_page/power_cap_frame.rs @@ -63,13 +63,13 @@ impl PowerCapFrame { } } - pub fn get_cap(&self) -> Option { + pub fn get_cap(&self) -> Option { // Using match gives a warning that floats shouldn't be used in patterns let cap = self.adjustment.value(); if cap == 0.0 { None } else { - Some(cap as i64) + Some(cap) } } diff --git a/lact-gui/src/client.rs b/lact-gui/src/client.rs index 3bf3ce5..f3ef27e 100644 --- a/lact-gui/src/client.rs +++ b/lact-gui/src/client.rs @@ -62,6 +62,12 @@ impl DaemonClient { Ok(()) } + pub fn set_power_cap(&self, id: &str, cap: Option) -> anyhow::Result<()> { + self.make_request(Request::SetPowerCap { id, cap })? + .inner()?; + Ok(()) + } + pub fn get_device_info(&self, id: &str) -> anyhow::Result> { self.make_request(Request::DeviceInfo { id }) }