From 23353c77f3634c0afa5c9e8ae24729cb7613de74 Mon Sep 17 00:00:00 2001 From: "Luke D. Jones" Date: Sun, 17 Jul 2022 20:21:34 +1200 Subject: [PATCH] Add panel_od support --- CHANGELOG.md | 1 + asusctl/src/cli_opts.rs | 15 ++++++- asusctl/src/main.rs | 18 +++++++- daemon/src/config.rs | 2 +- daemon/src/ctrl_rog_bios.rs | 87 ++++++++++++++++++++++++++++++++++++ rog-dbus/src/zbus_rogbios.rs | 10 +++++ rog-supported/src/lib.rs | 1 + 7 files changed, 130 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2323d0d6..b9047f24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased ] ### Changed - Fixed save and restore of multizone LED settings +- Add panel overdrive support (autodetects if supported) ## [4.2.0] - 2022-07-16 ### Added diff --git a/asusctl/src/cli_opts.rs b/asusctl/src/cli_opts.rs index 21a31194..85b17182 100644 --- a/asusctl/src/cli_opts.rs +++ b/asusctl/src/cli_opts.rs @@ -67,18 +67,29 @@ pub struct BiosCommand { pub help: bool, #[options( meta = "", + short = "S", no_long, help = "set bios POST sound: asusctl -p " )] pub post_sound_set: Option, - #[options(no_long, help = "read bios POST sound")] + #[options(no_long, short = "s", help = "read bios POST sound")] pub post_sound_get: bool, #[options( meta = "", + short = "D", no_long, help = "activate dGPU dedicated/G-Sync: asusctl -d , reboot required" )] pub dedicated_gfx_set: Option, - #[options(no_long, help = "get GPU mode")] + #[options(no_long, short = "d", help = "get GPU mode")] pub dedicated_gfx_get: bool, + #[options( + meta = "", + short = "O", + no_long, + help = "Set device panel overdrive " + )] + pub panel_overdrive_set: Option, + #[options(no_long, short = "o", help = "get panel overdrive")] + pub panel_overdrive_get: bool, } diff --git a/asusctl/src/main.rs b/asusctl/src/main.rs index e4adad81..bfbe55bd 100644 --- a/asusctl/src/main.rs +++ b/asusctl/src/main.rs @@ -167,6 +167,10 @@ fn do_parsed( if let Some(cmdlist) = CliStart::command_list() { println!("{}", cmdlist); } + + println!("\nExtra help can be requested on any command or subcommand:"); + println!(" asusctl led-mode --help"); + println!(" asusctl led-mode static --help"); } } } @@ -692,7 +696,9 @@ fn handle_bios_option( if (cmd.dedicated_gfx_set.is_none() && !cmd.dedicated_gfx_get && cmd.post_sound_set.is_none() - && !cmd.post_sound_get) + && !cmd.post_sound_get + && cmd.panel_overdrive_set.is_none() + && !cmd.panel_overdrive_get) || cmd.help { println!("Missing arg or command\n"); @@ -705,6 +711,7 @@ fn handle_bios_option( for line in usage.iter().filter(|line| { line.contains("sound") && supported.post_sound_toggle || line.contains("GPU") && supported.dedicated_gfx_toggle + || line.contains("panel") && supported.panel_overdrive }) { println!("{}", line); } @@ -717,6 +724,7 @@ fn handle_bios_option( let res = dbus.proxies().rog_bios().post_boot_sound()? == 1; println!("Bios POST sound on: {}", res); } + if let Some(opt) = cmd.dedicated_gfx_set { println!("Rebuilding initrd to include drivers"); dbus.proxies().rog_bios().set_dedicated_graphic_mode(opt)?; @@ -733,6 +741,14 @@ fn handle_bios_option( let res = dbus.proxies().rog_bios().dedicated_graphic_mode()? == 1; println!("Bios dedicated GPU on: {}", res); } + + if let Some(opt) = cmd.panel_overdrive_set { + dbus.proxies().rog_bios().set_panel_overdrive(opt)?; + } + if cmd.panel_overdrive_get { + let res = dbus.proxies().rog_bios().panel_overdrive()? == 1; + println!("Panel overdrive on: {}", res); + } } Ok(()) } diff --git a/daemon/src/config.rs b/daemon/src/config.rs index 0ebf6b1a..847326ae 100644 --- a/daemon/src/config.rs +++ b/daemon/src/config.rs @@ -6,7 +6,7 @@ use std::path::PathBuf; pub static CONFIG_PATH: &str = "/etc/asusd/asusd.conf"; -#[derive(Deserialize, Serialize)] +#[derive(Deserialize, Serialize, Default)] pub struct Config { /// Save charge limit for restoring on boot pub bat_charge_limit: u8, diff --git a/daemon/src/ctrl_rog_bios.rs b/daemon/src/ctrl_rog_bios.rs index e66d7249..0b687f24 100644 --- a/daemon/src/ctrl_rog_bios.rs +++ b/daemon/src/ctrl_rog_bios.rs @@ -19,6 +19,7 @@ static ASUS_SWITCH_GRAPHIC_MODE: &str = "/sys/firmware/efi/efivars/AsusSwitchGraphicMode-607005d5-3f75-4b2e-98f0-85ba66797a3e"; static ASUS_POST_LOGO_SOUND: &str = "/sys/firmware/efi/efivars/AsusPostLogoSound-607005d5-3f75-4b2e-98f0-85ba66797a3e"; +static ASUS_PANEL_OD_PATH: &str = "/sys/devices/platform/asus-nb-wmi/panel_od"; pub struct CtrlRogBios { _config: Arc>, @@ -31,6 +32,7 @@ impl GetSupported for CtrlRogBios { RogBiosSupportedFunctions { post_sound_toggle: Path::new(ASUS_POST_LOGO_SOUND).exists(), dedicated_gfx_toggle: Path::new(ASUS_SWITCH_GRAPHIC_MODE).exists(), + panel_overdrive: Path::new(ASUS_PANEL_OD_PATH).exists(), } } } @@ -94,6 +96,52 @@ impl CtrlRogBios { #[dbus_interface(signal)] async fn notify_post_boot_sound(ctxt: &SignalContext<'_>, on: bool) -> zbus::Result<()> {} + + async fn set_panel_overdrive( + &mut self, + #[zbus(signal_context)] ctxt: SignalContext<'_>, + overdrive: bool, + ) { + if self + .set_panel_od(overdrive) + .map_err(|err| { + warn!("CtrlRogBios: set_panel_overdrive {}", err); + err + }) + .is_ok() + { + Self::notify_panel_overdrive(&ctxt, overdrive).await.ok(); + } + } + + fn panel_overdrive(&self) -> i8 { + let path = ASUS_PANEL_OD_PATH; + if let Ok(mut file) = OpenOptions::new().read(true).open(path).map_err(|err| { + warn!("CtrlRogBios: panel_overdrive {}", err); + err + }) { + let mut buf = Vec::new(); + file.read_to_end(&mut buf) + .map_err(|err| { + warn!("CtrlRogBios: set_panel_overdrive {}", err); + err + }) + .ok(); + + if buf.len() >= 1 { + let tmp = String::from_utf8_lossy(&buf[0..1]); + return tmp.parse::().unwrap_or(-1); + } + } + -1 + } + + #[dbus_interface(signal)] + async fn notify_panel_overdrive( + signal_ctxt: &SignalContext<'_>, + overdrive: bool, + ) -> zbus::Result<()> { + } } #[async_trait] @@ -305,4 +353,43 @@ impl CtrlRogBios { } Ok(()) } + + fn set_panel_od(&mut self, overdrive: bool) -> Result<(), RogError> { + let path = ASUS_PANEL_OD_PATH; + let mut file = OpenOptions::new().write(true).open(path).map_err(|err| { + warn!("CtrlRogBios: set_panel_overdrive {}", err); + err + })?; + + let s = if overdrive { '1' } else { '0' }; + file.write(&[s as u8]).map_err(|err| { + warn!("CtrlRogBios: set_panel_overdrive {}", err); + err + })?; + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::CtrlRogBios; + use crate::config::Config; + use std::sync::{Arc, Mutex}; + + #[test] + #[ignore = "Must be manually tested"] + fn set_multizone_4key_config() { + let config = Config::default(); + + let controller = CtrlRogBios { + _config: Arc::new(Mutex::new(config)), + }; + + let res = controller.panel_overdrive(); + assert_eq!(res, 1); + + // controller.set_panel_od(false).unwrap(); + // let res = controller.panel_overdrive(); + // assert_eq!(res, 0); + } } diff --git a/rog-dbus/src/zbus_rogbios.rs b/rog-dbus/src/zbus_rogbios.rs index 437a1766..ae4cbd71 100644 --- a/rog-dbus/src/zbus_rogbios.rs +++ b/rog-dbus/src/zbus_rogbios.rs @@ -38,6 +38,12 @@ trait RogBios { /// SetPostBootSound method fn set_post_boot_sound(&self, on: bool) -> zbus::Result<()>; + /// PanelOverdrive method + fn panel_overdrive(&self) -> zbus::Result; + + /// SetPanelOverdrive method + fn set_panel_overdrive(&self, overdrive: bool) -> zbus::Result<()>; + /// NotifyDedicatedGraphicMode signal #[dbus_proxy(signal)] fn notify_dedicated_graphic_mode(&self, dedicated: bool) -> zbus::Result<()>; @@ -45,4 +51,8 @@ trait RogBios { /// NotifyPostBootSound signal #[dbus_proxy(signal)] fn notify_post_boot_sound(&self, sound: bool) -> zbus::Result<()>; + + /// NotifyPanelOverdrive signal + #[dbus_proxy(signal)] + fn notify_panel_overdrive(&self, overdrive: bool) -> zbus::Result<()>; } diff --git a/rog-supported/src/lib.rs b/rog-supported/src/lib.rs index de2f61b2..c2118d50 100644 --- a/rog-supported/src/lib.rs +++ b/rog-supported/src/lib.rs @@ -40,6 +40,7 @@ pub struct LedSupportedFunctions { pub struct RogBiosSupportedFunctions { pub post_sound_toggle: bool, pub dedicated_gfx_toggle: bool, + pub panel_overdrive: bool, } impl fmt::Display for SupportedFunctions {