Better everything

This commit is contained in:
Luke D. Jones
2024-05-11 11:03:13 +12:00
parent 293a087b8a
commit f855908c82
9 changed files with 166 additions and 68 deletions

View File

@@ -17,6 +17,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- More logging - More logging
- Fix TUF laptop led power - Fix TUF laptop led power
- Sanitize the dbus path for aura devices (remove `.` chars) - Sanitize the dbus path for aura devices (remove `.` chars)
- Even more error handling (gracefully)
- Better checking for dbus interfaces
- Remove dbus `supported_interfaces`
- dbus ObjectManager is now at root `/`
## [v6.0.5] ## [v6.0.5]

View File

@@ -14,6 +14,7 @@ use rog_anime::usb::get_anime_type;
use rog_anime::{AnimTime, AnimeDataBuffer, AnimeDiagonal, AnimeGif, AnimeImage, AnimeType, Vec2}; use rog_anime::{AnimTime, AnimeDataBuffer, AnimeDiagonal, AnimeGif, AnimeImage, AnimeType, Vec2};
use rog_aura::keyboard::{AuraPowerState, LaptopAuraPower}; use rog_aura::keyboard::{AuraPowerState, LaptopAuraPower};
use rog_aura::{self, AuraDeviceType, AuraEffect, PowerZones}; use rog_aura::{self, AuraDeviceType, AuraEffect, PowerZones};
use rog_dbus::list_iface_blocking;
use rog_dbus::zbus_anime::AnimeProxyBlocking; use rog_dbus::zbus_anime::AnimeProxyBlocking;
use rog_dbus::zbus_aura::AuraProxyBlocking; use rog_dbus::zbus_aura::AuraProxyBlocking;
use rog_dbus::zbus_fan_curves::FanCurvesProxyBlocking; use rog_dbus::zbus_fan_curves::FanCurvesProxyBlocking;
@@ -65,7 +66,7 @@ fn main() {
} }
let supported_properties = platform_proxy.supported_properties().unwrap(); let supported_properties = platform_proxy.supported_properties().unwrap();
let supported_interfaces = platform_proxy.supported_interfaces().unwrap(); let supported_interfaces = list_iface_blocking().unwrap();
if parsed.version { if parsed.version {
println!("asusctl v{}", env!("CARGO_PKG_VERSION")); println!("asusctl v{}", env!("CARGO_PKG_VERSION"));
@@ -89,7 +90,10 @@ fn print_error_help(
print_info(); print_info();
println!(); println!();
println!("Supported interfaces:\n\n{:#?}\n", supported_interfaces); println!("Supported interfaces:\n\n{:#?}\n", supported_interfaces);
println!("Supported properties:\n\n{:#?}\n", supported_properties); println!(
"Supported properties on Platform:\n\n{:#?}\n",
supported_properties
);
} }
fn print_info() { fn print_info() {
@@ -120,12 +124,8 @@ fn check_service(name: &str) -> bool {
fn find_aura_iface() -> Result<Vec<AuraProxyBlocking<'static>>, Box<dyn std::error::Error>> { fn find_aura_iface() -> Result<Vec<AuraProxyBlocking<'static>>, Box<dyn std::error::Error>> {
let conn = zbus::blocking::Connection::system().unwrap(); let conn = zbus::blocking::Connection::system().unwrap();
let f = zbus::blocking::fdo::ObjectManagerProxy::new( let f =
&conn, zbus::blocking::fdo::ObjectManagerProxy::new(&conn, "org.asuslinux.Daemon", "/").unwrap();
"org.asuslinux.Daemon",
"/org/asuslinux",
)
.unwrap();
let interfaces = f.get_managed_objects().unwrap(); let interfaces = f.get_managed_objects().unwrap();
let mut aura_paths = Vec::new(); let mut aura_paths = Vec::new();
for v in interfaces.iter() { for v in interfaces.iter() {
@@ -203,6 +203,31 @@ fn do_parsed(
}; };
let commands: Vec<String> = cmdlist.lines().map(|s| s.to_owned()).collect(); let commands: Vec<String> = cmdlist.lines().map(|s| s.to_owned()).collect();
for command in commands.iter().filter(|command| { for command in commands.iter().filter(|command| {
if command.trim().starts_with("fan-curve")
&& !supported_interfaces
.contains(&"org.asuslinux.FanCurves".to_string())
{
return false;
}
if command.trim().starts_with("anime")
&& !supported_interfaces.contains(&"org.asuslinux.Anime".to_string())
{
return false;
}
if command.trim().starts_with("slash")
&& !supported_interfaces.contains(&"org.asuslinux.Slash".to_string())
{
return false;
}
if command.trim().starts_with("bios")
&& !supported_interfaces.contains(&"org.asuslinux.Platform".to_string())
{
return false;
}
if !dev_type.is_old_laptop() if !dev_type.is_old_laptop()
&& !dev_type.is_tuf_laptop() && !dev_type.is_tuf_laptop()
&& command.trim().starts_with("led-pow-1") && command.trim().starts_with("led-pow-1")

View File

@@ -62,7 +62,7 @@ async fn start_daemon() -> Result<(), Box<dyn Error>> {
let mut connection = Connection::system().await?; let mut connection = Connection::system().await?;
connection connection
.object_server() .object_server()
.at("/org/asuslinux", ObjectManager) .at("/", ObjectManager)
.await .await
.unwrap(); .unwrap();

View File

@@ -6,12 +6,12 @@ pub mod setup_system;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use config_traits::StdConfig; use config_traits::StdConfig;
use rog_dbus::zbus_platform::PlatformProxyBlocking; use rog_dbus::has_iface_blocking;
use slint::{ComponentHandle, PhysicalSize, SharedString, Weak}; use slint::{ComponentHandle, PhysicalSize, SharedString, Weak};
use crate::config::Config; use crate::config::Config;
use crate::ui::setup_anime::setup_anime_page; use crate::ui::setup_anime::setup_anime_page;
use crate::ui::setup_aura::{has_aura_iface_blocking, setup_aura_page}; use crate::ui::setup_aura::setup_aura_page;
use crate::ui::setup_fans::setup_fan_curve_page; use crate::ui::setup_fans::setup_fan_curve_page;
use crate::ui::setup_system::{setup_system_page, setup_system_page_callbacks}; use crate::ui::setup_system::{setup_system_page, setup_system_page_callbacks};
use crate::{AppSettingsPageData, MainWindow}; use crate::{AppSettingsPageData, MainWindow};
@@ -108,19 +108,13 @@ pub fn setup_window(config: Arc<Mutex<Config>>) -> MainWindow {
} }
}; };
let conn = zbus::blocking::Connection::system().unwrap();
let platform = PlatformProxyBlocking::new(&conn).unwrap();
let interfaces = platform.supported_interfaces().unwrap();
log::debug!("Available interfaces: {interfaces:?}");
// "Anime", "Aura", "FanCurves", "Platform"
ui.set_sidebar_items_avilable( ui.set_sidebar_items_avilable(
[ [
// Needs to match the order of slint sidebar items // Needs to match the order of slint sidebar items
interfaces.contains(&"Platform".into()), has_iface_blocking("org.asuslinux.Platform").unwrap_or(false),
has_aura_iface_blocking().unwrap_or(false), has_iface_blocking("org.asuslinux.Aura").unwrap_or(false),
interfaces.contains(&"Anime".into()), has_iface_blocking("org.asuslinux.Anime").unwrap_or(false),
interfaces.contains(&"FanCurves".into()), has_iface_blocking("org.asuslinux.FanCurves").unwrap_or(false),
true, true,
true, true,
] ]

View File

@@ -1,5 +1,6 @@
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use log::{error, info, warn};
use rog_anime::Animations; use rog_anime::Animations;
use rog_dbus::zbus_anime::AnimeProxy; use rog_dbus::zbus_anime::AnimeProxy;
use slint::ComponentHandle; use slint::ComponentHandle;
@@ -11,8 +12,13 @@ use crate::{set_ui_callbacks, set_ui_props_async, AnimePageData, MainWindow};
pub fn setup_anime_page(ui: &MainWindow, _states: Arc<Mutex<Config>>) { pub fn setup_anime_page(ui: &MainWindow, _states: Arc<Mutex<Config>>) {
let handle = ui.as_weak(); let handle = ui.as_weak();
tokio::spawn(async move { tokio::spawn(async move {
let conn = zbus::Connection::system().await.unwrap(); let Ok(conn) = zbus::Connection::system().await.map_err(|e| warn!("{e:}")) else {
let anime = AnimeProxy::new(&conn).await.unwrap(); return;
};
let Ok(anime) = AnimeProxy::new(&conn).await.map_err(|e| warn!("{e:}")) else {
info!("This device may not have an AniMe. If not then the error can be ignored");
return;
};
set_ui_props_async!(handle, anime, AnimePageData, brightness); set_ui_props_async!(handle, anime, AnimePageData, brightness);
set_ui_props_async!(handle, anime, AnimePageData, builtins_enabled); set_ui_props_async!(handle, anime, AnimePageData, builtins_enabled);
@@ -123,6 +129,7 @@ pub fn setup_anime_page(ui: &MainWindow, _states: Arc<Mutex<Config>>) {
"Setting Anime off_when_unplugged failed" "Setting Anime off_when_unplugged failed"
); );
}) })
.unwrap(); .map_err(|e| error!("setup_anime_page: upgrade_in_event_loop: {e:?}"))
.ok();
}); });
} }

View File

@@ -1,6 +1,6 @@
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use log::info; use log::{error, info};
use rog_aura::keyboard::LaptopAuraPower; use rog_aura::keyboard::LaptopAuraPower;
use rog_dbus::zbus_aura::AuraProxy; use rog_dbus::zbus_aura::AuraProxy;
use slint::{ComponentHandle, Model, RgbaColor, SharedString}; use slint::{ComponentHandle, Model, RgbaColor, SharedString};
@@ -33,31 +33,11 @@ fn decode_hex(s: &str) -> RgbaColor<u8> {
} }
} }
pub fn has_aura_iface_blocking() -> Result<bool, Box<dyn std::error::Error>> {
let conn = zbus::blocking::Connection::system()?;
let f = zbus::blocking::fdo::ObjectManagerProxy::new(
&conn,
"org.asuslinux.Daemon",
"/org/asuslinux",
)?;
let interfaces = f.get_managed_objects()?;
let mut aura_paths = Vec::new();
for v in interfaces.iter() {
for k in v.1.keys() {
if k.as_str() == "org.asuslinux.Aura" {
aura_paths.push(v.0.clone());
}
}
}
Ok(!aura_paths.is_empty())
}
/// Returns the first available Aura interface /// Returns the first available Aura interface
// TODO: return all // TODO: return all
async fn find_aura_iface() -> Result<AuraProxy<'static>, Box<dyn std::error::Error>> { async fn find_aura_iface() -> Result<AuraProxy<'static>, Box<dyn std::error::Error>> {
let conn = zbus::Connection::system().await?; let conn = zbus::Connection::system().await?;
let f = let f = zbus::fdo::ObjectManagerProxy::new(&conn, "org.asuslinux.Daemon", "/").await?;
zbus::fdo::ObjectManagerProxy::new(&conn, "org.asuslinux.Daemon", "/org/asuslinux").await?;
let interfaces = f.get_managed_objects().await?; let interfaces = f.get_managed_objects().await?;
let mut aura_paths = Vec::new(); let mut aura_paths = Vec::new();
for v in interfaces.iter() { for v in interfaces.iter() {
@@ -93,9 +73,7 @@ pub fn setup_aura_page(ui: &MainWindow, _states: Arc<Mutex<Config>>) {
let handle = ui.as_weak(); let handle = ui.as_weak();
tokio::spawn(async move { tokio::spawn(async move {
let aura = if let Ok(aura) = find_aura_iface().await { let Ok(aura) = find_aura_iface().await else {
aura
} else {
info!("This device appears to have no aura interfaces"); info!("This device appears to have no aura interfaces");
return; return;
}; };
@@ -138,6 +116,7 @@ pub fn setup_aura_page(ui: &MainWindow, _states: Arc<Mutex<Config>>) {
.global::<AuraPageData>() .global::<AuraPageData>()
.set_available_mode_names(res.as_slice().into()); .set_available_mode_names(res.as_slice().into());
}) })
.map_err(|e| error!("{e:}"))
.ok(); .ok();
} }
@@ -196,7 +175,8 @@ pub fn setup_aura_page(ui: &MainWindow, _states: Arc<Mutex<Config>>) {
}); });
}); });
}) })
.unwrap(); .map_err(|e| error!("{e:}"))
.ok();
// Need to update the UI if the mode changes // Need to update the UI if the mode changes
let handle_copy = handle.clone(); let handle_copy = handle.clone();
@@ -213,6 +193,7 @@ pub fn setup_aura_page(ui: &MainWindow, _states: Arc<Mutex<Config>>) {
.invoke_update_led_mode_data(out.into()); .invoke_update_led_mode_data(out.into());
handle.invoke_external_colour_change(); handle.invoke_external_colour_change();
}) })
.map_err(|e| error!("{e:}"))
.ok(); .ok();
} }
} }

