diff --git a/CHANGELOG.md b/CHANGELOG.md index 134d3944..9d8311a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ ## [Unreleased] +### Changed +- Bug fix: UI was setting incorrect value for FPPT +- Bug fix: Re-add callbacks for the throttle and epp settings in UI +- Strip out all outdated and unsafe tuning stuff + ## [v6.1.0-rc3] ### Changed diff --git a/asusctl/src/cli_opts.rs b/asusctl/src/cli_opts.rs index 1558e7f8..a21293d4 100644 --- a/asusctl/src/cli_opts.rs +++ b/asusctl/src/cli_opts.rs @@ -49,8 +49,6 @@ pub enum CliCommand { Slash(SlashCommand), #[options(name = "scsi", help = "Manage SCSI external drive")] Scsi(ScsiCommand), - #[options(help = "Change bios settings")] - PlatformOld(PlatformCommand), #[options( help = "Change platform settings. This is a new interface exposed by the asus-armoury \ driver, some of the settings will be the same as the older platform interface" @@ -94,39 +92,6 @@ pub struct GraphicsCommand { pub help: bool } -#[derive(Options, Debug)] -pub struct PlatformCommand { - #[options(help = "print help message")] - pub help: bool, - #[options( - meta = "", - short = "S", - no_long, - help = "set bios POST sound: asusctl -S " - )] - pub post_sound_set: Option, - #[options(no_long, short = "s", help = "read bios POST sound")] - pub post_sound_get: bool, - #[options( - meta = "", - short = "D", - no_long, - help = "Switch GPU MUX mode: 0 = Discrete, 1 = Optimus, reboot required" - )] - pub gpu_mux_mode_set: Option, - #[options(no_long, short = "d", help = "get GPU mode")] - pub gpu_mux_mode_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 -} - #[derive(Options, Debug)] pub struct ArmouryCommand { #[options(help = "print help message")] diff --git a/asusctl/src/main.rs b/asusctl/src/main.rs index a476aeb4..9af4e2a5 100644 --- a/asusctl/src/main.rs +++ b/asusctl/src/main.rs @@ -21,7 +21,7 @@ use rog_dbus::zbus_aura::AuraProxyBlocking; use rog_dbus::zbus_fan_curves::FanCurvesProxyBlocking; use rog_dbus::zbus_platform::PlatformProxyBlocking; use rog_dbus::zbus_slash::SlashProxyBlocking; -use rog_platform::platform::{GpuMode, Properties, ThrottlePolicy}; +use rog_platform::platform::{Properties, ThrottlePolicy}; use rog_profiles::error::ProfileError; use rog_scsi::AuraMode; use rog_slash::SlashMode; @@ -186,9 +186,6 @@ fn do_parsed( Some(CliCommand::Anime(cmd)) => handle_anime(cmd)?, Some(CliCommand::Slash(cmd)) => handle_slash(cmd)?, Some(CliCommand::Scsi(cmd)) => handle_scsi(cmd)?, - Some(CliCommand::PlatformOld(cmd)) => { - handle_platform_properties(&conn, supported_properties, cmd)? - } Some(CliCommand::Armoury(cmd)) => handle_armoury_command(cmd)?, None => { if (!parsed.show_supported @@ -1007,70 +1004,6 @@ fn handle_fan_curve( Ok(()) } -fn handle_platform_properties( - conn: &Connection, - supported: &[Properties], - cmd: &PlatformCommand -) -> Result<(), Box> { - { - if (cmd.gpu_mux_mode_set.is_none() - && !cmd.gpu_mux_mode_get - && cmd.post_sound_set.is_none() - && !cmd.post_sound_get - && cmd.panel_overdrive_set.is_none() - && !cmd.panel_overdrive_get) - || cmd.help - { - println!("Missing arg or command\n"); - - let usage: Vec = PlatformCommand::usage() - .lines() - .map(|s| s.to_owned()) - .collect(); - - for line in usage.iter().filter(|line| { - line.contains("sound") && supported.contains(&Properties::PostAnimationSound) - || line.contains("GPU") && supported.contains(&Properties::GpuMuxMode) - || line.contains("panel") && supported.contains(&Properties::PanelOd) - }) { - println!("{}", line); - } - } - - let proxy = PlatformProxyBlocking::new(conn)?; - - if let Some(opt) = cmd.post_sound_set { - proxy.set_boot_sound(opt)?; - } - if cmd.post_sound_get { - let res = proxy.boot_sound()?; - println!("Bios POST sound on: {}", res); - } - - if let Some(opt) = cmd.gpu_mux_mode_set { - println!("Rebuilding initrd to include drivers"); - proxy.set_gpu_mux_mode(GpuMode::from_mux(opt))?; - println!( - "The mode change is not active until you reboot, on boot the bios will make the \ - required change" - ); - } - if cmd.gpu_mux_mode_get { - let res = proxy.gpu_mux_mode()?; - println!("Bios GPU MUX: {:?}", res); - } - - if let Some(opt) = cmd.panel_overdrive_set { - proxy.set_panel_od(opt)?; - } - if cmd.panel_overdrive_get { - let res = proxy.panel_od()?; - println!("Panel overdrive on: {}", res); - } - } - Ok(()) -} - fn check_systemd_unit_active(name: &str) -> bool { if let Ok(out) = Command::new("systemctl") .arg("is-active") diff --git a/asusd/src/asus_armoury.rs b/asusd/src/asus_armoury.rs index 87850dc4..b673fe83 100644 --- a/asusd/src/asus_armoury.rs +++ b/asusd/src/asus_armoury.rs @@ -1,20 +1,20 @@ +use std::collections::HashMap; use std::str::FromStr; use std::sync::Arc; use ::zbus::export::futures_util::lock::Mutex; use config_traits::StdConfig; -use log::error; -use rog_platform::firmware_attributes::{ - AttrValue, Attribute, FirmwareAttribute, FirmwareAttributes -}; +use log::{debug, error, info}; +use rog_platform::asus_armoury::{AttrValue, Attribute, FirmwareAttribute, FirmwareAttributes}; use rog_platform::platform::{RogPlatform, ThrottlePolicy}; use serde::{Deserialize, Serialize}; +use zbus::object_server::SignalEmitter; use zbus::zvariant::{ObjectPath, OwnedObjectPath, OwnedValue, Type, Value}; use zbus::{fdo, interface, Connection}; use crate::config::Config; use crate::error::RogError; -use crate::ASUS_ZBUS_PATH; +use crate::{Reloadable, ASUS_ZBUS_PATH}; const MOD_NAME: &str = "asus_armoury"; @@ -28,6 +28,7 @@ fn dbus_path_for_attr(attr_name: &str) -> OwnedObjectPath { ObjectPath::from_str_unchecked(&format!("{ASUS_ZBUS_PATH}/{MOD_NAME}/{attr_name}")).into() } +#[derive(Clone)] pub struct AsusArmouryAttribute { attr: Attribute, config: Arc>, @@ -44,10 +45,7 @@ impl AsusArmouryAttribute { } } - pub async fn start_tasks(self, connection: &Connection) -> Result<(), RogError> { - // self.reload() - // .await - // .unwrap_or_else(|err| warn!("Controller error: {}", err)); + pub async fn move_to_zbus(self, connection: &Connection) -> Result<(), RogError> { let path = dbus_path_for_attr(self.attr.name()); connection .object_server() @@ -57,6 +55,60 @@ impl AsusArmouryAttribute { .ok(); Ok(()) } + + async fn watch_and_notify( + &mut self, + signal_ctxt: SignalEmitter<'static> + ) -> Result<(), RogError> { + use zbus::export::futures_util::StreamExt; + + let ctrl = self.clone(); + let name = self.name(); + match self.attr.get_watcher() { + Ok(watch) => { + let name = <&str>::from(name); + tokio::spawn(async move { + let mut buffer = [0; 32]; + watch + .into_event_stream(&mut buffer) + .unwrap() + .for_each(|_| async { + debug!("{} changed", name); + ctrl.current_value_changed(&signal_ctxt).await.ok(); + }) + .await; + }); + } + Err(e) => info!( + "inotify watch failed: {}. You can ignore this if your device does not support \ + the feature", + e + ) + } + + Ok(()) + } +} + +impl crate::Reloadable for AsusArmouryAttribute { + async fn reload(&mut self) -> Result<(), RogError> { + info!("Reloading {}", self.attr.name()); + let profile: ThrottlePolicy = + ThrottlePolicy::from_str(self.platform.get_platform_profile()?.as_str())?; + if let Some(tunings) = self.config.lock().await.profile_tunings.get(&profile) { + if let Some(tune) = tunings.get(&self.name()) { + self.attr + .set_current_value(AttrValue::Integer(*tune)) + .map_err(|e| { + error!("Could not set value: {e:?}"); + e + })?; + info!("Set {} to {:?}", self.attr.name(), tune); + } + } + + Ok(()) + } } /// If return is `-1` on a property then there is avilable value for that @@ -157,11 +209,73 @@ impl AsusArmouryAttribute { error!("Could not set value: {e:?}"); e })?; - let profile: ThrottlePolicy = - ThrottlePolicy::from_str(self.platform.get_platform_profile()?.as_str())?; - if let Some(tunings) = self.config.lock().await.tunings.get_mut(&profile) { - if let Some(tune) = tunings.get_mut(&self.name()) { - *tune = value; + + if matches!( + self.name(), + FirmwareAttribute::PptPl1Spl + | FirmwareAttribute::PptPl2Sppt + | FirmwareAttribute::PptPl3Fppt + | FirmwareAttribute::PptFppt + | FirmwareAttribute::PptApuSppt + | FirmwareAttribute::PptPlatformSppt + | FirmwareAttribute::NvDynamicBoost + | FirmwareAttribute::NvTempTarget + | FirmwareAttribute::DgpuBaseTgp + | FirmwareAttribute::DgpuTgp + ) { + let profile: ThrottlePolicy = + ThrottlePolicy::from_str(self.platform.get_platform_profile()?.as_str())?; + + // var here to prevent async deadlock on else clause + let has_profile = self + .config + .lock() + .await + .profile_tunings + .contains_key(&profile); + if has_profile { + if let Some(tunings) = self.config.lock().await.profile_tunings.get_mut(&profile) { + if let Some(tune) = tunings.get_mut(&self.name()) { + *tune = value; + } else { + tunings.insert(self.name(), value); + debug!("Set tuning config for {} = {:?}", self.attr.name(), value); + } + } + } else { + debug!("Adding tuning config for {}", profile); + self.config + .lock() + .await + .profile_tunings + .insert(profile, HashMap::from([(self.name(), value)])); + debug!("Set tuning config for {} = {:?}", self.attr.name(), value); + } + } else { + let has_attr = self + .config + .lock() + .await + .armoury_settings + .contains_key(&self.name()); + if has_attr { + if let Some(setting) = self + .config + .lock() + .await + .armoury_settings + .get_mut(&self.name()) + { + *setting = value + } + } else { + debug!("Adding config for {}", self.attr.name()); + self.config + .lock() + .await + .armoury_settings + .insert(self.name(), value); + debug!("Set config for {} = {:?}", self.attr.name(), value); } } self.config.lock().await.write(); @@ -170,14 +284,19 @@ impl AsusArmouryAttribute { } pub async fn start_attributes_zbus( - server: &Connection, + conn: &Connection, platform: RogPlatform, config: Arc> ) -> Result<(), RogError> { for attr in FirmwareAttributes::new().attributes() { - AsusArmouryAttribute::new(attr.clone(), platform.clone(), config.clone()) - .start_tasks(server) - .await?; + let mut attr = AsusArmouryAttribute::new(attr.clone(), platform.clone(), config.clone()); + attr.reload().await?; + + let path = dbus_path_for_attr(attr.attr.name()); + let sig = zbus::object_server::SignalEmitter::new(conn, path)?; + attr.watch_and_notify(sig).await?; + + attr.move_to_zbus(conn).await?; } Ok(()) } diff --git a/asusd/src/config.rs b/asusd/src/config.rs index 8814d9f0..3c35ad0a 100644 --- a/asusd/src/config.rs +++ b/asusd/src/config.rs @@ -1,23 +1,20 @@ use std::collections::HashMap; use config_traits::{StdConfig, StdConfigLoad1}; +use rog_platform::asus_armoury::FirmwareAttribute; use rog_platform::cpu::CPUEPP; -use rog_platform::firmware_attributes::FirmwareAttribute; use rog_platform::platform::ThrottlePolicy; use serde::{Deserialize, Serialize}; const CONFIG_FILE: &str = "asusd.ron"; -#[derive(Deserialize, Serialize)] +#[derive(Deserialize, Serialize, PartialEq)] pub struct Config { // The current charge limit applied pub charge_control_end_threshold: u8, /// Save charge limit for restoring #[serde(skip)] pub base_charge_control_end_threshold: u8, - pub panel_od: bool, - pub boot_sound: bool, - pub mini_led_mode: bool, pub disable_nvidia_powerd_on_battery: bool, /// An optional command/script to run when power is changed to AC pub ac_command: String, @@ -40,7 +37,8 @@ pub struct Config { pub throttle_balanced_epp: CPUEPP, /// The energy_performance_preference for this throttle/platform profile pub throttle_performance_epp: CPUEPP, - pub tunings: HashMap>, + pub profile_tunings: HashMap>, + pub armoury_settings: HashMap, /// Temporary state for AC/Batt #[serde(skip)] pub last_power_plugged: u8 @@ -51,9 +49,6 @@ impl Default for Config { Self { charge_control_end_threshold: 100, base_charge_control_end_threshold: 100, - panel_od: false, - boot_sound: false, - mini_led_mode: false, disable_nvidia_powerd_on_battery: true, ac_command: Default::default(), bat_command: Default::default(), @@ -65,7 +60,8 @@ impl Default for Config { throttle_quiet_epp: CPUEPP::Power, throttle_balanced_epp: CPUEPP::BalancePower, throttle_performance_epp: CPUEPP::Performance, - tunings: HashMap::default(), + profile_tunings: HashMap::default(), + armoury_settings: HashMap::default(), last_power_plugged: Default::default() } } @@ -140,12 +136,9 @@ impl From for Config { // Restore the base charge limit charge_control_end_threshold: c.charge_control_end_threshold, base_charge_control_end_threshold: c.charge_control_end_threshold, - panel_od: c.panel_od, - boot_sound: c.boot_sound, disable_nvidia_powerd_on_battery: c.disable_nvidia_powerd_on_battery, ac_command: c.ac_command, bat_command: c.bat_command, - mini_led_mode: c.mini_led_mode, throttle_policy_linked_epp: c.throttle_policy_linked_epp, throttle_policy_on_battery: c.throttle_policy_on_battery, change_throttle_policy_on_battery: c.change_throttle_policy_on_battery, @@ -155,7 +148,8 @@ impl From for Config { throttle_balanced_epp: c.throttle_balanced_epp, throttle_performance_epp: c.throttle_performance_epp, last_power_plugged: c.last_power_plugged, - tunings: HashMap::default() + profile_tunings: HashMap::default(), + armoury_settings: HashMap::default() } } } diff --git a/asusd/src/ctrl_platform.rs b/asusd/src/ctrl_platform.rs index 6aaac7e7..36250b87 100644 --- a/asusd/src/ctrl_platform.rs +++ b/asusd/src/ctrl_platform.rs @@ -1,11 +1,12 @@ use std::path::Path; use std::process::Command; +use std::str::FromStr; use std::sync::Arc; use config_traits::StdConfig; use log::{debug, error, info, warn}; use rog_platform::cpu::{CPUControl, CPUGovernor, CPUEPP}; -use rog_platform::platform::{GpuMode, Properties, RogPlatform, ThrottlePolicy}; +use rog_platform::platform::{Properties, RogPlatform, ThrottlePolicy}; use rog_platform::power::AsusPower; use zbus::export::futures_util::lock::Mutex; use zbus::fdo::Error as FdoErr; @@ -14,7 +15,7 @@ use zbus::{interface, Connection}; use crate::config::Config; use crate::error::RogError; -use crate::{task_watch_item, task_watch_item_notify, CtrlTask, ReloadAndNotify}; +use crate::{task_watch_item, CtrlTask, ReloadAndNotify}; const PLATFORM_ZBUS_PATH: &str = "/xyz/ljones"; @@ -37,28 +38,6 @@ macro_rules! platform_get_value { } } -macro_rules! platform_set_value { - ($self:ident, $property:tt, $prop_name:literal, $new_value:expr) => { - concat_idents::concat_idents!(has = has_, $property { - if $self.platform.has() { - concat_idents::concat_idents!(set = set_, $property { - $self.platform.set($new_value).map_err(|err| { - error!("RogPlatform: {} {err}", $prop_name); - FdoErr::Failed(format!("RogPlatform: {} {err}", $prop_name)) - })?; - }); - let mut lock = $self.config.lock().await; - lock.$property = $new_value; - lock.write(); - Ok(()) - } else { - debug!("RogPlatform: {} not supported", $prop_name); - Err(FdoErr::NotSupported(format!("RogPlatform: {} not supported", $prop_name))) - } - }) - } -} - #[derive(Clone)] pub struct CtrlPlatform { power: AsusPower, @@ -75,12 +54,6 @@ impl CtrlPlatform { ) -> Result { let platform = RogPlatform::new()?; let power = AsusPower::new()?; - - if !platform.has_gpu_mux_mode() { - info!("G-Sync Switchable Graphics or GPU MUX not detected"); - info!("Standard graphics switching will still work."); - } - let config1 = config.clone(); let config_path = config_path.to_owned(); @@ -146,17 +119,6 @@ impl CtrlPlatform { Ok(ret_self) } - fn set_gfx_mode(&self, mode: GpuMode) -> Result<(), RogError> { - self.platform.set_gpu_mux_mode(mode.to_mux_attr())?; - // self.update_initramfs(enable)?; - if mode == GpuMode::Ultimate { - info!("Set system-level graphics mode: Dedicated Nvidia"); - } else { - info!("Set system-level graphics mode: Optimus"); - } - Ok(()) - } - async fn restore_charge_limit(&self) { let limit = self.config.lock().await.base_charge_control_end_threshold; if limit > 0 @@ -315,12 +277,6 @@ impl CtrlPlatform { Properties::ChargeControlEndThreshold ); - platform_name!(dgpu_disable, Properties::DgpuDisable); - platform_name!(gpu_mux_mode, Properties::GpuMuxMode); - platform_name!(boot_sound, Properties::PostAnimationSound); - platform_name!(panel_od, Properties::PanelOd); - platform_name!(mini_led_mode, Properties::MiniLedMode); - platform_name!(egpu_enable, Properties::EgpuEnable); platform_name!(throttle_thermal_policy, Properties::ThrottlePolicy); supported @@ -357,30 +313,6 @@ impl CtrlPlatform { Ok(()) } - #[zbus(property)] - fn gpu_mux_mode(&self) -> Result { - self.platform.get_gpu_mux_mode().map_err(|err| { - warn!("get_gpu_mux_mode {err}"); - FdoErr::NotSupported("RogPlatform: set_gpu_mux_mode not supported".to_owned()) - }) - } - - #[zbus(property)] - async fn set_gpu_mux_mode(&mut self, mode: u8) -> Result<(), FdoErr> { - if self.platform.has_gpu_mux_mode() { - self.set_gfx_mode(mode.into()).map_err(|err| { - warn!("set_gpu_mux_mode {}", err); - FdoErr::Failed(format!("RogPlatform: set_gpu_mux_mode: {err}")) - })?; - self.config.lock().await.write(); - } else { - return Err(FdoErr::NotSupported( - "RogPlatform: set_gpu_mux_mode not supported".to_owned() - )); - } - Ok(()) - } - /// Toggle to next platform_profile. Names provided by `Profiles`. /// If fan-curves are supported will also activate a fan curve for profile. async fn next_throttle_thermal_policy( @@ -549,58 +481,6 @@ impl CtrlPlatform { self.config.lock().await.write(); Ok(()) } - - /// Get the `panel_od` value from platform. Updates the stored value in - /// internal config also. - #[zbus(property)] - fn panel_od(&self) -> Result { - platform_get_value!(self, panel_od, "panel_od") - } - - #[zbus(property)] - async fn set_panel_od(&mut self, overdrive: bool) -> Result<(), FdoErr> { - platform_set_value!(self, panel_od, "panel_od", overdrive)?; - self.config.lock().await.write(); - Ok(()) - } - - /// Get the `boot_sound` value from platform. Updates the stored value in - /// internal config also. - #[zbus(property)] - fn boot_sound(&self) -> Result { - platform_get_value!(self, boot_sound, "boot_sound") - } - - #[zbus(property)] - async fn set_boot_sound(&mut self, on: bool) -> Result<(), FdoErr> { - platform_set_value!(self, boot_sound, "boot_sound", on)?; - self.config.lock().await.write(); - Ok(()) - } - - /// Get the `panel_od` value from platform. Updates the stored value in - /// internal config also. - #[zbus(property)] - fn mini_led_mode(&self) -> Result { - platform_get_value!(self, mini_led_mode, "mini_led_mode") - } - - #[zbus(property)] - async fn set_mini_led_mode(&mut self, on: bool) -> Result<(), FdoErr> { - platform_set_value!(self, mini_led_mode, "mini_led_mode", on)?; - self.config.lock().await.write(); - Ok(()) - } - - #[zbus(property)] - fn dgpu_disable(&self) -> Result { - platform_get_value!(self, dgpu_disable, "dgpu_disable") - } - - #[zbus(property)] - fn egpu_enable(&self) -> Result { - platform_get_value!(self, egpu_enable, "egpu_enable") - } } impl crate::ZbusRun for CtrlPlatform { @@ -619,49 +499,44 @@ impl ReloadAndNotify for CtrlPlatform { data: Self::Data ) -> Result<(), RogError> { let mut config = self.config.lock().await; - info!("asusd.ron updated externally, reloading and updating internal copy"); + if *config != data { + info!("asusd.ron updated externally, reloading and updating internal copy"); - let mut base_charge_control_end_threshold = None; + let mut base_charge_control_end_threshold = None; - if self.power.has_charge_control_end_threshold() { - let limit = data.charge_control_end_threshold; - warn!("setting charge_control_end_threshold to {limit}"); - self.power.set_charge_control_end_threshold(limit)?; - self.charge_control_end_threshold_changed(signal_context) - .await?; - base_charge_control_end_threshold = (config.base_charge_control_end_threshold > 0) - .then_some(config.base_charge_control_end_threshold) - .or(Some(limit)); - } - - if self.platform.has_throttle_thermal_policy() - && config.throttle_policy_linked_epp != data.throttle_policy_linked_epp - { - // TODO: extra stuff - } - - macro_rules! reload_and_notify { - ($property:tt, $prop_name:literal) => { - concat_idents::concat_idents!(has = has_, $property { - if self.platform.has() && config.$property != data.$property { - concat_idents::concat_idents!(set = set_, $property { - self.platform - .set(data.$property)?;}); - concat_idents::concat_idents!(changed = $property, _changed { - self.changed(signal_context).await?;}); - } - }) - } + if self.power.has_charge_control_end_threshold() + && data.charge_control_end_threshold != config.charge_control_end_threshold + { + let limit = data.charge_control_end_threshold; + warn!("setting charge_control_end_threshold to {limit}"); + self.power.set_charge_control_end_threshold(limit)?; + self.charge_control_end_threshold_changed(signal_context) + .await?; + base_charge_control_end_threshold = (config.base_charge_control_end_threshold > 0) + .then_some(config.base_charge_control_end_threshold) + .or(Some(limit)); } - reload_and_notify!(mini_led_mode, "mini_led_mode"); - reload_and_notify!(panel_od, "panel_od"); - reload_and_notify!(boot_sound, "boot_sound"); - // reload_and_notify!(throttle_thermal_policy, "throttle_thermal_policy"); - *config = data; - config.base_charge_control_end_threshold = - base_charge_control_end_threshold.unwrap_or_default(); + if self.platform.has_throttle_thermal_policy() + && config.throttle_policy_linked_epp != data.throttle_policy_linked_epp + { + let profile: ThrottlePolicy = + ThrottlePolicy::from_str(self.platform.get_platform_profile()?.as_str())?; + let epp = match profile { + ThrottlePolicy::Balanced => data.throttle_balanced_epp, + ThrottlePolicy::Performance => data.throttle_performance_epp, + ThrottlePolicy::Quiet => data.throttle_quiet_epp + }; + warn!("setting epp to {epp:?}"); + self.check_and_set_epp(epp, true); + } + // reload_and_notify!(throttle_thermal_policy, "throttle_thermal_policy"); + + *config = data; + config.base_charge_control_end_threshold = + base_charge_control_end_threshold.unwrap_or_default(); + } Ok(()) } } @@ -678,22 +553,6 @@ impl crate::Reloadable for CtrlPlatform { warn!("No charge_control_end_threshold found") } - macro_rules! reload { - ($property:tt, $prop_name:literal) => { - concat_idents::concat_idents!(has = has_, $property { - if self.platform.has() { - concat_idents::concat_idents!(set = set_, $property { - self.platform - .set(self.config.lock().await.$property)?;}); - - } - }) - } - } - reload!(mini_led_mode, "mini_led_mode"); - reload!(panel_od, "panel_od"); - reload!(boot_sound, "boot_sound"); - if let Ok(power_plugged) = self.power.get_online() { self.config.lock().await.last_power_plugged = power_plugged; if self.platform.has_throttle_thermal_policy() { @@ -709,20 +568,7 @@ impl crate::Reloadable for CtrlPlatform { } impl CtrlPlatform { - task_watch_item!(panel_od "panel_od" platform); - - task_watch_item!(mini_led_mode "mini_led_mode" platform); - task_watch_item!(charge_control_end_threshold "charge_control_end_threshold" power); - - task_watch_item_notify!(boot_sound platform); - - task_watch_item_notify!(dgpu_disable platform); - - task_watch_item_notify!(egpu_enable platform); - - // NOTE: see note further below - task_watch_item_notify!(gpu_mux_mode platform); } impl CtrlTask for CtrlPlatform { @@ -738,17 +584,6 @@ impl CtrlTask for CtrlPlatform { move |sleeping| { let platform1 = platform1.clone(); async move { - info!("RogPlatform reloading panel_od"); - if !sleeping && platform1.platform.has_panel_od() { - platform1 - .platform - .set_panel_od(platform1.config.lock().await.panel_od) - .map_err(|err| { - warn!("CtrlCharge: panel_od {}", err); - err - }) - .ok(); - } // This block is commented out due to some kind of issue reported. Maybe the // desktops used were storing a value whcih was then read here. // Don't store it on suspend, assume that the current config setting is desired @@ -788,17 +623,6 @@ impl CtrlTask for CtrlPlatform { async move { info!("RogPlatform reloading panel_od"); let lock = platform2.config.lock().await; - if !shutting_down && platform2.platform.has_panel_od() { - platform2 - .platform - .set_panel_od(lock.panel_od) - .map_err(|err| { - warn!("CtrlCharge: panel_od {}", err); - err - }) - .ok(); - } - if shutting_down && platform2.power.has_charge_control_end_threshold() && lock.base_charge_control_end_threshold > 0 @@ -843,19 +667,9 @@ impl CtrlTask for CtrlPlatform { // This spawns a new task for every item. // TODO: find a better way to manage this - self.watch_panel_od(signal_ctxt.clone()).await?; - self.watch_mini_led_mode(signal_ctxt.clone()).await?; self.watch_charge_control_end_threshold(signal_ctxt.clone()) .await?; - self.watch_dgpu_disable(signal_ctxt.clone()).await?; - self.watch_egpu_enable(signal_ctxt.clone()).await?; - - // NOTE: Can't have this as a watch because on a write to it, it reverts back to - // booted-with value as it does not actually change until reboot. - self.watch_gpu_mux_mode(signal_ctxt.clone()).await?; - self.watch_boot_sound(signal_ctxt.clone()).await?; - let watch_throttle_thermal_policy = self.platform.monitor_throttle_thermal_policy()?; let ctrl = self.clone(); diff --git a/rog-control-center/src/notify.rs b/rog-control-center/src/notify.rs index bc83bda9..ebd37cd9 100644 --- a/rog-control-center/src/notify.rs +++ b/rog-control-center/src/notify.rs @@ -11,7 +11,6 @@ use std::time::Duration; use log::{debug, error, info, warn}; use notify_rust::{Hint, Notification, Timeout, Urgency}; -use rog_dbus::zbus_platform::PlatformProxy; use rog_platform::platform::GpuMode; use rog_platform::power::AsusPower; use serde::{Deserialize, Serialize}; @@ -154,39 +153,41 @@ pub fn start_notifications( }; // GPU MUX Mode notif - let enabled_notifications_copy = config.clone(); - tokio::spawn(async move { - let conn = zbus::Connection::system().await.map_err(|e| { - error!("zbus signal: receive_notify_gpu_mux_mode: {e}"); - e - })?; - let proxy = PlatformProxy::new(&conn).await.map_err(|e| { - error!("zbus signal: receive_notify_gpu_mux_mode: {e}"); - e - })?; + // TODO: need to get armoury attrs and iter to find + // let enabled_notifications_copy = config.clone(); + // tokio::spawn(async move { + // let conn = zbus::Connection::system().await.map_err(|e| { + // error!("zbus signal: receive_notify_gpu_mux_mode: {e}"); + // e + // })?; + // let proxy = PlatformProxy::new(&conn).await.map_err(|e| { + // error!("zbus signal: receive_notify_gpu_mux_mode: {e}"); + // e + // })?; - let mut actual_mux_mode = GpuMode::Error; - if let Ok(mode) = proxy.gpu_mux_mode().await { - actual_mux_mode = GpuMode::from(mode); - } + // let mut actual_mux_mode = GpuMode::Error; + // if let Ok(mode) = proxy.gpu_mux_mode().await { + // actual_mux_mode = GpuMode::from(mode); + // } - info!("Started zbus signal thread: receive_notify_gpu_mux_mode"); - while let Some(e) = proxy.receive_gpu_mux_mode_changed().await.next().await { - if let Ok(config) = enabled_notifications_copy.lock() { - if !config.notifications.enabled || !config.notifications.receive_notify_gfx { - continue; - } - } - if let Ok(out) = e.get().await { - let mode = GpuMode::from(out); - if mode == actual_mux_mode { - continue; - } - do_mux_notification("Reboot required. BIOS GPU MUX mode set to", &mode).ok(); - } - } - Ok::<(), zbus::Error>(()) - }); + // info!("Started zbus signal thread: receive_notify_gpu_mux_mode"); + // while let Some(e) = + // proxy.receive_gpu_mux_mode_changed().await.next().await { if let + // Ok(config) = enabled_notifications_copy.lock() { if + // !config.notifications.enabled || !config.notifications.receive_notify_gfx { + // continue; + // } + // } + // if let Ok(out) = e.get().await { + // let mode = GpuMode::from(out); + // if mode == actual_mux_mode { + // continue; + // } + // do_mux_notification("Reboot required. BIOS GPU MUX mode set to", + // &mode).ok(); } + // } + // Ok::<(), zbus::Error>(()) + // }); let enabled_notifications_copy = config.clone(); // GPU Mode change/action notif diff --git a/rog-control-center/src/ui/mod.rs b/rog-control-center/src/ui/mod.rs index 3531aceb..344c6f45 100644 --- a/rog-control-center/src/ui/mod.rs +++ b/rog-control-center/src/ui/mod.rs @@ -26,7 +26,7 @@ macro_rules! set_ui_callbacks { let handle_copy = $handle.as_weak(); let proxy_copy = $proxy.clone(); let data = $handle.global::<$data>(); - concat_idents::concat_idents!(on_set = on_set_, $proxy_fn { + concat_idents::concat_idents!(on_set = on_cb_, $proxy_fn { data.on_set(move |value| { let proxy_copy = proxy_copy.clone(); let handle_copy = handle_copy.clone(); diff --git a/rog-control-center/src/ui/setup_anime.rs b/rog-control-center/src/ui/setup_anime.rs index 462b2152..e9908a8f 100644 --- a/rog-control-center/src/ui/setup_anime.rs +++ b/rog-control-center/src/ui/setup_anime.rs @@ -39,7 +39,7 @@ pub fn setup_anime_page(ui: &MainWindow, _states: Arc>) { let handle_copy = handle.as_weak(); let anime_copy = anime.clone(); - global.on_set_builtin_animations(move |boot, awake, sleep, shutdown| { + 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 { diff --git a/rog-control-center/src/ui/setup_aura.rs b/rog-control-center/src/ui/setup_aura.rs index b51b4825..05e817f7 100644 --- a/rog-control-center/src/ui/setup_aura.rs +++ b/rog-control-center/src/ui/setup_aura.rs @@ -65,12 +65,12 @@ async fn find_aura_iface() -> Result, Box>) { - ui.global::().on_set_hex_from_colour(|c| { + ui.global::().on_cb_hex_from_colour(|c| { format!("#{:02X}{:02X}{:02X}", c.red(), c.green(), c.blue()).into() }); ui.global::() - .on_set_hex_to_colour(|s| decode_hex(s.as_str()).into()); + .on_cb_hex_to_colour(|s| decode_hex(s.as_str()).into()); let handle = ui.as_weak(); tokio::spawn(async move { @@ -189,7 +189,7 @@ pub fn setup_aura_page(ui: &MainWindow, _states: Arc>) { .upgrade_in_event_loop(|handle| { handle .global::() - .on_set_led_power(move |power| { + .on_cb_led_power(move |power| { let handle_copy = handle_copy.clone(); let proxy_copy = aura.clone(); let power: LaptopAuraPower = power.into(); diff --git a/rog-control-center/src/ui/setup_system.rs b/rog-control-center/src/ui/setup_system.rs index 8c9a406f..4c362563 100644 --- a/rog-control-center/src/ui/setup_system.rs +++ b/rog-control-center/src/ui/setup_system.rs @@ -4,14 +4,14 @@ use concat_idents::concat_idents; use log::error; use rog_dbus::asus_armoury::AsusArmouryProxy; use rog_dbus::zbus_platform::{PlatformProxy, PlatformProxyBlocking}; -use rog_platform::firmware_attributes::FirmwareAttribute; +use rog_platform::asus_armoury::FirmwareAttribute; use rog_platform::platform::Properties; use slint::ComponentHandle; use super::show_toast; use crate::config::Config; use crate::zbus_proxies::find_iface_async; -use crate::{set_ui_props_async, AttrMinMax, MainWindow, SystemPageData}; +use crate::{set_ui_callbacks, set_ui_props_async, AttrMinMax, MainWindow, SystemPageData}; const MINMAX: AttrMinMax = AttrMinMax { min: 0, @@ -35,6 +35,7 @@ pub fn setup_system_page(ui: &MainWindow, _config: Arc>) { ui.global::().set_mini_led_mode(-1); ui.global::().set_ppt_pl1_spl(MINMAX); ui.global::().set_ppt_pl2_sppt(MINMAX); + ui.global::().set_ppt_pl3_fppt(MINMAX); ui.global::().set_ppt_fppt(MINMAX); ui.global::().set_ppt_apu_sppt(MINMAX); ui.global::().set_ppt_platform_sppt(MINMAX); @@ -142,7 +143,6 @@ macro_rules! setup_external { use zbus::export::futures_util::StreamExt; while let Some(e) = x.next().await { if let Ok(out) = e.get().await { - dbg!(out); handle_copy .upgrade_in_event_loop(move |handle| { handle @@ -216,8 +216,8 @@ pub fn setup_system_page_callbacks(ui: &MainWindow, _states: Arc>) SystemPageData, charge_control_end_threshold ); - set_ui_props_async!(handle, platform, SystemPageData, throttle_thermal_policy); + set_ui_props_async!(handle, platform, SystemPageData, throttle_thermal_policy); set_ui_props_async!(handle, platform, SystemPageData, throttle_policy_linked_epp); set_ui_props_async!(handle, platform, SystemPageData, throttle_balanced_epp); set_ui_props_async!(handle, platform, SystemPageData, throttle_performance_epp); @@ -237,6 +237,72 @@ pub fn setup_system_page_callbacks(ui: &MainWindow, _states: Arc>) change_throttle_policy_on_ac ); + handle + .upgrade_in_event_loop(move |handle| { + set_ui_callbacks!(handle, + SystemPageData(as f32), + platform.charge_control_end_threshold(as u8), + "Charge limit successfully set to {}", + "Setting Charge limit failed" + ); + set_ui_callbacks!(handle, + SystemPageData(as i32), + platform.throttle_thermal_policy(.into()), + "Throttle policy set to {}", + "Setting Throttle policy failed" + ); + set_ui_callbacks!(handle, + SystemPageData(as i32), + platform.throttle_balanced_epp(.into()), + "Throttle policy EPP set to {}", + "Setting Throttle policy EPP failed" + ); + set_ui_callbacks!(handle, + SystemPageData(as i32), + platform.throttle_performance_epp(.into()), + "Throttle policy EPP set to {}", + "Setting Throttle policy EPP failed" + ); + set_ui_callbacks!(handle, + SystemPageData(as i32), + platform.throttle_quiet_epp(.into()), + "Throttle policy EPP set to {}", + "Setting Throttle policy EPP failed" + ); + set_ui_callbacks!( + handle, + SystemPageData(), + platform.throttle_policy_linked_epp(), + "Throttle policy linked to EPP: {}", + "Setting Throttle policy linked to EPP failed" + ); + set_ui_callbacks!(handle, + SystemPageData(as i32), + platform.throttle_policy_on_ac(.into()), + "Throttle policy on AC set to {}", + "Setting Throttle policy on AC failed" + ); + set_ui_callbacks!(handle, + SystemPageData(as bool), + platform.change_throttle_policy_on_ac(.into()), + "Throttle policy on AC enabled: {}", + "Setting Throttle policy on AC failed" + ); + set_ui_callbacks!(handle, + SystemPageData(as i32), + platform.throttle_policy_on_battery(.into()), + "Throttle policy on abttery set to {}", + "Setting Throttle policy on battery failed" + ); + set_ui_callbacks!(handle, + SystemPageData(as bool), + platform.change_throttle_policy_on_battery(.into()), + "Throttle policy on battery enabled: {}", + "Setting Throttle policy on AC failed" + ); + }) + .ok(); + let armoury_attrs; if let Ok(attrs) = find_iface_async::("xyz.ljones.AsusArmoury").await { armoury_attrs = attrs; diff --git a/rog-control-center/translations/en/rog-control-center.po b/rog-control-center/translations/en/rog-control-center.po index 218195f6..b7d21d3a 100644 --- a/rog-control-center/translations/en/rog-control-center.po +++ b/rog-control-center/translations/en/rog-control-center.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2025-01-15 09:19+0000\n" +"POT-Creation-Date: 2025-01-15 09:25+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/rog-control-center/ui/pages/about.slint b/rog-control-center/ui/pages/about.slint index 0ab40b1e..fc49c075 100644 --- a/rog-control-center/ui/pages/about.slint +++ b/rog-control-center/ui/pages/about.slint @@ -17,7 +17,7 @@ export component PageAbout inherits VerticalLayout { Text { wrap: TextWrap.word-wrap; - text: "You will require these patches: https://lore.kernel.org/platform-driver-x86/20240404001652.86207-1-luke@ljones.dev/, they have been merged upstream for kernel 6.10. The main thing is that the PPT settings will apply without them, but the read/back will fail"; + text: "You will require a kernel built with my work from here: https://github.com/flukejones/linux"; } Text { @@ -28,19 +28,7 @@ export component PageAbout inherits VerticalLayout { } Text { - text: "- [x] Theme the widgets"; - } - - Text { - text: "- [x] Add a fullscreen mode (cli arg)"; - } - - Text { - text: "- [x] Disable aura items depending if mode supports or not"; - } - - Text { - text: "- [x] Add fan curve graph controls"; + text: "- [ ] Theme the widgets"; } Text { @@ -48,11 +36,15 @@ export component PageAbout inherits VerticalLayout { } Text { - text: "- [ ] Supergfx control"; + text: "- [ ] Include fan speeds, temps in a bottom bar"; } Text { - text: "- [ ] Include fan speeds, temps in a bottom bar"; + text: "- [ ] Slash control"; + } + + Text { + text: "- [ ] Supergfx control"; } Text { diff --git a/rog-control-center/ui/pages/anime.slint b/rog-control-center/ui/pages/anime.slint index fd0b0d02..2ac383a9 100644 --- a/rog-control-center/ui/pages/anime.slint +++ b/rog-control-center/ui/pages/anime.slint @@ -9,17 +9,17 @@ export global AnimePageData { @tr("Anime Brightness" => "High"), ]; in-out property brightness; - callback set_brightness(int); + callback cb_brightness(int); in-out property builtins_enabled; - callback set_builtins_enabled(bool); + callback cb_builtins_enabled(bool); in-out property enable_display; - callback set_enable_display(bool); + callback cb_enable_display(bool); in-out property off_when_lid_closed; - callback set_off_when_lid_closed(bool); + callback cb_off_when_lid_closed(bool); in-out property off_when_suspended; - callback set_off_when_suspended(bool); + callback cb_off_when_suspended(bool); in-out property off_when_unplugged; - callback set_off_when_unplugged(bool); + callback cb_off_when_unplugged(bool); in-out property <[string]> boot_anim_choices: [@tr("Glitch Construction"), @tr("Static Emergence")]; in property boot_anim: 0; in-out property <[string]> awake_anim_choices: [@tr("Binary Banner Scroll"), @tr("Rog Logo Glitch")]; @@ -28,7 +28,7 @@ export global AnimePageData { in property sleep_anim: 0; in-out property <[string]> shutdown_anim_choices: [@tr("Glitch Out"), @tr("See Ya")]; in property shutdown_anim: 0; - callback set_builtin_animations(int, int, int, int); + callback cb_builtin_animations(int, int, int, int); } export component PageAnime inherits Rectangle { @@ -53,7 +53,7 @@ export component PageAnime inherits Rectangle { model <=> AnimePageData.brightness_names; selected => { self.current_value = AnimePageData.brightness_names[AnimePageData.brightness]; - AnimePageData.set_brightness(AnimePageData.brightness) + AnimePageData.cb_brightness(AnimePageData.brightness) } } } @@ -66,7 +66,7 @@ export component PageAnime inherits Rectangle { text: @tr("Enable display"); checked <=> AnimePageData.enable_display; toggled => { - AnimePageData.set_enable_display(AnimePageData.enable_display) + AnimePageData.cb_enable_display(AnimePageData.enable_display) } } @@ -89,7 +89,7 @@ export component PageAnime inherits Rectangle { text: @tr("Use built-in animations"); checked <=> AnimePageData.builtins_enabled; toggled => { - AnimePageData.set_builtins_enabled(AnimePageData.builtins_enabled) + AnimePageData.cb_builtins_enabled(AnimePageData.builtins_enabled) } } @@ -152,7 +152,7 @@ export component PageAnime inherits Rectangle { current_value: AnimePageData.boot_anim_choices[AnimePageData.boot_anim]; model <=> AnimePageData.boot_anim_choices; selected => { - AnimePageData.set_builtin_animations(AnimePageData.boot_anim, AnimePageData.awake_anim, AnimePageData.sleep_anim, AnimePageData.shutdown_anim) + AnimePageData.cb_builtin_animations(AnimePageData.boot_anim, AnimePageData.awake_anim, AnimePageData.sleep_anim, AnimePageData.shutdown_anim) } } @@ -162,7 +162,7 @@ export component PageAnime inherits Rectangle { current_value: AnimePageData.awake_anim_choices[AnimePageData.awake_anim]; model <=> AnimePageData.awake_anim_choices; selected => { - AnimePageData.set_builtin_animations(AnimePageData.boot_anim, AnimePageData.awake_anim, AnimePageData.sleep_anim, AnimePageData.shutdown_anim) + AnimePageData.cb_builtin_animations(AnimePageData.boot_anim, AnimePageData.awake_anim, AnimePageData.sleep_anim, AnimePageData.shutdown_anim) } } @@ -172,7 +172,7 @@ export component PageAnime inherits Rectangle { current_value: AnimePageData.sleep_anim_choices[AnimePageData.sleep_anim]; model <=> AnimePageData.sleep_anim_choices; selected => { - AnimePageData.set_builtin_animations(AnimePageData.boot_anim, AnimePageData.awake_anim, AnimePageData.sleep_anim, AnimePageData.shutdown_anim) + AnimePageData.cb_builtin_animations(AnimePageData.boot_anim, AnimePageData.awake_anim, AnimePageData.sleep_anim, AnimePageData.shutdown_anim) } } @@ -182,7 +182,7 @@ export component PageAnime inherits Rectangle { current_value: AnimePageData.shutdown_anim_choices[AnimePageData.shutdown_anim]; model <=> AnimePageData.shutdown_anim_choices; selected => { - AnimePageData.set_builtin_animations(AnimePageData.boot_anim, AnimePageData.awake_anim, AnimePageData.sleep_anim, AnimePageData.shutdown_anim) + AnimePageData.cb_builtin_animations(AnimePageData.boot_anim, AnimePageData.awake_anim, AnimePageData.sleep_anim, AnimePageData.shutdown_anim) } } } @@ -225,7 +225,7 @@ export component PageAnime inherits Rectangle { text: @tr("Off when lid closed"); checked <=> AnimePageData.off_when_lid_closed; toggled => { - AnimePageData.set_off_when_lid_closed(AnimePageData.off_when_lid_closed) + AnimePageData.cb_off_when_lid_closed(AnimePageData.off_when_lid_closed) } } @@ -234,7 +234,7 @@ export component PageAnime inherits Rectangle { text: @tr("Off when suspended"); checked <=> AnimePageData.off_when_suspended; toggled => { - AnimePageData.set_off_when_suspended(AnimePageData.off_when_suspended) + AnimePageData.cb_off_when_suspended(AnimePageData.off_when_suspended) } } @@ -243,7 +243,7 @@ export component PageAnime inherits Rectangle { text: @tr("Off when on battery"); checked <=> AnimePageData.off_when_unplugged; toggled => { - AnimePageData.set_off_when_unplugged(AnimePageData.off_when_unplugged) + AnimePageData.cb_off_when_unplugged(AnimePageData.off_when_unplugged) } } } diff --git a/rog-control-center/ui/pages/aura.slint b/rog-control-center/ui/pages/aura.slint index 3cedec58..866de1f0 100644 --- a/rog-control-center/ui/pages/aura.slint +++ b/rog-control-center/ui/pages/aura.slint @@ -30,7 +30,7 @@ export component PageAura inherits Rectangle { current_value: AuraPageData.brightness_names[self.current-index]; model <=> AuraPageData.brightness_names; selected => { - AuraPageData.set_brightness(AuraPageData.brightness) + AuraPageData.cb_brightness(AuraPageData.brightness) } } @@ -44,7 +44,7 @@ export component PageAura inherits Rectangle { AuraPageData.led_mode_data.mode = AuraPageData.led_mode; AuraPageData.led_mode_data.mode = AuraPageData.current_available_mode; self.current_value = AuraPageData.available_mode_names[self.current-index]; - AuraPageData.set_led_mode(AuraPageData.current_available_mode); + AuraPageData.cb_led_mode(AuraPageData.current_available_mode); } } } @@ -67,14 +67,14 @@ export component PageAura inherits Rectangle { final_colour <=> AuraPageData.color1; colourbox <=> AuraPageData.colorbox1; set_hex_from_colour(c1) => { - return AuraPageData.set_hex_from_colour(c1); + return AuraPageData.cb_hex_from_colour(c1); } hex_to_colour(s) => { - return AuraPageData.set_hex_to_colour(s); + return AuraPageData.cb_hex_to_colour(s); } released => { AuraPageData.led_mode_data.colour1 = AuraPageData.color1; - AuraPageData.set_led_mode_data(AuraPageData.led_mode_data); + AuraPageData.cb_led_mode_data(AuraPageData.led_mode_data); } } } @@ -93,14 +93,14 @@ export component PageAura inherits Rectangle { final_colour <=> AuraPageData.color2; colourbox <=> AuraPageData.colorbox2; set_hex_from_colour(c1) => { - return AuraPageData.set_hex_from_colour(c1); + return AuraPageData.cb_hex_from_colour(c1); } hex_to_colour(s) => { - return AuraPageData.set_hex_to_colour(s); + return AuraPageData.cb_hex_to_colour(s); } released => { AuraPageData.led_mode_data.colour2 = AuraPageData.color2; - AuraPageData.set_led_mode_data(AuraPageData.led_mode_data); + AuraPageData.cb_led_mode_data(AuraPageData.led_mode_data); } } } @@ -129,7 +129,7 @@ export component PageAura inherits Rectangle { model <=> AuraPageData.zone_names; selected => { AuraPageData.led_mode_data.zone = self.current-index; - AuraPageData.set_led_mode_data(AuraPageData.led_mode_data); + AuraPageData.cb_led_mode_data(AuraPageData.led_mode_data); } } } @@ -151,7 +151,7 @@ export component PageAura inherits Rectangle { model <=> AuraPageData.direction_names; selected => { AuraPageData.led_mode_data.direction = self.current-index; - AuraPageData.set_led_mode_data(AuraPageData.led_mode_data); + AuraPageData.cb_led_mode_data(AuraPageData.led_mode_data); } } } @@ -173,7 +173,7 @@ export component PageAura inherits Rectangle { model <=> AuraPageData.speed_names; selected => { AuraPageData.led_mode_data.speed = self.current-index; - AuraPageData.set_led_mode_data(AuraPageData.led_mode_data); + AuraPageData.cb_led_mode_data(AuraPageData.led_mode_data); } } } @@ -218,22 +218,22 @@ export component PageAura inherits Rectangle { boot_checked: state.boot; boot_toggled => { AuraPageData.led_power.states[idx].boot = zone.boot_checked; - AuraPageData.set_led_power(AuraPageData.led_power); + AuraPageData.cb_led_power(AuraPageData.led_power); } awake_checked: state.awake; awake_toggled => { AuraPageData.led_power.states[idx].awake = zone.awake_checked; - AuraPageData.set_led_power(AuraPageData.led_power); + AuraPageData.cb_led_power(AuraPageData.led_power); } sleep_checked: state.sleep; sleep_toggled => { AuraPageData.led_power.states[idx].sleep = zone.sleep_checked; - AuraPageData.set_led_power(AuraPageData.led_power); + AuraPageData.cb_led_power(AuraPageData.led_power); } shutdown_checked: state.shutdown; shutdown_toggled => { AuraPageData.led_power.states[idx].shutdown = zone.shutdown_checked; - AuraPageData.set_led_power(AuraPageData.led_power); + AuraPageData.cb_led_power(AuraPageData.led_power); } } } @@ -271,22 +271,22 @@ export component PageAura inherits Rectangle { zone_strings <=> AuraPageData.power_zone_names_old; selected_zone => { AuraPageData.led_power.states[idx].zone = AuraPageData.supported_power_zones[old_zone.current_zone]; - AuraPageData.set_led_power(AuraPageData.led_power); + AuraPageData.cb_led_power(AuraPageData.led_power); } boot_checked: state.boot; boot_toggled => { AuraPageData.led_power.states[idx].boot = old_zone.boot_checked; - AuraPageData.set_led_power(AuraPageData.led_power); + AuraPageData.cb_led_power(AuraPageData.led_power); } awake_checked: state.awake; awake_toggled => { AuraPageData.led_power.states[idx].awake = old_zone.awake_checked; - AuraPageData.set_led_power(AuraPageData.led_power); + AuraPageData.cb_led_power(AuraPageData.led_power); } sleep_checked: state.sleep; sleep_toggled => { AuraPageData.led_power.states[idx].sleep = old_zone.sleep_checked; - AuraPageData.set_led_power(AuraPageData.led_power); + AuraPageData.cb_led_power(AuraPageData.led_power); } } } diff --git a/rog-control-center/ui/pages/system.slint b/rog-control-center/ui/pages/system.slint index b200310a..7ad8e91d 100644 --- a/rog-control-center/ui/pages/system.slint +++ b/rog-control-center/ui/pages/system.slint @@ -219,6 +219,14 @@ export component PageSystem inherits Rectangle { } } + if SystemPageData.ppt_pl1_spl.val != -1: Rectangle { + height: 32px; + Text { + font-size: 16px; + text: @tr("ppt_warning" => "The following settings may not be safe, please take care."); + } + } + if SystemPageData.ppt_pl1_spl.val != -1: SystemSlider { text: @tr("ppt_pl1_spl" => "PL1, sustained power limit"); minimum: SystemPageData.ppt_pl1_spl.min; @@ -247,8 +255,8 @@ export component PageSystem inherits Rectangle { maximum: SystemPageData.ppt_pl3_fppt.max; value: SystemPageData.ppt_pl3_fppt.val; released => { - SystemPageData.ppt_fppt.val = self.value; - SystemPageData.cb_ppt_fppt(Math.round(self.value)) + SystemPageData.ppt_pl3_fppt.val = self.value; + SystemPageData.cb_ppt_pl3_fppt(Math.round(self.value)) } } if SystemPageData.ppt_fppt.val != -1: SystemSlider { diff --git a/rog-control-center/ui/types/aura_types.slint b/rog-control-center/ui/types/aura_types.slint index 44954f7c..78df8330 100644 --- a/rog-control-center/ui/types/aura_types.slint +++ b/rog-control-center/ui/types/aura_types.slint @@ -71,7 +71,7 @@ export global AuraPageData { @tr("Aura brightness" => "High"), ]; in-out property brightness; - callback set_brightness(int); + callback cb_brightness(int); in-out property <[string]> mode_names: [ @tr("Basic aura mode" => "Static"), @tr("Basic aura mode" => "Breathe"), @@ -95,7 +95,7 @@ export global AuraPageData { in-out property current_available_mode: 0; in-out property <[int]> supported_basic_modes: [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12]; in-out property led_mode; - callback set_led_mode(int); + callback cb_led_mode(int); in-out property <[string]> zone_names: [ @tr("Aura zone" => "None"), @tr("Aura zone" => "Key1"), @@ -130,7 +130,7 @@ export global AuraPageData { speed: 0, direction: 0, }; - callback set_led_mode_data(AuraEffect); + callback cb_led_mode_data(AuraEffect); in-out property color1; in-out property colorbox1; in-out property color2; @@ -147,8 +147,8 @@ export global AuraPageData { colorbox1 = data.colour1; colorbox2 = data.colour2; } - callback set_hex_from_colour(color) -> string; - callback set_hex_to_colour(string) -> color; + callback cb_hex_from_colour(color) -> string; + callback cb_hex_to_colour(string) -> color; in-out property device_type: AuraDevType.Old; // List of indexes to power_zone_names. Must correspond to rog-aura crate in-out property <[PowerZones]> supported_power_zones: [ @@ -165,5 +165,5 @@ export global AuraPageData { shutdown: true, }] }; - callback set_led_power(LaptopAuraPower); + callback cb_led_power(LaptopAuraPower); } diff --git a/rog-dbus/src/asus_armoury.rs b/rog-dbus/src/asus_armoury.rs index b46a28b5..5d5b89fd 100644 --- a/rog-dbus/src/asus_armoury.rs +++ b/rog-dbus/src/asus_armoury.rs @@ -2,7 +2,7 @@ //! //! `zbus-xmlgen system xyz.ljones.Asusd //! /xyz/ljones/asus_armoury/nv_temp_target` -use rog_platform::firmware_attributes::FirmwareAttribute; +use rog_platform::asus_armoury::FirmwareAttribute; use zbus::proxy; #[proxy( interface = "xyz.ljones.AsusArmoury", diff --git a/rog-dbus/src/zbus_platform.rs b/rog-dbus/src/zbus_platform.rs index 087c0f3d..4b8a964d 100644 --- a/rog-dbus/src/zbus_platform.rs +++ b/rog-dbus/src/zbus_platform.rs @@ -21,7 +21,7 @@ //! …consequently `zbus-xmlgen` did not generate code for the above interfaces. use rog_platform::cpu::CPUEPP; -use rog_platform::platform::{GpuMode, Properties, ThrottlePolicy}; +use rog_platform::platform::{Properties, ThrottlePolicy}; use zbus::proxy; #[proxy( @@ -48,80 +48,6 @@ pub trait Platform { // Toggle one-shot charge to 100% fn one_shot_full_charge(&self) -> zbus::Result<()>; - /// DgpuDisable property - #[zbus(property)] - fn dgpu_disable(&self) -> zbus::Result; - - /// EgpuEnable property - #[zbus(property)] - fn egpu_enable(&self) -> zbus::Result; - - /// GpuMuxMode property - #[zbus(property)] - fn gpu_mux_mode(&self) -> zbus::Result; - #[zbus(property)] - fn set_gpu_mux_mode(&self, value: GpuMode) -> zbus::Result<()>; - - /// MiniLedMode property - #[zbus(property)] - fn mini_led_mode(&self) -> zbus::Result; - #[zbus(property)] - fn set_mini_led_mode(&self, value: bool) -> zbus::Result<()>; - - /// NvDynamicBoost property - #[zbus(property)] - fn nv_dynamic_boost(&self) -> zbus::Result; - #[zbus(property)] - fn set_nv_dynamic_boost(&self, value: u8) -> zbus::Result<()>; - - /// NvTempTarget property - #[zbus(property)] - fn nv_temp_target(&self) -> zbus::Result; - #[zbus(property)] - fn set_nv_temp_target(&self, value: u8) -> zbus::Result<()>; - - /// PanelOd property - #[zbus(property)] - fn panel_od(&self) -> zbus::Result; - #[zbus(property)] - fn set_panel_od(&self, value: bool) -> zbus::Result<()>; - - /// PostAnimationSound property - #[zbus(property)] - fn boot_sound(&self) -> zbus::Result; - #[zbus(property)] - fn set_boot_sound(&self, value: bool) -> zbus::Result<()>; - - /// PptApuSppt property - #[zbus(property)] - fn ppt_apu_sppt(&self) -> zbus::Result; - #[zbus(property)] - fn set_ppt_apu_sppt(&self, value: u8) -> zbus::Result<()>; - - /// PptFppt property - #[zbus(property)] - fn ppt_fppt(&self) -> zbus::Result; - #[zbus(property)] - fn set_ppt_fppt(&self, value: u8) -> zbus::Result<()>; - - /// PptPl1Spl property - #[zbus(property)] - fn ppt_pl1_spl(&self) -> zbus::Result; - #[zbus(property)] - fn set_ppt_pl1_spl(&self, value: u8) -> zbus::Result<()>; - - /// PptPl2Sppt property - #[zbus(property)] - fn ppt_pl2_sppt(&self) -> zbus::Result; - #[zbus(property)] - fn set_ppt_pl2_sppt(&self, value: u8) -> zbus::Result<()>; - - /// PptPlatformSppt property - #[zbus(property)] - fn ppt_platform_sppt(&self) -> zbus::Result; - #[zbus(property)] - fn set_ppt_platform_sppt(&self, value: u8) -> zbus::Result<()>; - /// ThrottleBalancedEpp property #[zbus(property)] fn throttle_balanced_epp(&self) -> zbus::Result; diff --git a/rog-platform/src/firmware_attributes.rs b/rog-platform/src/asus_armoury.rs similarity index 94% rename from rog-platform/src/firmware_attributes.rs rename to rog-platform/src/asus_armoury.rs index 27d619cf..61ab3203 100644 --- a/rog-platform/src/firmware_attributes.rs +++ b/rog-platform/src/asus_armoury.rs @@ -157,6 +157,25 @@ impl Attribute { default_value, possible_values, min_value, max_value, scalar_increment ) } + + pub fn get_watcher(&self) -> Result { + let path = self.base_path.join("current_value"); + if let Some(path) = path.to_str() { + let inotify = inotify::Inotify::init()?; + inotify + .watches() + .add(path, inotify::WatchMask::MODIFY) + .map_err(|e| { + if e.kind() == std::io::ErrorKind::NotFound { + PlatformError::AttrNotFound(self.name().to_string()) + } else { + PlatformError::IoPath(path.to_string(), e) + } + })?; + return Ok(inotify); + } + Err(PlatformError::AttrNotFound(self.name().to_string())) + } } pub struct FirmwareAttributes { diff --git a/rog-platform/src/lib.rs b/rog-platform/src/lib.rs index 380573b6..bcea4612 100644 --- a/rog-platform/src/lib.rs +++ b/rog-platform/src/lib.rs @@ -1,9 +1,9 @@ //! This crate functions as a wrapper of all the relevant ASUS functionality //! on ROG, Strix, and TUF laptops. +pub mod asus_armoury; pub mod cpu; pub mod error; -pub mod firmware_attributes; pub mod hid_raw; pub mod keyboard_led; pub(crate) mod macros; diff --git a/rog-platform/src/platform.rs b/rog-platform/src/platform.rs index 7a63dcb7..eab4874b 100644 --- a/rog-platform/src/platform.rs +++ b/rog-platform/src/platform.rs @@ -7,7 +7,7 @@ use serde::{Deserialize, Serialize}; use zbus::zvariant::{OwnedValue, Type, Value}; use crate::error::{PlatformError, Result}; -use crate::{attr_bool, attr_string, attr_u8, to_device}; +use crate::{attr_string, attr_u8, to_device}; /// The "platform" device provides access to things like: /// - `dgpu_disable` @@ -24,16 +24,6 @@ pub struct RogPlatform { } impl RogPlatform { - attr_bool!("dgpu_disable", path); - - attr_bool!("egpu_enable", path); - - attr_u8!("gpu_mux_mode", path); - - attr_bool!("panel_od", path); - - attr_bool!("mini_led_mode", path); - attr_u8!( /// This is technically the same as `platform_profile` since both are /// tied in-kernel @@ -47,12 +37,6 @@ impl RogPlatform { pp_path ); - attr_bool!( - /// Control the POST animation "FWOOoosh" sound - "boot_sound", - path - ); - pub fn new() -> Result { let mut enumerator = udev::Enumerator::new().map_err(|err| { warn!("{}", err);