mirror of
https://gitlab.com/asus-linux/asusctl.git
synced 2026-02-06 00:15:04 +01:00
Add support for /etc/asusd/asusd-user-ledmodes.toml
This commit is contained in:
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
- Support for GA402 Anime Matrix display (Author: I-Al-Istannen & Luke Jones)
|
- Support for GA402 Anime Matrix display (Author: I-Al-Istannen & Luke Jones)
|
||||||
- Support for power-config of all LED zones. See `asusctrl led-power --help` (Author: Luke Jones, With much help from: @MNS26)
|
- Support for power-config of all LED zones. See `asusctrl led-power --help` (Author: Luke Jones, With much help from: @MNS26)
|
||||||
- Full support for multizone LED <logo, keyboard, lightbar> (Author: Luke Jones, With much help from: @MNS26)
|
- Full support for multizone LED <logo, keyboard, lightbar> (Author: Luke Jones, With much help from: @MNS26)
|
||||||
|
- Add ability to load extra data from `/etc/asusd/asusd-user-ledmodes.toml` for LED support if file exits
|
||||||
### Changed
|
### Changed
|
||||||
- Data for anime-matrix now requires passing the laptop model as enum
|
- Data for anime-matrix now requires passing the laptop model as enum
|
||||||
- Extra unit tests for anime stuff to help verify things
|
- Extra unit tests for anime stuff to help verify things
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ use std::fs::OpenOptions;
|
|||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
|
|
||||||
pub const ASUS_LED_MODE_CONF: &str = "/etc/asusd/asusd-ledmodes.toml";
|
pub const ASUS_LED_MODE_CONF: &str = "/etc/asusd/asusd-ledmodes.toml";
|
||||||
|
pub const ASUS_LED_MODE_USER_CONF: &str = "/etc/asusd/asusd-user-ledmodes.toml";
|
||||||
pub const ASUS_KEYBOARD_DEVICES: [&str; 4] = ["1866", "1869", "1854", "19b6"];
|
pub const ASUS_KEYBOARD_DEVICES: [&str; 4] = ["1866", "1869", "1854", "19b6"];
|
||||||
|
|
||||||
pub fn print_board_info() {
|
pub fn print_board_info() {
|
||||||
@@ -32,7 +33,7 @@ pub fn print_modes(supported_modes: &[u8]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, Serialize)]
|
#[derive(Debug, Default, Deserialize, Serialize)]
|
||||||
struct LedSupportFile {
|
struct LedSupportFile {
|
||||||
led_data: Vec<LaptopLedData>,
|
led_data: Vec<LaptopLedData>,
|
||||||
}
|
}
|
||||||
@@ -86,19 +87,49 @@ impl LedSupportFile {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn load_from_config() -> Option<Self> {
|
fn load_from_config() -> Option<Self> {
|
||||||
|
let mut loaded = false;
|
||||||
|
let mut data = LedSupportFile::default();
|
||||||
|
// 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) {
|
||||||
|
let mut buf = String::new();
|
||||||
|
if let Ok(l) = file.read_to_string(&mut buf) {
|
||||||
|
if l == 0 {
|
||||||
|
warn!("{} is empty", ASUS_LED_MODE_USER_CONF);
|
||||||
|
} else {
|
||||||
|
if let Ok(mut tmp) = toml::from_str::<LedSupportFile>(&buf) {
|
||||||
|
data.led_data.append(&mut tmp.led_data);
|
||||||
|
}
|
||||||
|
info!(
|
||||||
|
"Loaded user-defined LED support data from {}",
|
||||||
|
ASUS_LED_MODE_USER_CONF
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 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(mut file) = OpenOptions::new().read(true).open(&ASUS_LED_MODE_CONF) {
|
||||||
let mut buf = String::new();
|
let mut buf = String::new();
|
||||||
if let Ok(l) = file.read_to_string(&mut buf) {
|
if let Ok(l) = file.read_to_string(&mut buf) {
|
||||||
if l == 0 {
|
if l == 0 {
|
||||||
warn!("{} is empty", ASUS_LED_MODE_CONF);
|
warn!("{} is empty", ASUS_LED_MODE_CONF);
|
||||||
} else {
|
} else {
|
||||||
return Some(toml::from_str(&buf).unwrap_or_else(|_| {
|
let mut tmp: LedSupportFile = toml::from_str(&buf)
|
||||||
panic!("Could not deserialise {}", ASUS_LED_MODE_CONF)
|
.unwrap_or_else(|_| panic!("Could not deserialise {}", ASUS_LED_MODE_CONF));
|
||||||
}));
|
data.led_data.append(&mut tmp.led_data);
|
||||||
|
loaded = true;
|
||||||
|
info!(
|
||||||
|
"Loaded default LED support data from {}",
|
||||||
|
ASUS_LED_MODE_CONF
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
warn!("Does {} exist?", ASUS_LED_MODE_CONF);
|
|
||||||
|
if loaded {
|
||||||
|
return Some(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
warn!("Does {} exist?", ASUS_LED_MODE_USER_CONF);
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -308,7 +308,8 @@ impl AnimeImage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn edge_outline(&mut self) {
|
/// A helper for determining physical position alignment
|
||||||
|
fn _edge_outline(&mut self) {
|
||||||
// Janky shit here just to try help align images
|
// Janky shit here just to try help align images
|
||||||
let mut last_x = 0.0;
|
let mut last_x = 0.0;
|
||||||
let mut last_y = 0.0;
|
let mut last_y = 0.0;
|
||||||
@@ -503,7 +504,7 @@ impl From<&AnimeImage> for AnimeDataBuffer {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
use crate::{image::*, AnimePacketType, AnimeGif, AnimTime};
|
use crate::{image::*, AnimTime, AnimeGif, AnimePacketType};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn led_positions() {
|
fn led_positions() {
|
||||||
@@ -727,7 +728,7 @@ mod tests {
|
|||||||
100,
|
100,
|
||||||
AnimeType::GA402,
|
AnimeType::GA402,
|
||||||
);
|
);
|
||||||
matrix.edge_outline();
|
matrix._edge_outline();
|
||||||
let data = AnimeDataBuffer::from(&matrix);
|
let data = AnimeDataBuffer::from(&matrix);
|
||||||
let pkt = AnimePacketType::from(data);
|
let pkt = AnimePacketType::from(data);
|
||||||
|
|
||||||
@@ -742,7 +743,16 @@ mod tests {
|
|||||||
let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
||||||
path.push("data/anime/custom/sonic-run.gif");
|
path.push("data/anime/custom/sonic-run.gif");
|
||||||
|
|
||||||
let matrix = AnimeGif::from_gif(&path, 1.0, 0.0, Vec2::default(), AnimTime::Infinite, 1.0, AnimeType::GA402).unwrap();
|
let matrix = AnimeGif::from_gif(
|
||||||
|
&path,
|
||||||
|
1.0,
|
||||||
|
0.0,
|
||||||
|
Vec2::default(),
|
||||||
|
AnimTime::Infinite,
|
||||||
|
1.0,
|
||||||
|
AnimeType::GA402,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
matrix.frames()[0].frame();
|
matrix.frames()[0].frame();
|
||||||
let _pkt = AnimePacketType::from(matrix.frames()[0].frame().clone());
|
let _pkt = AnimePacketType::from(matrix.frames()[0].frame().clone());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user