mirror of
https://gitlab.com/asus-linux/asusctl.git
synced 2026-01-22 17:33:19 +01:00
Compare commits
34 Commits
6.2.0
...
392436808d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
392436808d | ||
|
|
3d9a08d7e0 | ||
|
|
ff103f98af | ||
|
|
d05182ae64 | ||
|
|
a4957a6eeb | ||
|
|
dda750cf33 | ||
|
|
0b5e04393a | ||
|
|
c9c9a022a4 | ||
|
|
aa063c20fd | ||
|
|
8551908452 | ||
|
|
5ecb174b8f | ||
|
|
fa266bff5b | ||
|
|
f53f1f360f | ||
|
|
da19216b78 | ||
|
|
46efd4190f | ||
|
|
ed3022e25e | ||
|
|
7c10d6c6d9 | ||
|
|
af5f3a5c71 | ||
|
|
7d5ec5f2c7 | ||
|
|
1c8acf6de3 | ||
|
|
7b644e7ad6 | ||
|
|
0f02fe868c | ||
|
|
abd3100e30 | ||
|
|
6f651c2b85 | ||
|
|
93ec5d1bce | ||
|
|
5aea7f51c0 | ||
|
|
3a206eb76f | ||
|
|
4449838282 | ||
|
|
58d740f77a | ||
|
|
f0488d9750 | ||
|
|
f1b9ae6f71 | ||
|
|
db5de3b854 | ||
|
|
7a3d39b8f1 | ||
|
|
7a5d6325c0 |
@@ -2,9 +2,15 @@
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
### Changed
|
||||
- Added support for TUF keyboard powerstate control
|
||||
- Improved AniMe Matrix support thanks to @Seom1177 !
|
||||
- Fixed a bug with one-shot battery change, thanks @bitr8 !
|
||||
|
||||
|
||||
## [6.2.0]
|
||||
|
||||
## Changed
|
||||
### Changed
|
||||
- Added aura support for FX607V: thanks @jomp16
|
||||
- Added testing support for G835LW
|
||||
- Added support for GU605C models slash lighting: thanks @Otters
|
||||
|
||||
@@ -1192,7 +1192,7 @@ fn print_firmware_attr(attr: &AsusArmouryProxyBlocking) -> Result<(), Box<dyn st
|
||||
fn handle_armoury_command(cmd: &ArmouryCommand) -> Result<(), Box<dyn std::error::Error>> {
|
||||
{
|
||||
if cmd.free.is_empty() || (cmd.free.len() % 2 != 0) || cmd.help {
|
||||
const USAGE: &str = "Usage: asusctl platform panel_overdrive 1 nv_dynamic_boost 5";
|
||||
const USAGE: &str = "Usage: asusctl armoury panel_overdrive 1 nv_dynamic_boost 5";
|
||||
if cmd.free.len() % 2 != 0 {
|
||||
println!(
|
||||
"Incorrect number of args, each attribute label must be paired with a setting:"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use config_traits::StdConfig;
|
||||
use log::{debug, error, info};
|
||||
use log::{debug, error, info, warn};
|
||||
use rog_platform::asus_armoury::{AttrValue, Attribute, FirmwareAttribute, FirmwareAttributes};
|
||||
use rog_platform::platform::{PlatformProfile, RogPlatform};
|
||||
use rog_platform::power::AsusPower;
|
||||
@@ -205,7 +205,13 @@ impl crate::Reloadable for AsusArmouryAttribute {
|
||||
self.attr.base_path_exists();
|
||||
e
|
||||
})?;
|
||||
info!("Set {} to {:?}", self.attr.name(), tune);
|
||||
info!(
|
||||
"Restored PPT armoury setting {} to {:?}",
|
||||
self.attr.name(),
|
||||
tune
|
||||
);
|
||||
} else {
|
||||
info!("Ignored restoring PPT armoury setting {} as tuning group is disabled or no saved value", self.attr.name());
|
||||
}
|
||||
} else {
|
||||
// Handle non-PPT attributes (boolean and other settings)
|
||||
@@ -213,7 +219,10 @@ impl crate::Reloadable for AsusArmouryAttribute {
|
||||
self.attr
|
||||
.set_current_value(&AttrValue::Integer(*saved_value))
|
||||
.map_err(|e| {
|
||||
error!("Could not set {} value: {e:?}", self.attr.name());
|
||||
error!(
|
||||
"Error restoring armoury setting {}: {e:?}",
|
||||
self.attr.name()
|
||||
);
|
||||
self.attr.base_path_exists();
|
||||
e
|
||||
})?;
|
||||
@@ -222,6 +231,11 @@ impl crate::Reloadable for AsusArmouryAttribute {
|
||||
self.attr.name(),
|
||||
saved_value
|
||||
);
|
||||
} else {
|
||||
info!(
|
||||
"No saved armoury setting for {}: skipping restore",
|
||||
self.attr.name()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -397,44 +411,44 @@ impl AsusArmouryAttribute {
|
||||
self.attr
|
||||
.set_current_value(&AttrValue::Integer(value))
|
||||
.map_err(|e| {
|
||||
error!("Could not set value: {e:?}");
|
||||
error!(
|
||||
"Could not set value to PPT property {}: {e:?}",
|
||||
self.attr.name()
|
||||
);
|
||||
e
|
||||
})?;
|
||||
} else {
|
||||
warn!(
|
||||
"Tuning group is disabled: skipping setting value to PPT property {}",
|
||||
self.attr.name()
|
||||
);
|
||||
}
|
||||
} else {
|
||||
self.attr
|
||||
.set_current_value(&AttrValue::Integer(value))
|
||||
.map_err(|e| {
|
||||
error!("Could not set value: {e:?}");
|
||||
error!(
|
||||
"Could not set value {value} to attribute {}: {e:?}",
|
||||
self.attr.name()
|
||||
);
|
||||
e
|
||||
})?;
|
||||
|
||||
let has_attr = self
|
||||
.config
|
||||
.lock()
|
||||
.await
|
||||
let mut settings = self.config.lock().await;
|
||||
settings
|
||||
.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);
|
||||
}
|
||||
.entry(self.name())
|
||||
.and_modify(|setting| {
|
||||
debug!("Set config for {} = {value}", self.attr.name());
|
||||
*setting = value;
|
||||
})
|
||||
.or_insert_with(|| {
|
||||
debug!("Adding config for {} = {value}", self.attr.name());
|
||||
value
|
||||
});
|
||||
}
|
||||
|
||||
// write config after setting value
|
||||
self.config.lock().await.write();
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -71,7 +71,13 @@ impl AuraZbus {
|
||||
#[zbus(property)]
|
||||
async fn set_brightness(&mut self, brightness: LedBrightness) -> Result<(), ZbErr> {
|
||||
if let Some(bl) = self.0.backlight.as_ref() {
|
||||
return Ok(bl.lock().await.set_brightness(brightness.into())?);
|
||||
let res = 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()))
|
||||
}
|
||||
|
||||
@@ -8,6 +8,12 @@ use serde::{Deserialize, Serialize};
|
||||
|
||||
const CONFIG_FILE: &str = "asusd.ron";
|
||||
|
||||
/// Default value for base_charge_control_end_threshold when not present in config.
|
||||
/// Returns 0 so restore_charge_limit() skips restoration for upgraded configs.
|
||||
fn default_base_charge_limit() -> u8 {
|
||||
0
|
||||
}
|
||||
|
||||
#[derive(Default, Clone, Deserialize, Serialize, PartialEq)]
|
||||
pub struct Tuning {
|
||||
pub enabled: bool,
|
||||
@@ -19,8 +25,8 @@ type Tunings = HashMap<PlatformProfile, Tuning>;
|
||||
pub struct Config {
|
||||
// The current charge limit applied
|
||||
pub charge_control_end_threshold: u8,
|
||||
/// Save charge limit for restoring
|
||||
#[serde(skip)]
|
||||
/// Save charge limit for restoring after one-shot full charge
|
||||
#[serde(default = "default_base_charge_limit")]
|
||||
pub base_charge_control_end_threshold: u8,
|
||||
pub disable_nvidia_powerd_on_battery: bool,
|
||||
/// An optional command/script to run when power is changed to AC
|
||||
@@ -86,6 +92,9 @@ impl Default for Config {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
charge_control_end_threshold: 100,
|
||||
// NOTE: This is intentionally 100 (not 0 like the serde default).
|
||||
// New installs get 100 (no limit). Upgraded configs missing this
|
||||
// field get 0 via serde, which skips restore_charge_limit().
|
||||
base_charge_control_end_threshold: 100,
|
||||
disable_nvidia_powerd_on_battery: true,
|
||||
ac_command: Default::default(),
|
||||
|
||||
@@ -9,7 +9,7 @@ Environment=IS_SERVICE=1
|
||||
# Reduce noisy span logs while keeping useful debug info for asusd and related crates.
|
||||
# Keep global level at info but allow debug for our crates; silence tracing::span (very noisy)
|
||||
# RUST_LOG format: <module>=<level>,... (levels: error,warn,info,debug,trace)
|
||||
Environment=RUST_LOG="info,asusd=debug,rog_platform=debug,tracing::span=error"
|
||||
Environment=RUST_LOG="info,asusd=debug,rog_platform=debug,tracing::span=error,zbus::object_server=error,zbus::connection::handshake::common=error,zbus::connection::handshake::client=error"
|
||||
# required to prevent init issues with hid_asus and MCU
|
||||
ExecStartPre=/bin/sleep 1
|
||||
ExecStart=/usr/bin/asusd
|
||||
|
||||
@@ -147,6 +147,15 @@ install -D -m 0644 LICENSE %{buildroot}%{_datadir}/asusctl/LICENSE
|
||||
|
||||
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
|
||||
%license LICENSE
|
||||
%{_bindir}/asusd
|
||||
|
||||
@@ -64,7 +64,7 @@ pub enum AnimeType {
|
||||
GA402,
|
||||
GU604,
|
||||
G635L,
|
||||
G835LW,
|
||||
G835L,
|
||||
#[default]
|
||||
Unsupported,
|
||||
}
|
||||
@@ -73,14 +73,21 @@ impl FromStr for AnimeType {
|
||||
type Err = AnimeError;
|
||||
|
||||
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
|
||||
Ok(match s.to_uppercase().as_str() {
|
||||
"GA401" => Self::GA401,
|
||||
"GA402" => Self::GA402,
|
||||
"GU604" => Self::GU604,
|
||||
"G635L" => Self::G635L,
|
||||
"G835LW" => Self::G835LW,
|
||||
_ => Self::Unsupported,
|
||||
})
|
||||
let dmi = s.to_uppercase();
|
||||
|
||||
if dmi.contains("GA401") {
|
||||
return Ok(Self::GA401);
|
||||
} else if dmi.contains("GA402") {
|
||||
return Ok(Self::GA402);
|
||||
} else if dmi.contains("GU604") {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -104,7 +111,7 @@ impl AnimeType {
|
||||
pub fn width(&self) -> usize {
|
||||
match self {
|
||||
AnimeType::GU604 => 70,
|
||||
AnimeType::G835LW => 74,
|
||||
AnimeType::G835L => 74,
|
||||
_ => 74,
|
||||
}
|
||||
}
|
||||
@@ -114,7 +121,7 @@ impl AnimeType {
|
||||
match self {
|
||||
AnimeType::GA401 => 36,
|
||||
AnimeType::GU604 => 43,
|
||||
AnimeType::G835LW => 39,
|
||||
AnimeType::G835L => 39,
|
||||
_ => 39,
|
||||
}
|
||||
}
|
||||
@@ -124,7 +131,7 @@ impl AnimeType {
|
||||
match self {
|
||||
AnimeType::GA401 => PANE_LEN * 2,
|
||||
AnimeType::GU604 => PANE_LEN * 3,
|
||||
AnimeType::G835LW => PANE_LEN * 3,
|
||||
AnimeType::G835L => PANE_LEN * 3,
|
||||
_ => PANE_LEN * 3,
|
||||
}
|
||||
}
|
||||
@@ -192,7 +199,7 @@ impl TryFrom<AnimeDataBuffer> for AnimePacketType {
|
||||
AnimeType::GA402
|
||||
| AnimeType::GU604
|
||||
| AnimeType::G635L
|
||||
| AnimeType::G835LW
|
||||
| AnimeType::G835L
|
||||
| AnimeType::Unsupported => {
|
||||
vec![[0; 640]; 3]
|
||||
}
|
||||
@@ -209,7 +216,7 @@ impl TryFrom<AnimeDataBuffer> for AnimePacketType {
|
||||
AnimeType::GA402
|
||||
| AnimeType::GU604
|
||||
| AnimeType::G635L
|
||||
| AnimeType::G835LW
|
||||
| AnimeType::G835L
|
||||
| AnimeType::Unsupported
|
||||
) {
|
||||
buffers[2][..7].copy_from_slice(&USB_PREFIX3);
|
||||
|
||||
@@ -253,6 +253,8 @@ pub fn get_anime_type() -> AnimeType {
|
||||
AnimeType::GU604
|
||||
} else if board_name.contains("G635L") {
|
||||
AnimeType::G635L
|
||||
} else if board_name.contains("G835L") {
|
||||
AnimeType::G835L
|
||||
} else {
|
||||
AnimeType::Unsupported
|
||||
}
|
||||
|
||||
@@ -38,7 +38,16 @@
|
||||
(
|
||||
device_name: "FA617NS",
|
||||
product_id: "",
|
||||
layout_name: "fx505d",
|
||||
layout_name: "fa507",
|
||||
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_zones: [],
|
||||
advanced_type: r#None,
|
||||
@@ -47,7 +56,16 @@
|
||||
(
|
||||
device_name: "FA617XS",
|
||||
product_id: "",
|
||||
layout_name: "fx505d",
|
||||
layout_name: "fa507",
|
||||
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_zones: [],
|
||||
advanced_type: r#None,
|
||||
@@ -296,6 +314,15 @@
|
||||
advanced_type: r#None,
|
||||
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",
|
||||
product_id: "",
|
||||
|
||||
@@ -168,15 +168,24 @@ pub fn setup_fan_curve_page(ui: &MainWindow, _config: Arc<Mutex<Config>>) {
|
||||
|
||||
update_fan_data(handle, balanced, perf, quiet);
|
||||
|
||||
let choices_for_ui = platform_profile_choices.clone();
|
||||
let handle_next1 = handle_copy.clone();
|
||||
if let Err(e) = handle_copy.upgrade_in_event_loop(move |handle| {
|
||||
let global = handle.global::<FanPageData>();
|
||||
let fans1 = fans.clone();
|
||||
let choices = choices_for_ui.clone();
|
||||
global.on_set_profile_default(move |profile| {
|
||||
let fans = fans1.clone();
|
||||
let handle_next = handle_next1.clone();
|
||||
let choices = choices.clone();
|
||||
tokio::spawn(async move {
|
||||
if fans.set_curves_to_defaults(profile.into()).await.is_err() {
|
||||
let mut target: PlatformProfile = profile.into();
|
||||
if target == PlatformProfile::Quiet
|
||||
&& !choices.contains(&PlatformProfile::Quiet)
|
||||
{
|
||||
target = PlatformProfile::LowPower;
|
||||
}
|
||||
if fans.set_curves_to_defaults(target).await.is_err() {
|
||||
return;
|
||||
}
|
||||
let Ok(balanced) = fans
|
||||
|
||||
@@ -40,6 +40,10 @@ pub fn setup_system_page(ui: &MainWindow, _config: Arc<Mutex<Config>>) {
|
||||
ui.global::<SystemPageData>().set_platform_profile(-1);
|
||||
ui.global::<SystemPageData>().set_panel_overdrive(-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_mcu_powersave(-1);
|
||||
ui.global::<SystemPageData>().set_mini_led_mode(-1);
|
||||
@@ -669,6 +673,26 @@ pub fn setup_system_page_callbacks(ui: &MainWindow, _states: Arc<Mutex<Config>>)
|
||||
setup_callback!(boot_sound, handle, attr, i32);
|
||||
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 => {
|
||||
init_property!(screen_auto_brightness, handle, value, i32);
|
||||
setup_callback!(screen_auto_brightness, handle, attr, i32);
|
||||
|
||||
@@ -51,6 +51,14 @@ export global SystemPageData {
|
||||
callback cb_panel_overdrive(int);
|
||||
in-out property <int> boot_sound;
|
||||
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;
|
||||
callback cb_screen_auto_brightness(int);
|
||||
in-out property <int> mcu_powersave;
|
||||
@@ -278,6 +286,44 @@ 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 {
|
||||
padding: 0px;
|
||||
spacing: 10px;
|
||||
|
||||
@@ -286,6 +286,10 @@ define_attribute_getters!(
|
||||
dgpu_tgp,
|
||||
charge_mode,
|
||||
boot_sound,
|
||||
kbd_leds_awake,
|
||||
kbd_leds_sleep,
|
||||
kbd_leds_boot,
|
||||
kbd_leds_shutdown,
|
||||
mcu_powersave,
|
||||
panel_od,
|
||||
panel_hd_mode,
|
||||
@@ -342,6 +346,10 @@ pub enum FirmwareAttribute {
|
||||
PptEnabled = 24,
|
||||
None = 25,
|
||||
ScreenAutoBrightness = 26,
|
||||
KbdLedsAwake = 27,
|
||||
KbdLedsSleep = 28,
|
||||
KbdLedsBoot = 29,
|
||||
KbdLedsShutdown = 30,
|
||||
}
|
||||
|
||||
impl FirmwareAttribute {
|
||||
@@ -386,6 +394,10 @@ impl From<&str> for FirmwareAttribute {
|
||||
"nv_tgp" => Self::DgpuTgp,
|
||||
"charge_mode" => Self::ChargeMode,
|
||||
"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,
|
||||
"panel_overdrive" => Self::PanelOverdrive,
|
||||
"panel_hd_mode" => Self::PanelHdMode,
|
||||
@@ -431,6 +443,10 @@ impl From<FirmwareAttribute> for &str {
|
||||
FirmwareAttribute::DgpuDisable => "dgpu_disable",
|
||||
FirmwareAttribute::GpuMuxMode => "gpu_mux_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::ScreenAutoBrightness => "screen_auto_brightness",
|
||||
FirmwareAttribute::None => "none",
|
||||
|
||||
@@ -12,12 +12,13 @@ use crate::usb::{PROD_ID1, PROD_ID1_STR, PROD_ID2, PROD_ID2_STR};
|
||||
|
||||
#[derive(Default, Debug, Copy, Clone, PartialEq, Eq, Deserialize, Serialize)]
|
||||
pub enum SlashType {
|
||||
GA403,
|
||||
GA403W,
|
||||
GA605,
|
||||
GU605,
|
||||
GU605C,
|
||||
G614F,
|
||||
GA403_2024,
|
||||
GA403_2025,
|
||||
GA605_2024,
|
||||
GA605_2025,
|
||||
GU605_2024,
|
||||
GU605_2025,
|
||||
G614_2025,
|
||||
#[default]
|
||||
Unsupported,
|
||||
}
|
||||
@@ -25,24 +26,26 @@ pub enum SlashType {
|
||||
impl SlashType {
|
||||
pub const fn prod_id(&self) -> u16 {
|
||||
match self {
|
||||
SlashType::GA403W => PROD_ID2,
|
||||
SlashType::GA403 => PROD_ID1,
|
||||
SlashType::GA605 => PROD_ID2,
|
||||
SlashType::GU605 => PROD_ID1,
|
||||
SlashType::GU605C => PROD_ID2,
|
||||
SlashType::G614F => PROD_ID2,
|
||||
SlashType::GA403_2025 => PROD_ID2,
|
||||
SlashType::GA403_2024 => PROD_ID1,
|
||||
SlashType::GA605_2025 => PROD_ID2,
|
||||
SlashType::GA605_2024 => PROD_ID2,
|
||||
SlashType::GU605_2025 => PROD_ID2,
|
||||
SlashType::GU605_2024 => PROD_ID1,
|
||||
SlashType::G614_2025 => PROD_ID2,
|
||||
SlashType::Unsupported => 0,
|
||||
}
|
||||
}
|
||||
|
||||
pub const fn prod_id_str(&self) -> &str {
|
||||
match self {
|
||||
SlashType::GA403W => PROD_ID2_STR,
|
||||
SlashType::GA403 => PROD_ID1_STR,
|
||||
SlashType::GA605 => PROD_ID2_STR,
|
||||
SlashType::GU605 => PROD_ID1_STR,
|
||||
SlashType::GU605C => PROD_ID2_STR,
|
||||
SlashType::G614F => PROD_ID2_STR,
|
||||
SlashType::GA403_2025 => PROD_ID2_STR,
|
||||
SlashType::GA403_2024 => PROD_ID1_STR,
|
||||
SlashType::GA605_2025 => PROD_ID2_STR,
|
||||
SlashType::GA605_2024 => PROD_ID2_STR,
|
||||
SlashType::GU605_2025 => PROD_ID2_STR,
|
||||
SlashType::GU605_2024 => PROD_ID1_STR,
|
||||
SlashType::G614_2025 => PROD_ID2_STR,
|
||||
SlashType::Unsupported => "",
|
||||
}
|
||||
}
|
||||
@@ -50,17 +53,24 @@ impl SlashType {
|
||||
pub fn from_dmi() -> Self {
|
||||
let board_name = DMIID::new().unwrap_or_default().board_name.to_uppercase();
|
||||
if board_name.contains("G614F") {
|
||||
SlashType::G614F
|
||||
} else if board_name.contains("GA403W") {
|
||||
SlashType::GA403W
|
||||
SlashType::G614_2025
|
||||
} else if [
|
||||
"GA403W", "GA403UH", "GA403UM", "GA403UP",
|
||||
]
|
||||
.iter()
|
||||
.any(|s| board_name.contains(s))
|
||||
{
|
||||
SlashType::GA403_2025
|
||||
} else if board_name.contains("GA403") {
|
||||
SlashType::GA403
|
||||
SlashType::GA403_2024
|
||||
} else if board_name.contains("GA605K") {
|
||||
SlashType::GA605_2025
|
||||
} else if board_name.contains("GA605") {
|
||||
SlashType::GA605
|
||||
SlashType::GA605_2024
|
||||
} else if board_name.contains("GU605C") {
|
||||
SlashType::GU605C
|
||||
SlashType::GU605_2025
|
||||
} else if board_name.contains("GU605") {
|
||||
SlashType::GU605
|
||||
SlashType::GU605_2024
|
||||
} else {
|
||||
SlashType::Unsupported
|
||||
}
|
||||
@@ -72,12 +82,13 @@ impl FromStr for SlashType {
|
||||
|
||||
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
|
||||
Ok(match s.to_uppercase().as_str() {
|
||||
"GA403W" => Self::GA403W,
|
||||
"GA403" => Self::GA403,
|
||||
"GA605" => Self::GA605,
|
||||
"GU605C" => Self::GU605C,
|
||||
"GU605" => Self::GU605,
|
||||
"G614FR" => Self::G614F,
|
||||
"GA403_2025" => Self::GA403_2025,
|
||||
"GA403_2024" => Self::GA403_2024,
|
||||
"GA605_2025" => Self::GA605_2025,
|
||||
"GA605_2024" => Self::GA605_2024,
|
||||
"GU605_2025" => Self::GU605_2025,
|
||||
"GU605_2024" => Self::GU605_2024,
|
||||
"G614_2025" => Self::G614_2025,
|
||||
_ => Self::Unsupported,
|
||||
})
|
||||
}
|
||||
@@ -86,6 +97,7 @@ impl FromStr for SlashType {
|
||||
#[cfg_attr(feature = "dbus", derive(Type, Value, OwnedValue))]
|
||||
#[derive(Debug, Default, PartialEq, Eq, Copy, Clone, Deserialize, Serialize)]
|
||||
pub enum SlashMode {
|
||||
Static = 0x06,
|
||||
Bounce = 0x10,
|
||||
Slash = 0x12,
|
||||
Loading = 0x13,
|
||||
@@ -109,6 +121,7 @@ impl FromStr for SlashMode {
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, SlashError> {
|
||||
match s {
|
||||
"Static" => Ok(SlashMode::Static),
|
||||
"Bounce" => Ok(SlashMode::Bounce),
|
||||
"Slash" => Ok(SlashMode::Slash),
|
||||
"Loading" => Ok(SlashMode::Loading),
|
||||
@@ -132,6 +145,7 @@ impl FromStr for SlashMode {
|
||||
impl Display for SlashMode {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
let str = match &self {
|
||||
SlashMode::Static => String::from("Static"),
|
||||
SlashMode::Bounce => String::from("Bounce"),
|
||||
SlashMode::Slash => String::from("Slash"),
|
||||
SlashMode::Loading => String::from("Loading"),
|
||||
@@ -153,8 +167,9 @@ impl Display for SlashMode {
|
||||
}
|
||||
|
||||
impl SlashMode {
|
||||
pub fn list() -> [String; 15] {
|
||||
pub fn list() -> [String; 16] {
|
||||
[
|
||||
SlashMode::Static.to_string(),
|
||||
SlashMode::Bounce.to_string(),
|
||||
SlashMode::Slash.to_string(),
|
||||
SlashMode::Loading.to_string(),
|
||||
|
||||
@@ -39,17 +39,24 @@ pub fn get_slash_type() -> SlashType {
|
||||
.unwrap_or_default();
|
||||
let board_name = dmi.board_name.to_uppercase();
|
||||
if board_name.contains("G614F") {
|
||||
SlashType::G614F
|
||||
} else if board_name.contains("GA403W") {
|
||||
SlashType::GA403W
|
||||
SlashType::G614_2025
|
||||
} else if [
|
||||
"GA403W", "GA403UH", "GA403UM", "GA403UP",
|
||||
]
|
||||
.iter()
|
||||
.any(|s| board_name.contains(s))
|
||||
{
|
||||
SlashType::GA403_2025
|
||||
} else if board_name.contains("GA403") {
|
||||
SlashType::GA403
|
||||
SlashType::GA403_2024
|
||||
} else if board_name.contains("GA605K") {
|
||||
SlashType::GA605_2025
|
||||
} else if board_name.contains("GA605") {
|
||||
SlashType::GA605
|
||||
SlashType::GA605_2024
|
||||
} else if board_name.contains("GU605C") {
|
||||
SlashType::GU605C
|
||||
SlashType::GU605_2025
|
||||
} else if board_name.contains("GU605") {
|
||||
SlashType::GU605
|
||||
SlashType::GU605_2024
|
||||
} else {
|
||||
SlashType::Unsupported
|
||||
}
|
||||
@@ -57,12 +64,13 @@ pub fn get_slash_type() -> SlashType {
|
||||
|
||||
pub const fn report_id(slash_type: SlashType) -> u8 {
|
||||
match slash_type {
|
||||
SlashType::GA403W => REPORT_ID_19B6,
|
||||
SlashType::GA403 => REPORT_ID_193B,
|
||||
SlashType::GA605 => REPORT_ID_19B6,
|
||||
SlashType::G614F => REPORT_ID_19B6,
|
||||
SlashType::GU605 => REPORT_ID_193B,
|
||||
SlashType::GU605C => REPORT_ID_19B6,
|
||||
SlashType::GA403_2025 => REPORT_ID_19B6,
|
||||
SlashType::GA403_2024 => REPORT_ID_193B,
|
||||
SlashType::GA605_2025 => REPORT_ID_19B6,
|
||||
SlashType::GA605_2024 => REPORT_ID_19B6,
|
||||
SlashType::GU605_2025 => REPORT_ID_19B6,
|
||||
SlashType::GU605_2024 => REPORT_ID_193B,
|
||||
SlashType::G614_2025 => REPORT_ID_19B6,
|
||||
SlashType::Unsupported => REPORT_ID_19B6,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ impl AniMatrix {
|
||||
vertical: 2,
|
||||
horizontal: 5,
|
||||
},
|
||||
AnimeType::GA402 | AnimeType::G635L | AnimeType::G835LW | AnimeType::Unsupported => {
|
||||
AnimeType::GA402 | AnimeType::G635L | AnimeType::G835L | AnimeType::Unsupported => {
|
||||
LedShape {
|
||||
vertical: 2,
|
||||
horizontal: 5,
|
||||
@@ -58,7 +58,7 @@ impl AniMatrix {
|
||||
// Do a hard mapping of each (derived from wireshardk captures)
|
||||
let rows = match model {
|
||||
AnimeType::GA401 => GA401.to_vec(),
|
||||
AnimeType::GA402 | AnimeType::G635L | AnimeType::G835LW | AnimeType::Unsupported => {
|
||||
AnimeType::GA402 | AnimeType::G635L | AnimeType::G835L | AnimeType::Unsupported => {
|
||||
GA402.to_vec()
|
||||
}
|
||||
AnimeType::GU604 => GU604.to_vec(),
|
||||
|
||||
Reference in New Issue
Block a user