From a117c300d5aa32d50892276cab39cae2b4b3854c Mon Sep 17 00:00:00 2001 From: "Luke D. Jones" Date: Sat, 16 Jul 2022 13:40:57 +1200 Subject: [PATCH] Add support for /etc/asusd/asusd-user-ledmodes.toml --- CHANGELOG.md | 1 + daemon/src/laptops.rs | 41 ++++++++++++++++++++++++++++++++++++----- rog-anime/src/image.rs | 18 ++++++++++++++---- 3 files changed, 51 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4674a350..5adfbf8b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 power-config of all LED zones. See `asusctrl led-power --help` (Author: Luke Jones, With much help from: @MNS26) - Full support for multizone LED (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 - Data for anime-matrix now requires passing the laptop model as enum - Extra unit tests for anime stuff to help verify things diff --git a/daemon/src/laptops.rs b/daemon/src/laptops.rs index 0c195a7f..63860110 100644 --- a/daemon/src/laptops.rs +++ b/daemon/src/laptops.rs @@ -5,6 +5,7 @@ use std::fs::OpenOptions; use std::io::Read; 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 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 { led_data: Vec, } @@ -86,19 +87,49 @@ impl LedSupportFile { } fn load_from_config() -> Option { + 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::(&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) { let mut buf = String::new(); if let Ok(l) = file.read_to_string(&mut buf) { if l == 0 { warn!("{} is empty", ASUS_LED_MODE_CONF); } else { - return Some(toml::from_str(&buf).unwrap_or_else(|_| { - panic!("Could not deserialise {}", ASUS_LED_MODE_CONF) - })); + let mut tmp: LedSupportFile = toml::from_str(&buf) + .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 } } diff --git a/rog-anime/src/image.rs b/rog-anime/src/image.rs index de1441a2..af452edf 100644 --- a/rog-anime/src/image.rs +++ b/rog-anime/src/image.rs @@ -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 let mut last_x = 0.0; let mut last_y = 0.0; @@ -503,7 +504,7 @@ impl From<&AnimeImage> for AnimeDataBuffer { mod tests { use std::path::PathBuf; - use crate::{image::*, AnimePacketType, AnimeGif, AnimTime}; + use crate::{image::*, AnimTime, AnimeGif, AnimePacketType}; #[test] fn led_positions() { @@ -727,7 +728,7 @@ mod tests { 100, AnimeType::GA402, ); - matrix.edge_outline(); + matrix._edge_outline(); let data = AnimeDataBuffer::from(&matrix); let pkt = AnimePacketType::from(data); @@ -742,7 +743,16 @@ mod tests { let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); 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(); let _pkt = AnimePacketType::from(matrix.frames()[0].frame().clone()); }