mirror of
https://gitlab.com/asus-linux/asusctl.git
synced 2026-01-22 17:33:19 +01:00
ROGCC: add enable/disable aura options depending on mode
This commit is contained in:
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -1992,7 +1992,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rog_aura"
|
name = "rog_aura"
|
||||||
version = "1.2.0"
|
version = "1.2.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "rog_aura"
|
name = "rog_aura"
|
||||||
version = "1.2.0"
|
version = "1.2.1"
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
authors = ["Luke <luke@ljones.dev>"]
|
authors = ["Luke <luke@ljones.dev>"]
|
||||||
|
|||||||
@@ -346,6 +346,53 @@ impl Default for AuraEffect {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct AuraParameters {
|
||||||
|
pub zone: bool,
|
||||||
|
pub colour1: bool,
|
||||||
|
pub colour2: bool,
|
||||||
|
pub speed: bool,
|
||||||
|
pub direction: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AuraParameters {
|
||||||
|
pub const fn new(
|
||||||
|
zone: bool,
|
||||||
|
colour1: bool,
|
||||||
|
colour2: bool,
|
||||||
|
speed: bool,
|
||||||
|
direction: bool,
|
||||||
|
) -> Self {
|
||||||
|
Self {
|
||||||
|
zone,
|
||||||
|
colour1,
|
||||||
|
colour2,
|
||||||
|
speed,
|
||||||
|
direction,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AuraEffect {
|
||||||
|
/// A helper to provide detail on what effects have which parameters, e.g the static
|
||||||
|
/// factory mode accepts only one colour.
|
||||||
|
pub const fn allowed_parameters(mode: AuraModeNum) -> AuraParameters {
|
||||||
|
match mode {
|
||||||
|
AuraModeNum::Static => AuraParameters::new(true, true, false, false, false),
|
||||||
|
AuraModeNum::Breathe => AuraParameters::new(true, true, true, true, false),
|
||||||
|
AuraModeNum::Strobe => AuraParameters::new(true, false, false, true, false),
|
||||||
|
AuraModeNum::Rainbow => AuraParameters::new(true, false, false, true, true),
|
||||||
|
AuraModeNum::Star => AuraParameters::new(true, true, true, true, true),
|
||||||
|
AuraModeNum::Rain => AuraParameters::new(true, false, false, true, false),
|
||||||
|
AuraModeNum::Highlight => AuraParameters::new(true, true, false, false, false),
|
||||||
|
AuraModeNum::Laser => AuraParameters::new(true, true, false, true, false),
|
||||||
|
AuraModeNum::Ripple => AuraParameters::new(true, true, false, true, false),
|
||||||
|
AuraModeNum::Pulse => AuraParameters::new(true, true, false, false, false),
|
||||||
|
AuraModeNum::Comet => AuraParameters::new(true, true, false, false, false),
|
||||||
|
AuraModeNum::Flash => AuraParameters::new(true, true, false, false, false),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Parses `AuraEffect` in to packet data for writing to the USB interface
|
/// Parses `AuraEffect` in to packet data for writing to the USB interface
|
||||||
///
|
///
|
||||||
/// Byte structure where colour is RGB, one byte per R, G, B:
|
/// Byte structure where colour is RGB, one byte per R, G, B:
|
||||||
|
|||||||
@@ -1,11 +1,4 @@
|
|||||||
use egui::{RichText, Ui};
|
use crate::{widgets::aura_modes_group, RogApp};
|
||||||
use rog_aura::{AuraModeNum, AuraZone, Colour, Speed};
|
|
||||||
use rog_supported::SupportedFunctions;
|
|
||||||
|
|
||||||
use crate::{
|
|
||||||
page_states::{AuraState, PageDataStates},
|
|
||||||
RogApp, RogDbusClientBlocking,
|
|
||||||
};
|
|
||||||
|
|
||||||
impl<'a> RogApp<'a> {
|
impl<'a> RogApp<'a> {
|
||||||
pub fn aura_page(&mut self, ctx: &egui::Context) {
|
pub fn aura_page(&mut self, ctx: &egui::Context) {
|
||||||
@@ -17,174 +10,7 @@ impl<'a> RogApp<'a> {
|
|||||||
} = self;
|
} = self;
|
||||||
|
|
||||||
egui::CentralPanel::default().show(ctx, |ui| {
|
egui::CentralPanel::default().show(ctx, |ui| {
|
||||||
Self::aura_modes(supported, states, dbus, ui);
|
aura_modes_group(supported, states, dbus, ui);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn aura_modes(
|
|
||||||
supported: &SupportedFunctions,
|
|
||||||
states: &mut PageDataStates,
|
|
||||||
dbus: &mut RogDbusClientBlocking,
|
|
||||||
ui: &mut Ui,
|
|
||||||
) {
|
|
||||||
let mut changed = false;
|
|
||||||
let mut selected = states.aura.current_mode;
|
|
||||||
|
|
||||||
let has_keyzones = supported
|
|
||||||
.keyboard_led
|
|
||||||
.multizone_led_mode
|
|
||||||
.contains(&AuraZone::Key2);
|
|
||||||
let has_logo = supported
|
|
||||||
.keyboard_led
|
|
||||||
.multizone_led_mode
|
|
||||||
.contains(&AuraZone::Logo);
|
|
||||||
let has_lightbar = supported
|
|
||||||
.keyboard_led
|
|
||||||
.multizone_led_mode
|
|
||||||
.contains(&AuraZone::BarLeft)
|
|
||||||
|| supported
|
|
||||||
.keyboard_led
|
|
||||||
.multizone_led_mode
|
|
||||||
.contains(&AuraZone::BarRight);
|
|
||||||
|
|
||||||
ui.heading("Aura modes");
|
|
||||||
let mut item = |a: AuraModeNum, ui: &mut Ui| {
|
|
||||||
if ui
|
|
||||||
.selectable_value(&mut selected, a, format!("{:?}", a))
|
|
||||||
.clicked()
|
|
||||||
{
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
ui.horizontal_wrapped(|ui| {
|
|
||||||
for a in states.aura.modes.keys() {
|
|
||||||
item(*a, ui);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// TODO: Need some sort of mapping to enable options only if
|
|
||||||
// they actually work.
|
|
||||||
if let Some(effect) = states.aura.modes.get_mut(&selected) {
|
|
||||||
let mut zone_button = |a: AuraZone, ui: &mut Ui| {
|
|
||||||
ui.selectable_value(&mut effect.zone, a, format!("{:?}", a));
|
|
||||||
};
|
|
||||||
let mut speed_button = |a: Speed, ui: &mut Ui| {
|
|
||||||
ui.selectable_value(&mut effect.speed, a, format!("{:?}", a));
|
|
||||||
};
|
|
||||||
let mut dir_button = |a: rog_aura::Direction, ui: &mut Ui| {
|
|
||||||
ui.selectable_value(&mut effect.direction, a, format!("{:?}", a));
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut c1: [f32; 3] = effect.colour1.into();
|
|
||||||
let mut c2: [f32; 3] = effect.colour2.into();
|
|
||||||
|
|
||||||
ui.separator();
|
|
||||||
ui.horizontal_wrapped(|ui| {
|
|
||||||
ui.vertical(|ui| {
|
|
||||||
let h = 16.0;
|
|
||||||
ui.set_row_height(22.0);
|
|
||||||
if has_keyzones || has_lightbar || has_logo {
|
|
||||||
ui.horizontal_wrapped(|ui| {
|
|
||||||
ui.label(RichText::new("Zone").size(h));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
ui.horizontal_wrapped(|ui| {
|
|
||||||
ui.label(RichText::new("Colour 1").size(h));
|
|
||||||
});
|
|
||||||
ui.horizontal_wrapped(|ui| {
|
|
||||||
ui.label(RichText::new("Colour 2").size(h));
|
|
||||||
});
|
|
||||||
ui.horizontal_wrapped(|ui| {
|
|
||||||
ui.label(RichText::new("Speed").size(h));
|
|
||||||
});
|
|
||||||
ui.horizontal_wrapped(|ui| {
|
|
||||||
ui.label(RichText::new("Direction").size(h));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
ui.vertical(|ui| {
|
|
||||||
ui.set_row_height(22.0);
|
|
||||||
if has_keyzones || has_lightbar || has_logo {
|
|
||||||
ui.horizontal_wrapped(|ui| {
|
|
||||||
zone_button(AuraZone::None, ui);
|
|
||||||
if has_keyzones {
|
|
||||||
zone_button(AuraZone::Key1, ui);
|
|
||||||
zone_button(AuraZone::Key2, ui);
|
|
||||||
zone_button(AuraZone::Key3, ui);
|
|
||||||
zone_button(AuraZone::Key4, ui);
|
|
||||||
}
|
|
||||||
if has_logo {
|
|
||||||
zone_button(AuraZone::Logo, ui);
|
|
||||||
}
|
|
||||||
if has_lightbar {
|
|
||||||
zone_button(AuraZone::BarLeft, ui);
|
|
||||||
zone_button(AuraZone::BarRight, ui);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
egui::color_picker::color_edit_button_rgb(ui, &mut c1);
|
|
||||||
egui::color_picker::color_edit_button_rgb(ui, &mut c2);
|
|
||||||
|
|
||||||
ui.horizontal_wrapped(|ui| {
|
|
||||||
speed_button(Speed::Low, ui);
|
|
||||||
speed_button(Speed::Med, ui);
|
|
||||||
speed_button(Speed::High, ui);
|
|
||||||
});
|
|
||||||
|
|
||||||
ui.horizontal_wrapped(|ui| {
|
|
||||||
dir_button(rog_aura::Direction::Left, ui);
|
|
||||||
dir_button(rog_aura::Direction::Down, ui);
|
|
||||||
dir_button(rog_aura::Direction::Right, ui);
|
|
||||||
dir_button(rog_aura::Direction::Up, ui);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
effect.colour1 = Colour::from(&c1);
|
|
||||||
effect.colour2 = Colour::from(&c2);
|
|
||||||
}
|
|
||||||
|
|
||||||
ui.separator();
|
|
||||||
ui.with_layout(egui::Layout::right_to_left(egui::Align::TOP), |ui| {
|
|
||||||
if ui.add(egui::Button::new("Cancel")).clicked() {
|
|
||||||
let notif = states.aura.was_notified.clone();
|
|
||||||
match AuraState::new(notif, supported, dbus) {
|
|
||||||
Ok(a) => states.aura.modes = a.modes,
|
|
||||||
Err(e) => states.error = Some(e.to_string()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ui.add(egui::Button::new("Apply")).clicked() {
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// egui::TopBottomPanel::bottom("error_bar")
|
|
||||||
// .default_height(26.0)
|
|
||||||
// .show(ctx, |ui| {
|
|
||||||
// ui.with_layout(egui::Layout::right_to_left(egui::Align::TOP), |ui| {
|
|
||||||
// if ui.add(egui::Button::new("Cancel")).clicked() {
|
|
||||||
// let notif = states.aura.was_notified.clone();
|
|
||||||
// states.aura.modes = AuraState::new(notif, supported, dbus).modes;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if ui.add(egui::Button::new("Apply")).clicked() {
|
|
||||||
// changed = true;
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// });
|
|
||||||
|
|
||||||
if changed {
|
|
||||||
states.aura.current_mode = selected;
|
|
||||||
|
|
||||||
dbus.proxies()
|
|
||||||
.led()
|
|
||||||
.set_led_mode(states.aura.modes.get(&selected).unwrap())
|
|
||||||
.map_err(|err| {
|
|
||||||
states.error = Some(err.to_string());
|
|
||||||
})
|
|
||||||
.ok();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
187
rog-control-center/src/widgets/aura_modes.rs
Normal file
187
rog-control-center/src/widgets/aura_modes.rs
Normal file
@@ -0,0 +1,187 @@
|
|||||||
|
use egui::{RichText, Ui};
|
||||||
|
use rog_aura::{AuraEffect, AuraModeNum, AuraZone, Colour, Speed};
|
||||||
|
use rog_supported::SupportedFunctions;
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
page_states::{AuraState, PageDataStates},
|
||||||
|
RogDbusClientBlocking,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn aura_modes_group(
|
||||||
|
supported: &SupportedFunctions,
|
||||||
|
states: &mut PageDataStates,
|
||||||
|
dbus: &mut RogDbusClientBlocking,
|
||||||
|
ui: &mut Ui,
|
||||||
|
) {
|
||||||
|
let mut changed = false;
|
||||||
|
let mut selected = states.aura.current_mode;
|
||||||
|
let allowed = AuraEffect::allowed_parameters(selected);
|
||||||
|
|
||||||
|
let has_keyzones = supported
|
||||||
|
.keyboard_led
|
||||||
|
.multizone_led_mode
|
||||||
|
.contains(&AuraZone::Key2);
|
||||||
|
let has_logo = supported
|
||||||
|
.keyboard_led
|
||||||
|
.multizone_led_mode
|
||||||
|
.contains(&AuraZone::Logo);
|
||||||
|
let has_lightbar = supported
|
||||||
|
.keyboard_led
|
||||||
|
.multizone_led_mode
|
||||||
|
.contains(&AuraZone::BarLeft)
|
||||||
|
|| supported
|
||||||
|
.keyboard_led
|
||||||
|
.multizone_led_mode
|
||||||
|
.contains(&AuraZone::BarRight);
|
||||||
|
|
||||||
|
ui.heading("Aura modes");
|
||||||
|
let mut item = |a: AuraModeNum, ui: &mut Ui| {
|
||||||
|
if ui
|
||||||
|
.selectable_value(&mut selected, a, format!("{:?}", a))
|
||||||
|
.clicked()
|
||||||
|
{
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ui.horizontal_wrapped(|ui| {
|
||||||
|
for a in states.aura.modes.keys() {
|
||||||
|
item(*a, ui);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if let Some(effect) = states.aura.modes.get_mut(&selected) {
|
||||||
|
let mut zone_button = |a: AuraZone, ui: &mut Ui| {
|
||||||
|
ui.selectable_value(&mut effect.zone, a, format!("{:?}", a));
|
||||||
|
};
|
||||||
|
let mut speed_button = |a: Speed, ui: &mut Ui| {
|
||||||
|
ui.selectable_value(&mut effect.speed, a, format!("{:?}", a));
|
||||||
|
};
|
||||||
|
let mut dir_button = |a: rog_aura::Direction, ui: &mut Ui| {
|
||||||
|
ui.selectable_value(&mut effect.direction, a, format!("{:?}", a));
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut c1: [f32; 3] = effect.colour1.into();
|
||||||
|
let mut c2: [f32; 3] = effect.colour2.into();
|
||||||
|
|
||||||
|
ui.separator();
|
||||||
|
ui.horizontal_wrapped(|ui| {
|
||||||
|
ui.vertical(|ui| {
|
||||||
|
let h = 16.0;
|
||||||
|
ui.set_row_height(22.0);
|
||||||
|
if has_keyzones || has_lightbar || has_logo {
|
||||||
|
ui.horizontal_wrapped(|ui| {
|
||||||
|
ui.set_enabled(allowed.zone);
|
||||||
|
ui.label(RichText::new("Zone").size(h));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
ui.horizontal_wrapped(|ui| {
|
||||||
|
ui.set_enabled(allowed.colour1);
|
||||||
|
ui.label(RichText::new("Colour 1").size(h));
|
||||||
|
});
|
||||||
|
|
||||||
|
ui.horizontal_wrapped(|ui| {
|
||||||
|
ui.set_enabled(allowed.colour2);
|
||||||
|
ui.label(RichText::new("Colour 2").size(h));
|
||||||
|
});
|
||||||
|
|
||||||
|
ui.horizontal_wrapped(|ui| {
|
||||||
|
ui.set_enabled(allowed.speed);
|
||||||
|
ui.label(RichText::new("Speed").size(h));
|
||||||
|
});
|
||||||
|
ui.horizontal_wrapped(|ui| {
|
||||||
|
ui.set_enabled(allowed.direction);
|
||||||
|
ui.label(RichText::new("Direction").size(h));
|
||||||
|
});
|
||||||
|
ui.set_enabled(true);
|
||||||
|
});
|
||||||
|
ui.vertical(|ui| {
|
||||||
|
ui.set_row_height(22.0);
|
||||||
|
if has_keyzones || has_lightbar || has_logo {
|
||||||
|
ui.horizontal_wrapped(|ui| {
|
||||||
|
ui.set_enabled(allowed.zone);
|
||||||
|
zone_button(AuraZone::None, ui);
|
||||||
|
if has_keyzones {
|
||||||
|
zone_button(AuraZone::Key1, ui);
|
||||||
|
zone_button(AuraZone::Key2, ui);
|
||||||
|
zone_button(AuraZone::Key3, ui);
|
||||||
|
zone_button(AuraZone::Key4, ui);
|
||||||
|
}
|
||||||
|
if has_logo {
|
||||||
|
zone_button(AuraZone::Logo, ui);
|
||||||
|
}
|
||||||
|
if has_lightbar {
|
||||||
|
zone_button(AuraZone::BarLeft, ui);
|
||||||
|
zone_button(AuraZone::BarRight, ui);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
ui.set_enabled(allowed.colour1);
|
||||||
|
egui::color_picker::color_edit_button_rgb(ui, &mut c1);
|
||||||
|
ui.set_enabled(allowed.colour2);
|
||||||
|
egui::color_picker::color_edit_button_rgb(ui, &mut c2);
|
||||||
|
|
||||||
|
ui.set_enabled(allowed.speed);
|
||||||
|
ui.horizontal_wrapped(|ui| {
|
||||||
|
speed_button(Speed::Low, ui);
|
||||||
|
speed_button(Speed::Med, ui);
|
||||||
|
speed_button(Speed::High, ui);
|
||||||
|
});
|
||||||
|
|
||||||
|
ui.set_enabled(allowed.direction);
|
||||||
|
ui.horizontal_wrapped(|ui| {
|
||||||
|
dir_button(rog_aura::Direction::Left, ui);
|
||||||
|
dir_button(rog_aura::Direction::Down, ui);
|
||||||
|
dir_button(rog_aura::Direction::Right, ui);
|
||||||
|
dir_button(rog_aura::Direction::Up, ui);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
effect.colour1 = Colour::from(&c1);
|
||||||
|
effect.colour2 = Colour::from(&c2);
|
||||||
|
}
|
||||||
|
|
||||||
|
ui.separator();
|
||||||
|
ui.with_layout(egui::Layout::right_to_left(egui::Align::TOP), |ui| {
|
||||||
|
if ui.add(egui::Button::new("Cancel")).clicked() {
|
||||||
|
let notif = states.aura.was_notified.clone();
|
||||||
|
match AuraState::new(notif, supported, dbus) {
|
||||||
|
Ok(a) => states.aura.modes = a.modes,
|
||||||
|
Err(e) => states.error = Some(e.to_string()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ui.add(egui::Button::new("Apply")).clicked() {
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// egui::TopBottomPanel::bottom("error_bar")
|
||||||
|
// .default_height(26.0)
|
||||||
|
// .show(ctx, |ui| {
|
||||||
|
// ui.with_layout(egui::Layout::right_to_left(egui::Align::TOP), |ui| {
|
||||||
|
// if ui.add(egui::Button::new("Cancel")).clicked() {
|
||||||
|
// let notif = states.aura.was_notified.clone();
|
||||||
|
// states.aura.modes = AuraState::new(notif, supported, dbus).modes;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if ui.add(egui::Button::new("Apply")).clicked() {
|
||||||
|
// changed = true;
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
|
||||||
|
if changed {
|
||||||
|
states.aura.current_mode = selected;
|
||||||
|
|
||||||
|
dbus.proxies()
|
||||||
|
.led()
|
||||||
|
.set_led_mode(states.aura.modes.get(&selected).unwrap())
|
||||||
|
.map_err(|err| {
|
||||||
|
states.error = Some(err.to_string());
|
||||||
|
})
|
||||||
|
.ok();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
mod anime_power;
|
mod anime_power;
|
||||||
|
mod aura_modes;
|
||||||
mod aura_power;
|
mod aura_power;
|
||||||
mod fan_graph;
|
mod fan_graph;
|
||||||
mod rog_bios;
|
mod rog_bios;
|
||||||
@@ -6,6 +7,7 @@ mod side_panel;
|
|||||||
mod top_bar;
|
mod top_bar;
|
||||||
|
|
||||||
pub use anime_power::*;
|
pub use anime_power::*;
|
||||||
|
pub use aura_modes::*;
|
||||||
pub use aura_power::*;
|
pub use aura_power::*;
|
||||||
pub use fan_graph::*;
|
pub use fan_graph::*;
|
||||||
pub use rog_bios::*;
|
pub use rog_bios::*;
|
||||||
|
|||||||
Reference in New Issue
Block a user