Begin implmenting keyboard power states

This commit is contained in:
Luke D. Jones
2024-03-09 21:00:16 +13:00
parent efcad3f6f9
commit ca41bd59de
17 changed files with 1224 additions and 473 deletions

View File

@@ -2,11 +2,13 @@ use std::sync::{Arc, Mutex};
use config_traits::StdConfig;
use rog_anime::Animations;
use rog_aura::power::KbAuraPowerState;
use rog_aura::usb::AuraPowerDev;
use rog_dbus::zbus_anime::AnimeProxy;
use rog_dbus::zbus_aura::AuraProxy;
use rog_dbus::zbus_platform::{PlatformProxy, PlatformProxyBlocking};
use rog_platform::platform::Properties;
use slint::{ComponentHandle, Model, RgbaColor, SharedString, Weak};
use slint::{ComponentHandle, Model, ModelRc, RgbaColor, SharedString, Weak};
use zbus::proxy::CacheProperties;
use crate::config::Config;
@@ -63,6 +65,207 @@ impl From<crate::slint_generatedMainWindow::AuraEffect> for rog_aura::AuraEffect
}
}
use crate::slint_generatedMainWindow::AuraDevTuf as SlintAuraDevTuf;
impl From<rog_aura::usb::AuraDevTuf> for SlintAuraDevTuf {
fn from(value: rog_aura::usb::AuraDevTuf) -> Self {
match value {
rog_aura::usb::AuraDevTuf::Boot => SlintAuraDevTuf::Boot,
rog_aura::usb::AuraDevTuf::Awake => SlintAuraDevTuf::Awake,
rog_aura::usb::AuraDevTuf::Sleep => SlintAuraDevTuf::Sleep,
rog_aura::usb::AuraDevTuf::Keyboard => SlintAuraDevTuf::Keyboard,
}
}
}
impl From<SlintAuraDevTuf> for rog_aura::usb::AuraDevTuf {
fn from(value: SlintAuraDevTuf) -> Self {
match value {
SlintAuraDevTuf::Boot => rog_aura::usb::AuraDevTuf::Boot,
SlintAuraDevTuf::Awake => rog_aura::usb::AuraDevTuf::Awake,
SlintAuraDevTuf::Sleep => rog_aura::usb::AuraDevTuf::Sleep,
SlintAuraDevTuf::Keyboard => rog_aura::usb::AuraDevTuf::Keyboard,
}
}
}
use crate::slint_generatedMainWindow::AuraDevRog1 as SlintAuraDevRog1;
impl From<rog_aura::usb::AuraDevRog1> for SlintAuraDevRog1 {
fn from(value: rog_aura::usb::AuraDevRog1) -> Self {
match value {
rog_aura::usb::AuraDevRog1::Awake => SlintAuraDevRog1::Awake,
rog_aura::usb::AuraDevRog1::Keyboard => SlintAuraDevRog1::Keyboard,
rog_aura::usb::AuraDevRog1::Lightbar => SlintAuraDevRog1::Lightbar,
rog_aura::usb::AuraDevRog1::Boot => SlintAuraDevRog1::Boot,
rog_aura::usb::AuraDevRog1::Sleep => SlintAuraDevRog1::Sleep,
}
}
}
impl From<SlintAuraDevRog1> for rog_aura::usb::AuraDevRog1 {
fn from(value: SlintAuraDevRog1) -> Self {
match value {
SlintAuraDevRog1::Awake => rog_aura::usb::AuraDevRog1::Awake,
SlintAuraDevRog1::Keyboard => rog_aura::usb::AuraDevRog1::Keyboard,
SlintAuraDevRog1::Lightbar => rog_aura::usb::AuraDevRog1::Lightbar,
SlintAuraDevRog1::Boot => rog_aura::usb::AuraDevRog1::Boot,
SlintAuraDevRog1::Sleep => rog_aura::usb::AuraDevRog1::Sleep,
}
}
}
use crate::slint_generatedMainWindow::PowerZones as SlintPowerZones;
impl From<rog_aura::aura_detection::PowerZones> for SlintPowerZones {
fn from(value: rog_aura::aura_detection::PowerZones) -> Self {
match value {
rog_aura::aura_detection::PowerZones::Logo => SlintPowerZones::Logo,
rog_aura::aura_detection::PowerZones::Keyboard => SlintPowerZones::Keyboard,
rog_aura::aura_detection::PowerZones::Lightbar => SlintPowerZones::Lightbar,
rog_aura::aura_detection::PowerZones::Lid => SlintPowerZones::Lid,
rog_aura::aura_detection::PowerZones::RearGlow => SlintPowerZones::RearGlow,
}
}
}
impl From<SlintPowerZones> for rog_aura::aura_detection::PowerZones {
fn from(value: SlintPowerZones) -> Self {
match value {
SlintPowerZones::Logo => rog_aura::aura_detection::PowerZones::Logo,
SlintPowerZones::Keyboard => rog_aura::aura_detection::PowerZones::Keyboard,
SlintPowerZones::Lightbar => rog_aura::aura_detection::PowerZones::Lightbar,
SlintPowerZones::Lid => rog_aura::aura_detection::PowerZones::Lid,
SlintPowerZones::RearGlow => rog_aura::aura_detection::PowerZones::RearGlow,
}
}
}
use crate::slint_generatedMainWindow::{
AuraPower as SlintAuraPower, KbAuraPowerState as SlintKbAuraPowerState,
};
impl From<rog_aura::power::AuraPower> for SlintAuraPower {
fn from(value: rog_aura::power::AuraPower) -> Self {
Self {
keyboard: SlintKbAuraPowerState {
awake: value.keyboard.awake,
boot: value.keyboard.boot,
shutdown: value.keyboard.shutdown,
sleep: value.keyboard.sleep,
zone: value.keyboard.zone.into(),
},
lid: SlintKbAuraPowerState {
awake: value.lid.awake,
boot: value.lid.boot,
shutdown: value.lid.shutdown,
sleep: value.lid.sleep,
zone: value.lid.zone.into(),
},
lightbar: SlintKbAuraPowerState {
awake: value.lightbar.awake,
boot: value.lightbar.boot,
shutdown: value.lightbar.shutdown,
sleep: value.lightbar.sleep,
zone: value.lightbar.zone.into(),
},
logo: SlintKbAuraPowerState {
awake: value.logo.awake,
boot: value.logo.boot,
shutdown: value.logo.shutdown,
sleep: value.logo.sleep,
zone: value.logo.zone.into(),
},
rear_glow: SlintKbAuraPowerState {
awake: value.rear_glow.awake,
boot: value.rear_glow.boot,
shutdown: value.rear_glow.shutdown,
sleep: value.rear_glow.sleep,
zone: value.rear_glow.zone.into(),
},
}
}
}
impl From<SlintAuraPower> for rog_aura::power::AuraPower {
fn from(value: SlintAuraPower) -> Self {
Self {
keyboard: KbAuraPowerState {
awake: value.keyboard.awake,
boot: value.keyboard.boot,
shutdown: value.keyboard.shutdown,
sleep: value.keyboard.sleep,
zone: value.keyboard.zone.into(),
},
lid: KbAuraPowerState {
awake: value.lid.awake,
boot: value.lid.boot,
shutdown: value.lid.shutdown,
sleep: value.lid.sleep,
zone: value.lid.zone.into(),
},
lightbar: KbAuraPowerState {
awake: value.lightbar.awake,
boot: value.lightbar.boot,
shutdown: value.lightbar.shutdown,
sleep: value.lightbar.sleep,
zone: value.lightbar.zone.into(),
},
logo: KbAuraPowerState {
awake: value.logo.awake,
boot: value.logo.boot,
shutdown: value.logo.shutdown,
sleep: value.logo.sleep,
zone: value.logo.zone.into(),
},
rear_glow: KbAuraPowerState {
awake: value.rear_glow.awake,
boot: value.rear_glow.boot,
shutdown: value.rear_glow.shutdown,
sleep: value.rear_glow.sleep,
zone: value.rear_glow.zone.into(),
},
}
}
}
use crate::slint_generatedMainWindow::AuraPowerDev as SlintAuraPowerDev;
impl From<rog_aura::usb::AuraPowerDev> for SlintAuraPowerDev {
fn from(value: rog_aura::usb::AuraPowerDev) -> Self {
let tuf: Vec<SlintAuraDevTuf> = value
.tuf
.iter()
.map(|n| SlintAuraDevTuf::from(*n))
.collect();
let old_rog: Vec<SlintAuraDevRog1> = value
.old_rog
.iter()
.map(|n| SlintAuraDevRog1::from(*n))
.collect();
Self {
tuf: ModelRc::from(tuf.as_slice()),
old_rog: ModelRc::from(old_rog.as_slice()),
rog: value.rog.into(),
}
}
}
impl From<SlintAuraPowerDev> for rog_aura::usb::AuraPowerDev {
fn from(value: SlintAuraPowerDev) -> Self {
let tuf: Vec<rog_aura::usb::AuraDevTuf> = value
.tuf
.iter()
.map(|n| rog_aura::usb::AuraDevTuf::from(n))
.collect();
let old_rog: Vec<rog_aura::usb::AuraDevRog1> = value
.old_rog
.iter()
.map(|n| rog_aura::usb::AuraDevRog1::from(n))
.collect();
Self {
tuf,
old_rog,
rog: value.rog.into(),
}
}
}
// This macro expects are consistent naming between proxy calls and slint
// globals
macro_rules! set_ui_props_async {
@@ -429,6 +632,19 @@ fn setup_aura_page(ui: &MainWindow, _states: Arc<Mutex<Config>>) {
set_ui_props_async!(handle, aura, AuraPageData, brightness);
set_ui_props_async!(handle, aura, AuraPageData, led_mode);
set_ui_props_async!(handle, aura, AuraPageData, led_mode_data);
set_ui_props_async!(handle, aura, AuraPageData, led_power);
if let Ok(power) = aura.supported_power_zones().await {
log::debug!("Available LED power modes {power:?}");
let power: Vec<SlintPowerZones> = power.iter().map(|p| (*p).into()).collect();
handle
.upgrade_in_event_loop(move |handle| {
handle
.global::<AuraPageData>()
.set_supported_power_zones(power.as_slice().into());
})
.ok();
}
if let Ok(modes) = aura.supported_basic_modes().await {
log::debug!("Available LED modes {modes:?}");
@@ -459,29 +675,58 @@ fn setup_aura_page(ui: &MainWindow, _states: Arc<Mutex<Config>>) {
.upgrade_in_event_loop(move |handle| {
set_ui_callbacks!(handle,
AuraPageData(.into()),
aura.brightness(.into()),
proxy_copy.brightness(.into()),
"Keyboard LED brightness successfully set to {}",
"Setting keyboard LED brightness failed"
);
set_ui_callbacks!(handle,
AuraPageData(.into()),
aura.led_mode(.into()),
proxy_copy.led_mode(.into()),
"Keyboard LED mode successfully set to {}",
"Setting keyboard LEDmode failed"
);
set_ui_callbacks!(handle,
AuraPageData(.into()),
aura.led_mode_data(.into()),
proxy_copy.led_mode_data(.into()),
"Keyboard LED mode set to {:?}",
"Setting keyboard LED mode failed"
);
// set_ui_callbacks!(handle,
// AuraPageData(.clone().into()),
// proxy_copy.led_power(.into()),
// "Keyboard LED power successfully set to {:?}",
// "Setting keyboard power failed"
// );
handle.invoke_external_colour_change();
})
.ok();
let handle_copy = handle.clone();
let proxy_copy = aura.clone();
handle
.upgrade_in_event_loop(|handle| {
handle
.global::<AuraPageData>()
.on_set_led_power(move |power| {
let handle_copy = handle_copy.clone();
let proxy_copy = aura.clone();
let power: AuraPowerDev = power.into();
tokio::spawn(async move {
show_toast(
"Anime builtin animations changed".into(),
"Failed to set Anime builtin animations".into(),
handle_copy,
proxy_copy.set_led_power(power.into()).await,
);
});
});
})
.unwrap();
// Need to update the UI if the mode changes
let handle_copy = handle.clone();
// spawn required since the while let never exits