From 8da748bf7fbedade8098ca67b23dce8e025741a5 Mon Sep 17 00:00:00 2001 From: Luke Date: Sun, 5 Jul 2020 21:20:25 +1200 Subject: [PATCH] Fix many small bugs in refactor of laptop LED mode handling Closes issue #27 --- Cargo.lock | 4 ++-- debian/changelog | 6 ++++++ rog-client/Cargo.toml | 2 +- rog-core/Cargo.toml | 2 +- rog-core/src/daemon.rs | 2 +- rog-core/src/led_control.rs | 39 ++++++++++++++++++++++++++++--------- 6 files changed, 41 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 170ee8e4..f2f638c6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -697,7 +697,7 @@ checksum = "cabe4fa914dec5870285fa7f71f602645da47c486e68486d2b4ceb4a343e90ac" [[package]] name = "rog-client" -version = "0.14.0" +version = "0.14.3" dependencies = [ "dbus", "gumdrop", @@ -710,7 +710,7 @@ dependencies = [ [[package]] name = "rog-daemon" -version = "0.14.0" +version = "0.14.3" dependencies = [ "dbus", "dbus-tokio", diff --git a/debian/changelog b/debian/changelog index 472c3798..a09735bd 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +rog-core (0.14.3) focal; urgency=medium + + - Proper fix of laptop mode conversion bug + + -- Luke Jones Sun, 05 Jul 2020 21:22:05 +1200 + rog-core (0.14.2) focal; urgency=medium - Try to correct how laptop modes are handled diff --git a/rog-client/Cargo.toml b/rog-client/Cargo.toml index 0bc9606a..e4b40180 100644 --- a/rog-client/Cargo.toml +++ b/rog-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rog-client" -version = "0.14.0" +version = "0.14.3" license = "MPL-2.0" readme = "README.md" authors = ["Luke "] diff --git a/rog-core/Cargo.toml b/rog-core/Cargo.toml index 7d8b80f8..b649059c 100644 --- a/rog-core/Cargo.toml +++ b/rog-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rog-daemon" -version = "0.14.0" +version = "0.14.3" license = "MPL-2.0" readme = "README.md" authors = ["Luke "] diff --git a/rog-core/src/daemon.rs b/rog-core/src/daemon.rs index 42d70e4f..3ff50acd 100644 --- a/rog-core/src/daemon.rs +++ b/rog-core/src/daemon.rs @@ -63,7 +63,7 @@ pub async fn start_daemon() -> Result<(), Box> { laptop.supported_modes().to_owned(), ); led_writer - .reload_last_builtin(&config) + .reload_last_builtin(&mut config) .await .unwrap_or_else(|err| warn!("Reload settings: {}", err)); diff --git a/rog-core/src/led_control.rs b/rog-core/src/led_control.rs index 3f3ca668..5e5bac49 100644 --- a/rog-core/src/led_control.rs +++ b/rog-core/src/led_control.rs @@ -9,7 +9,7 @@ static LED_APPLY: [u8; 17] = [0x5d, 0xb4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, static LED_SET: [u8; 17] = [0x5d, 0xb5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; use crate::{config::Config, error::RogError}; -use log::{error, info}; +use log::{error, info, warn}; use rog_client::{ aura_brightness_bytes, aura_modes::AuraModes, fancy::KeyColourArray, LED_MSG_LEN, }; @@ -181,17 +181,38 @@ where } #[inline] - pub async fn reload_last_builtin(&mut self, config: &Config) -> Result<(), RogError> { + pub async fn reload_last_builtin(&mut self, config: &mut Config) -> Result<(), RogError> { self.initialise().await?; // set current mode (if any) if self.supported_modes.len() > 1 { - let mode = config - .get_led_mode_data(config.current_mode) - .ok_or(RogError::NotSupported)? - .to_owned(); - let mode: [u8; LED_MSG_LEN] = mode.into(); - self.write_bytes(&mode).await?; - info!("Reloaded last used mode"); + if self.supported_modes.contains(&config.current_mode) { + let mode = config + .get_led_mode_data(config.current_mode) + .ok_or(RogError::NotSupported)? + .to_owned(); + self.write_mode(&mode).await?; + info!("Reloaded last used mode"); + } else { + warn!( + "An unsupported mode was set: {}, reset to first mode available", + <&str>::from(&::from(config.current_mode)) + ); + for (idx, mode) in config.builtin_modes.iter_mut().enumerate() { + if !self.supported_modes.contains(&mode.into()) { + config.builtin_modes.remove(idx); + config.write(); + break; + } + } + config.current_mode = self.supported_modes[0]; + // TODO: do a recursive call with a boxed dyn future later + let mode = config + .get_led_mode_data(config.current_mode) + .ok_or(RogError::NotSupported)? + .to_owned(); + self.write_mode(&mode).await?; + info!("Reloaded last used mode"); + } } // Reload brightness