View File

@@ -1,5 +1,6 @@
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use log::{error, info};
use rog_dbus::zbus_fan_curves::FanCurvesProxy; use rog_dbus::zbus_fan_curves::FanCurvesProxy;
use rog_platform::platform::ThrottlePolicy; use rog_platform::platform::ThrottlePolicy;
use rog_profiles::fan_curve_set::CurveData; use rog_profiles::fan_curve_set::CurveData;
@@ -81,7 +82,8 @@ pub fn update_fan_data(
} }
} }
}) })
.unwrap(); .map_err(|e| error!("update_fan_data: upgrade_in_event_loop: {e:?}"))
.ok();
} }
pub fn setup_fan_curve_page(ui: &MainWindow, _config: Arc<Mutex<Config>>) { pub fn setup_fan_curve_page(ui: &MainWindow, _config: Arc<Mutex<Config>>) {
@@ -89,17 +91,44 @@ pub fn setup_fan_curve_page(ui: &MainWindow, _config: Arc<Mutex<Config>>) {
tokio::spawn(async move { tokio::spawn(async move {
// Create the connections/proxies here to prevent future delays in process // Create the connections/proxies here to prevent future delays in process
let conn = zbus::Connection::system().await.unwrap(); let conn = if let Ok(conn) = zbus::Connection::system().await.map_err(|e| error!("{e:}")) {
let fans = FanCurvesProxy::new(&conn).await.unwrap(); conn
} else {
return;
};
let fans = if let Ok(fans) = FanCurvesProxy::new(&conn).await.map_err(|e| error!("{e:}")) {
fans
} else {
info!(
"This device may not have an Fan Curve control. If not then the error can be \
ignored"
);
return;
};
let handle_copy = handle.clone(); let handle_copy = handle.clone();
// Do initial setup // Do initial setup
let balanced = fans.fan_curve_data(ThrottlePolicy::Balanced).await.unwrap(); let Ok(balanced) = fans
let perf = fans .fan_curve_data(ThrottlePolicy::Balanced)
.await
.map_err(|e| error!("{e:}"))
else {
return;
};
let Ok(perf) = fans
.fan_curve_data(ThrottlePolicy::Performance) .fan_curve_data(ThrottlePolicy::Performance)
.await .await
.unwrap(); .map_err(|e| error!("{e:}"))
let quiet = fans.fan_curve_data(ThrottlePolicy::Quiet).await.unwrap(); else {
return;
};
let Ok(quiet) = fans
.fan_curve_data(ThrottlePolicy::Quiet)
.await
.map_err(|e| error!("{e:}"))
else {
return;
};
update_fan_data(handle, balanced, perf, quiet); update_fan_data(handle, balanced, perf, quiet);
let handle_next1 = handle_copy.clone(); let handle_next1 = handle_copy.clone();
@@ -111,14 +140,30 @@ pub fn setup_fan_curve_page(ui: &MainWindow, _config: Arc<Mutex<Config>>) {
let fans = fans1.clone(); let fans = fans1.clone();
let handle_next = handle_next1.clone(); let handle_next = handle_next1.clone();
tokio::spawn(async move { tokio::spawn(async move {
fans.set_curves_to_defaults(profile.into()).await.unwrap(); if fans.set_curves_to_defaults(profile.into()).await.is_err() {
return;
let balanced = fans.fan_curve_data(ThrottlePolicy::Balanced).await.unwrap(); }
let perf = fans let Ok(balanced) = fans
.fan_curve_data(ThrottlePolicy::Balanced)
.await
.map_err(|e| error!("{e:}"))
else {
return;
};
let Ok(perf) = fans
.fan_curve_data(ThrottlePolicy::Performance) .fan_curve_data(ThrottlePolicy::Performance)
.await .await
.unwrap(); .map_err(|e| error!("{e:}"))
let quiet = fans.fan_curve_data(ThrottlePolicy::Quiet).await.unwrap(); else {
return;
};
let Ok(quiet) = fans
.fan_curve_data(ThrottlePolicy::Quiet)
.await
.map_err(|e| error!("{e:}"))
else {
return;
};
update_fan_data(handle_next, balanced, perf, quiet); update_fan_data(handle_next, balanced, perf, quiet);
}); });
}); });
@@ -127,11 +172,15 @@ pub fn setup_fan_curve_page(ui: &MainWindow, _config: Arc<Mutex<Config>>) {
let data: Vec<Node> = data.iter().collect(); let data: Vec<Node> = data.iter().collect();
let data = fan_data_for(fan, enabled, data); let data = fan_data_for(fan, enabled, data);
tokio::spawn(async move { tokio::spawn(async move {
fans.set_fan_curve(profile.into(), data).await.unwrap(); fans.set_fan_curve(profile.into(), data)
.await
.map_err(|e| error!("{e:}"))
.ok()
}); });
}); });
}) })
.unwrap(); .map_err(|e| error!("setup_fan_curve_page: upgrade_in_event_loop: {e:?}"))
.ok();
}); });
} }

