mirror of
https://gitlab.com/asus-linux/asusctl.git
synced 2026-01-22 17:33:19 +01:00
Cleanup unsafe sysfs interfaces. Bugfixes for UI
This commit is contained in:
@@ -2,6 +2,11 @@
|
|||||||
|
|
||||||
## [Unreleased]
|
## [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]
|
## [v6.1.0-rc3]
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|||||||
@@ -49,8 +49,6 @@ pub enum CliCommand {
|
|||||||
Slash(SlashCommand),
|
Slash(SlashCommand),
|
||||||
#[options(name = "scsi", help = "Manage SCSI external drive")]
|
#[options(name = "scsi", help = "Manage SCSI external drive")]
|
||||||
Scsi(ScsiCommand),
|
Scsi(ScsiCommand),
|
||||||
#[options(help = "Change bios settings")]
|
|
||||||
PlatformOld(PlatformCommand),
|
|
||||||
#[options(
|
#[options(
|
||||||
help = "Change platform settings. This is a new interface exposed by the asus-armoury \
|
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"
|
driver, some of the settings will be the same as the older platform interface"
|
||||||
@@ -94,39 +92,6 @@ pub struct GraphicsCommand {
|
|||||||
pub help: bool
|
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 <true/false>"
|
|
||||||
)]
|
|
||||||
pub post_sound_set: Option<bool>,
|
|
||||||
#[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<u8>,
|
|
||||||
#[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 <true/false>"
|
|
||||||
)]
|
|
||||||
pub panel_overdrive_set: Option<bool>,
|
|
||||||
#[options(no_long, short = "o", help = "get panel overdrive")]
|
|
||||||
pub panel_overdrive_get: bool
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Options, Debug)]
|
#[derive(Options, Debug)]
|
||||||
pub struct ArmouryCommand {
|
pub struct ArmouryCommand {
|
||||||
#[options(help = "print help message")]
|
#[options(help = "print help message")]
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ use rog_dbus::zbus_aura::AuraProxyBlocking;
|
|||||||
use rog_dbus::zbus_fan_curves::FanCurvesProxyBlocking;
|
use rog_dbus::zbus_fan_curves::FanCurvesProxyBlocking;
|
||||||
use rog_dbus::zbus_platform::PlatformProxyBlocking;
|
use rog_dbus::zbus_platform::PlatformProxyBlocking;
|
||||||
use rog_dbus::zbus_slash::SlashProxyBlocking;
|
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_profiles::error::ProfileError;
|
||||||
use rog_scsi::AuraMode;
|
use rog_scsi::AuraMode;
|
||||||
use rog_slash::SlashMode;
|
use rog_slash::SlashMode;
|
||||||
@@ -186,9 +186,6 @@ fn do_parsed(
|
|||||||
Some(CliCommand::Anime(cmd)) => handle_anime(cmd)?,
|
Some(CliCommand::Anime(cmd)) => handle_anime(cmd)?,
|
||||||
Some(CliCommand::Slash(cmd)) => handle_slash(cmd)?,
|
Some(CliCommand::Slash(cmd)) => handle_slash(cmd)?,
|
||||||
Some(CliCommand::Scsi(cmd)) => handle_scsi(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)?,
|
Some(CliCommand::Armoury(cmd)) => handle_armoury_command(cmd)?,
|
||||||
None => {
|
None => {
|
||||||
if (!parsed.show_supported
|
if (!parsed.show_supported
|
||||||
@@ -1007,70 +1004,6 @@ fn handle_fan_curve(
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_platform_properties(
|
|
||||||
conn: &Connection,
|
|
||||||
supported: &[Properties],
|
|
||||||
cmd: &PlatformCommand
|
|
||||||
) -> Result<(), Box<dyn std::error::Error>> {
|
|
||||||
{
|
|
||||||
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<String> = 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 {
|
fn check_systemd_unit_active(name: &str) -> bool {
|
||||||
if let Ok(out) = Command::new("systemctl")
|
if let Ok(out) = Command::new("systemctl")
|
||||||
.arg("is-active")
|
.arg("is-active")
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use ::zbus::export::futures_util::lock::Mutex;
|
use ::zbus::export::futures_util::lock::Mutex;
|
||||||
use config_traits::StdConfig;
|
use config_traits::StdConfig;
|
||||||
use log::error;
|
use log::{debug, error, info};
|
||||||
use rog_platform::firmware_attributes::{
|
use rog_platform::asus_armoury::{AttrValue, Attribute, FirmwareAttribute, FirmwareAttributes};
|
||||||
AttrValue, Attribute, FirmwareAttribute, FirmwareAttributes
|
|
||||||
};
|
|
||||||
use rog_platform::platform::{RogPlatform, ThrottlePolicy};
|
use rog_platform::platform::{RogPlatform, ThrottlePolicy};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
use zbus::object_server::SignalEmitter;
|
||||||
use zbus::zvariant::{ObjectPath, OwnedObjectPath, OwnedValue, Type, Value};
|
use zbus::zvariant::{ObjectPath, OwnedObjectPath, OwnedValue, Type, Value};
|
||||||
use zbus::{fdo, interface, Connection};
|
use zbus::{fdo, interface, Connection};
|
||||||
|
|
||||||
use crate::config::Config;
|
use crate::config::Config;
|
||||||
use crate::error::RogError;
|
use crate::error::RogError;
|
||||||
use crate::ASUS_ZBUS_PATH;
|
use crate::{Reloadable, ASUS_ZBUS_PATH};
|
||||||
|
|
||||||
const MOD_NAME: &str = "asus_armoury";
|
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()
|
ObjectPath::from_str_unchecked(&format!("{ASUS_ZBUS_PATH}/{MOD_NAME}/{attr_name}")).into()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
pub struct AsusArmouryAttribute {
|
pub struct AsusArmouryAttribute {
|
||||||
attr: Attribute,
|
attr: Attribute,
|
||||||
config: Arc<Mutex<Config>>,
|
config: Arc<Mutex<Config>>,
|
||||||
@@ -44,10 +45,7 @@ impl AsusArmouryAttribute {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn start_tasks(self, connection: &Connection) -> Result<(), RogError> {
|
pub async fn move_to_zbus(self, connection: &Connection) -> Result<(), RogError> {
|
||||||
// self.reload()
|
|
||||||
// .await
|
|
||||||
// .unwrap_or_else(|err| warn!("Controller error: {}", err));
|
|
||||||
let path = dbus_path_for_attr(self.attr.name());
|
let path = dbus_path_for_attr(self.attr.name());
|
||||||
connection
|
connection
|
||||||
.object_server()
|
.object_server()
|
||||||
@@ -57,6 +55,60 @@ impl AsusArmouryAttribute {
|
|||||||
.ok();
|
.ok();
|
||||||
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
|
/// 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:?}");
|
error!("Could not set value: {e:?}");
|
||||||
e
|
e
|
||||||
})?;
|
})?;
|
||||||
let profile: ThrottlePolicy =
|
|
||||||
ThrottlePolicy::from_str(self.platform.get_platform_profile()?.as_str())?;
|
if matches!(
|
||||||
if let Some(tunings) = self.config.lock().await.tunings.get_mut(&profile) {
|
self.name(),
|
||||||
if let Some(tune) = tunings.get_mut(&self.name()) {
|
FirmwareAttribute::PptPl1Spl
|
||||||
*tune = value;
|
| 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();
|
self.config.lock().await.write();
|
||||||
@@ -170,14 +284,19 @@ impl AsusArmouryAttribute {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn start_attributes_zbus(
|
pub async fn start_attributes_zbus(
|
||||||
server: &Connection,
|
conn: &Connection,
|
||||||
platform: RogPlatform,
|
platform: RogPlatform,
|
||||||
config: Arc<Mutex<Config>>
|
config: Arc<Mutex<Config>>
|
||||||
) -> Result<(), RogError> {
|
) -> Result<(), RogError> {
|
||||||
for attr in FirmwareAttributes::new().attributes() {
|
for attr in FirmwareAttributes::new().attributes() {
|
||||||
AsusArmouryAttribute::new(attr.clone(), platform.clone(), config.clone())
|
let mut attr = AsusArmouryAttribute::new(attr.clone(), platform.clone(), config.clone());
|
||||||
.start_tasks(server)
|
attr.reload().await?;
|
||||||
.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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,23 +1,20 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use config_traits::{StdConfig, StdConfigLoad1};
|
use config_traits::{StdConfig, StdConfigLoad1};
|
||||||
|
use rog_platform::asus_armoury::FirmwareAttribute;
|
||||||
use rog_platform::cpu::CPUEPP;
|
use rog_platform::cpu::CPUEPP;
|
||||||
use rog_platform::firmware_attributes::FirmwareAttribute;
|
|
||||||
use rog_platform::platform::ThrottlePolicy;
|
use rog_platform::platform::ThrottlePolicy;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
const CONFIG_FILE: &str = "asusd.ron";
|
const CONFIG_FILE: &str = "asusd.ron";
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize)]
|
#[derive(Deserialize, Serialize, PartialEq)]
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
// The current charge limit applied
|
// The current charge limit applied
|
||||||
pub charge_control_end_threshold: u8,
|
pub charge_control_end_threshold: u8,
|
||||||
/// Save charge limit for restoring
|
/// Save charge limit for restoring
|
||||||
#[serde(skip)]
|
#[serde(skip)]
|
||||||
pub base_charge_control_end_threshold: u8,
|
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,
|
pub disable_nvidia_powerd_on_battery: bool,
|
||||||
/// An optional command/script to run when power is changed to AC
|
/// An optional command/script to run when power is changed to AC
|
||||||
pub ac_command: String,
|
pub ac_command: String,
|
||||||
@@ -40,7 +37,8 @@ pub struct Config {
|
|||||||
pub throttle_balanced_epp: CPUEPP,
|
pub throttle_balanced_epp: CPUEPP,
|
||||||
/// The energy_performance_preference for this throttle/platform profile
|
/// The energy_performance_preference for this throttle/platform profile
|
||||||
pub throttle_performance_epp: CPUEPP,
|
pub throttle_performance_epp: CPUEPP,
|
||||||
pub tunings: HashMap<ThrottlePolicy, HashMap<FirmwareAttribute, i32>>,
|
pub profile_tunings: HashMap<ThrottlePolicy, HashMap<FirmwareAttribute, i32>>,
|
||||||
|
pub armoury_settings: HashMap<FirmwareAttribute, i32>,
|
||||||
/// Temporary state for AC/Batt
|
/// Temporary state for AC/Batt
|
||||||
#[serde(skip)]
|
#[serde(skip)]
|
||||||
pub last_power_plugged: u8
|
pub last_power_plugged: u8
|
||||||
@@ -51,9 +49,6 @@ impl Default for Config {
|
|||||||
Self {
|
Self {
|
||||||
charge_control_end_threshold: 100,
|
charge_control_end_threshold: 100,
|
||||||
base_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,
|
disable_nvidia_powerd_on_battery: true,
|
||||||
ac_command: Default::default(),
|
ac_command: Default::default(),
|
||||||
bat_command: Default::default(),
|
bat_command: Default::default(),
|
||||||
@@ -65,7 +60,8 @@ impl Default for Config {
|
|||||||
throttle_quiet_epp: CPUEPP::Power,
|
throttle_quiet_epp: CPUEPP::Power,
|
||||||
throttle_balanced_epp: CPUEPP::BalancePower,
|
throttle_balanced_epp: CPUEPP::BalancePower,
|
||||||
throttle_performance_epp: CPUEPP::Performance,
|
throttle_performance_epp: CPUEPP::Performance,
|
||||||
tunings: HashMap::default(),
|
profile_tunings: HashMap::default(),
|
||||||
|
armoury_settings: HashMap::default(),
|
||||||
last_power_plugged: Default::default()
|
last_power_plugged: Default::default()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -140,12 +136,9 @@ impl From<Config601> for Config {
|
|||||||
// Restore the base charge limit
|
// Restore the base charge limit
|
||||||
charge_control_end_threshold: c.charge_control_end_threshold,
|
charge_control_end_threshold: c.charge_control_end_threshold,
|
||||||
base_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,
|
disable_nvidia_powerd_on_battery: c.disable_nvidia_powerd_on_battery,
|
||||||
ac_command: c.ac_command,
|
ac_command: c.ac_command,
|
||||||
bat_command: c.bat_command,
|
bat_command: c.bat_command,
|
||||||
mini_led_mode: c.mini_led_mode,
|
|
||||||
throttle_policy_linked_epp: c.throttle_policy_linked_epp,
|
throttle_policy_linked_epp: c.throttle_policy_linked_epp,
|
||||||
throttle_policy_on_battery: c.throttle_policy_on_battery,
|
throttle_policy_on_battery: c.throttle_policy_on_battery,
|
||||||
change_throttle_policy_on_battery: c.change_throttle_policy_on_battery,
|
change_throttle_policy_on_battery: c.change_throttle_policy_on_battery,
|
||||||
@@ -155,7 +148,8 @@ impl From<Config601> for Config {
|
|||||||
throttle_balanced_epp: c.throttle_balanced_epp,
|
throttle_balanced_epp: c.throttle_balanced_epp,
|
||||||
throttle_performance_epp: c.throttle_performance_epp,
|
throttle_performance_epp: c.throttle_performance_epp,
|
||||||
last_power_plugged: c.last_power_plugged,
|
last_power_plugged: c.last_power_plugged,
|
||||||
tunings: HashMap::default()
|
profile_tunings: HashMap::default(),
|
||||||
|
armoury_settings: HashMap::default()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
|
use std::str::FromStr;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use config_traits::StdConfig;
|
use config_traits::StdConfig;
|
||||||
use log::{debug, error, info, warn};
|
use log::{debug, error, info, warn};
|
||||||
use rog_platform::cpu::{CPUControl, CPUGovernor, CPUEPP};
|
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 rog_platform::power::AsusPower;
|
||||||
use zbus::export::futures_util::lock::Mutex;
|
use zbus::export::futures_util::lock::Mutex;
|
||||||
use zbus::fdo::Error as FdoErr;
|
use zbus::fdo::Error as FdoErr;
|
||||||
@@ -14,7 +15,7 @@ use zbus::{interface, Connection};
|
|||||||
|
|
||||||
use crate::config::Config;
|
use crate::config::Config;
|
||||||
use crate::error::RogError;
|
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";
|
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)]
|
#[derive(Clone)]
|
||||||
pub struct CtrlPlatform {
|
pub struct CtrlPlatform {
|
||||||
power: AsusPower,
|
power: AsusPower,
|
||||||
@@ -75,12 +54,6 @@ impl CtrlPlatform {
|
|||||||
) -> Result<Self, RogError> {
|
) -> Result<Self, RogError> {
|
||||||
let platform = RogPlatform::new()?;
|
let platform = RogPlatform::new()?;
|
||||||
let power = AsusPower::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 config1 = config.clone();
|
||||||
let config_path = config_path.to_owned();
|
let config_path = config_path.to_owned();
|
||||||
|
|
||||||
@@ -146,17 +119,6 @@ impl CtrlPlatform {
|
|||||||
Ok(ret_self)
|
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) {
|
async fn restore_charge_limit(&self) {
|
||||||
let limit = self.config.lock().await.base_charge_control_end_threshold;
|
let limit = self.config.lock().await.base_charge_control_end_threshold;
|
||||||
if limit > 0
|
if limit > 0
|
||||||
@@ -315,12 +277,6 @@ impl CtrlPlatform {
|
|||||||
Properties::ChargeControlEndThreshold
|
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);
|
platform_name!(throttle_thermal_policy, Properties::ThrottlePolicy);
|
||||||
|
|
||||||
supported
|
supported
|
||||||
@@ -357,30 +313,6 @@ impl CtrlPlatform {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[zbus(property)]
|
|
||||||
fn gpu_mux_mode(&self) -> Result<u8, FdoErr> {
|
|
||||||
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`.
|
/// Toggle to next platform_profile. Names provided by `Profiles`.
|
||||||
/// If fan-curves are supported will also activate a fan curve for profile.
|
/// If fan-curves are supported will also activate a fan curve for profile.
|
||||||
async fn next_throttle_thermal_policy(
|
async fn next_throttle_thermal_policy(
|
||||||
@@ -549,58 +481,6 @@ impl CtrlPlatform {
|
|||||||
self.config.lock().await.write();
|
self.config.lock().await.write();
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the `panel_od` value from platform. Updates the stored value in
|
|
||||||
/// internal config also.
|
|
||||||
#[zbus(property)]
|
|
||||||
fn panel_od(&self) -> Result<bool, FdoErr> {
|
|
||||||
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<bool, FdoErr> {
|
|
||||||
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<bool, FdoErr> {
|
|
||||||
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<bool, FdoErr> {
|
|
||||||
platform_get_value!(self, dgpu_disable, "dgpu_disable")
|
|
||||||
}
|
|
||||||
|
|
||||||
#[zbus(property)]
|
|
||||||
fn egpu_enable(&self) -> Result<bool, FdoErr> {
|
|
||||||
platform_get_value!(self, egpu_enable, "egpu_enable")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl crate::ZbusRun for CtrlPlatform {
|
impl crate::ZbusRun for CtrlPlatform {
|
||||||
@@ -619,49 +499,44 @@ impl ReloadAndNotify for CtrlPlatform {
|
|||||||
data: Self::Data
|
data: Self::Data
|
||||||
) -> Result<(), RogError> {
|
) -> Result<(), RogError> {
|
||||||
let mut config = self.config.lock().await;
|
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() {
|
if self.power.has_charge_control_end_threshold()
|
||||||
let limit = data.charge_control_end_threshold;
|
&& data.charge_control_end_threshold != config.charge_control_end_threshold
|
||||||
warn!("setting charge_control_end_threshold to {limit}");
|
{
|
||||||
self.power.set_charge_control_end_threshold(limit)?;
|
let limit = data.charge_control_end_threshold;
|
||||||
self.charge_control_end_threshold_changed(signal_context)
|
warn!("setting charge_control_end_threshold to {limit}");
|
||||||
.await?;
|
self.power.set_charge_control_end_threshold(limit)?;
|
||||||
base_charge_control_end_threshold = (config.base_charge_control_end_threshold > 0)
|
self.charge_control_end_threshold_changed(signal_context)
|
||||||
.then_some(config.base_charge_control_end_threshold)
|
.await?;
|
||||||
.or(Some(limit));
|
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?;});
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
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;
|
if self.platform.has_throttle_thermal_policy()
|
||||||
config.base_charge_control_end_threshold =
|
&& config.throttle_policy_linked_epp != data.throttle_policy_linked_epp
|
||||||
base_charge_control_end_threshold.unwrap_or_default();
|
{
|
||||||
|
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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -678,22 +553,6 @@ impl crate::Reloadable for CtrlPlatform {
|
|||||||
warn!("No charge_control_end_threshold found")
|
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() {
|
if let Ok(power_plugged) = self.power.get_online() {
|
||||||
self.config.lock().await.last_power_plugged = power_plugged;
|
self.config.lock().await.last_power_plugged = power_plugged;
|
||||||
if self.platform.has_throttle_thermal_policy() {
|
if self.platform.has_throttle_thermal_policy() {
|
||||||
@@ -709,20 +568,7 @@ impl crate::Reloadable for CtrlPlatform {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl 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!(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 {
|
impl CtrlTask for CtrlPlatform {
|
||||||
@@ -738,17 +584,6 @@ impl CtrlTask for CtrlPlatform {
|
|||||||
move |sleeping| {
|
move |sleeping| {
|
||||||
let platform1 = platform1.clone();
|
let platform1 = platform1.clone();
|
||||||
async move {
|
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
|
// 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.
|
// 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
|
// Don't store it on suspend, assume that the current config setting is desired
|
||||||
@@ -788,17 +623,6 @@ impl CtrlTask for CtrlPlatform {
|
|||||||
async move {
|
async move {
|
||||||
info!("RogPlatform reloading panel_od");
|
info!("RogPlatform reloading panel_od");
|
||||||
let lock = platform2.config.lock().await;
|
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
|
if shutting_down
|
||||||
&& platform2.power.has_charge_control_end_threshold()
|
&& platform2.power.has_charge_control_end_threshold()
|
||||||
&& lock.base_charge_control_end_threshold > 0
|
&& lock.base_charge_control_end_threshold > 0
|
||||||
@@ -843,19 +667,9 @@ impl CtrlTask for CtrlPlatform {
|
|||||||
|
|
||||||
// This spawns a new task for every item.
|
// This spawns a new task for every item.
|
||||||
// TODO: find a better way to manage this
|
// 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())
|
self.watch_charge_control_end_threshold(signal_ctxt.clone())
|
||||||
.await?;
|
.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 watch_throttle_thermal_policy = self.platform.monitor_throttle_thermal_policy()?;
|
||||||
let ctrl = self.clone();
|
let ctrl = self.clone();
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ use std::time::Duration;
|
|||||||
|
|
||||||
use log::{debug, error, info, warn};
|
use log::{debug, error, info, warn};
|
||||||
use notify_rust::{Hint, Notification, Timeout, Urgency};
|
use notify_rust::{Hint, Notification, Timeout, Urgency};
|
||||||
use rog_dbus::zbus_platform::PlatformProxy;
|
|
||||||
use rog_platform::platform::GpuMode;
|
use rog_platform::platform::GpuMode;
|
||||||
use rog_platform::power::AsusPower;
|
use rog_platform::power::AsusPower;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
@@ -154,39 +153,41 @@ pub fn start_notifications(
|
|||||||
};
|
};
|
||||||
|
|
||||||
// GPU MUX Mode notif
|
// GPU MUX Mode notif
|
||||||
let enabled_notifications_copy = config.clone();
|
// TODO: need to get armoury attrs and iter to find
|
||||||
tokio::spawn(async move {
|
// let enabled_notifications_copy = config.clone();
|
||||||
let conn = zbus::Connection::system().await.map_err(|e| {
|
// tokio::spawn(async move {
|
||||||
error!("zbus signal: receive_notify_gpu_mux_mode: {e}");
|
// let conn = zbus::Connection::system().await.map_err(|e| {
|
||||||
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}");
|
// let proxy = PlatformProxy::new(&conn).await.map_err(|e| {
|
||||||
e
|
// error!("zbus signal: receive_notify_gpu_mux_mode: {e}");
|
||||||
})?;
|
// e
|
||||||
|
// })?;
|
||||||
|
|
||||||
let mut actual_mux_mode = GpuMode::Error;
|
// let mut actual_mux_mode = GpuMode::Error;
|
||||||
if let Ok(mode) = proxy.gpu_mux_mode().await {
|
// if let Ok(mode) = proxy.gpu_mux_mode().await {
|
||||||
actual_mux_mode = GpuMode::from(mode);
|
// actual_mux_mode = GpuMode::from(mode);
|
||||||
}
|
// }
|
||||||
|
|
||||||
info!("Started zbus signal thread: receive_notify_gpu_mux_mode");
|
// info!("Started zbus signal thread: receive_notify_gpu_mux_mode");
|
||||||
while let Some(e) = proxy.receive_gpu_mux_mode_changed().await.next().await {
|
// while let Some(e) =
|
||||||
if let Ok(config) = enabled_notifications_copy.lock() {
|
// proxy.receive_gpu_mux_mode_changed().await.next().await { if let
|
||||||
if !config.notifications.enabled || !config.notifications.receive_notify_gfx {
|
// Ok(config) = enabled_notifications_copy.lock() { if
|
||||||
continue;
|
// !config.notifications.enabled || !config.notifications.receive_notify_gfx {
|
||||||
}
|
// continue;
|
||||||
}
|
// }
|
||||||
if let Ok(out) = e.get().await {
|
// }
|
||||||
let mode = GpuMode::from(out);
|
// if let Ok(out) = e.get().await {
|
||||||
if mode == actual_mux_mode {
|
// let mode = GpuMode::from(out);
|
||||||
continue;
|
// if mode == actual_mux_mode {
|
||||||
}
|
// continue;
|
||||||
do_mux_notification("Reboot required. BIOS GPU MUX mode set to", &mode).ok();
|
// }
|
||||||
}
|
// do_mux_notification("Reboot required. BIOS GPU MUX mode set to",
|
||||||
}
|
// &mode).ok(); }
|
||||||
Ok::<(), zbus::Error>(())
|
// }
|
||||||
});
|
// Ok::<(), zbus::Error>(())
|
||||||
|
// });
|
||||||
|
|
||||||
let enabled_notifications_copy = config.clone();
|
let enabled_notifications_copy = config.clone();
|
||||||
// GPU Mode change/action notif
|
// GPU Mode change/action notif
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ macro_rules! set_ui_callbacks {
|
|||||||
let handle_copy = $handle.as_weak();
|
let handle_copy = $handle.as_weak();
|
||||||
let proxy_copy = $proxy.clone();
|
let proxy_copy = $proxy.clone();
|
||||||
let data = $handle.global::<$data>();
|
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| {
|
data.on_set(move |value| {
|
||||||
let proxy_copy = proxy_copy.clone();
|
let proxy_copy = proxy_copy.clone();
|
||||||
let handle_copy = handle_copy.clone();
|
let handle_copy = handle_copy.clone();
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ pub fn setup_anime_page(ui: &MainWindow, _states: Arc<Mutex<Config>>) {
|
|||||||
|
|
||||||
let handle_copy = handle.as_weak();
|
let handle_copy = handle.as_weak();
|
||||||
let anime_copy = anime.clone();
|
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 handle_copy = handle_copy.clone();
|
||||||
let anime_copy = anime_copy.clone();
|
let anime_copy = anime_copy.clone();
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
|
|||||||
@@ -65,12 +65,12 @@ async fn find_aura_iface() -> Result<AuraProxy<'static>, Box<dyn std::error::Err
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn setup_aura_page(ui: &MainWindow, _states: Arc<Mutex<Config>>) {
|
pub fn setup_aura_page(ui: &MainWindow, _states: Arc<Mutex<Config>>) {
|
||||||
ui.global::<AuraPageData>().on_set_hex_from_colour(|c| {
|
ui.global::<AuraPageData>().on_cb_hex_from_colour(|c| {
|
||||||
format!("#{:02X}{:02X}{:02X}", c.red(), c.green(), c.blue()).into()
|
format!("#{:02X}{:02X}{:02X}", c.red(), c.green(), c.blue()).into()
|
||||||
});
|
});
|
||||||
|
|
||||||
ui.global::<AuraPageData>()
|
ui.global::<AuraPageData>()
|
||||||
.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();
|
let handle = ui.as_weak();
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
@@ -189,7 +189,7 @@ pub fn setup_aura_page(ui: &MainWindow, _states: Arc<Mutex<Config>>) {
|
|||||||
.upgrade_in_event_loop(|handle| {
|
.upgrade_in_event_loop(|handle| {
|
||||||
handle
|
handle
|
||||||
.global::<AuraPageData>()
|
.global::<AuraPageData>()
|
||||||
.on_set_led_power(move |power| {
|
.on_cb_led_power(move |power| {
|
||||||
let handle_copy = handle_copy.clone();
|
let handle_copy = handle_copy.clone();
|
||||||
let proxy_copy = aura.clone();
|
let proxy_copy = aura.clone();
|
||||||
let power: LaptopAuraPower = power.into();
|
let power: LaptopAuraPower = power.into();
|
||||||
|
|||||||
@@ -4,14 +4,14 @@ use concat_idents::concat_idents;
|
|||||||
use log::error;
|
use log::error;
|
||||||
use rog_dbus::asus_armoury::AsusArmouryProxy;
|
use rog_dbus::asus_armoury::AsusArmouryProxy;
|
||||||
use rog_dbus::zbus_platform::{PlatformProxy, PlatformProxyBlocking};
|
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 rog_platform::platform::Properties;
|
||||||
use slint::ComponentHandle;
|
use slint::ComponentHandle;
|
||||||
|
|
||||||
use super::show_toast;
|
use super::show_toast;
|
||||||
use crate::config::Config;
|
use crate::config::Config;
|
||||||
use crate::zbus_proxies::find_iface_async;
|
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 {
|
const MINMAX: AttrMinMax = AttrMinMax {
|
||||||
min: 0,
|
min: 0,
|
||||||
@@ -35,6 +35,7 @@ pub fn setup_system_page(ui: &MainWindow, _config: Arc<Mutex<Config>>) {
|
|||||||
ui.global::<SystemPageData>().set_mini_led_mode(-1);
|
ui.global::<SystemPageData>().set_mini_led_mode(-1);
|
||||||
ui.global::<SystemPageData>().set_ppt_pl1_spl(MINMAX);
|
ui.global::<SystemPageData>().set_ppt_pl1_spl(MINMAX);
|
||||||
ui.global::<SystemPageData>().set_ppt_pl2_sppt(MINMAX);
|
ui.global::<SystemPageData>().set_ppt_pl2_sppt(MINMAX);
|
||||||
|
ui.global::<SystemPageData>().set_ppt_pl3_fppt(MINMAX);
|
||||||
ui.global::<SystemPageData>().set_ppt_fppt(MINMAX);
|
ui.global::<SystemPageData>().set_ppt_fppt(MINMAX);
|
||||||
ui.global::<SystemPageData>().set_ppt_apu_sppt(MINMAX);
|
ui.global::<SystemPageData>().set_ppt_apu_sppt(MINMAX);
|
||||||
ui.global::<SystemPageData>().set_ppt_platform_sppt(MINMAX);
|
ui.global::<SystemPageData>().set_ppt_platform_sppt(MINMAX);
|
||||||
@@ -142,7 +143,6 @@ macro_rules! setup_external {
|
|||||||
use zbus::export::futures_util::StreamExt;
|
use zbus::export::futures_util::StreamExt;
|
||||||
while let Some(e) = x.next().await {
|
while let Some(e) = x.next().await {
|
||||||
if let Ok(out) = e.get().await {
|
if let Ok(out) = e.get().await {
|
||||||
dbg!(out);
|
|
||||||
handle_copy
|
handle_copy
|
||||||
.upgrade_in_event_loop(move |handle| {
|
.upgrade_in_event_loop(move |handle| {
|
||||||
handle
|
handle
|
||||||
@@ -216,8 +216,8 @@ pub fn setup_system_page_callbacks(ui: &MainWindow, _states: Arc<Mutex<Config>>)
|
|||||||
SystemPageData,
|
SystemPageData,
|
||||||
charge_control_end_threshold
|
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_policy_linked_epp);
|
||||||
set_ui_props_async!(handle, platform, SystemPageData, throttle_balanced_epp);
|
set_ui_props_async!(handle, platform, SystemPageData, throttle_balanced_epp);
|
||||||
set_ui_props_async!(handle, platform, SystemPageData, throttle_performance_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<Mutex<Config>>)
|
|||||||
change_throttle_policy_on_ac
|
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;
|
let armoury_attrs;
|
||||||
if let Ok(attrs) = find_iface_async::<AsusArmouryProxy>("xyz.ljones.AsusArmoury").await {
|
if let Ok(attrs) = find_iface_async::<AsusArmouryProxy>("xyz.ljones.AsusArmoury").await {
|
||||||
armoury_attrs = attrs;
|
armoury_attrs = attrs;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"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"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ export component PageAbout inherits VerticalLayout {
|
|||||||
|
|
||||||
Text {
|
Text {
|
||||||
wrap: TextWrap.word-wrap;
|
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 {
|
Text {
|
||||||
@@ -28,19 +28,7 @@ export component PageAbout inherits VerticalLayout {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
text: "- [x] Theme the widgets";
|
text: "- [ ] 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 {
|
Text {
|
||||||
@@ -48,11 +36,15 @@ export component PageAbout inherits VerticalLayout {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
text: "- [ ] Supergfx control";
|
text: "- [ ] Include fan speeds, temps in a bottom bar";
|
||||||
}
|
}
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
text: "- [ ] Include fan speeds, temps in a bottom bar";
|
text: "- [ ] Slash control";
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
text: "- [ ] Supergfx control";
|
||||||
}
|
}
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
|
|||||||
@@ -9,17 +9,17 @@ export global AnimePageData {
|
|||||||
@tr("Anime Brightness" => "High"),
|
@tr("Anime Brightness" => "High"),
|
||||||
];
|
];
|
||||||
in-out property <int> brightness;
|
in-out property <int> brightness;
|
||||||
callback set_brightness(int);
|
callback cb_brightness(int);
|
||||||
in-out property <bool> builtins_enabled;
|
in-out property <bool> builtins_enabled;
|
||||||
callback set_builtins_enabled(bool);
|
callback cb_builtins_enabled(bool);
|
||||||
in-out property <bool> enable_display;
|
in-out property <bool> enable_display;
|
||||||
callback set_enable_display(bool);
|
callback cb_enable_display(bool);
|
||||||
in-out property <bool> off_when_lid_closed;
|
in-out property <bool> off_when_lid_closed;
|
||||||
callback set_off_when_lid_closed(bool);
|
callback cb_off_when_lid_closed(bool);
|
||||||
in-out property <bool> off_when_suspended;
|
in-out property <bool> off_when_suspended;
|
||||||
callback set_off_when_suspended(bool);
|
callback cb_off_when_suspended(bool);
|
||||||
in-out property <bool> off_when_unplugged;
|
in-out property <bool> 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-out property <[string]> boot_anim_choices: [@tr("Glitch Construction"), @tr("Static Emergence")];
|
||||||
in property <int> boot_anim: 0;
|
in property <int> boot_anim: 0;
|
||||||
in-out property <[string]> awake_anim_choices: [@tr("Binary Banner Scroll"), @tr("Rog Logo Glitch")];
|
in-out property <[string]> awake_anim_choices: [@tr("Binary Banner Scroll"), @tr("Rog Logo Glitch")];
|
||||||
@@ -28,7 +28,7 @@ export global AnimePageData {
|
|||||||
in property <int> sleep_anim: 0;
|
in property <int> sleep_anim: 0;
|
||||||
in-out property <[string]> shutdown_anim_choices: [@tr("Glitch Out"), @tr("See Ya")];
|
in-out property <[string]> shutdown_anim_choices: [@tr("Glitch Out"), @tr("See Ya")];
|
||||||
in property <int> shutdown_anim: 0;
|
in property <int> shutdown_anim: 0;
|
||||||
callback set_builtin_animations(int, int, int, int);
|
callback cb_builtin_animations(int, int, int, int);
|
||||||
}
|
}
|
||||||
|
|
||||||
export component PageAnime inherits Rectangle {
|
export component PageAnime inherits Rectangle {
|
||||||
@@ -53,7 +53,7 @@ export component PageAnime inherits Rectangle {
|
|||||||
model <=> AnimePageData.brightness_names;
|
model <=> AnimePageData.brightness_names;
|
||||||
selected => {
|
selected => {
|
||||||
self.current_value = AnimePageData.brightness_names[AnimePageData.brightness];
|
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");
|
text: @tr("Enable display");
|
||||||
checked <=> AnimePageData.enable_display;
|
checked <=> AnimePageData.enable_display;
|
||||||
toggled => {
|
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");
|
text: @tr("Use built-in animations");
|
||||||
checked <=> AnimePageData.builtins_enabled;
|
checked <=> AnimePageData.builtins_enabled;
|
||||||
toggled => {
|
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];
|
current_value: AnimePageData.boot_anim_choices[AnimePageData.boot_anim];
|
||||||
model <=> AnimePageData.boot_anim_choices;
|
model <=> AnimePageData.boot_anim_choices;
|
||||||
selected => {
|
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];
|
current_value: AnimePageData.awake_anim_choices[AnimePageData.awake_anim];
|
||||||
model <=> AnimePageData.awake_anim_choices;
|
model <=> AnimePageData.awake_anim_choices;
|
||||||
selected => {
|
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];
|
current_value: AnimePageData.sleep_anim_choices[AnimePageData.sleep_anim];
|
||||||
model <=> AnimePageData.sleep_anim_choices;
|
model <=> AnimePageData.sleep_anim_choices;
|
||||||
selected => {
|
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];
|
current_value: AnimePageData.shutdown_anim_choices[AnimePageData.shutdown_anim];
|
||||||
model <=> AnimePageData.shutdown_anim_choices;
|
model <=> AnimePageData.shutdown_anim_choices;
|
||||||
selected => {
|
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");
|
text: @tr("Off when lid closed");
|
||||||
checked <=> AnimePageData.off_when_lid_closed;
|
checked <=> AnimePageData.off_when_lid_closed;
|
||||||
toggled => {
|
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");
|
text: @tr("Off when suspended");
|
||||||
checked <=> AnimePageData.off_when_suspended;
|
checked <=> AnimePageData.off_when_suspended;
|
||||||
toggled => {
|
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");
|
text: @tr("Off when on battery");
|
||||||
checked <=> AnimePageData.off_when_unplugged;
|
checked <=> AnimePageData.off_when_unplugged;
|
||||||
toggled => {
|
toggled => {
|
||||||
AnimePageData.set_off_when_unplugged(AnimePageData.off_when_unplugged)
|
AnimePageData.cb_off_when_unplugged(AnimePageData.off_when_unplugged)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ export component PageAura inherits Rectangle {
|
|||||||
current_value: AuraPageData.brightness_names[self.current-index];
|
current_value: AuraPageData.brightness_names[self.current-index];
|
||||||
model <=> AuraPageData.brightness_names;
|
model <=> AuraPageData.brightness_names;
|
||||||
selected => {
|
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.led_mode;
|
||||||
AuraPageData.led_mode_data.mode = AuraPageData.current_available_mode;
|
AuraPageData.led_mode_data.mode = AuraPageData.current_available_mode;
|
||||||
self.current_value = AuraPageData.available_mode_names[self.current-index];
|
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;
|
final_colour <=> AuraPageData.color1;
|
||||||
colourbox <=> AuraPageData.colorbox1;
|
colourbox <=> AuraPageData.colorbox1;
|
||||||
set_hex_from_colour(c1) => {
|
set_hex_from_colour(c1) => {
|
||||||
return AuraPageData.set_hex_from_colour(c1);
|
return AuraPageData.cb_hex_from_colour(c1);
|
||||||
}
|
}
|
||||||
hex_to_colour(s) => {
|
hex_to_colour(s) => {
|
||||||
return AuraPageData.set_hex_to_colour(s);
|
return AuraPageData.cb_hex_to_colour(s);
|
||||||
}
|
}
|
||||||
released => {
|
released => {
|
||||||
AuraPageData.led_mode_data.colour1 = AuraPageData.color1;
|
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;
|
final_colour <=> AuraPageData.color2;
|
||||||
colourbox <=> AuraPageData.colorbox2;
|
colourbox <=> AuraPageData.colorbox2;
|
||||||
set_hex_from_colour(c1) => {
|
set_hex_from_colour(c1) => {
|
||||||
return AuraPageData.set_hex_from_colour(c1);
|
return AuraPageData.cb_hex_from_colour(c1);
|
||||||
}
|
}
|
||||||
hex_to_colour(s) => {
|
hex_to_colour(s) => {
|
||||||
return AuraPageData.set_hex_to_colour(s);
|
return AuraPageData.cb_hex_to_colour(s);
|
||||||
}
|
}
|
||||||
released => {
|
released => {
|
||||||
AuraPageData.led_mode_data.colour2 = AuraPageData.color2;
|
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;
|
model <=> AuraPageData.zone_names;
|
||||||
selected => {
|
selected => {
|
||||||
AuraPageData.led_mode_data.zone = self.current-index;
|
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;
|
model <=> AuraPageData.direction_names;
|
||||||
selected => {
|
selected => {
|
||||||
AuraPageData.led_mode_data.direction = self.current-index;
|
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;
|
model <=> AuraPageData.speed_names;
|
||||||
selected => {
|
selected => {
|
||||||
AuraPageData.led_mode_data.speed = self.current-index;
|
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_checked: state.boot;
|
||||||
boot_toggled => {
|
boot_toggled => {
|
||||||
AuraPageData.led_power.states[idx].boot = zone.boot_checked;
|
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_checked: state.awake;
|
||||||
awake_toggled => {
|
awake_toggled => {
|
||||||
AuraPageData.led_power.states[idx].awake = zone.awake_checked;
|
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_checked: state.sleep;
|
||||||
sleep_toggled => {
|
sleep_toggled => {
|
||||||
AuraPageData.led_power.states[idx].sleep = zone.sleep_checked;
|
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_checked: state.shutdown;
|
||||||
shutdown_toggled => {
|
shutdown_toggled => {
|
||||||
AuraPageData.led_power.states[idx].shutdown = zone.shutdown_checked;
|
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;
|
zone_strings <=> AuraPageData.power_zone_names_old;
|
||||||
selected_zone => {
|
selected_zone => {
|
||||||
AuraPageData.led_power.states[idx].zone = AuraPageData.supported_power_zones[old_zone.current_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_checked: state.boot;
|
||||||
boot_toggled => {
|
boot_toggled => {
|
||||||
AuraPageData.led_power.states[idx].boot = old_zone.boot_checked;
|
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_checked: state.awake;
|
||||||
awake_toggled => {
|
awake_toggled => {
|
||||||
AuraPageData.led_power.states[idx].awake = old_zone.awake_checked;
|
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_checked: state.sleep;
|
||||||
sleep_toggled => {
|
sleep_toggled => {
|
||||||
AuraPageData.led_power.states[idx].sleep = old_zone.sleep_checked;
|
AuraPageData.led_power.states[idx].sleep = old_zone.sleep_checked;
|
||||||
AuraPageData.set_led_power(AuraPageData.led_power);
|
AuraPageData.cb_led_power(AuraPageData.led_power);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
if SystemPageData.ppt_pl1_spl.val != -1: SystemSlider {
|
||||||
text: @tr("ppt_pl1_spl" => "PL1, sustained power limit");
|
text: @tr("ppt_pl1_spl" => "PL1, sustained power limit");
|
||||||
minimum: SystemPageData.ppt_pl1_spl.min;
|
minimum: SystemPageData.ppt_pl1_spl.min;
|
||||||
@@ -247,8 +255,8 @@ export component PageSystem inherits Rectangle {
|
|||||||
maximum: SystemPageData.ppt_pl3_fppt.max;
|
maximum: SystemPageData.ppt_pl3_fppt.max;
|
||||||
value: SystemPageData.ppt_pl3_fppt.val;
|
value: SystemPageData.ppt_pl3_fppt.val;
|
||||||
released => {
|
released => {
|
||||||
SystemPageData.ppt_fppt.val = self.value;
|
SystemPageData.ppt_pl3_fppt.val = self.value;
|
||||||
SystemPageData.cb_ppt_fppt(Math.round(self.value))
|
SystemPageData.cb_ppt_pl3_fppt(Math.round(self.value))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if SystemPageData.ppt_fppt.val != -1: SystemSlider {
|
if SystemPageData.ppt_fppt.val != -1: SystemSlider {
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ export global AuraPageData {
|
|||||||
@tr("Aura brightness" => "High"),
|
@tr("Aura brightness" => "High"),
|
||||||
];
|
];
|
||||||
in-out property <int> brightness;
|
in-out property <int> brightness;
|
||||||
callback set_brightness(int);
|
callback cb_brightness(int);
|
||||||
in-out property <[string]> mode_names: [
|
in-out property <[string]> mode_names: [
|
||||||
@tr("Basic aura mode" => "Static"),
|
@tr("Basic aura mode" => "Static"),
|
||||||
@tr("Basic aura mode" => "Breathe"),
|
@tr("Basic aura mode" => "Breathe"),
|
||||||
@@ -95,7 +95,7 @@ export global AuraPageData {
|
|||||||
in-out property <int> current_available_mode: 0;
|
in-out property <int> 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 <[int]> supported_basic_modes: [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12];
|
||||||
in-out property <int> led_mode;
|
in-out property <int> led_mode;
|
||||||
callback set_led_mode(int);
|
callback cb_led_mode(int);
|
||||||
in-out property <[string]> zone_names: [
|
in-out property <[string]> zone_names: [
|
||||||
@tr("Aura zone" => "None"),
|
@tr("Aura zone" => "None"),
|
||||||
@tr("Aura zone" => "Key1"),
|
@tr("Aura zone" => "Key1"),
|
||||||
@@ -130,7 +130,7 @@ export global AuraPageData {
|
|||||||
speed: 0,
|
speed: 0,
|
||||||
direction: 0,
|
direction: 0,
|
||||||
};
|
};
|
||||||
callback set_led_mode_data(AuraEffect);
|
callback cb_led_mode_data(AuraEffect);
|
||||||
in-out property <color> color1;
|
in-out property <color> color1;
|
||||||
in-out property <brush> colorbox1;
|
in-out property <brush> colorbox1;
|
||||||
in-out property <color> color2;
|
in-out property <color> color2;
|
||||||
@@ -147,8 +147,8 @@ export global AuraPageData {
|
|||||||
colorbox1 = data.colour1;
|
colorbox1 = data.colour1;
|
||||||
colorbox2 = data.colour2;
|
colorbox2 = data.colour2;
|
||||||
}
|
}
|
||||||
callback set_hex_from_colour(color) -> string;
|
callback cb_hex_from_colour(color) -> string;
|
||||||
callback set_hex_to_colour(string) -> color;
|
callback cb_hex_to_colour(string) -> color;
|
||||||
in-out property <AuraDevType> device_type: AuraDevType.Old;
|
in-out property <AuraDevType> device_type: AuraDevType.Old;
|
||||||
// List of indexes to power_zone_names. Must correspond to rog-aura crate
|
// List of indexes to power_zone_names. Must correspond to rog-aura crate
|
||||||
in-out property <[PowerZones]> supported_power_zones: [
|
in-out property <[PowerZones]> supported_power_zones: [
|
||||||
@@ -165,5 +165,5 @@ export global AuraPageData {
|
|||||||
shutdown: true,
|
shutdown: true,
|
||||||
}]
|
}]
|
||||||
};
|
};
|
||||||
callback set_led_power(LaptopAuraPower);
|
callback cb_led_power(LaptopAuraPower);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
//!
|
//!
|
||||||
//! `zbus-xmlgen system xyz.ljones.Asusd
|
//! `zbus-xmlgen system xyz.ljones.Asusd
|
||||||
//! /xyz/ljones/asus_armoury/nv_temp_target`
|
//! /xyz/ljones/asus_armoury/nv_temp_target`
|
||||||
use rog_platform::firmware_attributes::FirmwareAttribute;
|
use rog_platform::asus_armoury::FirmwareAttribute;
|
||||||
use zbus::proxy;
|
use zbus::proxy;
|
||||||
#[proxy(
|
#[proxy(
|
||||||
interface = "xyz.ljones.AsusArmoury",
|
interface = "xyz.ljones.AsusArmoury",
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
//! …consequently `zbus-xmlgen` did not generate code for the above interfaces.
|
//! …consequently `zbus-xmlgen` did not generate code for the above interfaces.
|
||||||
|
|
||||||
use rog_platform::cpu::CPUEPP;
|
use rog_platform::cpu::CPUEPP;
|
||||||
use rog_platform::platform::{GpuMode, Properties, ThrottlePolicy};
|
use rog_platform::platform::{Properties, ThrottlePolicy};
|
||||||
use zbus::proxy;
|
use zbus::proxy;
|
||||||
|
|
||||||
#[proxy(
|
#[proxy(
|
||||||
@@ -48,80 +48,6 @@ pub trait Platform {
|
|||||||
// Toggle one-shot charge to 100%
|
// Toggle one-shot charge to 100%
|
||||||
fn one_shot_full_charge(&self) -> zbus::Result<()>;
|
fn one_shot_full_charge(&self) -> zbus::Result<()>;
|
||||||
|
|
||||||
/// DgpuDisable property
|
|
||||||
#[zbus(property)]
|
|
||||||
fn dgpu_disable(&self) -> zbus::Result<bool>;
|
|
||||||
|
|
||||||
/// EgpuEnable property
|
|
||||||
#[zbus(property)]
|
|
||||||
fn egpu_enable(&self) -> zbus::Result<bool>;
|
|
||||||
|
|
||||||
/// GpuMuxMode property
|
|
||||||
#[zbus(property)]
|
|
||||||
fn gpu_mux_mode(&self) -> zbus::Result<u8>;
|
|
||||||
#[zbus(property)]
|
|
||||||
fn set_gpu_mux_mode(&self, value: GpuMode) -> zbus::Result<()>;
|
|
||||||
|
|
||||||
/// MiniLedMode property
|
|
||||||
#[zbus(property)]
|
|
||||||
fn mini_led_mode(&self) -> zbus::Result<bool>;
|
|
||||||
#[zbus(property)]
|
|
||||||
fn set_mini_led_mode(&self, value: bool) -> zbus::Result<()>;
|
|
||||||
|
|
||||||
/// NvDynamicBoost property
|
|
||||||
#[zbus(property)]
|
|
||||||
fn nv_dynamic_boost(&self) -> zbus::Result<u8>;
|
|
||||||
#[zbus(property)]
|
|
||||||
fn set_nv_dynamic_boost(&self, value: u8) -> zbus::Result<()>;
|
|
||||||
|
|
||||||
/// NvTempTarget property
|
|
||||||
#[zbus(property)]
|
|
||||||
fn nv_temp_target(&self) -> zbus::Result<u8>;
|
|
||||||
#[zbus(property)]
|
|
||||||
fn set_nv_temp_target(&self, value: u8) -> zbus::Result<()>;
|
|
||||||
|
|
||||||
/// PanelOd property
|
|
||||||
#[zbus(property)]
|
|
||||||
fn panel_od(&self) -> zbus::Result<bool>;
|
|
||||||
#[zbus(property)]
|
|
||||||
fn set_panel_od(&self, value: bool) -> zbus::Result<()>;
|
|
||||||
|
|
||||||
/// PostAnimationSound property
|
|
||||||
#[zbus(property)]
|
|
||||||
fn boot_sound(&self) -> zbus::Result<bool>;
|
|
||||||
#[zbus(property)]
|
|
||||||
fn set_boot_sound(&self, value: bool) -> zbus::Result<()>;
|
|
||||||
|
|
||||||
/// PptApuSppt property
|
|
||||||
#[zbus(property)]
|
|
||||||
fn ppt_apu_sppt(&self) -> zbus::Result<u8>;
|
|
||||||
#[zbus(property)]
|
|
||||||
fn set_ppt_apu_sppt(&self, value: u8) -> zbus::Result<()>;
|
|
||||||
|
|
||||||
/// PptFppt property
|
|
||||||
#[zbus(property)]
|
|
||||||
fn ppt_fppt(&self) -> zbus::Result<u8>;
|
|
||||||
#[zbus(property)]
|
|
||||||
fn set_ppt_fppt(&self, value: u8) -> zbus::Result<()>;
|
|
||||||
|
|
||||||
/// PptPl1Spl property
|
|
||||||
#[zbus(property)]
|
|
||||||
fn ppt_pl1_spl(&self) -> zbus::Result<u8>;
|
|
||||||
#[zbus(property)]
|
|
||||||
fn set_ppt_pl1_spl(&self, value: u8) -> zbus::Result<()>;
|
|
||||||
|
|
||||||
/// PptPl2Sppt property
|
|
||||||
#[zbus(property)]
|
|
||||||
fn ppt_pl2_sppt(&self) -> zbus::Result<u8>;
|
|
||||||
#[zbus(property)]
|
|
||||||
fn set_ppt_pl2_sppt(&self, value: u8) -> zbus::Result<()>;
|
|
||||||
|
|
||||||
/// PptPlatformSppt property
|
|
||||||
#[zbus(property)]
|
|
||||||
fn ppt_platform_sppt(&self) -> zbus::Result<u8>;
|
|
||||||
#[zbus(property)]
|
|
||||||
fn set_ppt_platform_sppt(&self, value: u8) -> zbus::Result<()>;
|
|
||||||
|
|
||||||
/// ThrottleBalancedEpp property
|
/// ThrottleBalancedEpp property
|
||||||
#[zbus(property)]
|
#[zbus(property)]
|
||||||
fn throttle_balanced_epp(&self) -> zbus::Result<CPUEPP>;
|
fn throttle_balanced_epp(&self) -> zbus::Result<CPUEPP>;
|
||||||
|
|||||||
@@ -157,6 +157,25 @@ impl Attribute {
|
|||||||
default_value, possible_values, min_value, max_value, scalar_increment
|
default_value, possible_values, min_value, max_value, scalar_increment
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_watcher(&self) -> Result<inotify::Inotify, PlatformError> {
|
||||||
|
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 {
|
pub struct FirmwareAttributes {
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
//! This crate functions as a wrapper of all the relevant ASUS functionality
|
//! This crate functions as a wrapper of all the relevant ASUS functionality
|
||||||
//! on ROG, Strix, and TUF laptops.
|
//! on ROG, Strix, and TUF laptops.
|
||||||
|
|
||||||
|
pub mod asus_armoury;
|
||||||
pub mod cpu;
|
pub mod cpu;
|
||||||
pub mod error;
|
pub mod error;
|
||||||
pub mod firmware_attributes;
|
|
||||||
pub mod hid_raw;
|
pub mod hid_raw;
|
||||||
pub mod keyboard_led;
|
pub mod keyboard_led;
|
||||||
pub(crate) mod macros;
|
pub(crate) mod macros;
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ use serde::{Deserialize, Serialize};
|
|||||||
use zbus::zvariant::{OwnedValue, Type, Value};
|
use zbus::zvariant::{OwnedValue, Type, Value};
|
||||||
|
|
||||||
use crate::error::{PlatformError, Result};
|
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:
|
/// The "platform" device provides access to things like:
|
||||||
/// - `dgpu_disable`
|
/// - `dgpu_disable`
|
||||||
@@ -24,16 +24,6 @@ pub struct RogPlatform {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl 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!(
|
attr_u8!(
|
||||||
/// This is technically the same as `platform_profile` since both are
|
/// This is technically the same as `platform_profile` since both are
|
||||||
/// tied in-kernel
|
/// tied in-kernel
|
||||||
@@ -47,12 +37,6 @@ impl RogPlatform {
|
|||||||
pp_path
|
pp_path
|
||||||
);
|
);
|
||||||
|
|
||||||
attr_bool!(
|
|
||||||
/// Control the POST animation "FWOOoosh" sound
|
|
||||||
"boot_sound",
|
|
||||||
path
|
|
||||||
);
|
|
||||||
|
|
||||||
pub fn new() -> Result<Self> {
|
pub fn new() -> Result<Self> {
|
||||||
let mut enumerator = udev::Enumerator::new().map_err(|err| {
|
let mut enumerator = udev::Enumerator::new().map_err(|err| {
|
||||||
warn!("{}", err);
|
warn!("{}", err);
|
||||||
|
|||||||
Reference in New Issue
Block a user