From 11483b28a61e7a449572b474249e96e3f5690309 Mon Sep 17 00:00:00 2001 From: "Luke D. Jones" Date: Tue, 1 Aug 2023 19:30:33 +1200 Subject: [PATCH] Fix: Further refine the CLI for fan curve control Should close #385 --- CHANGELOG.md | 1 + asusctl/src/main.rs | 24 ++++++++++++++++++++---- asusctl/src/profiles_cli.rs | 18 +++++++++++++----- rog-dbus/src/zbus_profile.rs | 2 +- rog-profiles/src/fan_curve_set.rs | 8 +++++--- 5 files changed, 40 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 206c21ba..b4430d2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Fixes to asusctl CLI tool to show fan curves - Fixes to asusd to ensure fan curve defaults are loaded if the config file fails +- Further refine the asusctl CLI for fan-curve control ### Added - Support for GV601V LED modes diff --git a/asusctl/src/main.rs b/asusctl/src/main.rs index e0135bb6..0c92e41d 100644 --- a/asusctl/src/main.rs +++ b/asusctl/src/main.rs @@ -678,10 +678,13 @@ fn handle_fan_curve( return Ok(()); } - if (cmd.enabled.is_some() || cmd.fan.is_some() || cmd.data.is_some()) + if (cmd.enable_fan_curves.is_some() || cmd.fan.is_some() || cmd.data.is_some()) && cmd.mod_profile.is_none() { - println!("--enabled, --fan, and --data options require --mod-profile"); + println!( + "--enable-fan-curves, --enable-fan-curve, --fan, and --data options require \ + --mod-profile" + ); return Ok(()); } @@ -698,18 +701,31 @@ fn handle_fan_curve( } if let Some(profile) = cmd.mod_profile { - if cmd.enabled.is_none() && cmd.data.is_none() { + if cmd.enable_fan_curves.is_none() && cmd.data.is_none() { let data = dbus.proxies().profile().fan_curve_data(profile)?; let data = toml::to_string(&data)?; println!("\nFan curves for {:?}\n\n{}", profile, data); } - if let Some(enabled) = cmd.enabled { + if let Some(enabled) = cmd.enable_fan_curves { dbus.proxies() .profile() .set_fan_curves_enabled(profile, enabled)?; } + if let Some(enabled) = cmd.enable_fan_curve { + if let Some(fan) = cmd.fan { + dbus.proxies() + .profile() + .set_profile_fan_curve_enabled(profile, fan, enabled)?; + } else { + println!( + "--enable-fan-curves, --enable-fan-curve, --fan, and --data options require \ + --mod-profile" + ); + } + } + if let Some(mut curve) = cmd.data.clone() { let fan = cmd.fan.unwrap_or_default(); curve.set_fan(fan); diff --git a/asusctl/src/profiles_cli.rs b/asusctl/src/profiles_cli.rs index ace3e231..43c8f1f2 100644 --- a/asusctl/src/profiles_cli.rs +++ b/asusctl/src/profiles_cli.rs @@ -39,20 +39,28 @@ pub struct FanCurveCommand { #[options( meta = "", - help = "enable or disable fan curve. `mod_profile` required" + help = "enable or disable fan all curves for a profile. `--mod_profile` \ + required" )] - pub enabled: Option, + pub enable_fan_curves: Option, #[options( meta = "", - help = "select fan to modify. `mod_profile` required" + help = "enable or disable a single fan curve for a profile. `--mod_profile` \ + and `--fan` required" + )] + pub enable_fan_curve: Option, + + #[options( + meta = "", + help = "select fan to modify. `--mod_profile` required" )] pub fan: Option, #[options( meta = "", - help = "data format = 30c:1%,49c:2%,59c:3%,69c:4%,79c:31%,89c:49%,99c:56%,109c:58%. - `--mod-profile` required. If '%' is omitted the fan range is 0-255" + help = "data format = 30c:1%,49c:2%,59c:3%,69c:4%,79c:31%,89c:49%,99c:56%,109c:58%. \ + `--mod-profile` required. If '%' is omitted the fan range is 0-255" )] pub data: Option, } diff --git a/rog-dbus/src/zbus_profile.rs b/rog-dbus/src/zbus_profile.rs index e3969049..2090fe11 100644 --- a/rog-dbus/src/zbus_profile.rs +++ b/rog-dbus/src/zbus_profile.rs @@ -51,7 +51,7 @@ trait Profile { /// Set a single fan curve for a profile to enabled status. Will also /// activate a fan curve. async fn set_profile_fan_curve_enabled( - &mut self, + &self, profile: Profile, fan: FanCurvePU, enabled: bool, diff --git a/rog-profiles/src/fan_curve_set.rs b/rog-profiles/src/fan_curve_set.rs index e28e434c..7bba72e5 100644 --- a/rog-profiles/src/fan_curve_set.rs +++ b/rog-profiles/src/fan_curve_set.rs @@ -43,8 +43,9 @@ pub struct CurveData { impl From<&CurveData> for String { fn from(c: &CurveData) -> Self { format!( - "{:?}: {}c:{}%,{}c:{}%,{}c:{}%,{}c:{}%,{}c:{}%,{}c:{}%,{}c:{}%,{}c:{}%", + "{:?}: enabled: {}, {}c:{}%,{}c:{}%,{}c:{}%,{}c:{}%,{}c:{}%,{}c:{}%,{}c:{}%,{}c:{}%", c.fan, + c.enabled, c.temp[0], (c.pwm[0] as u32) * 100 / 255, c.temp[1], @@ -193,9 +194,10 @@ mod tests { #[test] fn curve_data_from_str_to_str() { - let curve = + let mut curve = CurveData::from_str("30c:1%,49c:2%,59c:3%,69c:4%,79c:31%,89c:49%,99c:56%,109c:58%") .unwrap(); + curve.enabled = true; assert_eq!(curve.fan, FanCurvePU::CPU); assert_eq!(curve.temp, [30, 49, 59, 69, 79, 89, 99, 109]); assert_eq!(curve.pwm, [3, 5, 8, 10, 79, 125, 143, 148]); @@ -204,7 +206,7 @@ mod tests { // End result is slightly different due to type conversions and rounding errors assert_eq!( string.as_str(), - "CPU: 30c:1%,49c:1%,59c:3%,69c:3%,79c:30%,89c:49%,99c:56%,109c:58%" + "CPU: enabled: true, 30c:1%,49c:1%,59c:3%,69c:3%,79c:30%,89c:49%,99c:56%,109c:58%" ); let curve = CurveData::from_str("30c:1%,49c:2%,59c:3%,69c:4%,79c:31%,89c:49%,99c:56%");