From 3aa6eee306ec7ec0c7dff43b5bdfb0cff92026b4 Mon Sep 17 00:00:00 2001 From: "Luke D. Jones" Date: Tue, 21 Sep 2021 23:10:20 +1200 Subject: [PATCH] Bugfixes - Spawn tasks on individual threads - Don't force a default of fan-curve on reload - Add missing profile commands - Begin obsoleting the graphics switch command in favour of supergfxctl - Slim down the notification daemon to pure ASUS notifications Bad behaviour in fan-curve new function that was forcing a re-init to default on reload. Remove this and only save config again after loading the config file and writing a curve (hidden side effect of write is that a zeroed array is defaulted to read-from-system - this needs to be changed too). Closes #140, #139 --- CHANGELOG.md | 8 ++ Cargo.lock | 144 +++++++++++-------------- asus-notify/Cargo.toml | 1 - asus-notify/src/main.rs | 117 -------------------- asusctl/Cargo.toml | 3 +- asusctl/src/cli_opts.rs | 18 +--- asusctl/src/main.rs | 119 ++++++-------------- asusctl/src/profiles_cli.rs | 2 +- daemon/Cargo.toml | 2 +- daemon/src/ctrl_profiles/controller.rs | 14 +-- daemon/src/ctrl_profiles/zbus.rs | 8 +- daemon/src/daemon.rs | 75 ++++++------- daemon/src/lib.rs | 2 +- rog-dbus/Cargo.toml | 1 - rog-dbus/src/lib.rs | 1 - rog-profiles/src/lib.rs | 4 +- 16 files changed, 164 insertions(+), 355 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad647578..52b6a84a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +# [4.0.4] - 2021-10-02 +### Changed +- Add missing Profile commands +- Spawn tasks on individual threads to prevent blocking +- Don't force fan-curve default on reload +- Begin obsoleting the graphics switch command in favour of supergfxctl +- Slim down the notification daemon to pure ASUS notifications + # [4.0.3] - 2021-09-16 ### Changed - Don't show fan-curve warning if fan-curve available diff --git a/Cargo.lock b/Cargo.lock index 40e34d6d..4df48601 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -39,13 +39,12 @@ dependencies = [ "rog_profiles", "rog_supported", "serde_json", - "supergfxctl", "zbus", ] [[package]] name = "asusctl" -version = "4.0.3" +version = "4.0.4" dependencies = [ "daemon", "gif", @@ -56,7 +55,6 @@ dependencies = [ "rog_dbus", "rog_profiles", "rog_supported", - "supergfxctl", "sysfs-class", "tinybmp", "toml", @@ -148,9 +146,9 @@ checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" [[package]] name = "cc" -version = "1.0.69" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70cc2f62c6ce1868963827bd677764c62d07c3d9a3e1fb1177ee1a9ab199eb2" +checksum = "d26a6ce4b6a484fa3edb70f7efa6fc430fd2b87285fe8b84304fd0936faa0dc0" [[package]] name = "cfg-if" @@ -210,7 +208,7 @@ dependencies = [ [[package]] name = "daemon" -version = "4.0.3" +version = "4.0.4" dependencies = [ "env_logger", "log", @@ -256,7 +254,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote 1.0.9", - "syn 1.0.75", + "syn 1.0.77", ] [[package]] @@ -308,7 +306,7 @@ checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" dependencies = [ "proc-macro2", "quote 1.0.9", - "syn 1.0.75", + "syn 1.0.77", ] [[package]] @@ -335,9 +333,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adc00f486adfc9ce99f77d717836f0c5aa84965eb0b4f051f4e83f7cab53f8b" +checksum = "a12aa0eb539080d55c3f2d45a67c3b58b6b0773c1a3ca2dfec66d58c97fd66ca" dependencies = [ "futures-channel", "futures-core", @@ -350,9 +348,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74ed2411805f6e4e3d9bc904c95d5d423b89b3b25dc0250aa74729de20629ff9" +checksum = "5da6ba8c3bb3c165d3c7319fc1cc8304facf1fb8db99c5de877183c08a273888" dependencies = [ "futures-core", "futures-sink", @@ -360,15 +358,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af51b1b4a7fdff033703db39de8802c673eb91855f2e0d47dcf3bf2c0ef01f99" +checksum = "88d1c26957f23603395cd326b0ffe64124b818f4449552f960d815cfba83a53d" [[package]] name = "futures-executor" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d0d535a57b87e1ae31437b892713aee90cd2d7b0ee48727cd11fc72ef54761c" +checksum = "45025be030969d763025784f7f355043dc6bc74093e4ecc5000ca4dc50d8745c" dependencies = [ "futures-core", "futures-task", @@ -377,9 +375,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b0e06c393068f3a6ef246c75cdca793d6a46347e75286933e5e75fd2fd11582" +checksum = "522de2a0fe3e380f1bc577ba0474108faf3f6b18321dbf60b3b9c39a75073377" [[package]] name = "futures-lite" @@ -398,34 +396,34 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c54913bae956fb8df7f4dc6fc90362aa72e69148e3f39041fbe8742d21e0ac57" +checksum = "18e4a4b95cea4b4ccbcf1c5675ca7c4ee4e9e75eb79944d07defde18068f79bb" dependencies = [ "autocfg", "proc-macro-hack", "proc-macro2", "quote 1.0.9", - "syn 1.0.75", + "syn 1.0.77", ] [[package]] name = "futures-sink" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0f30aaa67363d119812743aa5f33c201a7a66329f97d1a887022971feea4b53" +checksum = "36ea153c13024fe480590b3e3d4cad89a0cfacecc24577b68f86c6ced9c2bc11" [[package]] name = "futures-task" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbe54a98670017f3be909561f6ad13e810d9a51f3f061b902062ca3da80799f2" +checksum = "1d3d00f4eddb73e498a54394f228cd55853bdf059259e8e7bc6e69d408892e99" [[package]] name = "futures-util" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eb846bfd58e44a8481a00049e82c43e0ccb5d61f8dc071057cb19249dd4d78" +checksum = "36568465210a3a6ee45e1f165136d68671471a501e632e9a98d96872222b5481" dependencies = [ "autocfg", "futures-channel", @@ -500,7 +498,7 @@ checksum = "915ef07c710d84733522461de2a734d4d62a3fd39a4d4f404c2f385ef8618d05" dependencies = [ "proc-macro2", "quote 1.0.9", - "syn 1.0.75", + "syn 1.0.77", ] [[package]] @@ -520,9 +518,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "instant" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee0328b1209d157ef001c94dd85b4f8f64139adb0eac2659f4b08382b2f474d" +checksum = "716d3d89f35ac6a34fd0eed635395f4c3b76fa889338a4632e5231a8684216bd" dependencies = [ "cfg-if 1.0.0", ] @@ -541,9 +539,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.101" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cb00336871be5ed2c8ed44b60ae9959dc5b9f08539422ed43f09e34ecaeba21" +checksum = "dd8f7255a17a627354f321ef0055d63b898c6fb27eff628af4d1b66b7331edf6" [[package]] name = "libudev-sys" @@ -662,9 +660,9 @@ dependencies = [ [[package]] name = "notify-rust" -version = "4.5.2" +version = "4.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2ca742cd7268b60c35828d318357f0b1bb9b82088e157ccf3013eb3ce70247" +checksum = "e4b2d5d72d16b6abdb6fa2c364d9363e23d6ed7c20c1a1e85fd8cd880144442c" dependencies = [ "mac-notification-sys", "serde", @@ -760,9 +758,9 @@ checksum = "bea9d5c668f13b4a1b97d848780e00cfabf76eb83538129c264c0c6d6a968047" [[package]] name = "pkg-config" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" +checksum = "7c9b1041b4387893b91ee6746cddfc28516aff326a3519fb2adf820932c5e6cb" [[package]] name = "png_pong" @@ -798,9 +796,9 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fdbd1df62156fbc5945f4762632564d7d038153091c3fcf1067f6aef7cff92" +checksum = "1ebace6889caf889b4d3f76becee12e90353f2b8c7d875534a71e5742f8f6f83" dependencies = [ "thiserror", "toml", @@ -820,9 +818,9 @@ checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" [[package]] name = "proc-macro2" -version = "1.0.28" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612" +checksum = "b9f5105d4fdaab20335ca9565e106a5d9b82b6219b5ba735731124ac6711d23d" dependencies = [ "unicode-xid 0.2.2", ] @@ -927,7 +925,6 @@ dependencies = [ "rog_aura", "rog_profiles", "rog_supported", - "supergfxctl", "zbus", "zbus_macros", "zvariant", @@ -991,29 +988,29 @@ checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" [[package]] name = "serde" -version = "1.0.129" +version = "1.0.130" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1f72836d2aa753853178eda473a3b9d8e4eefdaf20523b919677e6de489f8f1" +checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.129" +version = "1.0.130" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e57ae87ad533d9a56427558b516d0adac283614e347abf85b0dc0cbbf0a249f3" +checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" dependencies = [ "proc-macro2", "quote 1.0.9", - "syn 1.0.75", + "syn 1.0.77", ] [[package]] name = "serde_json" -version = "1.0.66" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "336b10da19a12ad094b59d870ebde26a45402e5b470add4b5fd03c5048a32127" +checksum = "0f690853975602e1bfe1ccbf50504d67174e3bcf340f23b5ea9992e0587a52d8" dependencies = [ "itoa", "ryu", @@ -1028,7 +1025,7 @@ checksum = "98d0516900518c29efa217c298fa1f4e6c6ffc85ae29fd7f4ee48f176e1a9ed5" dependencies = [ "proc-macro2", "quote 1.0.9", - "syn 1.0.75", + "syn 1.0.77", ] [[package]] @@ -1039,9 +1036,9 @@ checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" [[package]] name = "socket2" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "765f090f0e423d2b55843402a07915add955e7d60657db13707a159727326cad" +checksum = "5dc90fe6c7be1a323296982db1836d1ea9e47b6839496dde9a541bc496df3516" dependencies = [ "libc", "winapi", @@ -1069,22 +1066,6 @@ dependencies = [ "syn 0.11.11", ] -[[package]] -name = "supergfxctl" -version = "2.0.0" -source = "git+https://gitlab.com/asus-linux/supergfxctl.git?tag=2.0.0#8b91bddf7bdb9fd6eda00ca66e2d9394cda26441" -dependencies = [ - "log", - "logind-zbus", - "serde", - "serde_derive", - "serde_json", - "sysfs-class", - "zbus", - "zvariant", - "zvariant_derive", -] - [[package]] name = "syn" version = "0.11.11" @@ -1098,9 +1079,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.75" +version = "1.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f58f7e8eaa0009c5fec437aabf511bd9933e4b2d7407bd05273c01a8906ea7" +checksum = "5239bc68e0fef57495900cfea4e8dc75596d9a319d7e16b1e0a440d24e6fe0a0" dependencies = [ "proc-macro2", "quote 1.0.9", @@ -1136,22 +1117,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.26" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" +checksum = "602eca064b2d83369e2b2f34b09c70b605402801927c65c11071ac911d299b88" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.26" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" +checksum = "bad553cc2c78e8de258400763a647e80e6d1b31ee237275d756f6836d204494c" dependencies = [ "proc-macro2", "quote 1.0.9", - "syn 1.0.75", + "syn 1.0.77", ] [[package]] @@ -1350,17 +1331,18 @@ dependencies = [ "proc-macro-crate 0.1.5", "proc-macro2", "quote 1.0.9", - "syn 1.0.75", + "syn 1.0.77", ] [[package]] name = "zvariant" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4b785b8b32b0f8433b4474e6bb4ea77b37c1960e84d7598e01dd199b2b23ef" +checksum = "e1a9373dead84d640ccf5798f2928917e6aa1ab3f130751406bb13e0a9dd9913" dependencies = [ "byteorder", "enumflags2", + "libc", "serde", "static_assertions", "zvariant_derive", @@ -1368,12 +1350,12 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42af4ee88fb928781391216c34be77ec7cdb3546042b2947ce38d86aa5f37dd" +checksum = "46ee71e0e88747ec582d290dbe98ff7907ff28770c7a35f16da41e5e6f1f4fa3" dependencies = [ - "proc-macro-crate 1.0.0", + "proc-macro-crate 1.1.0", "proc-macro2", "quote 1.0.9", - "syn 1.0.75", + "syn 1.0.77", ] diff --git a/asus-notify/Cargo.toml b/asus-notify/Cargo.toml index 3bdda005..a4b48a18 100644 --- a/asus-notify/Cargo.toml +++ b/asus-notify/Cargo.toml @@ -14,7 +14,6 @@ rog_dbus = { path = "../rog-dbus" } rog_aura = { path = "../rog-aura" } rog_supported = { path = "../rog-supported" } rog_profiles = { path = "../rog-profiles" } -supergfxctl = { git = "https://gitlab.com/asus-linux/supergfxctl.git", tag = "2.0.0" } [dependencies.notify-rust] version = "^4.3" diff --git a/asus-notify/src/main.rs b/asus-notify/src/main.rs index 4814606b..e397ae39 100644 --- a/asus-notify/src/main.rs +++ b/asus-notify/src/main.rs @@ -3,13 +3,8 @@ use rog_aura::AuraEffect; use rog_dbus::{DbusProxies, Signals}; use rog_profiles::Profile; use std::error::Error; -use std::sync::mpsc::channel; use std::thread::sleep; use std::time::Duration; -use std::{process, thread}; -use supergfxctl::gfx_vendors::{GfxRequiredUserAction, GfxVendors}; -use supergfxctl::zbus_proxy::GfxProxy; -use zbus::Connection; const NOTIF_HEADER: &str = "ROG Control"; @@ -37,7 +32,6 @@ macro_rules! base_notification { fn main() -> Result<(), Box> { println!("asus-notify version {}", env!("CARGO_PKG_VERSION")); println!(" rog-dbus version {}", rog_dbus::VERSION); - println!("supergfxctl version {}", supergfxctl::VERSION); let (proxies, conn) = DbusProxies::new()?; let signals = Signals::new(&proxies)?; @@ -47,8 +41,6 @@ fn main() -> Result<(), Box> { let recv = proxies.setup_recv(conn); let mut err_count = 0; - gfx_thread()?; - loop { sleep(Duration::from_millis(100)); if let Err(err) = recv.next_signal() { @@ -77,56 +69,6 @@ fn main() -> Result<(), Box> { } } -fn gfx_thread() -> Result<(), Box> { - let mut last_notification: Option = None; - - let conn = Connection::new_system()?; - let proxy = GfxProxy::new(&conn)?; - - let (tx1, rx1) = channel(); - proxy.connect_notify_gfx(tx1)?; - - let (tx2, rx2) = channel(); - proxy.connect_notify_action(tx2)?; - - thread::spawn(move || loop { - if proxy - .next_signal() - .map_err(|e| println!("Error: {}", e)) - .is_err() - { - break; - } - - if let Ok(data) = rx1.try_recv() { - notify!(do_gfx_notif, last_notification, &data); - } - - if let Ok(data) = rx2.try_recv() { - match data { - GfxRequiredUserAction::Logout | GfxRequiredUserAction::Reboot => { - do_gfx_action_notif(&data) - .map_err(|e| { - println!("Error: {}", e); - }) - .ok(); - } - GfxRequiredUserAction::Integrated => { - base_notification!( - "You must be in integrated mode first to switch to the requested mode" - ) - .map_err(|e| { - println!("Error: {}", e); - }) - .ok(); - } - GfxRequiredUserAction::None => {} - } - } - }); - Ok(()) -} - fn do_thermal_notif(profile: &Profile) -> Result> { let icon = match profile { Profile::Balanced => "asus_notif_yellow", @@ -160,62 +102,3 @@ fn do_charge_notif(limit: &u8) -> Result Result { - let icon = match vendor { - GfxVendors::Nvidia => "/usr/share/icons/hicolor/scalable/status/gpu-nvidia.svg", - GfxVendors::Integrated => "/usr/share/icons/hicolor/scalable/status/gpu-integrated.svg", - GfxVendors::Compute => "/usr/share/icons/hicolor/scalable/status/gpu-compute.svg", - GfxVendors::Vfio => "/usr/share/icons/hicolor/scalable/status/gpu-vfio.svg", - GfxVendors::Hybrid => "/usr/share/icons/hicolor/scalable/status/gpu-hybrid.svg", - }; - Notification::new() - .summary(NOTIF_HEADER) - .body(&format!( - "Graphics mode changed to {}", - <&str>::from(vendor) - )) - .timeout(2000) - .icon(icon) - .show() -} - -fn do_gfx_action_notif(vendor: &GfxRequiredUserAction) -> Result<(), notify_rust::error::Error> { - let mut notif = Notification::new() - .summary(NOTIF_HEADER) - .timeout(2000) - .urgency(notify_rust::Urgency::Critical) - .icon("/usr/share/icons/hicolor/scalable/status/notification-reboot.svg") - .finalize(); - - if matches!(vendor, GfxRequiredUserAction::Logout) { - notif.action("logout", "Logout now?"); - } else if matches!(vendor, GfxRequiredUserAction::Reboot) { - notif.action("reboot", "Reboot now?"); - } - - notif.body("Graphics mode changed"); - notif.show()?.wait_for_action(|action| match action { - "logout" => { - let r = process::Command::new("gnome-session-quit").spawn(); - if r.is_err() { - // Try to prompt plasma logout screen via dbus - let conn = Connection::new_session().unwrap(); - conn.call_method( - Some(&"org.kde.LogoutPrompt"), - &"/LogoutPrompt", - Some(&"org.kde.LogoutPrompt"), - &"promptLogout", - &(), - ).ok(); - } - } - "reboot" => { - process::Command::new("systemctl") - .arg("reboot") - .spawn() - .ok(); - } - _ => (), - }); - Ok(()) -} diff --git a/asusctl/Cargo.toml b/asusctl/Cargo.toml index f0c1f353..e455719c 100644 --- a/asusctl/Cargo.toml +++ b/asusctl/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "asusctl" -version = "4.0.3" +version = "4.0.4" authors = ["Luke D Jones "] edition = "2018" @@ -15,7 +15,6 @@ rog_profiles = { path = "../rog-profiles" } rog_supported = { path = "../rog-supported" } daemon = { path = "../daemon" } gumdrop = "^0.8" -supergfxctl = { git = "https://gitlab.com/asus-linux/supergfxctl.git", tag = "2.0.0" } toml = "^0.5.8" sysfs-class = "^0.1.2" diff --git a/asusctl/src/cli_opts.rs b/asusctl/src/cli_opts.rs index 272d268c..bfb2089c 100644 --- a/asusctl/src/cli_opts.rs +++ b/asusctl/src/cli_opts.rs @@ -4,7 +4,6 @@ use crate::{ profiles_cli::{FanCurveCommand, ProfileCommand}, }; use gumdrop::Options; -use supergfxctl::gfx_vendors::GfxVendors; #[derive(Default, Options)] pub struct CliStart { @@ -20,7 +19,7 @@ pub struct CliStart { pub next_kbd_bright: bool, #[options(help = "Toggle to previous keyboard brightness")] pub prev_kbd_bright: bool, - #[options(meta = "", help = "<20-100>")] + #[options(meta = "", help = "Set your battery charge limit <20-100>")] pub chg_limit: Option, #[options(command)] pub command: Option, @@ -32,9 +31,9 @@ pub enum CliCommand { LedMode(LedModeCommand), #[options(help = "Set or select platform_profile")] Profile(ProfileCommand), - #[options(help = "Set, select, or modify fan curves if suported")] + #[options(help = "Set, select, or modify fan curves if supported")] FanCurve(FanCurveCommand), - #[options(help = "Set the graphics mode")] + #[options(help = "Set the graphics mode (obsoleted by supergfxctl)")] Graphics(GraphicsCommand), #[options(name = "anime", help = "Manage AniMe Matrix")] Anime(AnimeCommand), @@ -68,17 +67,6 @@ pub struct LedModeCommand { pub struct GraphicsCommand { #[options(help = "print help message")] pub help: bool, - #[options( - meta = "", - help = "Set graphics mode: " - )] - pub mode: Option, - #[options(help = "Get the current mode")] - pub get: bool, - #[options(help = "Get the current power status")] - pub pow: bool, - #[options(help = "Do not ask for confirmation")] - pub force: bool, } #[derive(Options, Debug)] diff --git a/asusctl/src/main.rs b/asusctl/src/main.rs index 9ff1ebd8..9dd73015 100644 --- a/asusctl/src/main.rs +++ b/asusctl/src/main.rs @@ -11,19 +11,14 @@ use profiles_cli::{FanCurveCommand, ProfileCommand}; use rog_anime::{AnimeDataBuffer, AnimeImage, Vec2, ANIME_DATA_LEN}; use rog_aura::{self, AuraEffect}; use rog_dbus::RogDbusClient; +use rog_profiles::error::ProfileError; use rog_supported::SupportedFunctions; use rog_supported::{ AnimeSupportedFunctions, LedSupportedFunctions, PlatformProfileFunctions, RogBiosSupportedFunctions, }; use std::process::Command; -use std::{env::args, path::Path, sync::mpsc::channel}; -use supergfxctl::{ - gfx_vendors::GfxRequiredUserAction, - special::{get_asus_gsync_gfx_mode, has_asus_gsync_gfx_mode}, - zbus_proxy::GfxProxy, -}; -use zbus::Connection; +use std::{env::args, path::Path}; const CONFIG_ADVICE: &str = "A config file need to be removed so a new one can be generated"; @@ -102,7 +97,6 @@ fn print_versions() { println!(" rog-dbus v{}", rog_dbus::VERSION); println!(" rog-profiles v{}", rog_profiles::VERSION); println!("rog-supported v{}", rog_supported::VERSION); - println!(" supergfxctl v{}", supergfxctl::VERSION); } fn print_laptop_info() { @@ -149,10 +143,7 @@ fn do_parsed( Some(CliCommand::FanCurve(cmd)) => { handle_fan_curve(dbus, &supported.platform_profile, cmd)? } - Some(CliCommand::Graphics(cmd)) => do_gfx(cmd).map_err(|err| { - do_gfx_diagnose(); - err - })?, + Some(CliCommand::Graphics(_)) => do_gfx()?, Some(CliCommand::Anime(cmd)) => handle_anime(dbus, &supported.anime_ctrl, cmd)?, Some(CliCommand::Bios(cmd)) => handle_bios_option(dbus, &supported.rog_bios_ctrl, cmd)?, None => { @@ -204,71 +195,9 @@ fn do_parsed( Ok(()) } -fn do_gfx_diagnose() { - println!("\nGraphics mode change error."); - do_diagnose("supergfxd"); - println!(); -} - -fn do_gfx(command: &GraphicsCommand) -> Result<(), Box> { - if command.mode.is_none() && !command.get && !command.pow && !command.force || command.help { - println!("{}", command.self_usage()); - } - - let conn = Connection::new_system()?; - let proxy = GfxProxy::new(&conn)?; - - let (tx, rx) = channel(); - proxy.connect_notify_action(tx)?; - - if let Some(mode) = command.mode { - if has_asus_gsync_gfx_mode() && get_asus_gsync_gfx_mode()? == 1 { - println!("You can not change modes until you turn dedicated/G-Sync off and reboot"); - std::process::exit(-1); - } - - println!( - "If anything fails check `journalctl -b -u asusd` and `journalctl -b -u supergfxd`\n" - ); - - proxy.gfx_write_mode(&mode)?; - - loop { - proxy.next_signal()?; - - if let Ok(res) = rx.try_recv() { - match res { - GfxRequiredUserAction::Integrated => { - println!( - "You must change to Integrated before you can change to {}", - <&str>::from(mode) - ); - } - GfxRequiredUserAction::Logout | GfxRequiredUserAction::Reboot => { - println!( - "Graphics mode changed to {}. User action required is: {}", - <&str>::from(mode), - <&str>::from(&res) - ); - } - GfxRequiredUserAction::None => { - println!("Graphics mode changed to {}", <&str>::from(mode)); - } - } - } - std::process::exit(0) - } - } - - if command.get { - let res = proxy.gfx_get_mode()?; - println!("Current graphics mode: {}", <&str>::from(res)); - } - if command.pow { - let res = proxy.gfx_get_pwr()?; - println!("Current power status: {}", <&str>::from(&res)); - } - +fn do_gfx() -> Result<(), Box> { + println!("Please use supergfxctl for graphics switching. supergfxctl is the result of making asusctl graphics switching generic so all laptops can use it"); + println!("This command will be removed in future"); Ok(()) } @@ -403,12 +332,19 @@ fn handle_led_mode( fn handle_profile( dbus: &RogDbusClient, - _supported: &PlatformProfileFunctions, + supported: &PlatformProfileFunctions, cmd: &ProfileCommand, ) -> Result<(), Box> { - println!("Warning: Profiles now depend on power-profiles-daemon v0.9+"); - println!("Warning: Fan-curve support is coming in a 4.1.x release"); - if !cmd.next && !cmd.list { + if !supported.fan_curves { + println!("Profiles not supported by either this kernel or by the laptop."); + return Err(ProfileError::NotSupported.into()); + } + + println!("Warning: Profiles now depend on power-profiles-daemon v0.9+ which may not be in your install"); + println!(" If you have unexpected behaviour or have only two profiles in your desktop control"); + println!(" you need to manually install from https://gitlab.freedesktop.org/hadess/power-profiles-daemon"); + println!(" Fedora and Arch distros will get the update soon...\n"); + if !cmd.next && !cmd.list && cmd.profile_set.is_none() && !cmd.profile_get { if !cmd.help { println!("Missing arg or command\n"); } @@ -417,28 +353,38 @@ fn handle_profile( if let Some(lst) = cmd.self_command_list() { println!("\n{}", lst); } - - // println!("Note: turbo, frequency, fan preset and fan curve options will apply to"); - // println!(" to the currently active profile unless a profile name is specified"); std::process::exit(1); } if cmd.next { dbus.proxies().profile().next_profile()?; + } else if let Some(profile) = cmd.profile_set { + dbus.proxies().profile().set_active_profile(profile)?; } if cmd.list { let res = dbus.proxies().profile().profiles()?; res.iter().for_each(|p| println!("{:?}", p)); } + + if cmd.profile_get { + let res = dbus.proxies().profile().active_profile()?; + println!("Active profile is {:?}", res); + } + Ok(()) } fn handle_fan_curve( dbus: &RogDbusClient, - _supported: &PlatformProfileFunctions, + supported: &PlatformProfileFunctions, cmd: &FanCurveCommand, ) -> Result<(), Box> { + if !supported.fan_curves { + println!("Fan-curves not supported by either this kernel or by the laptop."); + return Err(ProfileError::NotSupported.into()); + } + if !cmd.get_enabled && !cmd.default && cmd.mod_profile.is_none() { if !cmd.help { println!("Missing arg or command\n"); @@ -451,7 +397,8 @@ fn handle_fan_curve( std::process::exit(1); } - if (cmd.enabled.is_some() || cmd.fan.is_some() || cmd.data.is_some()) && cmd.mod_profile.is_none() + if (cmd.enabled.is_some() || cmd.fan.is_some() || cmd.data.is_some()) + && cmd.mod_profile.is_none() { println!("--enabled, --fan, and --data options require --mod-profile"); std::process::exit(666); diff --git a/asusctl/src/profiles_cli.rs b/asusctl/src/profiles_cli.rs index e52fdc47..06c7d488 100644 --- a/asusctl/src/profiles_cli.rs +++ b/asusctl/src/profiles_cli.rs @@ -12,7 +12,7 @@ pub struct ProfileCommand { #[options(help = "get profile")] pub profile_get: bool, - #[options(help = "set the active profile")] + #[options(meta = "", help = "set the active profile")] pub profile_set: Option, } diff --git a/daemon/Cargo.toml b/daemon/Cargo.toml index 9b945c6c..f6fd8b6a 100644 --- a/daemon/Cargo.toml +++ b/daemon/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "daemon" -version = "4.0.3" +version = "4.0.4" license = "MPL-2.0" readme = "README.md" authors = ["Luke "] diff --git a/daemon/src/ctrl_profiles/controller.rs b/daemon/src/ctrl_profiles/controller.rs index 569ff8d4..3b1b845a 100644 --- a/daemon/src/ctrl_profiles/controller.rs +++ b/daemon/src/ctrl_profiles/controller.rs @@ -56,7 +56,10 @@ impl crate::Reloadable for CtrlPlatformProfile { fn reload(&mut self) -> Result<(), RogError> { if let Some(curves) = &mut self.config.fan_curves { if let Ok(mut device) = FanCurveProfiles::get_device() { + // There is a possibility that the curve was default zeroed, so this call initialises + // the data from system read and we need to save it after curves.write_profile_curve_to_platform(self.config.active_profile, &mut device)?; + self.config.write(); } } Ok(()) @@ -64,17 +67,13 @@ impl crate::Reloadable for CtrlPlatformProfile { } impl CtrlPlatformProfile { - pub fn new(mut config: ProfileConfig) -> Result { + pub fn new(config: ProfileConfig) -> Result { if Profile::is_platform_profile_supported() { info!("Device has profile control available"); - if let Ok(ref device) = FanCurveProfiles::get_device() { - let profile = config.active_profile; - if let Some(curve) = config.fan_curves.as_mut() { - curve.read_from_dev_profile(profile, device); - } + if FanCurveProfiles::get_device().is_ok() { + info!("Device has fan curves available"); } - config.write(); return Ok(CtrlPlatformProfile { config }); } @@ -143,6 +142,7 @@ impl CtrlTask for CtrlProfileTask { let new_profile = Profile::get_active_profile().unwrap(); if new_profile != lock.config.active_profile { lock.config.active_profile = new_profile; + lock.write_profile_curve_to_platform()?; lock.save_config(); } } diff --git a/daemon/src/ctrl_profiles/zbus.rs b/daemon/src/ctrl_profiles/zbus.rs index a1711dfb..affcaae8 100644 --- a/daemon/src/ctrl_profiles/zbus.rs +++ b/daemon/src/ctrl_profiles/zbus.rs @@ -94,7 +94,7 @@ impl ProfileZbus { fn set_fan_curve_enabled(&mut self, profile: Profile, enabled: bool) -> zbus::fdo::Result<()> { if let Ok(mut ctrl) = self.inner.try_lock() { ctrl.config.read(); - if let Some(curves) = &mut ctrl.config.fan_curves { + return if let Some(curves) = &mut ctrl.config.fan_curves { curves.set_profile_curve_enabled(profile, enabled); ctrl.write_profile_curve_to_platform() @@ -102,10 +102,10 @@ impl ProfileZbus { .ok(); ctrl.save_config(); - return Ok(()); + Ok(()) } else { - return Err(Error::Failed(UNSUPPORTED_MSG.to_string())); - } + Err(Error::Failed(UNSUPPORTED_MSG.to_string())) + }; } Err(Error::Failed( "Failed to get enabled fan curve names".to_string(), diff --git a/daemon/src/daemon.rs b/daemon/src/daemon.rs index 846fc7a4..156a6171 100644 --- a/daemon/src/daemon.rs +++ b/daemon/src/daemon.rs @@ -1,3 +1,15 @@ +use std::error::Error; +use std::io::Write; +use std::sync::Arc; +use std::sync::Mutex; +use std::thread::sleep; +use std::time::Duration; +use std::{env, thread}; + +use ::zbus::{fdo, Connection, ObjectServer}; +use log::LevelFilter; +use log::{error, info, warn}; + use daemon::ctrl_anime::config::AnimeConfig; use daemon::ctrl_anime::zbus::CtrlAnimeZbus; use daemon::ctrl_anime::*; @@ -8,6 +20,8 @@ use daemon::ctrl_aura::controller::{ use daemon::ctrl_charge::CtrlCharge; use daemon::ctrl_profiles::config::ProfileConfig; use daemon::ctrl_profiles::controller::CtrlProfileTask; +use daemon::ctrl_rog_bios::CtrlRogBios; +use daemon::error::RogError; use daemon::{ config::Config, ctrl_supported::SupportedFunctions, laptops::print_board_info, GetSupported, }; @@ -15,20 +29,9 @@ use daemon::{ ctrl_profiles::{controller::CtrlPlatformProfile, zbus::ProfileZbus}, laptops::LaptopLedData, }; - -use ::zbus::{fdo, Connection, ObjectServer}; use daemon::{CtrlTask, Reloadable, ZbusAdd}; -use log::LevelFilter; -use log::{error, info, warn}; use rog_dbus::DBUS_NAME; use rog_profiles::Profile; -use std::env; -use std::error::Error; -use std::io::Write; -use std::sync::Arc; -use std::sync::Mutex; - -use daemon::ctrl_rog_bios::CtrlRogBios; static PROFILE_CONFIG_PATH: &str = "/etc/asusd/profile.conf"; @@ -71,8 +74,6 @@ fn start_daemon() -> Result<(), Box> { print_board_info(); println!("{}", serde_json::to_string_pretty(&supported)?); - // Collect tasks for task thread - let mut tasks: Vec> = Vec::new(); // Start zbus server let connection = Connection::new_system()?; let fdo_connection = fdo::DBusProxy::new(&connection)?; @@ -119,7 +120,15 @@ fn start_daemon() -> Result<(), Box> { let tmp = Arc::new(Mutex::new(ctrl)); ProfileZbus::new(tmp.clone()).add_to_server(&mut object_server); - tasks.push(Box::new(CtrlProfileTask::new(tmp))); + let task = CtrlProfileTask::new(tmp); + thread::Builder::new().name("profile tasks".into()).spawn( + move || -> Result<(), RogError> { + loop { + task.do_task()?; + sleep(Duration::from_millis(100)); + } + }, + )?; } Err(err) => { error!("Profile control: {}", err); @@ -141,7 +150,14 @@ fn start_daemon() -> Result<(), Box> { let zbus = CtrlAnimeZbus(inner.clone()); zbus.add_to_server(&mut object_server); - tasks.push(Box::new(CtrlAnimeTask::new(inner))); + let task = CtrlAnimeTask::new(inner); + thread::Builder::new().name("anime tasks".into()).spawn( + move || -> Result<(), RogError> { + loop { + task.do_task()?; + } + }, + )?; } Err(err) => { error!("AniMe control: {}", err); @@ -160,39 +176,26 @@ fn start_daemon() -> Result<(), Box> { .unwrap_or_else(|err| warn!("Keyboard LED control: {}", err)); CtrlKbdLedZbus::new(inner.clone()).add_to_server(&mut object_server); + let task = CtrlKbdLedTask::new(inner); - tasks.push(Box::new(task)); + thread::Builder::new().name("keyboard tasks".into()).spawn( + move || -> Result<(), RogError> { + loop { + task.do_task()?; + } + }, + )?; } Err(err) => { error!("Keyboard control: {}", err); } } - // TODO: implement messaging between threads to check fails - - // Run tasks - let handle = std::thread::Builder::new() - .name("asusd watch".to_string()) - .spawn(move || loop { - std::thread::sleep(std::time::Duration::from_millis(100)); - - for ctrl in tasks.iter() { - ctrl.do_task() - .map_err(|err| { - warn!("do_task error: {}", err); - }) - .ok(); - } - }); - // Request dbus name after finishing initalizing all functions fdo_connection.request_name(DBUS_NAME, fdo::RequestNameFlags::ReplaceExisting.into())?; // Loop to check errors and iterate zbus server loop { - if let Err(err) = &handle { - error!("{}", err); - } if let Err(err) = object_server.try_handle_next() { error!("{}", err); } diff --git a/daemon/src/lib.rs b/daemon/src/lib.rs index 766f9cd7..3ba9a8de 100644 --- a/daemon/src/lib.rs +++ b/daemon/src/lib.rs @@ -27,7 +27,7 @@ pub mod laptops; /// Fetch all supported functions for the laptop pub mod ctrl_supported; -mod error; +pub mod error; use crate::error::RogError; use config::Config; diff --git a/rog-dbus/Cargo.toml b/rog-dbus/Cargo.toml index 9a8fbe12..8b76e2dd 100644 --- a/rog-dbus/Cargo.toml +++ b/rog-dbus/Cargo.toml @@ -14,7 +14,6 @@ rog_anime = { path = "../rog-anime" } rog_aura = { path = "../rog-aura" } rog_profiles = { path = "../rog-profiles" } rog_supported = { path = "../rog-supported" } -supergfxctl = { git = "https://gitlab.com/asus-linux/supergfxctl.git", tag = "2.0.0" } zbus = "^1.9" zbus_macros = "^1.9" zvariant = "^2.8" diff --git a/rog-dbus/src/lib.rs b/rog-dbus/src/lib.rs index 458f4501..f5456af7 100644 --- a/rog-dbus/src/lib.rs +++ b/rog-dbus/src/lib.rs @@ -1,5 +1,4 @@ pub static DBUS_NAME: &str = "org.asuslinux.Daemon"; -pub static DBUS_NAME_GFX: &str = "org.supergfxctl.Daemon"; pub static DBUS_PATH: &str = "/org/asuslinux/Daemon"; pub static DBUS_IFACE: &str = "org.asuslinux.Daemon"; diff --git a/rog-profiles/src/lib.rs b/rog-profiles/src/lib.rs index 657f5260..3bb2f09c 100644 --- a/rog-profiles/src/lib.rs +++ b/rog-profiles/src/lib.rs @@ -219,7 +219,9 @@ impl FanCurveProfiles { } /// Write the curves for the selected profile to the device. If the curve is - /// in the enabled list it will become active. + /// in the enabled list it will become active. If the curve is zeroed it will be initialised + /// to a default read from the system. + // TODO: Make this return an error if curve is zeroed pub fn write_profile_curve_to_platform( &mut self, profile: Profile,