From a79520024544535d0fde51e09bd2debadc09e934 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Wo=C5=BAniak?= Date: Wed, 24 Aug 2022 17:00:30 +0200 Subject: [PATCH] Improve GUI --- Cargo.lock | 67 ++++++++- amdgpu/src/pidfile/ports.rs | 2 + amdguid/Cargo.toml | 4 +- amdguid/assets/icons/ports2.jpg | Bin 43445 -> 39899 bytes amdguid/assets/icons/ports2.png | Bin 0 -> 52273 bytes amdguid/src/app.rs | 156 ++++++++++++++------- amdguid/src/backend/glium_backend.rs | 2 +- amdguid/src/backend/glow_backend.rs | 2 +- amdguid/src/backend/mod.rs | 17 +-- amdguid/src/backend/wayland_backend.rs | 13 +- amdguid/src/main.rs | 4 +- amdguid/src/widgets/change_fan_settings.rs | 2 +- amdguid/src/widgets/outputs_settings.rs | 74 ++++++---- amdguid/src/widgets/reload_section.rs | 4 +- amdportsd/Cargo.toml | 4 +- amdportsd/src/main.rs | 18 ++- 16 files changed, 259 insertions(+), 110 deletions(-) create mode 100644 amdguid/assets/icons/ports2.png diff --git a/Cargo.lock b/Cargo.lock index e1a0f1e..1060882 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -160,14 +160,14 @@ dependencies = [ "glutin 0.29.1", "gumdrop", "image", - "log", "nix 0.25.0", "parking_lot 0.12.1", - "pretty_env_logger", "serde", "thiserror", "tokio", "toml", + "tracing", + "tracing-subscriber", "vulkano", "vulkano-shaders", "vulkano-win", @@ -213,11 +213,11 @@ version = "0.1.0" dependencies = [ "amdgpu", "futures", - "log", - "pretty_env_logger", "ron 0.7.1", "serde", "tokio", + "tracing", + "tracing-subscriber", ] [[package]] @@ -249,6 +249,15 @@ dependencies = [ "libc", ] +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + [[package]] name = "arboard" version = "2.1.1" @@ -2509,6 +2518,15 @@ dependencies = [ "libc", ] +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + [[package]] name = "shared_library" version = "0.1.9" @@ -2698,6 +2716,15 @@ dependencies = [ "syn", ] +[[package]] +name = "thread_local" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" +dependencies = [ + "once_cell", +] + [[package]] name = "threadpool" version = "1.8.1" @@ -2840,6 +2867,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5aeea4303076558a00714b823f9ad67d58a3bbda1df83d8827d21193156e22f7" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60db860322da191b40952ad9affe65ea23e7dd6a5c442c2c42865810c6ab8e6b" +dependencies = [ + "ansi_term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", ] [[package]] @@ -2906,6 +2959,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "vec_map" version = "0.8.2" diff --git a/amdgpu/src/pidfile/ports.rs b/amdgpu/src/pidfile/ports.rs index 21c5dfa..567b0f6 100644 --- a/amdgpu/src/pidfile/ports.rs +++ b/amdgpu/src/pidfile/ports.rs @@ -127,6 +127,7 @@ impl OutputType { Some(match s { "DP" => Self::DisplayPort, "eDP" => Self::MiniDisplayPort, + "DVI" => Self::Dvi, "HDMI" => Self::Hdmi, _ => return None, }) @@ -174,6 +175,7 @@ pub struct Output { pub status: Status, #[serde(rename = "M")] pub modes: Vec, + pub display_power_managment: bool, } #[derive(Debug, Default, Clone, Serialize, Deserialize)] diff --git a/amdguid/Cargo.toml b/amdguid/Cargo.toml index 6171e4c..3deea86 100644 --- a/amdguid/Cargo.toml +++ b/amdguid/Cargo.toml @@ -37,8 +37,8 @@ toml = { version = "0.5" } thiserror = { version = "1.0" } gumdrop = { version = "0.8" } -log = { version = "0.4" } -pretty_env_logger = { version = "0.4" } +tracing = { version = "0.1.36" } +tracing-subscriber = { version = "0.3.15" } egui = { version = "0.18", optional = true, features = [] } epaint = { version = "0.18", features = [], optional = true } diff --git a/amdguid/assets/icons/ports2.jpg b/amdguid/assets/icons/ports2.jpg index ac8cc0fa0d6e563934dbabbe0e2268f09114f314..063dd840a536090d0b0cf75a90e3e1ceba2c965b 100644 GIT binary patch delta 26810 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 Nob1Cds8s%%`hO|Oq?-T$ literal 43445 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 Pz17wJ&qX>uzm5MN5*^M! diff --git a/amdguid/assets/icons/ports2.png b/amdguid/assets/icons/ports2.png new file mode 100644 index 0000000000000000000000000000000000000000..06d4af50963936d82f0cabf30f93ae86e385bcbf GIT binary patch literal 52273 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
  • ;={9&So)x0aE~HW{?v9vPO7 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 +impl std::ops::Deref for FanServices { + type Target = Vec; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + impl FanServices { pub fn list_changed(&self, other: &[Pid]) -> bool { if self.0.len() != other.len() { @@ -108,8 +116,8 @@ impl StatefulConfig { // 80x80 let image = { - let bytes = include_bytes!("../assets/icons/ports2.jpg"); - image::load_from_memory_with_format(bytes, ImageFormat::Jpeg).unwrap() + let bytes = include_bytes!("../assets/icons/ports2.png"); + image::load_from_memory_with_format(bytes, ImageFormat::Png).unwrap() }; let ctx = ui.ctx(); @@ -139,8 +147,8 @@ impl StatefulConfig { pub struct AmdGui { pub page: Page, - pid_files: FanServices, - outputs: BTreeMap>, + pid_files: SocketState, + outputs: SocketState>>, cooling_performance: CoolingPerformance, change_fan_settings: ChangeFanSettings, outputs_settings: OutputsSettings, @@ -160,13 +168,13 @@ impl AmdGui { pub fn new_with_config(config: FanConfig) -> Self { Self { page: Default::default(), - pid_files: FanServices::from(vec![]), - outputs: Default::default(), + pid_files: SocketState::NotAvailable, + outputs: SocketState::NotAvailable, cooling_performance: CoolingPerformance::new(100, config.clone()), change_fan_settings: ChangeFanSettings::new(config.clone()), outputs_settings: OutputsSettings::default(), config: StatefulConfig::new(config), - reload_pid_list_delay: RELOAD_PID_LIST_DELAY, + reload_pid_list_delay: 0, } } @@ -175,65 +183,91 @@ impl AmdGui { match self.page { Page::Config => { - self.change_fan_settings - .draw(ui, &mut self.pid_files, &mut self.config); + if let SocketState::Connected(pid_files) = &mut self.pid_files { + self.change_fan_settings + .draw(ui, pid_files, &mut self.config); + } else { + ui.label("Not available"); + } } Page::Monitoring => { - self.cooling_performance.draw(ui, &self.pid_files); + if let SocketState::Connected(pid_files) = &mut self.pid_files { + self.cooling_performance.draw(ui, pid_files); + } else { + ui.label("Not available"); + } } Page::Settings => {} Page::Outputs => { - self.outputs_settings - .draw(ui, &mut self.config, &self.outputs); + if let SocketState::Connected(outputs) = &self.outputs { + self.outputs_settings.draw(ui, &mut self.config, outputs); + } else { + ui.label("Not available"); + } } } } pub fn tick(&mut self) { self.cooling_performance.tick(); - if self.pid_files.0.is_empty() || self.reload_pid_list_delay.checked_sub(1).is_none() { - self.reload_pid_list_delay = RELOAD_PID_LIST_DELAY; + let can_decrease = self.reload_pid_list_delay > 0; - { - use amdgpu::pidfile::helper_cmd::{send_command, Command, Response}; + if can_decrease { + self.reload_pid_list_delay -= 1; + return; + } - match send_command(Command::FanServices) { - Ok(Response::Services(services)) if self.pid_files.list_changed(&services) => { - self.pid_files = FanServices::from(services); - } - Ok(Response::Services(_services)) => { - // SKIP - } - Ok(res) => { - log::warn!("Unexpected response {:?} while loading fan services", res); - } - Err(e) => { - log::warn!("Failed to load amd fan services pid list. {:?}", e); - } + self.reload_pid_list_delay = RELOAD_PID_LIST_DELAY; + + { + use amdgpu::pidfile::helper_cmd::{send_command, Command, Response}; + + match send_command(Command::FanServices) { + Ok(Response::Services(services)) + if self + .pid_files + .connected() + .map(|c| c.list_changed(&services)) + .unwrap_or(true) => + { + self.pid_files = SocketState::Connected(FanServices::from(services)); + } + Ok(Response::Services(_services)) => { + // SKIP + } + Ok(res) => { + tracing::warn!("Unexpected response {:?} while loading fan services", res); + } + Err(e) => { + self.pid_files = SocketState::NotAvailable; + tracing::warn!("Failed to load amd fan services pid list. {:?}", e); } } + } - { - use amdgpu::pidfile::ports::{send_command, Command, Response}; + { + use amdgpu::pidfile::ports::{send_command, Command, Response}; - match send_command(Command::Ports) { - Ok(Response::NoOp) => {} - Ok(Response::Ports(outputs)) => { - let mut names = outputs.iter().fold( - Vec::with_capacity(outputs.len()), - |mut set, output| { - set.push(output.card.clone()); - set - }, - ); - names.sort(); + match send_command(Command::Ports) { + Ok(Response::NoOp) => {} + Ok(Response::Ports(outputs)) => { + let mut names = outputs.iter().fold( + Vec::with_capacity(outputs.len()), + |mut set, output| { + set.push(output.card.clone()); + set + }, + ); + names.sort(); - let mut tree = BTreeMap::new(); - names.into_iter().for_each(|name| { - tree.insert(name, Vec::with_capacity(6)); - }); + let mut tree = BTreeMap::new(); + names.into_iter().for_each(|name| { + tree.insert(name, Vec::with_capacity(6)); + }); - self.outputs = outputs.into_iter().fold(tree, |mut agg, output| { + self.outputs = SocketState::Connected(outputs.into_iter().fold( + tree, + |mut agg, output| { let v = agg .entry(output.card.clone()) .or_insert_with(|| Vec::with_capacity(6)); @@ -253,15 +287,31 @@ impl AmdGui { )) }); agg - }); - } - Err(e) => { - log::warn!("Failed to load amd fan services pid list. {:?}", e); + }, + )); + } + Err(e) => { + if matches!(self.page, Page::Outputs) { + self.page = Page::Config; } + self.outputs = SocketState::NotAvailable; + tracing::warn!("Failed to load amd fan services pid list. {:?}", e); } } - } else { - self.reload_pid_list_delay -= 1; + } + } +} + +pub enum SocketState { + NotAvailable, + Connected(Content), +} + +impl SocketState { + pub fn connected(&self) -> Option<&C> { + match self { + Self::Connected(c) => Some(c), + _ => None, } } } diff --git a/amdguid/src/backend/glium_backend.rs b/amdguid/src/backend/glium_backend.rs index 6a2142b..f7e63c9 100644 --- a/amdguid/src/backend/glium_backend.rs +++ b/amdguid/src/backend/glium_backend.rs @@ -39,7 +39,7 @@ pub fn run_app(amd_gui: Arc>, mut receiver: UnboundedReceiver>, mut receiver: UnboundedReceiver>, ctx: &egui::Context) { egui::containers::TopBottomPanel::new(TopBottomSide::Top, "menu").show(ctx, |ui| { let mut child = ui.child_ui(ui.available_rect_before_wrap(), Layout::left_to_right()); - if child - .add( - egui::Button::new("Outputs"), /* .text_style(TextStyle::Heading) */ - ) - .clicked_by(PointerButton::Primary) - { - amd_gui.lock().page = Page::Outputs; - } + if child .add( egui::Button::new("Config"), /* .text_style(TextStyle::Heading) */ @@ -47,6 +40,14 @@ pub fn create_ui(amd_gui: Arc>, ctx: &egui::Context) { { amd_gui.lock().page = Page::Monitoring; } + if child + .add( + egui::Button::new("Outputs"), /* .text_style(TextStyle::Heading) */ + ) + .clicked_by(PointerButton::Primary) + { + amd_gui.lock().page = Page::Outputs; + } if child .add( egui::Button::new("Settings"), /* .text_style(TextStyle::Heading) */ diff --git a/amdguid/src/backend/wayland_backend.rs b/amdguid/src/backend/wayland_backend.rs index 74a00f8..10b49be 100644 --- a/amdguid/src/backend/wayland_backend.rs +++ b/amdguid/src/backend/wayland_backend.rs @@ -24,7 +24,7 @@ use vulkano::{swapchain, sync}; use vulkano_win::VkSurfaceBuild; use winit::event::{Event, WindowEvent}; use winit::event_loop::{ControlFlow, EventLoop}; -use winit::window::{Fullscreen, Window, WindowBuilder}; +use winit::window::{Window, WindowBuilder}; use crate::app::AmdGui; use crate::backend::create_ui; @@ -66,14 +66,19 @@ impl AsMut for FrameEndFuture { pub fn run_app(amd_gui: Arc>, _receiver: UnboundedReceiver) { let required_extensions = vulkano_win::required_extensions(); let instance = Instance::new(InstanceCreateInfo { + application_name: Some("amdguid".into()), enabled_extensions: required_extensions, ..Default::default() }) .unwrap(); - let physical = PhysicalDevice::enumerate(&instance).next().unwrap(); + let physical = { + let mut v = PhysicalDevice::enumerate(&instance).collect::>(); + v.sort_by(|a, b| a.api_version().cmp(&b.api_version())); + v.remove(0) + }; - println!( + tracing::info!( "Using device: {} (type: {:?})", physical.properties().device_name, physical.properties().device_type, @@ -82,7 +87,7 @@ pub fn run_app(amd_gui: Arc>, _receiver: UnboundedReceiver) let event_loop = EventLoop::new(); let surface = WindowBuilder::new() .with_title("AMD GUID") - .with_fullscreen(Some(Fullscreen::Borderless(None))) + // .with_fullscreen(Some(Fullscreen::Borderless(None))) .build_vk_surface(&event_loop, instance.clone()) .unwrap(); diff --git a/amdguid/src/main.rs b/amdguid/src/main.rs index 9180d9d..9eeb0b3 100644 --- a/amdguid/src/main.rs +++ b/amdguid/src/main.rs @@ -16,7 +16,7 @@ async fn main() { if std::env::var("RUST_LOG").is_err() { std::env::set_var("RUST_LOG", "DEBUG"); } - pretty_env_logger::init(); + tracing_subscriber::fmt::init(); let config = Arc::new(Mutex::new( amdgpu_config::fan::load_config(amdgpu_config::fan::DEFAULT_FAN_CONFIG_PATH) .expect("No FAN config"), @@ -35,7 +35,7 @@ fn schedule_tick(amd_gui: std::sync::Arc>) -> Unbound loop { amd_gui.lock().tick(); if let Err(e) = sender.send(true) { - log::error!("Failed to propagate tick update. {:?}", e); + tracing::error!("Failed to propagate tick update. {:?}", e); } tokio::time::sleep(tokio::time::Duration::from_millis(166)).await; } diff --git a/amdguid/src/widgets/change_fan_settings.rs b/amdguid/src/widgets/change_fan_settings.rs index 1a26558..ff6eec4 100644 --- a/amdguid/src/widgets/change_fan_settings.rs +++ b/amdguid/src/widgets/change_fan_settings.rs @@ -158,7 +158,7 @@ impl ChangeFanSettings { let c: &amdgpu_config::fan::Config = &*config; let content = match toml::to_string(c) { Err(e) => { - log::error!("Config file serialization failed. {:?}", e); + tracing::error!("Config file serialization failed. {:?}", e); return; } Ok(content) => content, diff --git a/amdguid/src/widgets/outputs_settings.rs b/amdguid/src/widgets/outputs_settings.rs index a29955a..e0cf829 100644 --- a/amdguid/src/widgets/outputs_settings.rs +++ b/amdguid/src/widgets/outputs_settings.rs @@ -23,35 +23,10 @@ impl OutputsSettings { ui.horizontal_top(|ui| { outputs.iter().for_each(|(name, outputs)| { ui.vertical(|ui| { - ui.label(format!("name {name}")); + ui.label(format!("Card {name}")); ui.horizontal_top(|ui| { outputs.iter().for_each(|output| { - ui.vertical(|ui| { - ui.add(OutputWidget::new(output, state)); - - ui.label(format!("port_number {}", output.port_number)); - ui.label(format!("port_type {:?}", output.port_type)); - ui.label(format!("card {}", output.card)); - ui.label(format!( - "port_name {}", - output.port_name.as_deref().unwrap_or_default() - )); - - let state = WidgetText::RichText( - RichText::new(match output.status { - Status::Connected => "Connected", - Status::Disconnected => "Disconnected", - }) - .color( - match output.status { - Status::Connected => Color32::DARK_GREEN, - Status::Disconnected => Color32::GRAY, - }, - ), - ); - - ui.label(state); - }); + Self::render_single(ui, state, output); }); }); }); @@ -59,4 +34,49 @@ impl OutputsSettings { }); }); } + + fn render_single(ui: &mut Ui, state: &mut StatefulConfig, output: &Output) { + ui.vertical(|ui| { + ui.add(OutputWidget::new(output, state)); + + ui.label(format!("Port type {:?}", output.port_type)); + ui.label(format!("Port number {}", output.port_number)); + if let Some(name) = output.port_name.as_deref() { + ui.label(format!("Port name {}", name)); + } + + ui.label(WidgetText::RichText( + RichText::new(match output.status { + Status::Connected => "Connected", + Status::Disconnected => "Disconnected", + }) + .color(match output.status { + Status::Connected => Color32::GREEN, + Status::Disconnected => Color32::GRAY, + }) + .code() + .strong() + .monospace(), + )); + ui.label("Display Power Management"); + if ui + .button(WidgetText::RichText( + RichText::new(match output.display_power_managment { + true => "On", + false => "Off", + }) + .color(match output.display_power_managment { + true => Color32::GREEN, + false => Color32::GRAY, + }) + .monospace() + .code() + .strong(), + )) + .clicked() + { + // + } + }); + } } diff --git a/amdguid/src/widgets/reload_section.rs b/amdguid/src/widgets/reload_section.rs index 24124c8..ef8750e 100644 --- a/amdguid/src/widgets/reload_section.rs +++ b/amdguid/src/widgets/reload_section.rs @@ -23,11 +23,11 @@ impl<'l> egui::Widget for ReloadSection<'l> { }) { Ok(response) => { service.reload = ChangeState::Success; - log::info!("{:?}", response) + tracing::info!("{:?}", response) } Err(e) => { service.reload = ChangeState::Failure(format!("{:?}", e)); - log::error!("Failed to reload config. {:?}", e) + tracing::error!("Failed to reload config. {:?}", e) } } } diff --git a/amdportsd/Cargo.toml b/amdportsd/Cargo.toml index ead1d53..40b58b2 100644 --- a/amdportsd/Cargo.toml +++ b/amdportsd/Cargo.toml @@ -11,5 +11,5 @@ futures = { version = "0.3", features = [] } ron = { version = "0.7.1" } serde = { version = "1.0.137", features = ["derive"] } -log = { version = "0.4" } -pretty_env_logger = { version = "0.4" } +tracing = { version = "0.1.36" } +tracing-subscriber = { version = "0.3.15" } diff --git a/amdportsd/src/main.rs b/amdportsd/src/main.rs index 07241ba..6b6b5b9 100644 --- a/amdportsd/src/main.rs +++ b/amdportsd/src/main.rs @@ -12,6 +12,7 @@ fn parse_output(entry: DirEntry) -> Option { if ty.is_dir() { return None; } + tracing::error!("{:?}", entry.path()); let file_name = entry.file_name(); let path = file_name.to_str()?; let mut it = path @@ -33,11 +34,20 @@ fn parse_output(entry: DirEntry) -> Option { let card = it.next()?.strip_prefix("card")?.to_string(); let port_type = it.next()?; + let dpms = std::fs::read_to_string(entry.path().join("dpms")) + .unwrap_or_else(|e| { + tracing::error!("{}", e); + "Off".into() + }) + .to_lowercase(); + tracing::info!("Display Power Management System is {:?}", dpms); + let mut output = Output { card, ty: OutputType::parse_str(&port_type), port_type, modes, + display_power_managment: dpms.trim() == "on", ..Default::default() }; let mut it = it.rev(); @@ -90,7 +100,7 @@ async fn service(state: Arc>>) { .expect("Creating pid file for ports failed") }; if let Err(e) = std::fs::set_permissions(&sock_path, Permissions::from_mode(0o777)) { - log::error!("Failed to change gui helper socket file mode. {:?}", e); + tracing::error!("Failed to change gui helper socket file mode. {:?}", e); } while let Ok((stream, _addr)) = listener.accept() { @@ -106,11 +116,11 @@ fn handle_connection(stream: UnixStream, state: Arc>>) { _ => return service.kill(), }; - log::info!("Incoming {:?}", command); + tracing::info!("Incoming {:?}", command); let cmd = match ron::from_str::(command.trim()) { Ok(cmd) => cmd, Err(e) => { - log::warn!("Invalid message {:?}. {:?}", command, e); + tracing::warn!("Invalid message {:?}. {:?}", command, e); return service.kill(); } }; @@ -128,6 +138,8 @@ fn handle_command(mut service: Service, cmd: Command, state: Arc