mirror of
https://gitlab.com/asus-linux/asusctl.git
synced 2026-01-22 09:23:19 +01:00
Add git hooks via cargo-husky. Many many cleanups.
This commit is contained in:
12
.cargo-husky/hooks/pre-commit
Executable file
12
.cargo-husky/hooks/pre-commit
Executable file
@@ -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
|
||||||
10
.cargo-husky/hooks/pre-push
Executable file
10
.cargo-husky/hooks/pre-push
Executable file
@@ -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
|
||||||
18
Cargo.lock
generated
18
Cargo.lock
generated
@@ -151,6 +151,7 @@ checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6"
|
|||||||
name = "asusctl"
|
name = "asusctl"
|
||||||
version = "4.6.0-rc1"
|
version = "4.6.0-rc1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"cargo-husky",
|
||||||
"daemon",
|
"daemon",
|
||||||
"gif",
|
"gif",
|
||||||
"glam",
|
"glam",
|
||||||
@@ -504,6 +505,12 @@ dependencies = [
|
|||||||
"vec_map",
|
"vec_map",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cargo-husky"
|
||||||
|
version = "1.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7b02b629252fe8ef6460461409564e2c21d0c8e77e0944f3d189ff06c4e932ad"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.0.78"
|
version = "1.0.78"
|
||||||
@@ -659,8 +666,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "config-traits"
|
name = "config-traits"
|
||||||
version = "0.1.0"
|
version = "4.6.0-rc1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"cargo-husky",
|
||||||
"log",
|
"log",
|
||||||
"ron",
|
"ron",
|
||||||
"serde",
|
"serde",
|
||||||
@@ -793,6 +801,7 @@ name = "daemon"
|
|||||||
version = "4.6.0-rc1"
|
version = "4.6.0-rc1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
|
"cargo-husky",
|
||||||
"concat-idents",
|
"concat-idents",
|
||||||
"config-traits",
|
"config-traits",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
@@ -815,6 +824,7 @@ dependencies = [
|
|||||||
name = "daemon-user"
|
name = "daemon-user"
|
||||||
version = "4.6.0-rc1"
|
version = "4.6.0-rc1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"cargo-husky",
|
||||||
"config-traits",
|
"config-traits",
|
||||||
"dirs",
|
"dirs",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
@@ -2709,6 +2719,7 @@ dependencies = [
|
|||||||
name = "rog-control-center"
|
name = "rog-control-center"
|
||||||
version = "4.6.0-rc1"
|
version = "4.6.0-rc1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"cargo-husky",
|
||||||
"daemon",
|
"daemon",
|
||||||
"dirs",
|
"dirs",
|
||||||
"eframe",
|
"eframe",
|
||||||
@@ -2740,6 +2751,7 @@ dependencies = [
|
|||||||
name = "rog_anime"
|
name = "rog_anime"
|
||||||
version = "4.6.0-rc1"
|
version = "4.6.0-rc1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"cargo-husky",
|
||||||
"gif",
|
"gif",
|
||||||
"glam",
|
"glam",
|
||||||
"log",
|
"log",
|
||||||
@@ -2756,6 +2768,7 @@ dependencies = [
|
|||||||
name = "rog_aura"
|
name = "rog_aura"
|
||||||
version = "4.6.0-rc1"
|
version = "4.6.0-rc1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"cargo-husky",
|
||||||
"log",
|
"log",
|
||||||
"ron",
|
"ron",
|
||||||
"serde",
|
"serde",
|
||||||
@@ -2768,6 +2781,7 @@ dependencies = [
|
|||||||
name = "rog_dbus"
|
name = "rog_dbus"
|
||||||
version = "4.6.0-rc1"
|
version = "4.6.0-rc1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"cargo-husky",
|
||||||
"rog_anime",
|
"rog_anime",
|
||||||
"rog_aura",
|
"rog_aura",
|
||||||
"rog_platform",
|
"rog_platform",
|
||||||
@@ -2779,6 +2793,7 @@ dependencies = [
|
|||||||
name = "rog_platform"
|
name = "rog_platform"
|
||||||
version = "4.6.0-rc1"
|
version = "4.6.0-rc1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"cargo-husky",
|
||||||
"concat-idents",
|
"concat-idents",
|
||||||
"inotify",
|
"inotify",
|
||||||
"log",
|
"log",
|
||||||
@@ -2795,6 +2810,7 @@ dependencies = [
|
|||||||
name = "rog_profiles"
|
name = "rog_profiles"
|
||||||
version = "4.6.0-rc1"
|
version = "4.6.0-rc1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"cargo-husky",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
"udev 0.7.0",
|
"udev 0.7.0",
|
||||||
|
|||||||
@@ -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,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",
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
||||||
10
config-traits/README.md
Normal file
10
config-traits/README.md
Normal file
@@ -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.
|
||||||
@@ -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
|
||||||
)
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -206,7 +209,9 @@ macro_rules! std_config_load {
|
|||||||
self = data;
|
self = data;
|
||||||
} 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) {
|
} $(else if let Ok(data) = ron::from_str::<$generic>(&buf) {
|
||||||
|
self = data.into();
|
||||||
|
} else if let Ok(data) = serde_json::from_str::<$generic>(&buf) {
|
||||||
self = data.into();
|
self = data.into();
|
||||||
} 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();
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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))?;
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,7 +77,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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -473,13 +473,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
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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