mirror of
https://github.com/ilya-zlobintsev/LACT.git
synced 2025-02-25 18:55:26 -06:00
somewhat working power cap
This commit is contained in:
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -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",
|
||||
]
|
||||
|
||||
@@ -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<Notify>, 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");
|
||||
|
||||
@@ -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)
|
||||
}*/
|
||||
|
||||
@@ -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<F: Fn() + 'static + Clone>(&self, f: F) {
|
||||
@@ -72,24 +75,17 @@ impl OcPage {
|
||||
}
|
||||
|
||||
pub fn connect_settings_changed<F: Fn() + 'static + Clone>(&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<PerformanceLevel>) {
|
||||
@@ -130,7 +126,7 @@ impl OcPage {
|
||||
}
|
||||
}*/
|
||||
|
||||
pub fn get_power_cap(&self) -> Option<i64> {
|
||||
pub fn get_power_cap(&self) -> Option<f64> {
|
||||
self.power_cap_frame.get_cap()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -63,13 +63,13 @@ impl PowerCapFrame {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_cap(&self) -> Option<i64> {
|
||||
pub fn get_cap(&self) -> Option<f64> {
|
||||
// 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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -62,6 +62,12 @@ impl DaemonClient {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn set_power_cap(&self, id: &str, cap: Option<f64>) -> anyhow::Result<()> {
|
||||
self.make_request(Request::SetPowerCap { id, cap })?
|
||||
.inner()?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn get_device_info(&self, id: &str) -> anyhow::Result<ResponseBuffer<DeviceInfo>> {
|
||||
self.make_request(Request::DeviceInfo { id })
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user