Compare commits

..

1 Commits

Author SHA1 Message Date
Rob Parker 469d86bbc9 Merge branch 'fix/one-shot-charge-persistence' into 'main'
fix: one-shot charging loses original charge limit after restart

See merge request asus-linux/asusctl!242
2026-01-05 06:32:52 +00:00
12 changed files with 22 additions and 175 deletions
+1 -4
View File
@@ -2,12 +2,9 @@
## [Unreleased] ## [Unreleased]
### Changed
- Added support for TUF keyboard powerstate control
## [6.2.0] ## [6.2.0]
### Changed ## Changed
- Added aura support for FX607V: thanks @jomp16 - Added aura support for FX607V: thanks @jomp16
- Added testing support for G835LW - Added testing support for G835LW
- Added support for GU605C models slash lighting: thanks @Otters - Added support for GU605C models slash lighting: thanks @Otters
+1 -7
View File
@@ -71,13 +71,7 @@ impl AuraZbus {
#[zbus(property)] #[zbus(property)]
async fn set_brightness(&mut self, brightness: LedBrightness) -> Result<(), ZbErr> { async fn set_brightness(&mut self, brightness: LedBrightness) -> Result<(), ZbErr> {
if let Some(bl) = self.0.backlight.as_ref() { if let Some(bl) = self.0.backlight.as_ref() {
let res = bl.lock().await.set_brightness(brightness.into()); return Ok(bl.lock().await.set_brightness(brightness.into())?);
if res.is_ok() {
let mut config = self.0.config.lock().await;
config.brightness = brightness;
config.write();
}
return Ok(res?);
} }
Err(ZbErr::Failed("No sysfs brightness control".to_string())) Err(ZbErr::Failed("No sysfs brightness control".to_string()))
} }
-9
View File
@@ -147,15 +147,6 @@ install -D -m 0644 LICENSE %{buildroot}%{_datadir}/asusctl/LICENSE
desktop-file-validate %{buildroot}%{_datadir}/applications/rog-control-center.desktop desktop-file-validate %{buildroot}%{_datadir}/applications/rog-control-center.desktop
%post
%systemd_post asusd.service
%preun
%systemd_preun asusd.service
%postun
%systemd_postun_with_restart asusd.service
%files %files
%license LICENSE %license LICENSE
%{_bindir}/asusd %{_bindir}/asusd
+14 -21
View File
@@ -64,7 +64,7 @@ pub enum AnimeType {
GA402, GA402,
GU604, GU604,
G635L, G635L,
G835L, G835LW,
#[default] #[default]
Unsupported, Unsupported,
} }
@@ -73,21 +73,14 @@ impl FromStr for AnimeType {
type Err = AnimeError; type Err = AnimeError;
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> { fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
let dmi = s.to_uppercase(); Ok(match s.to_uppercase().as_str() {
"GA401" => Self::GA401,
if dmi.contains("GA401") { "GA402" => Self::GA402,
return Ok(Self::GA401); "GU604" => Self::GU604,
} else if dmi.contains("GA402") { "G635L" => Self::G635L,
return Ok(Self::GA402); "G835LW" => Self::G835LW,
} else if dmi.contains("GU604") { _ => Self::Unsupported,
return Ok(Self::GU604); })
} else if dmi.contains("G635L") {
return Ok(Self::G635L);
} else if dmi.contains("G835L") {
return Ok(Self::G835L);
}
Ok(Self::Unsupported)
} }
} }
@@ -111,7 +104,7 @@ impl AnimeType {
pub fn width(&self) -> usize { pub fn width(&self) -> usize {
match self { match self {
AnimeType::GU604 => 70, AnimeType::GU604 => 70,
AnimeType::G835L => 74, AnimeType::G835LW => 74,
_ => 74, _ => 74,
} }
} }
@@ -121,7 +114,7 @@ impl AnimeType {
match self { match self {
AnimeType::GA401 => 36, AnimeType::GA401 => 36,
AnimeType::GU604 => 43, AnimeType::GU604 => 43,
AnimeType::G835L => 39, AnimeType::G835LW => 39,
_ => 39, _ => 39,
} }
} }
@@ -131,7 +124,7 @@ impl AnimeType {
match self { match self {
AnimeType::GA401 => PANE_LEN * 2, AnimeType::GA401 => PANE_LEN * 2,
AnimeType::GU604 => PANE_LEN * 3, AnimeType::GU604 => PANE_LEN * 3,
AnimeType::G835L => PANE_LEN * 3, AnimeType::G835LW => PANE_LEN * 3,
_ => PANE_LEN * 3, _ => PANE_LEN * 3,
} }
} }
@@ -199,7 +192,7 @@ impl TryFrom<AnimeDataBuffer> for AnimePacketType {
AnimeType::GA402 AnimeType::GA402
| AnimeType::GU604 | AnimeType::GU604
| AnimeType::G635L | AnimeType::G635L
| AnimeType::G835L | AnimeType::G835LW
| AnimeType::Unsupported => { | AnimeType::Unsupported => {
vec![[0; 640]; 3] vec![[0; 640]; 3]
} }
@@ -216,7 +209,7 @@ impl TryFrom<AnimeDataBuffer> for AnimePacketType {
AnimeType::GA402 AnimeType::GA402
| AnimeType::GU604 | AnimeType::GU604
| AnimeType::G635L | AnimeType::G635L
| AnimeType::G835L | AnimeType::G835LW
| AnimeType::Unsupported | AnimeType::Unsupported
) { ) {
buffers[2][..7].copy_from_slice(&USB_PREFIX3); buffers[2][..7].copy_from_slice(&USB_PREFIX3);
-2
View File
@@ -253,8 +253,6 @@ pub fn get_anime_type() -> AnimeType {
AnimeType::GU604 AnimeType::GU604
} else if board_name.contains("G635L") { } else if board_name.contains("G635L") {
AnimeType::G635L AnimeType::G635L
} else if board_name.contains("G835L") {
AnimeType::G835L
} else { } else {
AnimeType::Unsupported AnimeType::Unsupported
} }
+2 -29
View File
@@ -38,16 +38,7 @@
( (
device_name: "FA617NS", device_name: "FA617NS",
product_id: "", product_id: "",
layout_name: "fa507", layout_name: "fx505d",
basic_modes: [Static, Breathe, Pulse],
basic_zones: [],
advanced_type: r#None,
power_zones: [Keyboard],
),
(
device_name: "FA617NT",
product_id: "",
layout_name: "fa507",
basic_modes: [Static, Breathe, Pulse], basic_modes: [Static, Breathe, Pulse],
basic_zones: [], basic_zones: [],
advanced_type: r#None, advanced_type: r#None,
@@ -56,16 +47,7 @@
( (
device_name: "FA617XS", device_name: "FA617XS",
product_id: "", product_id: "",
layout_name: "fa507", layout_name: "fx505d",
basic_modes: [Static, Breathe, Pulse],
basic_zones: [],
advanced_type: r#None,
power_zones: [Keyboard],
),
(
device_name: "FA617XT",
product_id: "",
layout_name: "fa507",
basic_modes: [Static, Breathe, Pulse], basic_modes: [Static, Breathe, Pulse],
basic_zones: [], basic_zones: [],
advanced_type: r#None, advanced_type: r#None,
@@ -314,15 +296,6 @@
advanced_type: r#None, advanced_type: r#None,
power_zones: [Keyboard, Lightbar], power_zones: [Keyboard, Lightbar],
), ),
(
device_name: "G614JU",
product_id: "",
layout_name: "g634j-per-key",
basic_modes: [Static, Breathe, RainbowCycle, RainbowWave, Star, Rain, Highlight, Laser, Ripple, Pulse, Comet, Flash],
basic_zones: [],
advanced_type: PerKey,
power_zones: [Keyboard, Lightbar, Logo],
),
( (
device_name: "G614JZ", device_name: "G614JZ",
product_id: "", product_id: "",
+1 -10
View File
@@ -168,24 +168,15 @@ pub fn setup_fan_curve_page(ui: &MainWindow, _config: Arc<Mutex<Config>>) {
update_fan_data(handle, balanced, perf, quiet); update_fan_data(handle, balanced, perf, quiet);
let choices_for_ui = platform_profile_choices.clone();
let handle_next1 = handle_copy.clone(); let handle_next1 = handle_copy.clone();
if let Err(e) = handle_copy.upgrade_in_event_loop(move |handle| { if let Err(e) = handle_copy.upgrade_in_event_loop(move |handle| {
let global = handle.global::<FanPageData>(); let global = handle.global::<FanPageData>();
let fans1 = fans.clone(); let fans1 = fans.clone();
let choices = choices_for_ui.clone();
global.on_set_profile_default(move |profile| { global.on_set_profile_default(move |profile| {
let fans = fans1.clone(); let fans = fans1.clone();
let handle_next = handle_next1.clone(); let handle_next = handle_next1.clone();
let choices = choices.clone();
tokio::spawn(async move { tokio::spawn(async move {
let mut target: PlatformProfile = profile.into(); if fans.set_curves_to_defaults(profile.into()).await.is_err() {
if target == PlatformProfile::Quiet
&& !choices.contains(&PlatformProfile::Quiet)
{
target = PlatformProfile::LowPower;
}
if fans.set_curves_to_defaults(target).await.is_err() {
return; return;
} }
let Ok(balanced) = fans let Ok(balanced) = fans
-24
View File
@@ -40,10 +40,6 @@ pub fn setup_system_page(ui: &MainWindow, _config: Arc<Mutex<Config>>) {
ui.global::<SystemPageData>().set_platform_profile(-1); ui.global::<SystemPageData>().set_platform_profile(-1);
ui.global::<SystemPageData>().set_panel_overdrive(-1); ui.global::<SystemPageData>().set_panel_overdrive(-1);
ui.global::<SystemPageData>().set_boot_sound(-1); ui.global::<SystemPageData>().set_boot_sound(-1);
ui.global::<SystemPageData>().set_kbd_leds_awake(-1);
ui.global::<SystemPageData>().set_kbd_leds_sleep(-1);
ui.global::<SystemPageData>().set_kbd_leds_boot(-1);
ui.global::<SystemPageData>().set_kbd_leds_shutdown(-1);
ui.global::<SystemPageData>().set_screen_auto_brightness(-1); ui.global::<SystemPageData>().set_screen_auto_brightness(-1);
ui.global::<SystemPageData>().set_mcu_powersave(-1); ui.global::<SystemPageData>().set_mcu_powersave(-1);
ui.global::<SystemPageData>().set_mini_led_mode(-1); ui.global::<SystemPageData>().set_mini_led_mode(-1);
@@ -673,26 +669,6 @@ pub fn setup_system_page_callbacks(ui: &MainWindow, _states: Arc<Mutex<Config>>)
setup_callback!(boot_sound, handle, attr, i32); setup_callback!(boot_sound, handle, attr, i32);
setup_external!(boot_sound, i32, handle, attr, value) setup_external!(boot_sound, i32, handle, attr, value)
} }
FirmwareAttribute::KbdLedsAwake => {
init_property!(kbd_leds_awake, handle, value, i32);
setup_callback!(kbd_leds_awake, handle, attr, i32);
setup_external!(kbd_leds_awake, i32, handle, attr, value)
}
FirmwareAttribute::KbdLedsSleep => {
init_property!(kbd_leds_sleep, handle, value, i32);
setup_callback!(kbd_leds_sleep, handle, attr, i32);
setup_external!(kbd_leds_sleep, i32, handle, attr, value)
}
FirmwareAttribute::KbdLedsBoot => {
init_property!(kbd_leds_boot, handle, value, i32);
setup_callback!(kbd_leds_boot, handle, attr, i32);
setup_external!(kbd_leds_boot, i32, handle, attr, value)
}
FirmwareAttribute::KbdLedsShutdown => {
init_property!(kbd_leds_shutdown, handle, value, i32);
setup_callback!(kbd_leds_shutdown, handle, attr, i32);
setup_external!(kbd_leds_shutdown, i32, handle, attr, value)
}
FirmwareAttribute::ScreenAutoBrightness => { FirmwareAttribute::ScreenAutoBrightness => {
init_property!(screen_auto_brightness, handle, value, i32); init_property!(screen_auto_brightness, handle, value, i32);
setup_callback!(screen_auto_brightness, handle, attr, i32); setup_callback!(screen_auto_brightness, handle, attr, i32);
-46
View File
@@ -51,14 +51,6 @@ export global SystemPageData {
callback cb_panel_overdrive(int); callback cb_panel_overdrive(int);
in-out property <int> boot_sound; in-out property <int> boot_sound;
callback cb_boot_sound(int); callback cb_boot_sound(int);
in-out property <int> kbd_leds_awake;
callback cb_kbd_leds_awake(int);
in-out property <int> kbd_leds_sleep;
callback cb_kbd_leds_sleep(int);
in-out property <int> kbd_leds_boot;
callback cb_kbd_leds_boot(int);
in-out property <int> kbd_leds_shutdown;
callback cb_kbd_leds_shutdown(int);
in-out property <int> screen_auto_brightness; in-out property <int> screen_auto_brightness;
callback cb_screen_auto_brightness(int); callback cb_screen_auto_brightness(int);
in-out property <int> mcu_powersave; in-out property <int> mcu_powersave;
@@ -286,44 +278,6 @@ export component PageSystem inherits Rectangle {
} }
} }
GroupBox {
title: @tr("Keyboard Power Management");
HorizontalLayout {
spacing: 10px;
if SystemPageData.kbd_leds_awake != -1: SystemToggleInt {
text: @tr("Keyboard Awake Effect");
checked_int <=> SystemPageData.kbd_leds_awake;
toggled => {
SystemPageData.cb_kbd_leds_awake(SystemPageData.kbd_leds_awake)
}
}
if SystemPageData.kbd_leds_sleep != -1: SystemToggleInt {
text: @tr("Keyboard Sleep Effect");
checked_int <=> SystemPageData.kbd_leds_sleep;
toggled => {
SystemPageData.cb_kbd_leds_sleep(SystemPageData.kbd_leds_sleep)
}
}
if SystemPageData.kbd_leds_boot != -1: SystemToggleInt {
text: @tr("Keyboard Boot Effect");
checked_int <=> SystemPageData.kbd_leds_boot;
toggled => {
SystemPageData.cb_kbd_leds_boot(SystemPageData.kbd_leds_boot)
}
}
if SystemPageData.kbd_leds_shutdown != -1: SystemToggleInt {
text: @tr("Keyboard Shutdown Effect");
checked_int <=> SystemPageData.kbd_leds_shutdown;
toggled => {
SystemPageData.cb_kbd_leds_shutdown(SystemPageData.kbd_leds_shutdown)
}
}
}
}
HorizontalBox { HorizontalBox {
padding: 0px; padding: 0px;
spacing: 10px; spacing: 10px;
-16
View File
@@ -286,10 +286,6 @@ define_attribute_getters!(
dgpu_tgp, dgpu_tgp,
charge_mode, charge_mode,
boot_sound, boot_sound,
kbd_leds_awake,
kbd_leds_sleep,
kbd_leds_boot,
kbd_leds_shutdown,
mcu_powersave, mcu_powersave,
panel_od, panel_od,
panel_hd_mode, panel_hd_mode,
@@ -346,10 +342,6 @@ pub enum FirmwareAttribute {
PptEnabled = 24, PptEnabled = 24,
None = 25, None = 25,
ScreenAutoBrightness = 26, ScreenAutoBrightness = 26,
KbdLedsAwake = 27,
KbdLedsSleep = 28,
KbdLedsBoot = 29,
KbdLedsShutdown = 30,
} }
impl FirmwareAttribute { impl FirmwareAttribute {
@@ -394,10 +386,6 @@ impl From<&str> for FirmwareAttribute {
"nv_tgp" => Self::DgpuTgp, "nv_tgp" => Self::DgpuTgp,
"charge_mode" => Self::ChargeMode, "charge_mode" => Self::ChargeMode,
"boot_sound" => Self::BootSound, "boot_sound" => Self::BootSound,
"kbd_leds_awake" => Self::KbdLedsAwake,
"kbd_leds_sleep" => Self::KbdLedsSleep,
"kbd_leds_boot" => Self::KbdLedsBoot,
"kbd_leds_shutdown" => Self::KbdLedsShutdown,
"mcu_powersave" => Self::McuPowersave, "mcu_powersave" => Self::McuPowersave,
"panel_overdrive" => Self::PanelOverdrive, "panel_overdrive" => Self::PanelOverdrive,
"panel_hd_mode" => Self::PanelHdMode, "panel_hd_mode" => Self::PanelHdMode,
@@ -443,10 +431,6 @@ impl From<FirmwareAttribute> for &str {
FirmwareAttribute::DgpuDisable => "dgpu_disable", FirmwareAttribute::DgpuDisable => "dgpu_disable",
FirmwareAttribute::GpuMuxMode => "gpu_mux_mode", FirmwareAttribute::GpuMuxMode => "gpu_mux_mode",
FirmwareAttribute::MiniLedMode => "mini_led_mode", FirmwareAttribute::MiniLedMode => "mini_led_mode",
FirmwareAttribute::KbdLedsAwake => "kbd_leds_awake",
FirmwareAttribute::KbdLedsSleep => "kbd_leds_sleep",
FirmwareAttribute::KbdLedsBoot => "kbd_leds_boot",
FirmwareAttribute::KbdLedsShutdown => "kbd_leds_shutdown",
FirmwareAttribute::PendingReboot => "pending_reboot", FirmwareAttribute::PendingReboot => "pending_reboot",
FirmwareAttribute::ScreenAutoBrightness => "screen_auto_brightness", FirmwareAttribute::ScreenAutoBrightness => "screen_auto_brightness",
FirmwareAttribute::None => "none", FirmwareAttribute::None => "none",
+1 -5
View File
@@ -86,7 +86,6 @@ impl FromStr for SlashType {
#[cfg_attr(feature = "dbus", derive(Type, Value, OwnedValue))] #[cfg_attr(feature = "dbus", derive(Type, Value, OwnedValue))]
#[derive(Debug, Default, PartialEq, Eq, Copy, Clone, Deserialize, Serialize)] #[derive(Debug, Default, PartialEq, Eq, Copy, Clone, Deserialize, Serialize)]
pub enum SlashMode { pub enum SlashMode {
Static = 0x06,
Bounce = 0x10, Bounce = 0x10,
Slash = 0x12, Slash = 0x12,
Loading = 0x13, Loading = 0x13,
@@ -110,7 +109,6 @@ impl FromStr for SlashMode {
fn from_str(s: &str) -> Result<Self, SlashError> { fn from_str(s: &str) -> Result<Self, SlashError> {
match s { match s {
"Static" => Ok(SlashMode::Static),
"Bounce" => Ok(SlashMode::Bounce), "Bounce" => Ok(SlashMode::Bounce),
"Slash" => Ok(SlashMode::Slash), "Slash" => Ok(SlashMode::Slash),
"Loading" => Ok(SlashMode::Loading), "Loading" => Ok(SlashMode::Loading),
@@ -134,7 +132,6 @@ impl FromStr for SlashMode {
impl Display for SlashMode { impl Display for SlashMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let str = match &self { let str = match &self {
SlashMode::Static => String::from("Static"),
SlashMode::Bounce => String::from("Bounce"), SlashMode::Bounce => String::from("Bounce"),
SlashMode::Slash => String::from("Slash"), SlashMode::Slash => String::from("Slash"),
SlashMode::Loading => String::from("Loading"), SlashMode::Loading => String::from("Loading"),
@@ -156,9 +153,8 @@ impl Display for SlashMode {
} }
impl SlashMode { impl SlashMode {
pub fn list() -> [String; 16] { pub fn list() -> [String; 15] {
[ [
SlashMode::Static.to_string(),
SlashMode::Bounce.to_string(), SlashMode::Bounce.to_string(),
SlashMode::Slash.to_string(), SlashMode::Slash.to_string(),
SlashMode::Loading.to_string(), SlashMode::Loading.to_string(),
+2 -2
View File
@@ -43,7 +43,7 @@ impl AniMatrix {
vertical: 2, vertical: 2,
horizontal: 5, horizontal: 5,
}, },
AnimeType::GA402 | AnimeType::G635L | AnimeType::G835L | AnimeType::Unsupported => { AnimeType::GA402 | AnimeType::G635L | AnimeType::G835LW | AnimeType::Unsupported => {
LedShape { LedShape {
vertical: 2, vertical: 2,
horizontal: 5, horizontal: 5,
@@ -58,7 +58,7 @@ impl AniMatrix {
// Do a hard mapping of each (derived from wireshardk captures) // Do a hard mapping of each (derived from wireshardk captures)
let rows = match model { let rows = match model {
AnimeType::GA401 => GA401.to_vec(), AnimeType::GA401 => GA401.to_vec(),
AnimeType::GA402 | AnimeType::G635L | AnimeType::G835L | AnimeType::Unsupported => { AnimeType::GA402 | AnimeType::G635L | AnimeType::G835LW | AnimeType::Unsupported => {
GA402.to_vec() GA402.to_vec()
} }
AnimeType::GU604 => GU604.to_vec(), AnimeType::GU604 => GU604.to_vec(),