diff --git a/lact-daemon/src/server/gpu_controller/mod.rs b/lact-daemon/src/server/gpu_controller/mod.rs index 15da3e3..690e3d4 100644 --- a/lact-daemon/src/server/gpu_controller/mod.rs +++ b/lact-daemon/src/server/gpu_controller/mod.rs @@ -264,6 +264,7 @@ impl GpuController { speed_current: self.hw_mon_and_then(HwMon::get_fan_current), speed_max: self.hw_mon_and_then(HwMon::get_fan_max), speed_min: self.hw_mon_and_then(HwMon::get_fan_min), + pwm_current: self.hw_mon_and_then(HwMon::get_fan_pwm), pmfw_info: PmfwInfo { acoustic_limit: self.handle.get_fan_acoustic_limit().ok(), acoustic_target: self.handle.get_fan_acoustic_target().ok(), diff --git a/lact-gui/src/app/root_stack/thermals_page/mod.rs b/lact-gui/src/app/root_stack/thermals_page/mod.rs index f58198d..32db0a1 100644 --- a/lact-gui/src/app/root_stack/thermals_page/mod.rs +++ b/lact-gui/src/app/root_stack/thermals_page/mod.rs @@ -147,22 +147,33 @@ impl ThermalsPage { self.temperatures_label .set_markup(&format!("{temperatures_text}",)); - match stats.fan.speed_current { - Some(fan_speed_current) => self.fan_speed_label.set_markup(&format!( - "{} RPM ({}%)", - fan_speed_current, - (fan_speed_current as f64 - / stats.fan.speed_max.unwrap_or(fan_speed_current) as f64 - * 100.0) - .round() - )), + let fan_label = if let Some(current_rpm) = stats.fan.speed_current { + let text = match stats.fan.speed_max { + Some(max_rpm) => format!( + "{current_rpm} RPM ({}%)", + ((current_rpm as f64 / max_rpm as f64) * 100.0).round(), + ), + None => format!("{current_rpm} RPM"), + }; + Some(text) + } else { + stats.fan.pwm_current.map(|current_pwm| { + format!( + "{}%", + ((current_pwm as f64 / u8::MAX as f64) * 100.0).round() + ) + }) + }; + + match &fan_label { + Some(label) => self.fan_speed_label.set_markup(label), None => self.fan_speed_label.set_text("No fan detected"), } if initial { self.fan_control_mode_stack_switcher.set_visible(true); self.fan_control_mode_stack_switcher - .set_sensitive(stats.fan.speed_current.is_some()); + .set_sensitive(fan_label.is_some()); let child_name = match stats.fan.control_mode { Some(mode) if stats.fan.control_enabled => match mode { diff --git a/lact-schema/src/lib.rs b/lact-schema/src/lib.rs index 9d248ec..eb502a5 100644 --- a/lact-schema/src/lib.rs +++ b/lact-schema/src/lib.rs @@ -188,6 +188,7 @@ pub struct FanStats { pub control_mode: Option, pub static_speed: Option, pub curve: Option, + pub pwm_current: Option, pub speed_current: Option, pub speed_max: Option, pub speed_min: Option,