View File

@@ -7,3 +7,44 @@ pub mod zbus_platform;
pub mod zbus_slash; pub mod zbus_slash;
pub const VERSION: &str = env!("CARGO_PKG_VERSION"); pub const VERSION: &str = env!("CARGO_PKG_VERSION");
pub fn list_iface_blocking() -> Result<Vec<String>, Box<dyn std::error::Error>> {
let conn = zbus::blocking::Connection::system()?;
let f = zbus::blocking::fdo::ObjectManagerProxy::new(&conn, "org.asuslinux.Daemon", "/")?;
let interfaces = f.get_managed_objects()?;
let mut ifaces = Vec::new();
for v in interfaces.iter() {
for k in v.1.keys() {
ifaces.push(k.to_string());
}
}
Ok(ifaces)
}
pub fn has_iface_blocking(iface: &str) -> Result<bool, Box<dyn std::error::Error>> {
let conn = zbus::blocking::Connection::system()?;
let f = zbus::blocking::fdo::ObjectManagerProxy::new(&conn, "org.asuslinux.Daemon", "/")?;
let interfaces = f.get_managed_objects()?;
for v in interfaces.iter() {
for k in v.1.keys() {
if k.as_str() == iface {
return Ok(true);
}
}
}
Ok(false)
}
pub async fn has_iface(iface: &str) -> Result<bool, Box<dyn std::error::Error>> {
let conn = zbus::Connection::system().await?;
let f = zbus::fdo::ObjectManagerProxy::new(&conn, "org.asuslinux.Daemon", "/").await?;
let interfaces = f.get_managed_objects().await?;
for v in interfaces.iter() {
for k in v.1.keys() {
if k.as_str() == iface {
return Ok(true);
}
}
}
Ok(false)
}

View File

@@ -36,9 +36,6 @@ trait Platform {
/// NextThrottleThermalPolicy method /// NextThrottleThermalPolicy method
fn next_throttle_thermal_policy(&self) -> zbus::Result<()>; fn next_throttle_thermal_policy(&self) -> zbus::Result<()>;
/// SupportedInterfaces method
fn supported_interfaces(&self) -> zbus::Result<Vec<String>>;
/// SupportedProperties method /// SupportedProperties method
fn supported_properties(&self) -> zbus::Result<Vec<Properties>>; fn supported_properties(&self) -> zbus::Result<Vec<Properties>>;