mirror of
https://gitlab.com/asus-linux/asusctl.git
synced 2026-02-06 00:15:04 +01:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ec5e6d2e7c | |||
| 5600c51ba0 | |||
| cb5856c4dc | |||
| aad6f6350b | |||
| 1ec45a6449 | |||
| bb612283fe | |||
| bcba11d4ec | |||
| 7eab94bc7f | |||
| e73bbedb41 | |||
| a83ccbd33d | |||
| b5b7799018 | |||
| 24ecb92621 |
Executable
+12
@@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo '+cargo +nightly fmt --all -- --check'
|
||||||
|
cargo +nightly fmt --all -- --check
|
||||||
|
echo '+cargo clippy --all -- -D warnings'
|
||||||
|
cargo clippy --all -- -D warnings
|
||||||
|
echo '+cargo test --all'
|
||||||
|
cargo test --all
|
||||||
|
echo '+cargo cranky'
|
||||||
|
cargo cranky
|
||||||
Executable
+10
@@ -0,0 +1,10 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo '+cargo +nightly fmt --all -- --check'
|
||||||
|
cargo +nightly fmt --all -- --check
|
||||||
|
echo '+cargo clippy --all -- -D warnings'
|
||||||
|
cargo clippy --all -- -D warnings
|
||||||
|
echo '+cargo cranky'
|
||||||
|
cargo cranky
|
||||||
+29
-8
@@ -1,15 +1,15 @@
|
|||||||
image: rust:latest
|
image: rust:latest
|
||||||
|
|
||||||
cache:
|
.rust_cache: &rust_cache
|
||||||
key: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG"
|
cache:
|
||||||
paths:
|
# key: $CI_COMMIT_REF_SLUG
|
||||||
|
paths:
|
||||||
# Don't include `incremental` to save space
|
# Don't include `incremental` to save space
|
||||||
# Debug
|
# Debug
|
||||||
- target/debug/build/
|
- target/debug/build/
|
||||||
- target/debug/deps/
|
- target/debug/deps/
|
||||||
- target/debug/.fingerprint/
|
- target/debug/.fingerprint/
|
||||||
- target/debug/.cargo-lock
|
- target/debug/.cargo-lock
|
||||||
- target/debug/df_storyteller
|
|
||||||
# Release
|
# Release
|
||||||
- target/release/build/
|
- target/release/build/
|
||||||
- target/release/deps/
|
- target/release/deps/
|
||||||
@@ -20,14 +20,16 @@ before_script:
|
|||||||
- apt-get update -qq && apt-get install -y -qq libudev-dev libgtk-3-dev grep llvm clang libclang-dev
|
- apt-get update -qq && apt-get install -y -qq libudev-dev libgtk-3-dev grep llvm clang libclang-dev
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
- format
|
- format
|
||||||
- check
|
- check
|
||||||
- test
|
- test
|
||||||
- release
|
- release
|
||||||
|
- deploy
|
||||||
|
|
||||||
format:
|
format:
|
||||||
except:
|
except:
|
||||||
- tags
|
- tags
|
||||||
|
<<: *rust_cache
|
||||||
script:
|
script:
|
||||||
- echo "nightly" > rust-toolchain
|
- echo "nightly" > rust-toolchain
|
||||||
- rustup component add rustfmt
|
- rustup component add rustfmt
|
||||||
@@ -36,6 +38,7 @@ format:
|
|||||||
check:
|
check:
|
||||||
except:
|
except:
|
||||||
- tags
|
- tags
|
||||||
|
<<: *rust_cache
|
||||||
script:
|
script:
|
||||||
- rustup component add clippy
|
- rustup component add clippy
|
||||||
- cargo check
|
- cargo check
|
||||||
@@ -46,12 +49,15 @@ check:
|
|||||||
test:
|
test:
|
||||||
except:
|
except:
|
||||||
- tags
|
- tags
|
||||||
|
<<: *rust_cache
|
||||||
script:
|
script:
|
||||||
|
- mkdir -p .git/hooks > /dev/null
|
||||||
- cargo test
|
- cargo test
|
||||||
|
|
||||||
release:
|
release:
|
||||||
only:
|
only:
|
||||||
- tags
|
- tags
|
||||||
|
<<: *rust_cache
|
||||||
script:
|
script:
|
||||||
- make && make vendor
|
- make && make vendor
|
||||||
artifacts:
|
artifacts:
|
||||||
@@ -59,5 +65,20 @@ release:
|
|||||||
- vendor_asusctl_*.tar.xz
|
- vendor_asusctl_*.tar.xz
|
||||||
- cargo-config
|
- cargo-config
|
||||||
|
|
||||||
|
pages:
|
||||||
|
stage: deploy
|
||||||
|
only:
|
||||||
|
- tags
|
||||||
|
<<: *rust_cache
|
||||||
|
script:
|
||||||
|
- cargo doc --document-private-items --no-deps --workspace
|
||||||
|
- rm -rf public
|
||||||
|
- mkdir public
|
||||||
|
- cp -R target/doc/* public
|
||||||
|
- cp misc/index.html public
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- public
|
||||||
|
|
||||||
variables:
|
variables:
|
||||||
GIT_SUBMODULE_STRATEGY: normal
|
GIT_SUBMODULE_STRATEGY: normal
|
||||||
|
|||||||
@@ -5,8 +5,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [v4.6.0]
|
||||||
### Added
|
### Added
|
||||||
- Support for GL703GE keyboard layout
|
- Support for GL703GE keyboard layout
|
||||||
|
- Support for G533Z modes and keyboard layout
|
||||||
### Changed
|
### Changed
|
||||||
- Better handling of `/etc/asusd` not existing
|
- Better handling of `/etc/asusd` not existing
|
||||||
- Better handling of non-existant config files
|
- Better handling of non-existant config files
|
||||||
@@ -20,6 +23,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
- ROGCC: Add CLI opt for viewing all layout files + filenames to help find a layout matching your laptop
|
- ROGCC: Add CLI opt for viewing all layout files + filenames to help find a layout matching your laptop
|
||||||
+ Both of these options would hopefully be temporary and replaced with a "wizard" GUI helper
|
+ Both of these options would hopefully be temporary and replaced with a "wizard" GUI helper
|
||||||
- Fix profile controller not detecting if platform_profile is changed
|
- Fix profile controller not detecting if platform_profile is changed
|
||||||
|
- Fix remove the leftover initial config writes on `new()` for some controllers to prevent resetting settings on startup
|
||||||
|
+ refactor the loading of systemd curve defaults and config file
|
||||||
### BREAKING
|
### BREAKING
|
||||||
- Rename aura dbus method from `per_key_raw` to `direct_addressing_raw` and add doc comment
|
- Rename aura dbus method from `per_key_raw` to `direct_addressing_raw` and add doc comment
|
||||||
- Changes to aura.conf:
|
- Changes to aura.conf:
|
||||||
|
|||||||
Generated
+311
-268
File diff suppressed because it is too large
Load Diff
+6
-1
@@ -2,7 +2,7 @@
|
|||||||
members = ["asusctl", "config-traits", "daemon", "daemon-user", "rog-platform", "rog-dbus", "rog-anime", "rog-aura", "rog-profiles", "rog-control-center"]
|
members = ["asusctl", "config-traits", "daemon", "daemon-user", "rog-platform", "rog-dbus", "rog-anime", "rog-aura", "rog-profiles", "rog-control-center"]
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
version = "4.6.0-rc1"
|
version = "4.6.0"
|
||||||
|
|
||||||
[workspace.dependencies]
|
[workspace.dependencies]
|
||||||
async-trait = "^0.1"
|
async-trait = "^0.1"
|
||||||
@@ -52,3 +52,8 @@ opt-level = 1
|
|||||||
[profile.bench]
|
[profile.bench]
|
||||||
debug = false
|
debug = false
|
||||||
opt-level = 3
|
opt-level = 3
|
||||||
|
|
||||||
|
[workspace.dependencies.cargo-husky]
|
||||||
|
version = "1"
|
||||||
|
default-features = false
|
||||||
|
features = ["user-hooks"]
|
||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
# https://github.com/ericseppanen/cargo-cranky
|
# https://github.com/ericseppanen/cargo-cranky
|
||||||
# cargo install cargo-cranky && cargo cranky
|
# cargo install cargo-cranky && cargo cranky
|
||||||
|
|
||||||
warn = [
|
error = [
|
||||||
"clippy::all",
|
"clippy::all",
|
||||||
"clippy::await_holding_lock",
|
"clippy::await_holding_lock",
|
||||||
"clippy::bool_to_int_with_if",
|
"clippy::bool_to_int_with_if",
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ Requirements are rust >= 1.57 installed from rustup.io if the distro provided ve
|
|||||||
|
|
||||||
**popos (unsuported):**
|
**popos (unsuported):**
|
||||||
|
|
||||||
sudo apt install cmake libclang-dev libudev-dev libgtk-3-dev ibclang-dev libglib2.0-dev libatkmm-1.6-dev libpangomm-1.4-dev librust-gdk-pixbuf-dev
|
sudo apt install cmake libclang-dev libudev-dev libgtk-3-dev libclang-dev libglib2.0-dev libatkmm-1.6-dev libpangomm-1.4-dev librust-gdk-pixbuf-dev
|
||||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
|
||||||
source "$HOME/.cargo/env"
|
source "$HOME/.cargo/env"
|
||||||
make
|
make
|
||||||
@@ -91,7 +91,7 @@ Requirements are rust >= 1.57 installed from rustup.io if the distro provided ve
|
|||||||
|
|
||||||
**fedora:**
|
**fedora:**
|
||||||
|
|
||||||
dnf install cmake clang-devel systemd-devel glib2-devel cairo-devel atkmm-devel pangomm-devel gdk-pixbuf-devel gtk3-devel libappindicator-gtk3
|
dnf install cmake clang-devel systemd-devel glib2-devel cairo-devel atkmm-devel pangomm-devel gdk-pixbuf2-devel gtk3-devel libappindicator-gtk3
|
||||||
make
|
make
|
||||||
sudo make install
|
sudo make install
|
||||||
|
|
||||||
@@ -100,7 +100,7 @@ Requirements are rust >= 1.57 installed from rustup.io if the distro provided ve
|
|||||||
Works with KDE Plasma (without GTK packages)
|
Works with KDE Plasma (without GTK packages)
|
||||||
|
|
||||||
zypper in -t pattern devel_basis
|
zypper in -t pattern devel_basis
|
||||||
zypper in rustup cmake clang-devel systemd-devel glib2-devel cairo-devel atkmm-devel pangomm-devel gdk-pixbuf-devel gtk3-devel
|
zypper in rustup make cmake systemd-devel clang-devel llvm-devel gdk-pixbuf-devel cairo-devel pango-devel freetype-devel gtk3-devel libexpat-devel libayatana-indicator3-7
|
||||||
make
|
make
|
||||||
sudo make install
|
sudo make install
|
||||||
|
|
||||||
@@ -126,6 +126,10 @@ You may also need to activate the service for debian install. If running Pop!_OS
|
|||||||
|
|
||||||
Run `sudo make uninstall` in the source repo, and remove `/etc/asusd/`.
|
Run `sudo make uninstall` in the source repo, and remove `/etc/asusd/`.
|
||||||
|
|
||||||
|
# Contributing
|
||||||
|
|
||||||
|
See `CONTRIBUTING.md`. Additionally, also do `cargo clean` and `cargo test` on first checkout to ensure the commit hooks are used (via `cargo-husky`).
|
||||||
|
|
||||||
# OTHER
|
# OTHER
|
||||||
|
|
||||||
## Supporting more laptops
|
## Supporting more laptops
|
||||||
|
|||||||
@@ -22,3 +22,5 @@ gif.workspace = true
|
|||||||
tinybmp.workspace = true
|
tinybmp.workspace = true
|
||||||
glam.workspace = true
|
glam.workspace = true
|
||||||
rog_dbus = { path = "../rog-dbus" }
|
rog_dbus = { path = "../rog-dbus" }
|
||||||
|
|
||||||
|
cargo-husky.workspace = true
|
||||||
+11
-13
@@ -36,15 +36,14 @@ fn main() {
|
|||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
eprintln!("source {}", err);
|
panic!("source {}", err);
|
||||||
std::process::exit(2);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let (dbus, _) = RogDbusClientBlocking::new()
|
let (dbus, _) = RogDbusClientBlocking::new()
|
||||||
.map_err(|e| {
|
.map_err(|e| {
|
||||||
print_error_help(&e, None);
|
print_error_help(&e, None);
|
||||||
std::process::exit(3);
|
panic!("Could not start dbus client");
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
@@ -54,7 +53,7 @@ fn main() {
|
|||||||
.supported_functions()
|
.supported_functions()
|
||||||
.map_err(|e| {
|
.map_err(|e| {
|
||||||
print_error_help(&e, None);
|
print_error_help(&e, None);
|
||||||
std::process::exit(4);
|
panic!("Could not start dbus proxy");
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
@@ -260,7 +259,7 @@ fn handle_anime(
|
|||||||
if let Some(lst) = image.self_command_list() {
|
if let Some(lst) = image.self_command_list() {
|
||||||
println!("\n{}", lst);
|
println!("\n{}", lst);
|
||||||
}
|
}
|
||||||
std::process::exit(1);
|
return Ok(());
|
||||||
}
|
}
|
||||||
verify_brightness(image.bright);
|
verify_brightness(image.bright);
|
||||||
|
|
||||||
@@ -283,7 +282,7 @@ fn handle_anime(
|
|||||||
if let Some(lst) = image.self_command_list() {
|
if let Some(lst) = image.self_command_list() {
|
||||||
println!("\n{}", lst);
|
println!("\n{}", lst);
|
||||||
}
|
}
|
||||||
std::process::exit(1);
|
return Ok(());
|
||||||
}
|
}
|
||||||
verify_brightness(image.bright);
|
verify_brightness(image.bright);
|
||||||
|
|
||||||
@@ -304,7 +303,7 @@ fn handle_anime(
|
|||||||
if let Some(lst) = gif.self_command_list() {
|
if let Some(lst) = gif.self_command_list() {
|
||||||
println!("\n{}", lst);
|
println!("\n{}", lst);
|
||||||
}
|
}
|
||||||
std::process::exit(1);
|
return Ok(());
|
||||||
}
|
}
|
||||||
verify_brightness(gif.bright);
|
verify_brightness(gif.bright);
|
||||||
|
|
||||||
@@ -338,7 +337,7 @@ fn handle_anime(
|
|||||||
if let Some(lst) = gif.self_command_list() {
|
if let Some(lst) = gif.self_command_list() {
|
||||||
println!("\n{}", lst);
|
println!("\n{}", lst);
|
||||||
}
|
}
|
||||||
std::process::exit(1);
|
return Ok(());
|
||||||
}
|
}
|
||||||
verify_brightness(gif.bright);
|
verify_brightness(gif.bright);
|
||||||
|
|
||||||
@@ -374,7 +373,6 @@ fn verify_brightness(brightness: f32) {
|
|||||||
"Image and global brightness must be between 0.0 and 1.0 (inclusive), was {}",
|
"Image and global brightness must be between 0.0 and 1.0 (inclusive), was {}",
|
||||||
brightness
|
brightness
|
||||||
);
|
);
|
||||||
std::process::exit(1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -391,7 +389,7 @@ fn handle_led_mode(
|
|||||||
println!("Commands available");
|
println!("Commands available");
|
||||||
|
|
||||||
if let Some(cmdlist) = LedModeCommand::command_list() {
|
if let Some(cmdlist) = LedModeCommand::command_list() {
|
||||||
let commands: Vec<String> = cmdlist.lines().map(|s| s.to_string()).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| {
|
||||||
for mode in &supported.basic_modes {
|
for mode in &supported.basic_modes {
|
||||||
if command
|
if command
|
||||||
@@ -662,7 +660,7 @@ fn handle_profile(
|
|||||||
if let Some(lst) = cmd.self_command_list() {
|
if let Some(lst) = cmd.self_command_list() {
|
||||||
println!("\n{}", lst);
|
println!("\n{}", lst);
|
||||||
}
|
}
|
||||||
std::process::exit(1);
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
if cmd.next {
|
if cmd.next {
|
||||||
@@ -706,14 +704,14 @@ fn handle_fan_curve(
|
|||||||
if let Some(lst) = cmd.self_command_list() {
|
if let Some(lst) = cmd.self_command_list() {
|
||||||
println!("\n{}", lst);
|
println!("\n{}", lst);
|
||||||
}
|
}
|
||||||
std::process::exit(1);
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmd.enabled.is_some() || cmd.fan.is_some() || cmd.data.is_some())
|
if (cmd.enabled.is_some() || cmd.fan.is_some() || cmd.data.is_some())
|
||||||
&& cmd.mod_profile.is_none()
|
&& cmd.mod_profile.is_none()
|
||||||
{
|
{
|
||||||
println!("--enabled, --fan, and --data options require --mod-profile");
|
println!("--enabled, --fan, and --data options require --mod-profile");
|
||||||
std::process::exit(666);
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
if cmd.get_enabled {
|
if cmd.get_enabled {
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "config-traits"
|
name = "config-traits"
|
||||||
version = "0.1.0"
|
license = "MPL-2.0"
|
||||||
|
authors = ["Luke D Jones <luke@ljones.dev>"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
version.workspace = true
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
serde.workspace = true
|
serde.workspace = true
|
||||||
@@ -13,3 +13,6 @@ toml.workspace = true
|
|||||||
ron.workspace = true
|
ron.workspace = true
|
||||||
|
|
||||||
log.workspace = true
|
log.workspace = true
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
cargo-husky.workspace = true
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
# config-traits
|
||||||
|
|
||||||
|
`config_traits` is a crate that broke out from the requirement to manage various
|
||||||
|
different config files, including parsing from different formats and updating
|
||||||
|
them from previous versions where fields or names are changed in some way.
|
||||||
|
|
||||||
|
The end canonical file format is `.ron` as this supports rust types well, and includes
|
||||||
|
the ability to add commenting, and is less verbose than `json`. Currently the crate will
|
||||||
|
also try to parse from `json` and `toml` if the `ron` parsing fails, then update to `ron`
|
||||||
|
format.
|
||||||
+38
-27
@@ -1,4 +1,14 @@
|
|||||||
use std::fs::{create_dir, File, OpenOptions};
|
//! `config_traits` is a crate that broke out from the requirement to manage
|
||||||
|
//! various different config files, including parsing from different formats and
|
||||||
|
//! updating them from previous versions where fields or names are changed in
|
||||||
|
//! some way.
|
||||||
|
//!
|
||||||
|
//! The end canonical file format is `.ron` as this supports rust types well,
|
||||||
|
//! and includes the ability to add commenting, and is less verbose than `json`.
|
||||||
|
//! Currently the crate will also try to parse from `json` and `toml` if the
|
||||||
|
//! `ron` parsing fails, then update to `ron` format.
|
||||||
|
|
||||||
|
use std::fs::{self, create_dir, File, OpenOptions};
|
||||||
use std::io::{Read, Write};
|
use std::io::{Read, Write};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
@@ -49,7 +59,7 @@ where
|
|||||||
"Could not rename. Please remove {} then restart service: Error {}",
|
"Could not rename. Please remove {} then restart service: Error {}",
|
||||||
self.file_name(),
|
self.file_name(),
|
||||||
err
|
err
|
||||||
)
|
);
|
||||||
});
|
});
|
||||||
do_rename = false;
|
do_rename = false;
|
||||||
}
|
}
|
||||||
@@ -68,7 +78,7 @@ where
|
|||||||
"Could not rename. Please remove {} then restart service: Error {}",
|
"Could not rename. Please remove {} then restart service: Error {}",
|
||||||
self.file_name(),
|
self.file_name(),
|
||||||
err
|
err
|
||||||
)
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
config
|
config
|
||||||
@@ -88,18 +98,10 @@ where
|
|||||||
|
|
||||||
/// Open and parse the config file to self from ron format
|
/// Open and parse the config file to self from ron format
|
||||||
fn read(&mut self) {
|
fn read(&mut self) {
|
||||||
let mut file = match OpenOptions::new().read(true).open(self.file_path()) {
|
if let Ok(data) = fs::read_to_string(self.file_path()) {
|
||||||
Ok(data) => data,
|
if data.is_empty() {
|
||||||
Err(err) => {
|
|
||||||
error!("Error reading {:?}: {}", self.file_path(), err);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let mut buf = String::new();
|
|
||||||
if let Ok(l) = file.read_to_string(&mut buf) {
|
|
||||||
if l == 0 {
|
|
||||||
warn!("File is empty {:?}", self.file_path());
|
warn!("File is empty {:?}", self.file_path());
|
||||||
} else if let Ok(data) = ron::from_str(&buf) {
|
} else if let Ok(data) = ron::from_str(&data) {
|
||||||
*self = data;
|
*self = data;
|
||||||
} else {
|
} else {
|
||||||
warn!("Could not deserialise {:?}", self.file_path());
|
warn!("Could not deserialise {:?}", self.file_path());
|
||||||
@@ -137,13 +139,14 @@ where
|
|||||||
self.file_name(),
|
self.file_name(),
|
||||||
self.file_name()
|
self.file_name()
|
||||||
);
|
);
|
||||||
let cfg_old = self.file_path().to_string_lossy().to_string() + "-old";
|
let mut cfg_old = self.file_path().to_string_lossy().to_string();
|
||||||
|
cfg_old.push_str("-old");
|
||||||
std::fs::rename(self.file_path(), cfg_old).unwrap_or_else(|err| {
|
std::fs::rename(self.file_path(), cfg_old).unwrap_or_else(|err| {
|
||||||
error!(
|
error!(
|
||||||
"Could not rename. Please remove {} then restart service: Error {}",
|
"Could not rename. Please remove {} then restart service: Error {}",
|
||||||
self.file_name(),
|
self.file_name(),
|
||||||
err
|
err
|
||||||
)
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -160,13 +163,13 @@ macro_rules! std_config_load {
|
|||||||
/// use serde::{Deserialize, Serialize};
|
/// use serde::{Deserialize, Serialize};
|
||||||
/// use config_traits::{StdConfig, StdConfigLoad2};
|
/// use config_traits::{StdConfig, StdConfigLoad2};
|
||||||
///
|
///
|
||||||
/// #[derive(Deserialize, Serialize)]
|
/// #[derive(Deserialize, Serialize, Debug)]
|
||||||
/// struct FanCurveConfigOld {}
|
/// struct FanCurveConfigOld {}
|
||||||
///
|
///
|
||||||
/// #[derive(Deserialize, Serialize)]
|
/// #[derive(Deserialize, Serialize, Debug)]
|
||||||
/// struct FanCurveConfigOlder {}
|
/// struct FanCurveConfigOlder {}
|
||||||
///
|
///
|
||||||
/// #[derive(Deserialize, Serialize)]
|
/// #[derive(Deserialize, Serialize, Debug)]
|
||||||
/// struct FanCurveConfig {}
|
/// struct FanCurveConfig {}
|
||||||
///
|
///
|
||||||
/// impl From<FanCurveConfigOld> for FanCurveConfig {
|
/// impl From<FanCurveConfigOld> for FanCurveConfig {
|
||||||
@@ -192,7 +195,7 @@ macro_rules! std_config_load {
|
|||||||
/// new one created
|
/// new one created
|
||||||
pub trait $trait_name<$($generic),*>
|
pub trait $trait_name<$($generic),*>
|
||||||
where
|
where
|
||||||
Self: $crate::StdConfig + DeserializeOwned + Serialize,
|
Self: $crate::StdConfig +std::fmt::Debug + DeserializeOwned + Serialize,
|
||||||
$($generic: DeserializeOwned + Into<Self>),*
|
$($generic: DeserializeOwned + Into<Self>),*
|
||||||
{
|
{
|
||||||
fn load(mut self) -> Self {
|
fn load(mut self) -> Self {
|
||||||
@@ -202,14 +205,22 @@ macro_rules! std_config_load {
|
|||||||
if read_len != 0 {
|
if read_len != 0 {
|
||||||
if let Ok(data) = ron::from_str(&buf) {
|
if let Ok(data) = ron::from_str(&buf) {
|
||||||
self = data;
|
self = data;
|
||||||
|
log::info!("Parsed RON for {:?}", std::any::type_name::<Self>());
|
||||||
} else if let Ok(data) = serde_json::from_str(&buf) {
|
} else if let Ok(data) = serde_json::from_str(&buf) {
|
||||||
self = data;
|
self = data;
|
||||||
|
log::info!("Parsed JSON for {:?}", std::any::type_name::<Self>());
|
||||||
} else if let Ok(data) = toml::from_str(&buf) {
|
} else if let Ok(data) = toml::from_str(&buf) {
|
||||||
self = data;
|
self = data;
|
||||||
} $(else if let Ok(data) = serde_json::from_str::<$generic>(&buf) {
|
log::info!("Parsed TOML for {:?}", std::any::type_name::<Self>());
|
||||||
|
} $(else if let Ok(data) = ron::from_str::<$generic>(&buf) {
|
||||||
self = data.into();
|
self = data.into();
|
||||||
|
log::info!("New version failed, trying previous: Parsed RON for {:?}", std::any::type_name::<$generic>());
|
||||||
|
} else if let Ok(data) = serde_json::from_str::<$generic>(&buf) {
|
||||||
|
self = data.into();
|
||||||
|
log::info!("New version failed, trying previous: Parsed JSON for {:?}", std::any::type_name::<$generic>());
|
||||||
} else if let Ok(data) = toml::from_str::<$generic>(&buf) {
|
} else if let Ok(data) = toml::from_str::<$generic>(&buf) {
|
||||||
self = data.into();
|
self = data.into();
|
||||||
|
log::info!("Newvious version failed, trying previous: Parsed TOML for {:?}", std::any::type_name::<$generic>());
|
||||||
})* else {
|
})* else {
|
||||||
self.rename_file_old();
|
self.rename_file_old();
|
||||||
self = Self::new();
|
self = Self::new();
|
||||||
@@ -237,10 +248,10 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn check_macro_from_1() {
|
fn check_macro_from_1() {
|
||||||
#[derive(serde::Deserialize, serde::Serialize)]
|
#[derive(serde::Deserialize, serde::Serialize, Debug)]
|
||||||
struct Test {}
|
struct Test {}
|
||||||
|
|
||||||
#[derive(serde::Deserialize, serde::Serialize)]
|
#[derive(serde::Deserialize, serde::Serialize, Debug)]
|
||||||
struct Old1 {}
|
struct Old1 {}
|
||||||
|
|
||||||
impl crate::StdConfig for Test {
|
impl crate::StdConfig for Test {
|
||||||
@@ -268,16 +279,16 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn check_macro_from_3() {
|
fn check_macro_from_3() {
|
||||||
#[derive(serde::Deserialize, serde::Serialize)]
|
#[derive(serde::Deserialize, serde::Serialize, Debug)]
|
||||||
struct Test {}
|
struct Test {}
|
||||||
|
|
||||||
#[derive(serde::Deserialize, serde::Serialize)]
|
#[derive(serde::Deserialize, serde::Serialize, Debug)]
|
||||||
struct Old1 {}
|
struct Old1 {}
|
||||||
|
|
||||||
#[derive(serde::Deserialize, serde::Serialize)]
|
#[derive(serde::Deserialize, serde::Serialize, Debug)]
|
||||||
struct Old2 {}
|
struct Old2 {}
|
||||||
|
|
||||||
#[derive(serde::Deserialize, serde::Serialize)]
|
#[derive(serde::Deserialize, serde::Serialize, Debug)]
|
||||||
struct Old3 {}
|
struct Old3 {}
|
||||||
|
|
||||||
impl crate::StdConfig for Test {
|
impl crate::StdConfig for Test {
|
||||||
|
|||||||
@@ -34,3 +34,6 @@ zbus.workspace = true
|
|||||||
# cli and logging
|
# cli and logging
|
||||||
log.workspace = true
|
log.workspace = true
|
||||||
env_logger.workspace = true
|
env_logger.workspace = true
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
cargo-husky.workspace = true
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
use std::fs::OpenOptions;
|
use std::io::Write;
|
||||||
use std::io::{Read, Write};
|
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::sync::atomic::AtomicBool;
|
use std::sync::atomic::AtomicBool;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
@@ -78,17 +77,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
// if supported.keyboard_led.per_key_led_mode {
|
// if supported.keyboard_led.per_key_led_mode {
|
||||||
if let Some(cfg) = config.active_aura {
|
if let Some(cfg) = config.active_aura {
|
||||||
let mut aura_config = ConfigAura::new().set_name(cfg).load();
|
let mut aura_config = ConfigAura::new().set_name(cfg).load();
|
||||||
|
// let baord_name = std::fs::read_to_string(BOARD_NAME)?;
|
||||||
// Find and load a matching layout for laptop
|
|
||||||
let mut file = OpenOptions::new()
|
|
||||||
.read(true)
|
|
||||||
.open(PathBuf::from(BOARD_NAME))
|
|
||||||
.map_err(|e| {
|
|
||||||
println!("{BOARD_NAME}, {e}");
|
|
||||||
e
|
|
||||||
})?;
|
|
||||||
let mut board_name = String::new();
|
|
||||||
file.read_to_string(&mut board_name)?;
|
|
||||||
|
|
||||||
let led_support = LaptopLedData::get_data();
|
let led_support = LaptopLedData::get_data();
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
//! # DBus interface proxy for: `org.asuslinux.Daemon`
|
//! # `DBus` interface proxy for: `org.asuslinux.Daemon`
|
||||||
//!
|
//!
|
||||||
//! This code was generated by `zbus-xmlgen` `1.0.0` from DBus introspection
|
//! This code was generated by `zbus-xmlgen` `1.0.0` from `DBus` introspection
|
||||||
//! data. Source: `Interface '/org/asuslinux/Anime' from service
|
//! data. Source: `Interface '/org/asuslinux/Anime' from service
|
||||||
//! 'org.asuslinux.Daemon' on session bus`.
|
//! 'org.asuslinux.Daemon' on session bus`.
|
||||||
//!
|
//!
|
||||||
@@ -10,8 +10,8 @@
|
|||||||
//! [Writing a client proxy](https://dbus.pages.freedesktop.org/zbus/client.html)
|
//! [Writing a client proxy](https://dbus.pages.freedesktop.org/zbus/client.html)
|
||||||
//! section of the zbus documentation.
|
//! section of the zbus documentation.
|
||||||
//!
|
//!
|
||||||
//! This DBus object implements
|
//! This `DBus` object implements
|
||||||
//! [standard DBus interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html),
|
//! [standard `DBus` interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html),
|
||||||
//! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used:
|
//! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used:
|
||||||
//!
|
//!
|
||||||
//! * [`zbus::fdo::PeerProxy`]
|
//! * [`zbus::fdo::PeerProxy`]
|
||||||
|
|||||||
@@ -45,3 +45,6 @@ sysfs-class.workspace = true # used for backlight control and baord ID
|
|||||||
concat-idents.workspace = true
|
concat-idents.workspace = true
|
||||||
|
|
||||||
systemd-zbus = "*"
|
systemd-zbus = "*"
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
cargo-husky.workspace = true
|
||||||
@@ -3,7 +3,7 @@ use serde_derive::{Deserialize, Serialize};
|
|||||||
|
|
||||||
const CONFIG_FILE: &str = "asusd.ron";
|
const CONFIG_FILE: &str = "asusd.ron";
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Default)]
|
#[derive(Deserialize, Serialize, Default, Debug)]
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
/// Save charge limit for restoring on boot
|
/// Save charge limit for restoring on boot
|
||||||
pub bat_charge_limit: u8,
|
pub bat_charge_limit: u8,
|
||||||
@@ -29,7 +29,7 @@ impl StdConfig for Config {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn file_name(&self) -> String {
|
fn file_name(&self) -> String {
|
||||||
CONFIG_FILE.to_string()
|
CONFIG_FILE.to_owned()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ impl AnimeConfigCached {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Config for base system actions for the anime display
|
/// Config for base system actions for the anime display
|
||||||
#[derive(Deserialize, Serialize)]
|
#[derive(Deserialize, Serialize, Debug)]
|
||||||
pub struct AnimeConfig {
|
pub struct AnimeConfig {
|
||||||
pub system: Vec<ActionLoader>,
|
pub system: Vec<ActionLoader>,
|
||||||
pub boot: Vec<ActionLoader>,
|
pub boot: Vec<ActionLoader>,
|
||||||
@@ -145,7 +145,7 @@ impl StdConfig for AnimeConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn file_name(&self) -> String {
|
fn file_name(&self) -> String {
|
||||||
CONFIG_FILE.to_string()
|
CONFIG_FILE.to_owned()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -164,7 +164,7 @@ impl AnimeConfig {
|
|||||||
|
|
||||||
fn create_default() -> Self {
|
fn create_default() -> Self {
|
||||||
// create a default config here
|
// create a default config here
|
||||||
let config = AnimeConfig {
|
AnimeConfig {
|
||||||
system: vec![],
|
system: vec![],
|
||||||
boot: vec![ActionLoader::ImageAnimation {
|
boot: vec![ActionLoader::ImageAnimation {
|
||||||
file: "/usr/share/asusd/anime/custom/sonic-run.gif".into(),
|
file: "/usr/share/asusd/anime/custom/sonic-run.gif".into(),
|
||||||
@@ -201,8 +201,6 @@ impl AnimeConfig {
|
|||||||
brightness: 1.0,
|
brightness: 1.0,
|
||||||
awake_enabled: true,
|
awake_enabled: true,
|
||||||
boot_anim_enabled: true,
|
boot_anim_enabled: true,
|
||||||
};
|
}
|
||||||
config.write();
|
|
||||||
config
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ impl From<&AuraPowerConfig> for AuraPowerDev {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize)]
|
#[derive(Deserialize, Serialize, Debug)]
|
||||||
// #[serde(default)]
|
// #[serde(default)]
|
||||||
pub struct AuraConfig {
|
pub struct AuraConfig {
|
||||||
pub brightness: LedBrightness,
|
pub brightness: LedBrightness,
|
||||||
@@ -195,7 +195,7 @@ impl StdConfig for AuraConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn file_name(&self) -> String {
|
fn file_name(&self) -> String {
|
||||||
CONFIG_FILE.to_string()
|
CONFIG_FILE.to_owned()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -232,7 +232,6 @@ impl AuraConfig {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
config.write();
|
|
||||||
config
|
config
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
pub mod config;
|
pub mod config;
|
||||||
pub mod controller;
|
pub mod controller;
|
||||||
/// Implements CtrlTask, Reloadable, ZbusRun
|
/// Implements `CtrlTask`, `Reloadable`, `ZbusRun`
|
||||||
pub mod trait_impls;
|
pub mod trait_impls;
|
||||||
|
|||||||
@@ -92,15 +92,8 @@ impl CtrlPlatform {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_boot_sound() -> Result<i8, RogError> {
|
pub fn get_boot_sound() -> Result<i8, RogError> {
|
||||||
let path = ASUS_POST_LOGO_SOUND;
|
let data = std::fs::read(ASUS_POST_LOGO_SOUND)
|
||||||
let mut file = OpenOptions::new()
|
.map_err(|err| RogError::Read(ASUS_POST_LOGO_SOUND.into(), err))?;
|
||||||
.read(true)
|
|
||||||
.open(path)
|
|
||||||
.map_err(|err| RogError::Path(path.into(), err))?;
|
|
||||||
|
|
||||||
let mut data = Vec::new();
|
|
||||||
file.read_to_end(&mut data)
|
|
||||||
.map_err(|err| RogError::Read(path.into(), err))?;
|
|
||||||
|
|
||||||
let idx = data.len() - 1;
|
let idx = data.len() - 1;
|
||||||
Ok(data[idx] as i8)
|
Ok(data[idx] as i8)
|
||||||
@@ -115,6 +108,7 @@ impl CtrlPlatform {
|
|||||||
.map_err(|err| RogError::Path(path.into(), err))?;
|
.map_err(|err| RogError::Path(path.into(), err))?;
|
||||||
|
|
||||||
let mut data = Vec::new();
|
let mut data = Vec::new();
|
||||||
|
#[allow(clippy::verbose_file_reads)]
|
||||||
file.read_to_end(&mut data)
|
file.read_to_end(&mut data)
|
||||||
.map_err(|err| RogError::Read(path.into(), err))?;
|
.map_err(|err| RogError::Read(path.into(), err))?;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ use std::path::PathBuf;
|
|||||||
|
|
||||||
use config_traits::{StdConfig, StdConfigLoad};
|
use config_traits::{StdConfig, StdConfigLoad};
|
||||||
use rog_profiles::fan_curve_set::FanCurveSet;
|
use rog_profiles::fan_curve_set::FanCurveSet;
|
||||||
use rog_profiles::{FanCurveProfiles, Profile};
|
use rog_profiles::Profile;
|
||||||
use serde_derive::{Deserialize, Serialize};
|
use serde_derive::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::CONFIG_PATH_BASE;
|
use crate::CONFIG_PATH_BASE;
|
||||||
@@ -28,7 +28,7 @@ impl StdConfig for ProfileConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn file_name(&self) -> String {
|
fn file_name(&self) -> String {
|
||||||
CONFIG_FILE.to_string()
|
CONFIG_FILE.to_owned()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,40 +36,16 @@ impl StdConfigLoad for ProfileConfig {}
|
|||||||
|
|
||||||
#[derive(Deserialize, Serialize, Debug, Default)]
|
#[derive(Deserialize, Serialize, Debug, Default)]
|
||||||
pub struct FanCurveConfig {
|
pub struct FanCurveConfig {
|
||||||
balanced: FanCurveSet,
|
pub balanced: FanCurveSet,
|
||||||
performance: FanCurveSet,
|
pub performance: FanCurveSet,
|
||||||
quiet: FanCurveSet,
|
pub quiet: FanCurveSet,
|
||||||
#[serde(skip)]
|
|
||||||
device: FanCurveProfiles,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FanCurveConfig {
|
|
||||||
pub fn update_device_config(&mut self) {
|
|
||||||
self.balanced = self.device.balanced.clone();
|
|
||||||
self.performance = self.device.performance.clone();
|
|
||||||
self.quiet = self.device.quiet.clone();
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn update_config(&mut self) {
|
|
||||||
self.balanced = self.device.balanced.clone();
|
|
||||||
self.performance = self.device.performance.clone();
|
|
||||||
self.quiet = self.device.quiet.clone();
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn device(&self) -> &FanCurveProfiles {
|
|
||||||
&self.device
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn device_mut(&mut self) -> &mut FanCurveProfiles {
|
|
||||||
&mut self.device
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl StdConfig for FanCurveConfig {
|
impl StdConfig for FanCurveConfig {
|
||||||
|
/// Create a new config. The defaults are zeroed so the device must be read
|
||||||
|
/// to get the actual device defaults.
|
||||||
fn new() -> Self {
|
fn new() -> Self {
|
||||||
let mut tmp = Self::default();
|
Self::default()
|
||||||
tmp.update_device_config();
|
|
||||||
tmp
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn config_dir() -> std::path::PathBuf {
|
fn config_dir() -> std::path::PathBuf {
|
||||||
@@ -77,7 +53,7 @@ impl StdConfig for FanCurveConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn file_name(&self) -> String {
|
fn file_name(&self) -> String {
|
||||||
CONFIG_FAN_FILE.to_string()
|
CONFIG_FAN_FILE.to_owned()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use config_traits::StdConfig;
|
use config_traits::{StdConfig, StdConfigLoad};
|
||||||
use log::{info, warn};
|
use log::{info, warn};
|
||||||
use rog_platform::platform::AsusPlatform;
|
use rog_platform::platform::AsusPlatform;
|
||||||
use rog_platform::supported::PlatformProfileFunctions;
|
use rog_platform::supported::PlatformProfileFunctions;
|
||||||
@@ -9,9 +9,39 @@ use super::config::{FanCurveConfig, ProfileConfig};
|
|||||||
use crate::error::RogError;
|
use crate::error::RogError;
|
||||||
use crate::GetSupported;
|
use crate::GetSupported;
|
||||||
|
|
||||||
|
// TODO: macro wrapper for warn/info/error log macros to add module name
|
||||||
|
const MOD_NAME: &str = "CtrlPlatformProfile";
|
||||||
|
|
||||||
|
pub struct FanCurves {
|
||||||
|
config_file: FanCurveConfig,
|
||||||
|
profiles: FanCurveProfiles,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FanCurves {
|
||||||
|
pub fn update_profiles_from_config(&mut self) {
|
||||||
|
self.profiles.balanced = self.config_file.balanced.clone();
|
||||||
|
self.profiles.performance = self.config_file.performance.clone();
|
||||||
|
self.profiles.quiet = self.config_file.quiet.clone();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn update_config_from_profiles(&mut self) {
|
||||||
|
self.config_file.balanced = self.profiles.balanced.clone();
|
||||||
|
self.config_file.performance = self.profiles.performance.clone();
|
||||||
|
self.config_file.quiet = self.profiles.quiet.clone();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn profiles(&self) -> &FanCurveProfiles {
|
||||||
|
&self.profiles
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn profiles_mut(&mut self) -> &mut FanCurveProfiles {
|
||||||
|
&mut self.profiles
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct CtrlPlatformProfile {
|
pub struct CtrlPlatformProfile {
|
||||||
pub profile_config: ProfileConfig,
|
pub profile_config: ProfileConfig,
|
||||||
pub fan_config: Option<FanCurveConfig>,
|
pub fan_curves: Option<FanCurves>,
|
||||||
pub platform: AsusPlatform,
|
pub platform: AsusPlatform,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,30 +80,50 @@ impl CtrlPlatformProfile {
|
|||||||
pub fn new(config: ProfileConfig) -> Result<Self, RogError> {
|
pub fn new(config: ProfileConfig) -> Result<Self, RogError> {
|
||||||
let platform = AsusPlatform::new()?;
|
let platform = AsusPlatform::new()?;
|
||||||
if platform.has_platform_profile() || platform.has_throttle_thermal_policy() {
|
if platform.has_platform_profile() || platform.has_throttle_thermal_policy() {
|
||||||
info!("Device has profile control available");
|
info!("{MOD_NAME}: Device has profile control available");
|
||||||
|
|
||||||
let mut controller = CtrlPlatformProfile {
|
let mut controller = CtrlPlatformProfile {
|
||||||
profile_config: config,
|
profile_config: config,
|
||||||
fan_config: None,
|
fan_curves: None,
|
||||||
platform,
|
platform,
|
||||||
};
|
};
|
||||||
if FanCurveProfiles::get_device().is_ok() {
|
if FanCurveProfiles::get_device().is_ok() {
|
||||||
info!("Device has fan curves available");
|
info!("{MOD_NAME}: Device has fan curves available");
|
||||||
if controller.fan_config.is_none() {
|
let fan_config = FanCurveConfig::new();
|
||||||
controller.fan_config = Some(Default::default());
|
// Only do defaults if the config doesn't already exist
|
||||||
|
if !fan_config.file_path().exists() {
|
||||||
|
info!("{MOD_NAME}: Fetching default fan curves");
|
||||||
|
controller.fan_curves = Some(FanCurves {
|
||||||
|
config_file: fan_config,
|
||||||
|
profiles: FanCurveProfiles::default(),
|
||||||
|
});
|
||||||
for _ in [Profile::Balanced, Profile::Performance, Profile::Quiet] {
|
for _ in [Profile::Balanced, Profile::Performance, Profile::Quiet] {
|
||||||
|
// For each profile we need to switch to it before we
|
||||||
|
// can read the existing values from hardware. The ACPI method used
|
||||||
|
// for this is what limits us.
|
||||||
controller.set_next_profile()?;
|
controller.set_next_profile()?;
|
||||||
|
// Make sure to set the baseline to default
|
||||||
controller.set_active_curve_to_defaults()?;
|
controller.set_active_curve_to_defaults()?;
|
||||||
|
|
||||||
let active = Profile::get_active_profile().unwrap_or(Profile::Balanced);
|
let active = Profile::get_active_profile().unwrap_or(Profile::Balanced);
|
||||||
if let Some(curves) = controller.fan_config.as_ref() {
|
|
||||||
|
if let Some(curves) = controller.fan_curves.as_ref() {
|
||||||
info!(
|
info!(
|
||||||
"{active:?}: {}",
|
"{MOD_NAME}: {active:?}: {}",
|
||||||
String::from(curves.device().get_fan_curves_for(active))
|
String::from(curves.profiles().get_fan_curves_for(active))
|
||||||
);
|
);
|
||||||
curves.write();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if let Some(curves) = controller.fan_curves.as_ref() {
|
||||||
|
curves.config_file.write();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
info!("{MOD_NAME}: Fan curves previously stored, loading...");
|
||||||
|
let mut fan_curves = FanCurves {
|
||||||
|
config_file: fan_config.load(),
|
||||||
|
profiles: FanCurveProfiles::default(),
|
||||||
|
};
|
||||||
|
fan_curves.update_profiles_from_config();
|
||||||
|
controller.fan_curves = Some(fan_curves);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,9 +135,9 @@ impl CtrlPlatformProfile {
|
|||||||
|
|
||||||
pub fn save_config(&mut self) {
|
pub fn save_config(&mut self) {
|
||||||
self.profile_config.write();
|
self.profile_config.write();
|
||||||
if let Some(fans) = self.fan_config.as_mut() {
|
if let Some(fans) = self.fan_curves.as_mut() {
|
||||||
fans.update_config();
|
fans.update_config_from_profiles();
|
||||||
fans.write();
|
fans.config_file.write(); // config write
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,9 +165,9 @@ impl CtrlPlatformProfile {
|
|||||||
|
|
||||||
/// Set the curve for the active profile active
|
/// Set the curve for the active profile active
|
||||||
pub(super) fn write_profile_curve_to_platform(&mut self) -> Result<(), RogError> {
|
pub(super) fn write_profile_curve_to_platform(&mut self) -> Result<(), RogError> {
|
||||||
if let Some(curves) = &mut self.fan_config {
|
if let Some(curves) = &mut self.fan_curves {
|
||||||
if let Ok(mut device) = FanCurveProfiles::get_device() {
|
if let Ok(mut device) = FanCurveProfiles::get_device() {
|
||||||
curves.device_mut().write_profile_curve_to_platform(
|
curves.profiles_mut().write_profile_curve_to_platform(
|
||||||
self.profile_config.active_profile,
|
self.profile_config.active_profile,
|
||||||
&mut device,
|
&mut device,
|
||||||
)?;
|
)?;
|
||||||
@@ -127,13 +177,13 @@ impl CtrlPlatformProfile {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn set_active_curve_to_defaults(&mut self) -> Result<(), RogError> {
|
pub(super) fn set_active_curve_to_defaults(&mut self) -> Result<(), RogError> {
|
||||||
if let Some(curves) = self.fan_config.as_mut() {
|
if let Some(curves) = self.fan_curves.as_mut() {
|
||||||
if let Ok(mut device) = FanCurveProfiles::get_device() {
|
if let Ok(mut device) = FanCurveProfiles::get_device() {
|
||||||
curves.device_mut().set_active_curve_to_defaults(
|
curves.profiles_mut().set_active_curve_to_defaults(
|
||||||
self.profile_config.active_profile,
|
self.profile_config.active_profile,
|
||||||
&mut device,
|
&mut device,
|
||||||
)?;
|
)?;
|
||||||
curves.update_config();
|
curves.update_config_from_profiles();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ use super::controller::CtrlPlatformProfile;
|
|||||||
use crate::error::RogError;
|
use crate::error::RogError;
|
||||||
use crate::CtrlTask;
|
use crate::CtrlTask;
|
||||||
|
|
||||||
|
const MOD_NAME: &str = "ProfileZbus";
|
||||||
|
|
||||||
const ZBUS_PATH: &str = "/org/asuslinux/Profile";
|
const ZBUS_PATH: &str = "/org/asuslinux/Profile";
|
||||||
const UNSUPPORTED_MSG: &str =
|
const UNSUPPORTED_MSG: &str =
|
||||||
"Fan curves are not supported on this laptop or you require a patched kernel";
|
"Fan curves are not supported on this laptop or you require a patched kernel";
|
||||||
@@ -39,7 +41,7 @@ impl ProfileZbus {
|
|||||||
async fn next_profile(&mut self, #[zbus(signal_context)] ctxt: SignalContext<'_>) {
|
async fn next_profile(&mut self, #[zbus(signal_context)] ctxt: SignalContext<'_>) {
|
||||||
let mut ctrl = self.0.lock().await;
|
let mut ctrl = self.0.lock().await;
|
||||||
ctrl.set_next_profile()
|
ctrl.set_next_profile()
|
||||||
.unwrap_or_else(|err| warn!("{}", err));
|
.unwrap_or_else(|err| warn!("{MOD_NAME}: {}", err));
|
||||||
ctrl.save_config();
|
ctrl.save_config();
|
||||||
|
|
||||||
Self::notify_profile(&ctxt, ctrl.profile_config.active_profile)
|
Self::notify_profile(&ctxt, ctrl.profile_config.active_profile)
|
||||||
@@ -64,11 +66,11 @@ impl ProfileZbus {
|
|||||||
// Read first just incase the user has modified the config before calling this
|
// Read first just incase the user has modified the config before calling this
|
||||||
ctrl.profile_config.read();
|
ctrl.profile_config.read();
|
||||||
Profile::set_profile(profile)
|
Profile::set_profile(profile)
|
||||||
.map_err(|e| warn!("set_profile, {}", e))
|
.map_err(|e| warn!("{MOD_NAME}: set_profile, {}", e))
|
||||||
.ok();
|
.ok();
|
||||||
ctrl.profile_config.active_profile = profile;
|
ctrl.profile_config.active_profile = profile;
|
||||||
ctrl.write_profile_curve_to_platform()
|
ctrl.write_profile_curve_to_platform()
|
||||||
.map_err(|e| warn!("write_profile_curve_to_platform, {}", e))
|
.map_err(|e| warn!("{MOD_NAME}: write_profile_curve_to_platform, {}", e))
|
||||||
.ok();
|
.ok();
|
||||||
|
|
||||||
ctrl.save_config();
|
ctrl.save_config();
|
||||||
@@ -82,8 +84,8 @@ impl ProfileZbus {
|
|||||||
async fn enabled_fan_profiles(&mut self) -> zbus::fdo::Result<Vec<Profile>> {
|
async fn enabled_fan_profiles(&mut self) -> zbus::fdo::Result<Vec<Profile>> {
|
||||||
let mut ctrl = self.0.lock().await;
|
let mut ctrl = self.0.lock().await;
|
||||||
ctrl.profile_config.read();
|
ctrl.profile_config.read();
|
||||||
if let Some(curves) = &mut ctrl.fan_config {
|
if let Some(curves) = &mut ctrl.fan_curves {
|
||||||
return Ok(curves.device().get_enabled_curve_profiles());
|
return Ok(curves.profiles().get_enabled_curve_profiles());
|
||||||
}
|
}
|
||||||
Err(Error::Failed(UNSUPPORTED_MSG.to_owned()))
|
Err(Error::Failed(UNSUPPORTED_MSG.to_owned()))
|
||||||
}
|
}
|
||||||
@@ -97,14 +99,13 @@ impl ProfileZbus {
|
|||||||
) -> zbus::fdo::Result<()> {
|
) -> zbus::fdo::Result<()> {
|
||||||
let mut ctrl = self.0.lock().await;
|
let mut ctrl = self.0.lock().await;
|
||||||
ctrl.profile_config.read();
|
ctrl.profile_config.read();
|
||||||
if let Some(curves) = &mut ctrl.fan_config {
|
if let Some(curves) = &mut ctrl.fan_curves {
|
||||||
curves
|
curves
|
||||||
.device_mut()
|
.profiles_mut()
|
||||||
.set_profile_curve_enabled(profile, enabled);
|
.set_profile_curve_enabled(profile, enabled);
|
||||||
curves.update_config();
|
|
||||||
|
|
||||||
ctrl.write_profile_curve_to_platform()
|
ctrl.write_profile_curve_to_platform()
|
||||||
.map_err(|e| warn!("write_profile_curve_to_platform, {}", e))
|
.map_err(|e| warn!("{MOD_NAME}: write_profile_curve_to_platform, {}", e))
|
||||||
.ok();
|
.ok();
|
||||||
|
|
||||||
ctrl.save_config();
|
ctrl.save_config();
|
||||||
@@ -118,8 +119,8 @@ impl ProfileZbus {
|
|||||||
async fn fan_curve_data(&mut self, profile: Profile) -> zbus::fdo::Result<FanCurveSet> {
|
async fn fan_curve_data(&mut self, profile: Profile) -> zbus::fdo::Result<FanCurveSet> {
|
||||||
let mut ctrl = self.0.lock().await;
|
let mut ctrl = self.0.lock().await;
|
||||||
ctrl.profile_config.read();
|
ctrl.profile_config.read();
|
||||||
if let Some(curves) = &mut ctrl.fan_config {
|
if let Some(curves) = &mut ctrl.fan_curves {
|
||||||
let curve = curves.device().get_fan_curves_for(profile);
|
let curve = curves.profiles().get_fan_curves_for(profile);
|
||||||
return Ok(curve.clone());
|
return Ok(curve.clone());
|
||||||
}
|
}
|
||||||
Err(Error::Failed(UNSUPPORTED_MSG.to_owned()))
|
Err(Error::Failed(UNSUPPORTED_MSG.to_owned()))
|
||||||
@@ -130,17 +131,16 @@ impl ProfileZbus {
|
|||||||
async fn set_fan_curve(&self, profile: Profile, curve: CurveData) -> zbus::fdo::Result<()> {
|
async fn set_fan_curve(&self, profile: Profile, curve: CurveData) -> zbus::fdo::Result<()> {
|
||||||
let mut ctrl = self.0.lock().await;
|
let mut ctrl = self.0.lock().await;
|
||||||
ctrl.profile_config.read();
|
ctrl.profile_config.read();
|
||||||
if let Some(curves) = &mut ctrl.fan_config {
|
if let Some(curves) = &mut ctrl.fan_curves {
|
||||||
curves
|
curves
|
||||||
.device_mut()
|
.profiles_mut()
|
||||||
.save_fan_curve(curve, profile)
|
.save_fan_curve(curve, profile)
|
||||||
.map_err(|err| zbus::fdo::Error::Failed(err.to_string()))?;
|
.map_err(|err| zbus::fdo::Error::Failed(err.to_string()))?;
|
||||||
curves.update_config();
|
|
||||||
} else {
|
} else {
|
||||||
return Err(Error::Failed(UNSUPPORTED_MSG.to_owned()));
|
return Err(Error::Failed(UNSUPPORTED_MSG.to_owned()));
|
||||||
}
|
}
|
||||||
ctrl.write_profile_curve_to_platform()
|
ctrl.write_profile_curve_to_platform()
|
||||||
.map_err(|e| warn!("Profile::set_profile, {}", e))
|
.map_err(|e| warn!("{MOD_NAME}: Profile::set_profile, {}", e))
|
||||||
.ok();
|
.ok();
|
||||||
ctrl.save_config();
|
ctrl.save_config();
|
||||||
|
|
||||||
@@ -156,7 +156,7 @@ impl ProfileZbus {
|
|||||||
let mut ctrl = self.0.lock().await;
|
let mut ctrl = self.0.lock().await;
|
||||||
ctrl.profile_config.read();
|
ctrl.profile_config.read();
|
||||||
ctrl.set_active_curve_to_defaults()
|
ctrl.set_active_curve_to_defaults()
|
||||||
.map_err(|e| warn!("Profile::set_active_curve_to_defaults, {}", e))
|
.map_err(|e| warn!("{MOD_NAME}: Profile::set_active_curve_to_defaults, {}", e))
|
||||||
.ok();
|
.ok();
|
||||||
ctrl.save_config();
|
ctrl.save_config();
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -173,14 +173,14 @@ impl ProfileZbus {
|
|||||||
let active = Profile::get_active_profile().unwrap_or(Profile::Balanced);
|
let active = Profile::get_active_profile().unwrap_or(Profile::Balanced);
|
||||||
|
|
||||||
Profile::set_profile(profile)
|
Profile::set_profile(profile)
|
||||||
.map_err(|e| warn!("set_profile, {}", e))
|
.map_err(|e| warn!("{MOD_NAME}: set_profile, {}", e))
|
||||||
.ok();
|
.ok();
|
||||||
ctrl.set_active_curve_to_defaults()
|
ctrl.set_active_curve_to_defaults()
|
||||||
.map_err(|e| warn!("Profile::set_active_curve_to_defaults, {}", e))
|
.map_err(|e| warn!("{MOD_NAME}: Profile::set_active_curve_to_defaults, {}", e))
|
||||||
.ok();
|
.ok();
|
||||||
|
|
||||||
Profile::set_profile(active)
|
Profile::set_profile(active)
|
||||||
.map_err(|e| warn!("set_profile, {}", e))
|
.map_err(|e| warn!("{MOD_NAME}: set_profile, {}", e))
|
||||||
.ok();
|
.ok();
|
||||||
ctrl.save_config();
|
ctrl.save_config();
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -222,12 +222,12 @@ impl CtrlTask for ProfileZbus {
|
|||||||
let mut lock = ctrl.lock().await;
|
let mut lock = ctrl.lock().await;
|
||||||
if let Ok(profile) =
|
if let Ok(profile) =
|
||||||
lock.platform.get_throttle_thermal_policy().map_err(|e| {
|
lock.platform.get_throttle_thermal_policy().map_err(|e| {
|
||||||
error!("get_throttle_thermal_policy error: {e}");
|
error!("{MOD_NAME}: get_throttle_thermal_policy error: {e}");
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
let new_profile = Profile::from_throttle_thermal_policy(profile);
|
let new_profile = Profile::from_throttle_thermal_policy(profile);
|
||||||
if new_profile != lock.profile_config.active_profile {
|
if new_profile != lock.profile_config.active_profile {
|
||||||
info!("platform_profile changed to {new_profile}");
|
info!("{MOD_NAME}: platform_profile changed to {new_profile}");
|
||||||
lock.profile_config.active_profile = new_profile;
|
lock.profile_config.active_profile = new_profile;
|
||||||
lock.write_profile_curve_to_platform().unwrap();
|
lock.write_profile_curve_to_platform().unwrap();
|
||||||
lock.save_config();
|
lock.save_config();
|
||||||
@@ -262,7 +262,7 @@ impl CtrlTask for ProfileZbus {
|
|||||||
error!("Profile::from_str(&profile) error: {e}");
|
error!("Profile::from_str(&profile) error: {e}");
|
||||||
}) {
|
}) {
|
||||||
if new_profile != lock.profile_config.active_profile {
|
if new_profile != lock.profile_config.active_profile {
|
||||||
info!("platform_profile changed to {new_profile}");
|
info!("{MOD_NAME}: platform_profile changed to {new_profile}");
|
||||||
lock.profile_config.active_profile = new_profile;
|
lock.profile_config.active_profile = new_profile;
|
||||||
lock.write_profile_curve_to_platform().unwrap();
|
lock.write_profile_curve_to_platform().unwrap();
|
||||||
lock.save_config();
|
lock.save_config();
|
||||||
@@ -295,15 +295,14 @@ impl crate::Reloadable for ProfileZbus {
|
|||||||
async fn reload(&mut self) -> Result<(), RogError> {
|
async fn reload(&mut self) -> Result<(), RogError> {
|
||||||
let mut ctrl = self.0.lock().await;
|
let mut ctrl = self.0.lock().await;
|
||||||
let active = ctrl.profile_config.active_profile;
|
let active = ctrl.profile_config.active_profile;
|
||||||
if let Some(curves) = &mut ctrl.fan_config {
|
if let Some(curves) = &mut ctrl.fan_curves {
|
||||||
if let Ok(mut device) = FanCurveProfiles::get_device() {
|
if let Ok(mut device) = FanCurveProfiles::get_device() {
|
||||||
// There is a possibility that the curve was default zeroed, so this call
|
// There is a possibility that the curve was default zeroed, so this call
|
||||||
// initialises the data from system read and we need to save it
|
// initialises the data from system read and we need to save it
|
||||||
// after
|
// after
|
||||||
curves
|
curves
|
||||||
.device_mut()
|
.profiles_mut()
|
||||||
.write_profile_curve_to_platform(active, &mut device)?;
|
.write_profile_curve_to_platform(active, &mut device)?;
|
||||||
curves.update_config();
|
|
||||||
ctrl.profile_config.write();
|
ctrl.profile_config.write();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,3 +33,6 @@ zbus = { workspace = true, optional = true }
|
|||||||
sysfs-class = { workspace = true, optional = true }
|
sysfs-class = { workspace = true, optional = true }
|
||||||
|
|
||||||
uhid-virt = "^0.0.5"
|
uhid-virt = "^0.0.5"
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
cargo-husky.workspace = true
|
||||||
@@ -141,7 +141,9 @@ impl AnimeImage {
|
|||||||
///
|
///
|
||||||
/// In relation to the display itself you should think of it as a full
|
/// In relation to the display itself you should think of it as a full
|
||||||
/// square grid, so `first_x` is the x position on that grid where the
|
/// square grid, so `first_x` is the x position on that grid where the
|
||||||
/// LED is actually positioned in relation to the Y. ```text
|
/// LED is actually positioned in relation to the Y.
|
||||||
|
///
|
||||||
|
/// ```text
|
||||||
/// +------------+
|
/// +------------+
|
||||||
/// | |
|
/// | |
|
||||||
/// | |
|
/// | |
|
||||||
|
|||||||
@@ -28,3 +28,6 @@ log.workspace = true
|
|||||||
sysfs-class.workspace = true # used for backlight control and baord ID
|
sysfs-class.workspace = true # used for backlight control and baord ID
|
||||||
|
|
||||||
ron = { version = "*", optional = true }
|
ron = { version = "*", optional = true }
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
cargo-husky.workspace = true
|
||||||
@@ -181,6 +181,13 @@
|
|||||||
basic_zones: [],
|
basic_zones: [],
|
||||||
advanced_type: PerKey,
|
advanced_type: PerKey,
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
board_name: "G533Z",
|
||||||
|
layout_name: "g533q-per-key",
|
||||||
|
basic_modes: [Static, Breathe, Strobe, Rainbow, Star, Rain, Highlight, Laser, Ripple, Pulse, Comet, Flash],
|
||||||
|
basic_zones: [],
|
||||||
|
advanced_type: PerKey,
|
||||||
|
),
|
||||||
(
|
(
|
||||||
board_name: "G712LI",
|
board_name: "G712LI",
|
||||||
layout_name: "gl503",
|
layout_name: "gl503",
|
||||||
@@ -286,6 +293,13 @@
|
|||||||
basic_zones: [],
|
basic_zones: [],
|
||||||
advanced_type: PerKey,
|
advanced_type: PerKey,
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
board_name: "GA401Q",
|
||||||
|
layout_name: "ga401q",
|
||||||
|
basic_modes: [Static, Breathe, Pulse],
|
||||||
|
basic_zones: [],
|
||||||
|
advanced_type: None,
|
||||||
|
),
|
||||||
(
|
(
|
||||||
board_name: "GA402R",
|
board_name: "GA402R",
|
||||||
layout_name: "ga401q",
|
layout_name: "ga401q",
|
||||||
@@ -447,11 +461,4 @@
|
|||||||
basic_zones: [],
|
basic_zones: [],
|
||||||
advanced_type: None,
|
advanced_type: None,
|
||||||
),
|
),
|
||||||
(
|
|
||||||
board_name: "ga401qQ",
|
|
||||||
layout_name: "ga401q",
|
|
||||||
basic_modes: [Static, Breathe, Pulse],
|
|
||||||
basic_zones: [],
|
|
||||||
advanced_type: None,
|
|
||||||
),
|
|
||||||
])
|
])
|
||||||
@@ -303,6 +303,7 @@ impl LedUsbPackets {
|
|||||||
fn rgb_for_led_code(&mut self, led_code: LedCode) -> Option<&mut [u8]> {
|
fn rgb_for_led_code(&mut self, led_code: LedCode) -> Option<&mut [u8]> {
|
||||||
let zoned = self.zoned;
|
let zoned = self.zoned;
|
||||||
// Tuples are indexes in to array
|
// Tuples are indexes in to array
|
||||||
|
#[allow(clippy::match_same_arms)]
|
||||||
let (row, col) = match led_code {
|
let (row, col) = match led_code {
|
||||||
LedCode::VolDown => (0, 15),
|
LedCode::VolDown => (0, 15),
|
||||||
LedCode::VolUp => (0, 18),
|
LedCode::VolUp => (0, 18),
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ impl From<LedCode> for &str {
|
|||||||
|
|
||||||
impl From<&LedCode> for &str {
|
impl From<&LedCode> for &str {
|
||||||
fn from(k: &LedCode) -> Self {
|
fn from(k: &LedCode) -> Self {
|
||||||
|
#[allow(clippy::match_same_arms)]
|
||||||
match k {
|
match k {
|
||||||
LedCode::VolUp => "Volume Up",
|
LedCode::VolUp => "Volume Up",
|
||||||
LedCode::VolDown => "Volume Down",
|
LedCode::VolDown => "Volume Down",
|
||||||
|
|||||||
@@ -1,6 +1,3 @@
|
|||||||
use std::fs::OpenOptions;
|
|
||||||
use std::io::Read;
|
|
||||||
|
|
||||||
use log::{error, info, warn};
|
use log::{error, info, warn};
|
||||||
use serde_derive::{Deserialize, Serialize};
|
use serde_derive::{Deserialize, Serialize};
|
||||||
|
|
||||||
@@ -76,39 +73,33 @@ impl LedSupportFile {
|
|||||||
let mut loaded = false;
|
let mut loaded = false;
|
||||||
let mut data = LedSupportFile::default();
|
let mut data = LedSupportFile::default();
|
||||||
// Load user configs first so they are first to be checked
|
// Load user configs first so they are first to be checked
|
||||||
if let Ok(mut file) = OpenOptions::new().read(true).open(ASUS_LED_MODE_USER_CONF) {
|
if let Ok(file) = std::fs::read_to_string(ASUS_LED_MODE_USER_CONF) {
|
||||||
let mut buf = String::new();
|
if file.is_empty() {
|
||||||
if let Ok(l) = file.read_to_string(&mut buf) {
|
warn!("{} is empty", ASUS_LED_MODE_USER_CONF);
|
||||||
if l == 0 {
|
} else {
|
||||||
warn!("{} is empty", ASUS_LED_MODE_USER_CONF);
|
if let Ok(mut tmp) = ron::from_str::<LedSupportFile>(&file) {
|
||||||
} else {
|
data.0.append(&mut tmp.0);
|
||||||
if let Ok(mut tmp) = ron::from_str::<LedSupportFile>(&buf) {
|
|
||||||
data.0.append(&mut tmp.0);
|
|
||||||
}
|
|
||||||
info!(
|
|
||||||
"Loaded user-defined LED support data from {}",
|
|
||||||
ASUS_LED_MODE_USER_CONF
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
info!(
|
||||||
|
"Loaded user-defined LED support data from {}",
|
||||||
|
ASUS_LED_MODE_USER_CONF
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Load and append the default LED support data
|
// Load and append the default LED support data
|
||||||
if let Ok(mut file) = OpenOptions::new().read(true).open(ASUS_LED_MODE_CONF) {
|
if let Ok(file) = std::fs::read_to_string(ASUS_LED_MODE_CONF) {
|
||||||
let mut buf = String::new();
|
if file.is_empty() {
|
||||||
if let Ok(l) = file.read_to_string(&mut buf) {
|
warn!("{} is empty", ASUS_LED_MODE_CONF);
|
||||||
if l == 0 {
|
} else {
|
||||||
warn!("{} is empty", ASUS_LED_MODE_CONF);
|
let mut tmp: LedSupportFile = ron::from_str(&file)
|
||||||
} else {
|
.map_err(|e| error!("{e}"))
|
||||||
let mut tmp: LedSupportFile = ron::from_str(&buf)
|
.unwrap_or_else(|_| panic!("Could not deserialise {}", ASUS_LED_MODE_CONF));
|
||||||
.map_err(|e| error!("{e}"))
|
data.0.append(&mut tmp.0);
|
||||||
.unwrap_or_else(|_| panic!("Could not deserialise {}", ASUS_LED_MODE_CONF));
|
loaded = true;
|
||||||
data.0.append(&mut tmp.0);
|
info!(
|
||||||
loaded = true;
|
"Loaded default LED support data from {}",
|
||||||
info!(
|
ASUS_LED_MODE_CONF
|
||||||
"Loaded default LED support data from {}",
|
);
|
||||||
ASUS_LED_MODE_CONF
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
data.0.sort_by(|a, b| a.board_name.cmp(&b.board_name));
|
data.0.sort_by(|a, b| a.board_name.cmp(&b.board_name));
|
||||||
@@ -125,7 +116,7 @@ impl LedSupportFile {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use std::fs::OpenOptions;
|
use std::fs::OpenOptions;
|
||||||
use std::io::{Read, Write};
|
use std::io::Write;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
use ron::ser::PrettyConfig;
|
use ron::ser::PrettyConfig;
|
||||||
@@ -155,9 +146,7 @@ mod tests {
|
|||||||
let mut data = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
let mut data = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
||||||
data.push("data/aura_support.ron");
|
data.push("data/aura_support.ron");
|
||||||
|
|
||||||
let mut file = OpenOptions::new().read(true).open(&data).unwrap();
|
let buf = std::fs::read_to_string(&data).unwrap();
|
||||||
let mut buf = String::new();
|
|
||||||
file.read_to_string(&mut buf).unwrap();
|
|
||||||
|
|
||||||
let tmp = ron::from_str::<LedSupportFile>(&buf).unwrap();
|
let tmp = ron::from_str::<LedSupportFile>(&buf).unwrap();
|
||||||
|
|
||||||
|
|||||||
@@ -284,7 +284,8 @@ impl FromStr for AuraZone {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Default factory modes structure. This easily converts to an USB HID packet
|
/// Default factory modes structure. This easily converts to an USB HID packet
|
||||||
/// with: ```rust
|
/// with:
|
||||||
|
/// ```rust
|
||||||
/// // let bytes: [u8; LED_MSG_LEN] = mode.into();
|
/// // let bytes: [u8; LED_MSG_LEN] = mode.into();
|
||||||
/// ```
|
/// ```
|
||||||
#[cfg_attr(feature = "dbus", derive(Type))]
|
#[cfg_attr(feature = "dbus", derive(Type))]
|
||||||
@@ -350,6 +351,7 @@ pub struct AuraParameters {
|
|||||||
pub direction: bool,
|
pub direction: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::fn_params_excessive_bools)]
|
||||||
impl AuraParameters {
|
impl AuraParameters {
|
||||||
pub const fn new(
|
pub const fn new(
|
||||||
zone: bool,
|
zone: bool,
|
||||||
|
|||||||
@@ -28,6 +28,6 @@ impl EffectState for InputBased {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn set_led(&mut self, address: LedCode) {
|
fn set_led(&mut self, address: LedCode) {
|
||||||
self.led = address
|
self.led = address;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-26
@@ -2,8 +2,6 @@
|
|||||||
//! editable config.
|
//! editable config.
|
||||||
|
|
||||||
use std::collections::{HashMap, HashSet};
|
use std::collections::{HashMap, HashSet};
|
||||||
use std::fs::{self, OpenOptions};
|
|
||||||
use std::io::Read;
|
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::slice::Iter;
|
use std::slice::Iter;
|
||||||
|
|
||||||
@@ -88,8 +86,8 @@ impl KeyShape {
|
|||||||
/// The first `Key` will determine the row height.
|
/// The first `Key` will determine the row height.
|
||||||
///
|
///
|
||||||
/// Every row is considered to start a x=0, with the first row being y=0,
|
/// Every row is considered to start a x=0, with the first row being y=0,
|
||||||
/// and following rows starting after the previous row_y+pad_top and
|
/// and following rows starting after the previous `row_y + pad_top` and
|
||||||
/// row_x+pad_left
|
/// `row_x + pad_left`
|
||||||
#[derive(Debug, Deserialize, Serialize, Clone)]
|
#[derive(Debug, Deserialize, Serialize, Clone)]
|
||||||
pub struct KeyRow {
|
pub struct KeyRow {
|
||||||
pad_left: f32,
|
pad_left: f32,
|
||||||
@@ -138,7 +136,7 @@ impl KeyRow {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if h < height {
|
if h < height {
|
||||||
h = height
|
h = height;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
h
|
h
|
||||||
@@ -192,15 +190,9 @@ pub struct KeyLayout {
|
|||||||
|
|
||||||
impl KeyLayout {
|
impl KeyLayout {
|
||||||
pub fn from_file(path: &Path) -> Result<Self, Error> {
|
pub fn from_file(path: &Path) -> Result<Self, Error> {
|
||||||
let mut file = OpenOptions::new()
|
let buf: String = std::fs::read_to_string(path)
|
||||||
.read(true)
|
|
||||||
.open(path)
|
|
||||||
.map_err(|e| Error::IoPath(path.to_string_lossy().to_string(), e))?;
|
.map_err(|e| Error::IoPath(path.to_string_lossy().to_string(), e))?;
|
||||||
let mut buf = String::new();
|
if buf.is_empty() {
|
||||||
let read_len = file
|
|
||||||
.read_to_string(&mut buf)
|
|
||||||
.map_err(|e| Error::IoPath(path.to_string_lossy().to_string(), e))?;
|
|
||||||
if read_len == 0 {
|
|
||||||
Err(Error::IoPath(
|
Err(Error::IoPath(
|
||||||
path.to_string_lossy().to_string(),
|
path.to_string_lossy().to_string(),
|
||||||
std::io::ErrorKind::InvalidData.into(),
|
std::io::ErrorKind::InvalidData.into(),
|
||||||
@@ -233,7 +225,7 @@ impl KeyLayout {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn rows(&self) -> Iter<KeyRow> {
|
pub fn rows(&self) -> Iter<'_, KeyRow> {
|
||||||
self.key_rows.iter()
|
self.key_rows.iter()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -279,7 +271,7 @@ impl KeyLayout {
|
|||||||
for r in &self.key_rows {
|
for r in &self.key_rows {
|
||||||
let tmp = r.width();
|
let tmp = r.width();
|
||||||
if width < tmp {
|
if width < tmp {
|
||||||
width = tmp
|
width = tmp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
width
|
width
|
||||||
@@ -305,7 +297,7 @@ impl KeyLayout {
|
|||||||
data_path.push("layouts");
|
data_path.push("layouts");
|
||||||
let path = data_path.as_path();
|
let path = data_path.as_path();
|
||||||
let mut files = Vec::new();
|
let mut files = Vec::new();
|
||||||
fs::read_dir(path)
|
std::fs::read_dir(path)
|
||||||
.map_err(|e| {
|
.map_err(|e| {
|
||||||
println!("{:?}, {e}", path);
|
println!("{:?}, {e}", path);
|
||||||
e
|
e
|
||||||
@@ -471,7 +463,6 @@ mod tests {
|
|||||||
data_path.push("data");
|
data_path.push("data");
|
||||||
data_path.push("layouts");
|
data_path.push("layouts");
|
||||||
let path = data_path.as_path();
|
let path = data_path.as_path();
|
||||||
let mut buf = String::new();
|
|
||||||
for p in fs::read_dir(path)
|
for p in fs::read_dir(path)
|
||||||
.map_err(|e| {
|
.map_err(|e| {
|
||||||
println!("{:?}, {e}", path);
|
println!("{:?}, {e}", path);
|
||||||
@@ -479,9 +470,7 @@ mod tests {
|
|||||||
})
|
})
|
||||||
.unwrap()
|
.unwrap()
|
||||||
{
|
{
|
||||||
let path = p.unwrap().path();
|
let mut buf = std::fs::read_to_string(p.unwrap().path()).unwrap();
|
||||||
let mut file = OpenOptions::new().read(true).open(&path).unwrap();
|
|
||||||
file.read_to_string(&mut buf).unwrap();
|
|
||||||
|
|
||||||
let data: KeyLayout = ron::from_str(&buf).unwrap();
|
let data: KeyLayout = ron::from_str(&buf).unwrap();
|
||||||
|
|
||||||
@@ -501,9 +490,10 @@ mod tests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !unused.is_empty() {
|
assert!(
|
||||||
panic!("The layout {path:?} had unused shapes {unused:?}",);
|
unused.is_empty(),
|
||||||
}
|
"The layout {path:?} had unused shapes {unused:?}",
|
||||||
|
);
|
||||||
buf.clear();
|
buf.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -527,9 +517,7 @@ mod tests {
|
|||||||
data_path.push("data");
|
data_path.push("data");
|
||||||
data_path.push("aura_support.ron");
|
data_path.push("aura_support.ron");
|
||||||
|
|
||||||
let mut buf = String::new();
|
let mut buf = std::fs::read_to_string(&data_path).unwrap();
|
||||||
let mut file = OpenOptions::new().read(true).open(&data_path).unwrap();
|
|
||||||
file.read_to_string(&mut buf).unwrap();
|
|
||||||
let data: LedSupportFile = ron::from_str(&buf).unwrap();
|
let data: LedSupportFile = ron::from_str(&buf).unwrap();
|
||||||
|
|
||||||
data_path.pop();
|
data_path.pop();
|
||||||
@@ -553,6 +541,7 @@ mod tests {
|
|||||||
)
|
)
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
#[allow(clippy::verbose_file_reads)]
|
||||||
if let Err(e) = file.read_to_string(&mut buf) {
|
if let Err(e) = file.read_to_string(&mut buf) {
|
||||||
panic!(
|
panic!(
|
||||||
"Error checking {data_path:?} for {} : {e:?}",
|
"Error checking {data_path:?} for {} : {e:?}",
|
||||||
|
|||||||
@@ -41,3 +41,6 @@ png_pong.workspace = true
|
|||||||
|
|
||||||
nix = "^0.26.1"
|
nix = "^0.26.1"
|
||||||
tempfile = "3.3.0"
|
tempfile = "3.3.0"
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
cargo-husky.workspace = true
|
||||||
@@ -60,6 +60,8 @@ impl Config {
|
|||||||
|
|
||||||
let mut buf = String::new();
|
let mut buf = String::new();
|
||||||
|
|
||||||
|
// Lint to allow, because we want the above file behaviour
|
||||||
|
#[allow(clippy::verbose_file_reads)]
|
||||||
if let Ok(read_len) = file.read_to_string(&mut buf) {
|
if let Ok(read_len) = file.read_to_string(&mut buf) {
|
||||||
if read_len == 0 {
|
if read_len == 0 {
|
||||||
warn!("Zero len read of Config file");
|
warn!("Zero len read of Config file");
|
||||||
|
|||||||
@@ -81,6 +81,8 @@ pub fn on_tmp_dir_exists() -> Result<TempDir, std::io::Error> {
|
|||||||
// First entry is the actual state
|
// First entry is the actual state
|
||||||
if buf[0] == SHOWING_GUI {
|
if buf[0] == SHOWING_GUI {
|
||||||
ipc_file.write_all(&[SHOWING_GUI])?; // Store state again as we drained the fifo
|
ipc_file.write_all(&[SHOWING_GUI])?; // Store state again as we drained the fifo
|
||||||
|
// Early exit is not an error and we don't want to pass back a dir
|
||||||
|
#[allow(clippy::exit)]
|
||||||
exit(0);
|
exit(0);
|
||||||
} else if buf[0] == SHOW_GUI {
|
} else if buf[0] == SHOW_GUI {
|
||||||
remove_dir_all(&path)?;
|
remove_dir_all(&path)?;
|
||||||
@@ -89,7 +91,7 @@ pub fn on_tmp_dir_exists() -> Result<TempDir, std::io::Error> {
|
|||||||
.rand_bytes(0)
|
.rand_bytes(0)
|
||||||
.tempdir();
|
.tempdir();
|
||||||
}
|
}
|
||||||
exit(-1);
|
panic!("Invalid exit or app state");
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_ipc_file() -> Result<File, crate::error::Error> {
|
pub fn get_ipc_file() -> Result<File, crate::error::Error> {
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
use std::env::args;
|
use std::env::args;
|
||||||
use std::fs::OpenOptions;
|
|
||||||
use std::io::{Read, Write};
|
use std::io::{Read, Write};
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
@@ -101,15 +100,10 @@ fn main() -> Result<()> {
|
|||||||
let enabled_notifications = EnabledNotifications::tokio_mutex(&config);
|
let enabled_notifications = EnabledNotifications::tokio_mutex(&config);
|
||||||
|
|
||||||
// Find and load a matching layout for laptop
|
// Find and load a matching layout for laptop
|
||||||
let mut file = OpenOptions::new()
|
let mut board_name = std::fs::read_to_string(BOARD_NAME).map_err(|e| {
|
||||||
.read(true)
|
println!("DOH! {BOARD_NAME}, {e}");
|
||||||
.open(PathBuf::from(BOARD_NAME))
|
e
|
||||||
.map_err(|e| {
|
})?;
|
||||||
println!("DOH! {BOARD_NAME}, {e}");
|
|
||||||
e
|
|
||||||
})?;
|
|
||||||
let mut board_name = String::new();
|
|
||||||
file.read_to_string(&mut board_name)?;
|
|
||||||
|
|
||||||
let mut led_support = LaptopLedData::get_data();
|
let mut led_support = LaptopLedData::get_data();
|
||||||
|
|
||||||
@@ -122,7 +116,7 @@ fn main() -> Result<()> {
|
|||||||
path.push("rog-aura");
|
path.push("rog-aura");
|
||||||
path.push("data");
|
path.push("data");
|
||||||
}
|
}
|
||||||
layouts = KeyLayout::layout_files(path.to_owned()).unwrap();
|
layouts = KeyLayout::layout_files(path.clone()).unwrap();
|
||||||
|
|
||||||
if let Some(name) = &cli_parsed.board_name {
|
if let Some(name) = &cli_parsed.board_name {
|
||||||
if let Some(modes) = LedSupportFile::load_from_config() {
|
if let Some(modes) = LedSupportFile::load_from_config() {
|
||||||
@@ -130,7 +124,7 @@ fn main() -> Result<()> {
|
|||||||
led_support = data;
|
led_support = data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
board_name = name.to_owned();
|
board_name = name.clone();
|
||||||
for layout in &layouts {
|
for layout in &layouts {
|
||||||
if layout
|
if layout
|
||||||
.file_name()
|
.file_name()
|
||||||
@@ -138,11 +132,11 @@ fn main() -> Result<()> {
|
|||||||
.to_string_lossy()
|
.to_string_lossy()
|
||||||
.contains(&led_support.layout_name.to_lowercase())
|
.contains(&led_support.layout_name.to_lowercase())
|
||||||
{
|
{
|
||||||
layout_name = Some(layout.to_owned());
|
layout_name = Some(layout.clone());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
board_name = "GQ401QM".to_string()
|
board_name = "GQ401QM".to_owned();
|
||||||
};
|
};
|
||||||
|
|
||||||
if cli_parsed.layout_viewing {
|
if cli_parsed.layout_viewing {
|
||||||
@@ -182,7 +176,7 @@ fn main() -> Result<()> {
|
|||||||
layout_name,
|
layout_name,
|
||||||
layout,
|
layout,
|
||||||
layouts,
|
layouts,
|
||||||
enabled_notifications,
|
&enabled_notifications,
|
||||||
&config,
|
&config,
|
||||||
&supported,
|
&supported,
|
||||||
)?;
|
)?;
|
||||||
@@ -222,7 +216,7 @@ fn setup_page_state_and_notifs(
|
|||||||
layout_testing: Option<PathBuf>,
|
layout_testing: Option<PathBuf>,
|
||||||
keyboard_layout: KeyLayout,
|
keyboard_layout: KeyLayout,
|
||||||
keyboard_layouts: Vec<PathBuf>,
|
keyboard_layouts: Vec<PathBuf>,
|
||||||
enabled_notifications: Arc<Mutex<EnabledNotifications>>,
|
enabled_notifications: &Arc<Mutex<EnabledNotifications>>,
|
||||||
config: &Config,
|
config: &Config,
|
||||||
supported: &SupportedFunctions,
|
supported: &SupportedFunctions,
|
||||||
) -> Result<Arc<Mutex<SystemState>>> {
|
) -> Result<Arc<Mutex<SystemState>>> {
|
||||||
@@ -234,7 +228,7 @@ fn setup_page_state_and_notifs(
|
|||||||
supported,
|
supported,
|
||||||
)?));
|
)?));
|
||||||
|
|
||||||
start_notifications(config, page_states.clone(), enabled_notifications)?;
|
start_notifications(config, &page_states, enabled_notifications)?;
|
||||||
|
|
||||||
Ok(page_states)
|
Ok(page_states)
|
||||||
}
|
}
|
||||||
@@ -253,21 +247,15 @@ fn start_app(states: Arc<Mutex<SystemState>>, native_options: NativeOptions) ->
|
|||||||
/// Bah.. the icon dosn't work on wayland anyway, but we'll leave it in for now.
|
/// Bah.. the icon dosn't work on wayland anyway, but we'll leave it in for now.
|
||||||
fn load_icon() -> IconData {
|
fn load_icon() -> IconData {
|
||||||
let path = PathBuf::from(APP_ICON_PATH);
|
let path = PathBuf::from(APP_ICON_PATH);
|
||||||
let mut buf = Vec::new();
|
|
||||||
let mut rgba = Vec::new();
|
let mut rgba = Vec::new();
|
||||||
let mut height = 512;
|
let mut height = 512;
|
||||||
let mut width = 512;
|
let mut width = 512;
|
||||||
if path.exists() {
|
if path.exists() {
|
||||||
if let Ok(mut file) = OpenOptions::new()
|
if let Ok(data) = std::fs::read(path)
|
||||||
.read(true)
|
.map_err(|e| error!("Error reading app icon: {e:?}"))
|
||||||
.open(path)
|
|
||||||
.map_err(|e| error!("Error opening app icon: {e:?}"))
|
.map_err(|e| error!("Error opening app icon: {e:?}"))
|
||||||
{
|
{
|
||||||
file.read_to_end(&mut buf)
|
let data = std::io::Cursor::new(data);
|
||||||
.map_err(|e| error!("Error reading app icon: {e:?}"))
|
|
||||||
.ok();
|
|
||||||
|
|
||||||
let data = std::io::Cursor::new(buf);
|
|
||||||
let decoder = png_pong::Decoder::new(data).unwrap().into_steps();
|
let decoder = png_pong::Decoder::new(data).unwrap().into_steps();
|
||||||
let png_pong::Step { raster, delay: _ } = decoder.last().unwrap().unwrap();
|
let png_pong::Step { raster, delay: _ } = decoder.last().unwrap().unwrap();
|
||||||
|
|
||||||
@@ -295,7 +283,7 @@ fn do_cli_help(parsed: &CliStart) -> bool {
|
|||||||
println!();
|
println!();
|
||||||
if let Some(cmdlist) = CliStart::command_list() {
|
if let Some(cmdlist) = CliStart::command_list() {
|
||||||
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() {
|
for command in &commands {
|
||||||
println!("{}", command);
|
println!("{}", command);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -342,6 +342,7 @@ impl ROGTray {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let Ok(mode) = self.bios_proxy.gpu_mux_mode() {
|
if let Ok(mode) = self.bios_proxy.gpu_mux_mode() {
|
||||||
|
// TODO: this is not taking in to account supergfxctl
|
||||||
let mode = match mode {
|
let mode = match mode {
|
||||||
GpuMode::Discrete => GfxMode::AsusMuxDiscreet,
|
GpuMode::Discrete => GfxMode::AsusMuxDiscreet,
|
||||||
_ => GfxMode::Hybrid,
|
_ => GfxMode::Hybrid,
|
||||||
@@ -473,13 +474,11 @@ pub fn init_tray(
|
|||||||
};
|
};
|
||||||
|
|
||||||
std::thread::spawn(move || {
|
std::thread::spawn(move || {
|
||||||
if gtk::init()
|
let gtk_init = gtk::init().map_err(|e| {
|
||||||
.map_err(|e| {
|
error!("ROGTray: gtk init {e}");
|
||||||
error!("ROGTray: gtk init {e}");
|
e
|
||||||
e
|
});
|
||||||
})
|
if gtk_init.is_err() {
|
||||||
.is_err()
|
|
||||||
{
|
|
||||||
return;
|
return;
|
||||||
} // Make this the main thread for gtk
|
} // Make this the main thread for gtk
|
||||||
debug!("init_tray gtk");
|
debug!("init_tray gtk");
|
||||||
|
|||||||
@@ -139,8 +139,8 @@ type SharedHandle = Arc<Mutex<Option<NotificationHandle>>>;
|
|||||||
|
|
||||||
pub fn start_notifications(
|
pub fn start_notifications(
|
||||||
config: &Config,
|
config: &Config,
|
||||||
page_states: Arc<Mutex<SystemState>>,
|
page_states: &Arc<Mutex<SystemState>>,
|
||||||
enabled_notifications: Arc<Mutex<EnabledNotifications>>,
|
enabled_notifications: &Arc<Mutex<EnabledNotifications>>,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let last_notification: SharedHandle = Arc::new(Mutex::new(None));
|
let last_notification: SharedHandle = Arc::new(Mutex::new(None));
|
||||||
|
|
||||||
@@ -556,7 +556,7 @@ fn do_mux_notification(message: &str, m: &GpuMode) -> Result<()> {
|
|||||||
} else if id == "__closed" {
|
} else if id == "__closed" {
|
||||||
// TODO: cancel the switching
|
// TODO: cancel the switching
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
});
|
});
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ pub fn keyboard(
|
|||||||
AdvancedAuraType::None => (false, keyboard_layout.max_width(), false),
|
AdvancedAuraType::None => (false, keyboard_layout.max_width(), false),
|
||||||
AdvancedAuraType::Zoned(zones) => {
|
AdvancedAuraType::Zoned(zones) => {
|
||||||
let width = if let Some(row) = keyboard_layout.rows_ref().get(2) {
|
let width = if let Some(row) = keyboard_layout.rows_ref().get(2) {
|
||||||
row.width() as f32
|
row.width()
|
||||||
} else {
|
} else {
|
||||||
0.0
|
0.0
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -15,3 +15,6 @@ rog_aura = { path = "../rog-aura" }
|
|||||||
rog_profiles = { path = "../rog-profiles" }
|
rog_profiles = { path = "../rog-profiles" }
|
||||||
rog_platform = { path = "../rog-platform" }
|
rog_platform = { path = "../rog-platform" }
|
||||||
zbus.workspace = true
|
zbus.workspace = true
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
cargo-husky.workspace = true
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
//! # DBus interface proxy for: `org.asuslinux.Daemon`
|
//! # `DBus` interface proxy for: `org.asuslinux.Daemon`
|
||||||
//!
|
//!
|
||||||
//! This code was generated by `zbus-xmlgen` `1.0.0` from DBus introspection
|
//! This code was generated by `zbus-xmlgen` `1.0.0` from `DBus` introspection
|
||||||
//! data. Source: `Interface '/org/asuslinux/Aura' from service
|
//! data. Source: `Interface '/org/asuslinux/Aura' from service
|
||||||
//! 'org.asuslinux.Daemon' on system bus`.
|
//! 'org.asuslinux.Daemon' on system bus`.
|
||||||
//!
|
//!
|
||||||
@@ -10,8 +10,8 @@
|
|||||||
//! [Writing a client proxy](https://zeenix.pages.freedesktop.org/zbus/client.html)
|
//! [Writing a client proxy](https://zeenix.pages.freedesktop.org/zbus/client.html)
|
||||||
//! section of the zbus documentation.
|
//! section of the zbus documentation.
|
||||||
//!
|
//!
|
||||||
//! This DBus object implements
|
//! This `DBus` object implements
|
||||||
//! [standard DBus interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html),
|
//! [standard `DBus` interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html),
|
||||||
//! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used:
|
//! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used:
|
||||||
//!
|
//!
|
||||||
//! * [`zbus::fdo::PeerProxy`]
|
//! * [`zbus::fdo::PeerProxy`]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
//! # DBus interface proxy for: `org.asuslinux.Daemon`
|
//! # `DBus` interface proxy for: `org.asuslinux.Daemon`
|
||||||
//!
|
//!
|
||||||
//! This code was generated by `zbus-xmlgen` `1.0.0` from DBus introspection
|
//! This code was generated by `zbus-xmlgen` `1.0.0` from `DBus` introspection
|
||||||
//! data. Source: `Interface '/org/asuslinux/Platform' from service
|
//! data. Source: `Interface '/org/asuslinux/Platform' from service
|
||||||
//! 'org.asuslinux.Daemon' on system bus`.
|
//! 'org.asuslinux.Daemon' on system bus`.
|
||||||
//!
|
//!
|
||||||
@@ -10,8 +10,8 @@
|
|||||||
//! [Writing a client proxy](https://zeenix.pages.freedesktop.org/zbus/client.html)
|
//! [Writing a client proxy](https://zeenix.pages.freedesktop.org/zbus/client.html)
|
||||||
//! section of the zbus documentation.
|
//! section of the zbus documentation.
|
||||||
//!
|
//!
|
||||||
//! This DBus object implements
|
//! This `DBus` object implements
|
||||||
//! [standard DBus interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html),
|
//! [standard `DBus` interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html),
|
||||||
//! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used:
|
//! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used:
|
||||||
//!
|
//!
|
||||||
//! * [`zbus::fdo::PropertiesProxy`]
|
//! * [`zbus::fdo::PropertiesProxy`]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
//! # DBus interface proxy for: `org.asuslinux.Daemon`
|
//! # `DBus` interface proxy for: `org.asuslinux.Daemon`
|
||||||
//!
|
//!
|
||||||
//! This code was generated by `zbus-xmlgen` `1.0.0` from DBus introspection
|
//! This code was generated by `zbus-xmlgen` `1.0.0` from `DBus` introspection
|
||||||
//! data. Source: `Interface '/org/asuslinux/Charge' from service
|
//! data. Source: `Interface '/org/asuslinux/Charge' from service
|
||||||
//! 'org.asuslinux.Daemon' on system bus`.
|
//! 'org.asuslinux.Daemon' on system bus`.
|
||||||
//!
|
//!
|
||||||
@@ -10,8 +10,8 @@
|
|||||||
//! [Writing a client proxy](https://zeenix.pages.freedesktop.org/zbus/client.html)
|
//! [Writing a client proxy](https://zeenix.pages.freedesktop.org/zbus/client.html)
|
||||||
//! section of the zbus documentation.
|
//! section of the zbus documentation.
|
||||||
//!
|
//!
|
||||||
//! This DBus object implements
|
//! This `DBus` object implements
|
||||||
//! [standard DBus interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html),
|
//! [standard `DBus` interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html),
|
||||||
//! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used:
|
//! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used:
|
||||||
//!
|
//!
|
||||||
//! * [`zbus::fdo::PropertiesProxy`]
|
//! * [`zbus::fdo::PropertiesProxy`]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
//! # DBus interface proxy for: `org.asuslinux.Daemon`
|
//! # `DBus` interface proxy for: `org.asuslinux.Daemon`
|
||||||
//!
|
//!
|
||||||
//! This code was generated by `zbus-xmlgen` `1.0.0` from DBus introspection
|
//! This code was generated by `zbus-xmlgen` `1.0.0` from `DBus` introspection
|
||||||
//! data. Source: `Interface '/org/asuslinux/Profile' from service
|
//! data. Source: `Interface '/org/asuslinux/Profile' from service
|
||||||
//! 'org.asuslinux.Daemon' on system bus`.
|
//! 'org.asuslinux.Daemon' on system bus`.
|
||||||
//!
|
//!
|
||||||
@@ -10,8 +10,8 @@
|
|||||||
//! [Writing a client proxy](https://zeenix.pages.freedesktop.org/zbus/client.html)
|
//! [Writing a client proxy](https://zeenix.pages.freedesktop.org/zbus/client.html)
|
||||||
//! section of the zbus documentation.
|
//! section of the zbus documentation.
|
||||||
//!
|
//!
|
||||||
//! This DBus object implements
|
//! This `DBus object implements
|
||||||
//! [standard DBus interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html),
|
//! [standard DBus` interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html),
|
||||||
//! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used:
|
//! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used:
|
||||||
//!
|
//!
|
||||||
//! * [`zbus::fdo::IntrospectableProxy`]
|
//! * [`zbus::fdo::IntrospectableProxy`]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
//! # DBus interface proxy for: `org.asuslinux.Daemon`
|
//! # `DBus` interface proxy for: `org.asuslinux.Daemon`
|
||||||
//!
|
//!
|
||||||
//! This code was generated by `zbus-xmlgen` `1.0.0` from DBus introspection
|
//! This code was generated by `zbus-xmlgen` `1.0.0` from `DBus` introspection
|
||||||
//! data. Source: `Interface '/org/asuslinux/Supported' from service
|
//! data. Source: `Interface '/org/asuslinux/Supported' from service
|
||||||
//! 'org.asuslinux.Daemon' on system bus`.
|
//! 'org.asuslinux.Daemon' on system bus`.
|
||||||
//!
|
//!
|
||||||
@@ -10,8 +10,8 @@
|
|||||||
//! [Writing a client proxy](https://zeenix.pages.freedesktop.org/zbus/client.html)
|
//! [Writing a client proxy](https://zeenix.pages.freedesktop.org/zbus/client.html)
|
||||||
//! section of the zbus documentation.
|
//! section of the zbus documentation.
|
||||||
//!
|
//!
|
||||||
//! This DBus object implements
|
//! This `DBus` object implements
|
||||||
//! [standard DBus interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html),
|
//! [standard `DBus` interfaces](https://dbus.freedesktop.org/doc/dbus-specification.html),
|
||||||
//! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used:
|
//! (`org.freedesktop.DBus.*`) for which the following zbus proxies can be used:
|
||||||
//!
|
//!
|
||||||
//! * [`zbus::fdo::PeerProxy`]
|
//! * [`zbus::fdo::PeerProxy`]
|
||||||
|
|||||||
@@ -16,3 +16,6 @@ udev.workspace = true
|
|||||||
inotify.workspace = true
|
inotify.workspace = true
|
||||||
|
|
||||||
rusb.workspace = true
|
rusb.workspace = true
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
cargo-husky.workspace = true
|
||||||
+1
-39
@@ -51,7 +51,7 @@ pub fn write_attr_bool(device: &mut Device, attr: &str, value: bool) -> Result<(
|
|||||||
pub fn read_attr_u8(device: &Device, attr_name: &str) -> Result<u8> {
|
pub fn read_attr_u8(device: &Device, attr_name: &str) -> Result<u8> {
|
||||||
if let Some(value) = device.attribute_value(attr_name) {
|
if let Some(value) = device.attribute_value(attr_name) {
|
||||||
let tmp = value.to_string_lossy();
|
let tmp = value.to_string_lossy();
|
||||||
return tmp.parse::<u8>().map_err(|_| PlatformError::ParseNum);
|
return tmp.parse::<u8>().map_err(|_e| PlatformError::ParseNum);
|
||||||
}
|
}
|
||||||
Err(PlatformError::AttrNotFound(attr_name.to_owned()))
|
Err(PlatformError::AttrNotFound(attr_name.to_owned()))
|
||||||
}
|
}
|
||||||
@@ -114,41 +114,3 @@ mod tests {
|
|||||||
assert_eq!(tmp, &[1, 2, 3, 4, 5]);
|
assert_eq!(tmp, &[1, 2, 3, 4, 5]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// pub fn find_led_node(id_product: &str) -> Result<Device, PlatformError> {
|
|
||||||
// let mut enumerator = udev::Enumerator::new().map_err(|err| {
|
|
||||||
// warn!("{}", err);
|
|
||||||
// PlatformError::Udev("enumerator failed".into(), err)
|
|
||||||
// })?;
|
|
||||||
// enumerator.match_subsystem("hidraw").map_err(|err| {
|
|
||||||
// warn!("{}", err);
|
|
||||||
// PlatformError::Udev("match_subsystem failed".into(), err)
|
|
||||||
// })?;
|
|
||||||
|
|
||||||
// for device in enumerator.scan_devices().map_err(|err| {
|
|
||||||
// warn!("{}", err);
|
|
||||||
// PlatformError::Udev("scan_devices failed".into(), err)
|
|
||||||
// })? {
|
|
||||||
// if let Some(parent) = device
|
|
||||||
// .parent_with_subsystem_devtype("usb", "usb_device")
|
|
||||||
// .map_err(|err| {
|
|
||||||
// warn!("{}", err);
|
|
||||||
// PlatformError::Udev("parent_with_subsystem_devtype
|
|
||||||
// failed".into(), err) })?
|
|
||||||
// {
|
|
||||||
// if parent
|
|
||||||
// .attribute_value("idProduct")
|
|
||||||
// .ok_or_else(|| PlatformError::NotFound("LED
|
|
||||||
// idProduct".into()))? == id_product
|
|
||||||
// {
|
|
||||||
// if let Some(dev_node) = device.devnode() {
|
|
||||||
// info!("Using device at: {:?} for LED control", dev_node);
|
|
||||||
// return Ok(device);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// Err(PlatformError::MissingFunction(
|
|
||||||
// "ASUS LED device node not found".into(),
|
|
||||||
// ))
|
|
||||||
// }
|
|
||||||
|
|||||||
@@ -15,3 +15,6 @@ serde.workspace = true
|
|||||||
serde_derive.workspace = true
|
serde_derive.workspace = true
|
||||||
|
|
||||||
zbus = { workspace = true, optional = true }
|
zbus = { workspace = true, optional = true }
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
cargo-husky.workspace = true
|
||||||
@@ -19,7 +19,7 @@ pub enum ProfileError {
|
|||||||
|
|
||||||
impl fmt::Display for ProfileError {
|
impl fmt::Display for ProfileError {
|
||||||
// This trait requires `fmt` with this exact signature.
|
// This trait requires `fmt` with this exact signature.
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
match self {
|
match self {
|
||||||
ProfileError::Path(path, error) => write!(f, "Path {}: {}", path, error),
|
ProfileError::Path(path, error) => write!(f, "Path {}: {}", path, error),
|
||||||
ProfileError::Read(path, error) => write!(f, "Read {}: {}", path, error),
|
ProfileError::Read(path, error) => write!(f, "Read {}: {}", path, error),
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ use crate::error::ProfileError;
|
|||||||
use crate::FanCurvePU;
|
use crate::FanCurvePU;
|
||||||
|
|
||||||
pub(crate) fn pwm_str(fan: char, index: usize) -> String {
|
pub(crate) fn pwm_str(fan: char, index: usize) -> String {
|
||||||
let mut buf = "pwm1_auto_point1_pwm".to_string();
|
let mut buf = "pwm1_auto_point1_pwm".to_owned();
|
||||||
unsafe {
|
unsafe {
|
||||||
let tmp = buf.as_bytes_mut();
|
let tmp = buf.as_bytes_mut();
|
||||||
tmp[3] = fan as u8;
|
tmp[3] = fan as u8;
|
||||||
@@ -17,7 +17,7 @@ pub(crate) fn pwm_str(fan: char, index: usize) -> String {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn temp_str(fan: char, index: usize) -> String {
|
pub(crate) fn temp_str(fan: char, index: usize) -> String {
|
||||||
let mut buf = "pwm1_auto_point1_temp".to_string();
|
let mut buf = "pwm1_auto_point1_temp".to_owned();
|
||||||
unsafe {
|
unsafe {
|
||||||
let tmp = buf.as_bytes_mut();
|
let tmp = buf.as_bytes_mut();
|
||||||
tmp[3] = fan as u8;
|
tmp[3] = fan as u8;
|
||||||
@@ -146,10 +146,10 @@ impl CurveData {
|
|||||||
for attr in device.attributes() {
|
for attr in device.attributes() {
|
||||||
let tmp = attr.name().to_string_lossy();
|
let tmp = attr.name().to_string_lossy();
|
||||||
if tmp.starts_with("pwm1") && tmp.ends_with("_temp") {
|
if tmp.starts_with("pwm1") && tmp.ends_with("_temp") {
|
||||||
Self::set_val_from_attr(tmp.as_ref(), device, &mut self.temp)
|
Self::set_val_from_attr(tmp.as_ref(), device, &mut self.temp);
|
||||||
}
|
}
|
||||||
if tmp.starts_with("pwm1") && tmp.ends_with("_pwm") {
|
if tmp.starts_with("pwm1") && tmp.ends_with("_pwm") {
|
||||||
Self::set_val_from_attr(tmp.as_ref(), device, &mut self.pwm)
|
Self::set_val_from_attr(tmp.as_ref(), device, &mut self.pwm);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-10
@@ -2,8 +2,8 @@ pub mod error;
|
|||||||
pub mod fan_curve_set;
|
pub mod fan_curve_set;
|
||||||
|
|
||||||
use std::fmt::Display;
|
use std::fmt::Display;
|
||||||
use std::fs::OpenOptions;
|
use std::fs::{self, OpenOptions};
|
||||||
use std::io::{Read, Write};
|
use std::io::Write;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
use error::ProfileError;
|
use error::ProfileError;
|
||||||
@@ -49,18 +49,12 @@ impl Profile {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_active_profile() -> Result<Profile, ProfileError> {
|
pub fn get_active_profile() -> Result<Profile, ProfileError> {
|
||||||
let mut file = OpenOptions::new().read(true).open(PLATFORM_PROFILE)?;
|
let buf = fs::read_to_string(PLATFORM_PROFILE)?;
|
||||||
|
|
||||||
let mut buf = String::new();
|
|
||||||
file.read_to_string(&mut buf)?;
|
|
||||||
Ok(buf.as_str().into())
|
Ok(buf.as_str().into())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_profile_names() -> Result<Vec<Profile>, ProfileError> {
|
pub fn get_profile_names() -> Result<Vec<Profile>, ProfileError> {
|
||||||
let mut file = OpenOptions::new().read(true).open(PLATFORM_PROFILES)?;
|
let buf = fs::read_to_string(PLATFORM_PROFILES)?;
|
||||||
|
|
||||||
let mut buf = String::new();
|
|
||||||
file.read_to_string(&mut buf)?;
|
|
||||||
Ok(buf.rsplit(' ').map(|p| p.into()).collect())
|
Ok(buf.rsplit(' ').map(|p| p.into()).collect())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user