From ee9e0a1e31f63229aaf7a15ce0fa4bf0f4141a7c Mon Sep 17 00:00:00 2001 From: "Luke D. Jones" Date: Sat, 18 Jan 2025 21:27:57 +1300 Subject: [PATCH] Fix: ROGCC: fix anime matrix settings --- CHANGELOG.md | 2 + Cargo.lock | 2 + asusctl/Cargo.toml | 4 +- asusctl/src/main.rs | 18 +- asusd/src/aura_types.rs | 35 ++-- rog-control-center/src/tray.rs | 14 +- rog-control-center/src/ui/setup_anime.rs | 222 +++++++++++------------ rog-dbus/src/lib.rs | 40 ++++ 8 files changed, 201 insertions(+), 136 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d8311a8..1ffc37c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ ### Changed - Bug fix: UI was setting incorrect value for FPPT - Bug fix: Re-add callbacks for the throttle and epp settings in UI +- Bug fix: Fix UI settigns for AniMe Matrix display +- Bug fix: better handle missing tray (for example gnome) - Strip out all outdated and unsafe tuning stuff ## [v6.1.0-rc3] diff --git a/Cargo.lock b/Cargo.lock index 8ff2f803..f97b6e41 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -179,7 +179,9 @@ name = "asusctl" version = "6.1.0-rc3" dependencies = [ "dmi_id", + "env_logger", "gumdrop", + "log", "rog_anime", "rog_aura", "rog_dbus", diff --git a/asusctl/Cargo.toml b/asusctl/Cargo.toml index 46fc0c28..9c1dffe2 100644 --- a/asusctl/Cargo.toml +++ b/asusctl/Cargo.toml @@ -18,10 +18,12 @@ rog_profiles = { path = "../rog-profiles" } rog_platform = { path = "../rog-platform" } dmi_id = { path = "../dmi-id" } +log.workspace = true +env_logger.workspace = true + ron.workspace = true gumdrop.workspace = true zbus.workspace = true [dev-dependencies] rog_dbus = { path = "../rog-dbus" } - diff --git a/asusctl/src/main.rs b/asusctl/src/main.rs index 9af4e2a5..08db8019 100644 --- a/asusctl/src/main.rs +++ b/asusctl/src/main.rs @@ -9,6 +9,7 @@ use aura_cli::{LedPowerCommand1, LedPowerCommand2}; use dmi_id::DMIID; use fan_curve_cli::FanCurveCommand; use gumdrop::{Opt, Options}; +use log::error; use rog_anime::usb::get_anime_type; use rog_anime::{AnimTime, AnimeDataBuffer, AnimeDiagonal, AnimeGif, AnimeImage, AnimeType, Vec2}; use rog_aura::keyboard::{AuraPowerState, LaptopAuraPower}; @@ -42,6 +43,14 @@ mod scsi_cli; mod slash_cli; fn main() { + let mut logger = env_logger::Builder::new(); + logger + .parse_default_env() + .target(env_logger::Target::Stdout) + .format_timestamp(None) + .filter_level(log::LevelFilter::Debug) + .init(); + let self_version = env!("CARGO_PKG_VERSION"); println!("Starting version {self_version}"); let args: Vec = args().skip(1).collect(); @@ -163,7 +172,7 @@ where return Ok(ctrl); } - Err("No Aura interface".into()) + Err(format!("Did not find {iface_name}").into()) } fn do_parsed( @@ -367,7 +376,12 @@ fn handle_anime(cmd: &AnimeCommand) -> Result<(), Box> { println!("\n{}", lst); } } - let animes = find_iface::("xyz.ljones.Anime")?; + + let animes = find_iface::("xyz.ljones.Anime").map_err(|e| { + error!("Did not find any interface for xyz.ljones.Anime: {e:?}"); + e + })?; + for proxy in animes { if let Some(enable) = cmd.enable_display { proxy.set_enable_display(enable)?; diff --git a/asusd/src/aura_types.rs b/asusd/src/aura_types.rs index ef52507f..03525b5c 100644 --- a/asusd/src/aura_types.rs +++ b/asusd/src/aura_types.rs @@ -104,23 +104,28 @@ impl DeviceHandle { /// Try AniMe Matrix HID. If one exists it is initialsed and returned. pub async fn maybe_anime_hid( - device: Arc>, - prod_id: &str + _device: Arc>, + _prod_id: &str ) -> Result { - debug!("Testing for HIDRAW AniMe"); - let anime_type = AnimeType::from_dmi(); - dbg!(prod_id); - if matches!(anime_type, AnimeType::Unsupported) || prod_id != "193b" { - log::info!("Unknown or invalid AniMe: {prod_id:?}, skipping"); - return Err(RogError::NotFound("No anime-matrix device".to_string())); - } - info!("Found AniMe Matrix HIDRAW {anime_type:?}: {prod_id}"); + // TODO: can't use HIDRAW for anime at the moment + Err(RogError::NotFound( + "Can't use anime over hidraw yet. Skip.".to_string() + )) - let mut config = AniMeConfig::new().load(); - config.anime_type = anime_type; - let mut anime = AniMe::new(Some(device), None, Arc::new(Mutex::new(config))); - anime.do_initialization().await?; - Ok(Self::AniMe(anime)) + // debug!("Testing for HIDRAW AniMe"); + // let anime_type = AnimeType::from_dmi(); + // dbg!(prod_id); + // if matches!(anime_type, AnimeType::Unsupported) || prod_id != "193b" + // { log::info!("Unknown or invalid AniMe: {prod_id:?}, + // skipping"); return Err(RogError::NotFound("No + // anime-matrix device".to_string())); } + // info!("Found AniMe Matrix HIDRAW {anime_type:?}: {prod_id}"); + + // let mut config = AniMeConfig::new().load(); + // config.anime_type = anime_type; + // let mut anime = AniMe::new(Some(device), None, + // Arc::new(Mutex::new(config))); anime.do_initialization(). + // await?; Ok(Self::AniMe(anime)) } pub async fn maybe_anime_usb() -> Result { diff --git a/rog-control-center/src/tray.rs b/rog-control-center/src/tray.rs index ef26a5e7..b099a33f 100644 --- a/rog-control-center/src/tray.rs +++ b/rog-control-center/src/tray.rs @@ -24,7 +24,7 @@ struct Icons { rog_red: Icon, rog_green: Icon, rog_white: Icon, - gpu_integrated: Icon, + gpu_integrated: Icon } static ICONS: OnceLock = OnceLock::new(); @@ -48,14 +48,14 @@ fn read_icon(file: &Path) -> Icon { Icon { width: width as i32, height: height as i32, - data: img.into_raw(), + data: img.into_raw() } } struct AsusTray { current_title: String, current_icon: Icon, - proxy: ROGCCZbusProxyBlocking<'static>, + proxy: ROGCCZbusProxyBlocking<'static> } impl ksni::Tray for AsusTray { @@ -103,7 +103,7 @@ async fn set_tray_icon_and_tip( mode: GfxMode, power: GfxPower, tray: &mut Handle, - supergfx_active: bool, + supergfx_active: bool ) { if let Some(icons) = ICONS.get() { let icon = match power { @@ -162,7 +162,7 @@ pub fn init_tray(_supported_properties: Vec, config: Arc, config: Arc, config: Arc warn!("Couldn't get mode form supergfxd: {e:?}"), + Err(e) => warn!("Couldn't get mode form supergfxd: {e:?}") } info!("Started ROGTray"); diff --git a/rog-control-center/src/ui/setup_anime.rs b/rog-control-center/src/ui/setup_anime.rs index e9908a8f..242a21d6 100644 --- a/rog-control-center/src/ui/setup_anime.rs +++ b/rog-control-center/src/ui/setup_anime.rs @@ -1,7 +1,8 @@ use std::sync::{Arc, Mutex}; -use log::{error, info, warn}; +use log::{error, info}; use rog_anime::Animations; +use rog_dbus::find_iface_async; use rog_dbus::zbus_anime::AnimeProxy; use slint::ComponentHandle; @@ -12,124 +13,123 @@ use crate::{set_ui_callbacks, set_ui_props_async, AnimePageData, MainWindow}; pub fn setup_anime_page(ui: &MainWindow, _states: Arc>) { let handle = ui.as_weak(); tokio::spawn(async move { - let Ok(conn) = zbus::Connection::system().await.map_err(|e| warn!("{e:}")) else { - return; - }; - let Ok(anime) = AnimeProxy::new(&conn).await.map_err(|e| warn!("{e:}")) else { - info!("This device may not have an AniMe. If not then the error can be ignored"); + let Ok(animes) = find_iface_async::("xyz.ljones.Anime").await else { + info!("This device appears to have no aura interfaces"); return; }; - set_ui_props_async!(handle, anime, AnimePageData, brightness); - set_ui_props_async!(handle, anime, AnimePageData, builtins_enabled); - set_ui_props_async!(handle, anime, AnimePageData, enable_display); - set_ui_props_async!(handle, anime, AnimePageData, off_when_lid_closed); - set_ui_props_async!(handle, anime, AnimePageData, off_when_suspended); - set_ui_props_async!(handle, anime, AnimePageData, off_when_unplugged); + for anime in animes { + set_ui_props_async!(handle, anime, AnimePageData, brightness); + set_ui_props_async!(handle, anime, AnimePageData, builtins_enabled); + set_ui_props_async!(handle, anime, AnimePageData, enable_display); + set_ui_props_async!(handle, anime, AnimePageData, off_when_lid_closed); + set_ui_props_async!(handle, anime, AnimePageData, off_when_suspended); + set_ui_props_async!(handle, anime, AnimePageData, off_when_unplugged); - let builtins = anime.builtin_animations().await.unwrap_or_default(); - handle - .upgrade_in_event_loop(move |handle| { - { - let global = handle.global::(); - global.set_boot_anim(builtins.boot as i32); - global.set_awake_anim(builtins.awake as i32); - global.set_sleep_anim(builtins.sleep as i32); - global.set_shutdown_anim(builtins.shutdown as i32); + let builtins = anime.builtin_animations().await.unwrap_or_default(); + handle + .upgrade_in_event_loop(move |handle| { + { + let global = handle.global::(); + global.set_boot_anim(builtins.boot as i32); + global.set_awake_anim(builtins.awake as i32); + global.set_sleep_anim(builtins.sleep as i32); + global.set_shutdown_anim(builtins.shutdown as i32); - let handle_copy = handle.as_weak(); - let anime_copy = anime.clone(); - global.on_cb_builtin_animations(move |boot, awake, sleep, shutdown| { - let handle_copy = handle_copy.clone(); - let anime_copy = anime_copy.clone(); - tokio::spawn(async move { - show_toast( - "Anime builtin animations changed".into(), - "Failed to set Anime builtin animations".into(), - handle_copy, - anime_copy - .set_builtin_animations(Animations { - boot: boot.into(), - awake: awake.into(), - sleep: sleep.into(), - shutdown: shutdown.into() - }) - .await - ); + let handle_copy = handle.as_weak(); + let anime_copy = anime.clone(); + global.on_cb_builtin_animations(move |boot, awake, sleep, shutdown| { + let handle_copy = handle_copy.clone(); + let anime_copy = anime_copy.clone(); + tokio::spawn(async move { + show_toast( + "Anime builtin animations changed".into(), + "Failed to set Anime builtin animations".into(), + handle_copy, + anime_copy + .set_builtin_animations(Animations { + boot: boot.into(), + awake: awake.into(), + sleep: sleep.into(), + shutdown: shutdown.into() + }) + .await + ); + }); }); - }); - let handle_copy = handle.as_weak(); - let anime_copy = anime.clone(); - tokio::spawn(async move { - let mut x = anime_copy.receive_builtin_animations_changed().await; - use zbus::export::futures_util::StreamExt; - while let Some(e) = x.next().await { - if let Ok(out) = e.get().await { - handle_copy - .upgrade_in_event_loop(move |handle| { - handle - .global::() - .set_boot_anim(out.boot.into()); - handle - .global::() - .set_awake_anim(out.awake.into()); - handle - .global::() - .set_sleep_anim(out.sleep.into()); - handle - .global::() - .set_shutdown_anim(out.shutdown.into()); - }) - .ok(); + let handle_copy = handle.as_weak(); + let anime_copy = anime.clone(); + tokio::spawn(async move { + let mut x = anime_copy.receive_builtin_animations_changed().await; + use zbus::export::futures_util::StreamExt; + while let Some(e) = x.next().await { + if let Ok(out) = e.get().await { + handle_copy + .upgrade_in_event_loop(move |handle| { + handle + .global::() + .set_boot_anim(out.boot.into()); + handle + .global::() + .set_awake_anim(out.awake.into()); + handle + .global::() + .set_sleep_anim(out.sleep.into()); + handle + .global::() + .set_shutdown_anim(out.shutdown.into()); + }) + .ok(); + } } - } - }); - } + }); + } - set_ui_callbacks!(handle, - AnimePageData(.into()), - anime.brightness(.into()), - "Anime LED brightness successfully set to {}", - "Setting Anime LED brightness failed" - ); - set_ui_callbacks!( - handle, - AnimePageData(), - anime.builtins_enabled(), - "Keyboard LED mode successfully set to {}", - "Setting keyboard LEDmode failed" - ); - set_ui_callbacks!( - handle, - AnimePageData(), - anime.enable_display(), - "Anime display successfully set to {}", - "Setting Anime display failed" - ); - set_ui_callbacks!( - handle, - AnimePageData(), - anime.off_when_lid_closed(), - "Anime off_when_lid_closed successfully set to {}", - "Setting Anime off_when_lid_closed failed" - ); - set_ui_callbacks!( - handle, - AnimePageData(), - anime.off_when_suspended(), - "Anime off_when_suspended successfully set to {}", - "Setting Anime off_when_suspended failed" - ); - set_ui_callbacks!( - handle, - AnimePageData(), - anime.off_when_unplugged(), - "Anime off_when_unplugged successfully set to {}", - "Setting Anime off_when_unplugged failed" - ); - }) - .map_err(|e| error!("setup_anime_page: upgrade_in_event_loop: {e:?}")) - .ok(); + set_ui_callbacks!(handle, + AnimePageData(.into()), + anime.brightness(.into()), + "Anime LED brightness successfully set to {}", + "Setting Anime LED brightness failed" + ); + set_ui_callbacks!( + handle, + AnimePageData(), + anime.builtins_enabled(), + "Keyboard LED mode successfully set to {}", + "Setting keyboard LEDmode failed" + ); + set_ui_callbacks!( + handle, + AnimePageData(), + anime.enable_display(), + "Anime display successfully set to {}", + "Setting Anime display failed" + ); + set_ui_callbacks!( + handle, + AnimePageData(), + anime.off_when_lid_closed(), + "Anime off_when_lid_closed successfully set to {}", + "Setting Anime off_when_lid_closed failed" + ); + set_ui_callbacks!( + handle, + AnimePageData(), + anime.off_when_suspended(), + "Anime off_when_suspended successfully set to {}", + "Setting Anime off_when_suspended failed" + ); + set_ui_callbacks!( + handle, + AnimePageData(), + anime.off_when_unplugged(), + "Anime off_when_unplugged successfully set to {}", + "Setting Anime off_when_unplugged failed" + ); + }) + .map_err(|e| error!("setup_anime_page: upgrade_in_event_loop: {e:?}")) + .ok(); + } }); } diff --git a/rog-dbus/src/lib.rs b/rog-dbus/src/lib.rs index c3cc4f41..005e232b 100644 --- a/rog-dbus/src/lib.rs +++ b/rog-dbus/src/lib.rs @@ -1,4 +1,5 @@ pub use asusd::{DBUS_IFACE, DBUS_NAME, DBUS_PATH}; +use zbus::proxy::ProxyImpl; pub mod asus_armoury; pub mod scsi_aura; @@ -50,3 +51,42 @@ pub async fn has_iface(iface: &str) -> Result> } Ok(false) } + +pub async fn find_iface_async(iface_name: &str) -> Result, Box> +where + T: ProxyImpl<'static> + From> +{ + let conn = zbus::Connection::system().await?; + let f = zbus::fdo::ObjectManagerProxy::new(&conn, "xyz.ljones.Asusd", "/").await?; + let interfaces = f.get_managed_objects().await?; + let mut paths = Vec::new(); + for v in interfaces.iter() { + // let o: Vec = v.1.keys().map(|e| + // e.to_owned()).collect(); println!("{}, {:?}", v.0, o); + for k in v.1.keys() { + if k.as_str() == iface_name { + // println!("Found {iface_name} device at {}, {}", v.0, k); + paths.push(v.0.clone()); + } + } + } + if paths.len() > 1 { + println!("Multiple asusd interfaces devices found"); + } + if !paths.is_empty() { + let mut ctrl = Vec::new(); + paths.sort_by(|a, b| a.cmp(b)); + for path in paths { + ctrl.push( + T::builder(&conn) + .path(path.clone())? + .destination("xyz.ljones.Asusd")? + .build() + .await? + ); + } + return Ok(ctrl); + } + + Err(format!("Did not find {iface_name}").into()) +}