From 03b338bdfa66c9b1fe852b7f6aa0ce50f2cbf132 Mon Sep 17 00:00:00 2001 From: Luke D Jones Date: Mon, 22 Mar 2021 14:09:27 +1300 Subject: [PATCH] Strongly type the Led brightness --- asusctl/src/aura_cli.rs | 6 +++--- asusctl/src/main.rs | 10 ++-------- daemon/src/config_aura.rs | 32 ++++++++++++++++++++++++++++---- daemon/src/ctrl_leds.rs | 18 ++++++++---------- rog-dbus/src/zbus_led.rs | 6 +++--- rog-types/src/aura_modes.rs | 26 ++++++++++++++++++++++++++ 6 files changed, 70 insertions(+), 28 deletions(-) diff --git a/asusctl/src/aura_cli.rs b/asusctl/src/aura_cli.rs index c0326373..47138b6a 100644 --- a/asusctl/src/aura_cli.rs +++ b/asusctl/src/aura_cli.rs @@ -7,14 +7,14 @@ use std::str::FromStr; #[derive(Options)] pub struct LedBrightness { - level: Option, + level: Option, } impl LedBrightness { - pub fn new(level: Option) -> Self { + pub fn new(level: Option) -> Self { LedBrightness { level } } - pub fn level(&self) -> Option { + pub fn level(&self) -> Option { self.level } } diff --git a/asusctl/src/main.rs b/asusctl/src/main.rs index ec0c6ee6..a5dbba59 100644 --- a/asusctl/src/main.rs +++ b/asusctl/src/main.rs @@ -7,13 +7,7 @@ use daemon::{ }; use gumdrop::{Opt, Options}; use rog_dbus::AuraDbusClient; -use rog_types::{ - anime_matrix::{AniMeDataBuffer, FULL_PANE_LEN}, - aura_modes::{AuraEffect, AuraModeNum}, - cli_options::{AniMeActions, AniMeStatusValue}, - gfx_vendors::GfxVendors, - profile::{FanLevel, ProfileCommand, ProfileEvent}, -}; +use rog_types::{anime_matrix::{AniMeDataBuffer, FULL_PANE_LEN}, aura_modes::{self, AuraEffect, AuraModeNum}, cli_options::{AniMeActions, AniMeStatusValue}, gfx_vendors::GfxVendors, profile::{FanLevel, ProfileCommand, ProfileEvent}}; use std::env::args; use yansi_term::Colour::Green; use yansi_term::Colour::Red; @@ -202,7 +196,7 @@ fn main() -> Result<(), Box> { let level = dbus.proxies().led().get_led_brightness()?; println!("Current keyboard led brightness: {}", level.to_string()); } - Some(level) => dbus.proxies().led().set_led_brightness(level)?, + Some(level) => dbus.proxies().led().set_led_brightness(::from(level))?, } } diff --git a/daemon/src/config_aura.rs b/daemon/src/config_aura.rs index 55b6696b..2705bcd0 100644 --- a/daemon/src/config_aura.rs +++ b/daemon/src/config_aura.rs @@ -1,6 +1,6 @@ use crate::laptops::LaptopLedData; -use log::{error, warn}; -use rog_types::aura_modes::{AuraEffect, AuraModeNum, AuraMultiZone, AuraZone}; +use log::{error, info, warn}; +use rog_types::aura_modes::{AuraEffect, AuraModeNum, AuraMultiZone, AuraZone, LedBrightness}; use serde_derive::{Deserialize, Serialize}; use std::collections::BTreeMap; use std::fs::{File, OpenOptions}; @@ -8,9 +8,28 @@ use std::io::{Read, Write}; pub static AURA_CONFIG_PATH: &str = "/etc/asusd/aura.conf"; +#[derive(Deserialize, Serialize)] +pub struct AuraConfigV320 { + pub brightness: u32, + pub current_mode: AuraModeNum, + pub builtins: BTreeMap, + pub multizone: Option, +} + +impl AuraConfigV320 { + pub(crate) fn into_current(self) -> AuraConfig { + AuraConfig { + brightness: ::from(self.brightness), + current_mode: self.current_mode, + builtins: self.builtins, + multizone: self.multizone, + } + } +} + #[derive(Deserialize, Serialize)] pub struct AuraConfig { - pub brightness: u8, + pub brightness: LedBrightness, pub current_mode: AuraModeNum, pub builtins: BTreeMap, pub multizone: Option, @@ -19,7 +38,7 @@ pub struct AuraConfig { impl Default for AuraConfig { fn default() -> Self { AuraConfig { - brightness: 1, + brightness: LedBrightness::Med, current_mode: AuraModeNum::Static, builtins: BTreeMap::new(), multizone: None, @@ -48,6 +67,11 @@ impl AuraConfig { } else { if let Ok(data) = serde_json::from_str(&buf) { return data; + } else if let Ok(data) = serde_json::from_str::(&buf) { + let config = data.into_current(); + config.write(); + info!("Updated AuraConfig version"); + return config; } warn!("Could not deserialise {}", AURA_CONFIG_PATH); panic!("Please remove {} then restart asusd", AURA_CONFIG_PATH); diff --git a/daemon/src/ctrl_leds.rs b/daemon/src/ctrl_leds.rs index 3ad7daee..867ae00f 100644 --- a/daemon/src/ctrl_leds.rs +++ b/daemon/src/ctrl_leds.rs @@ -10,10 +10,7 @@ use crate::{ laptops::{LaptopLedData, ASUS_KEYBOARD_DEVICES}, }; use log::{error, info, warn}; -use rog_types::{ - aura_modes::{AuraEffect, AuraModeNum}, - LED_MSG_LEN, -}; +use rog_types::{LED_MSG_LEN, aura_modes::{AuraEffect, AuraModeNum, LedBrightness}}; use std::fs::OpenOptions; use std::io::{Read, Write}; use std::path::Path; @@ -99,7 +96,7 @@ impl crate::ZbusAdd for DbusKbdBacklight { /// LED commands are split between Brightness, Modes, Per-Key #[dbus_interface(name = "org.asuslinux.Daemon")] impl DbusKbdBacklight { - fn set_brightness(&mut self, brightness: u8) { + fn set_brightness(&mut self, brightness: LedBrightness) { if let Ok(ctrl) = self.inner.try_lock() { ctrl.set_brightness(brightness) .map_err(|err| warn!("{}", err)) @@ -245,9 +242,9 @@ impl crate::CtrlTask for CtrlKbdBacklight { file.read_exact(&mut buf) .map_err(|err| RogError::Read("buffer".into(), err))?; if let Some(num) = char::from(buf[0]).to_digit(10) { - if self.config.brightness != num as u8 { + if self.config.brightness != num.into() { self.config.read(); - self.config.brightness = num as u8; + self.config.brightness = num.into(); self.config.write(); } return Ok(()); @@ -319,17 +316,18 @@ impl CtrlKbdBacklight { Ok(buf[0]) } - pub fn set_brightness(&self, brightness: u8) -> Result<(), RogError> { + pub fn set_brightness(&self, brightness: LedBrightness) -> Result<(), RogError> { + let path = Path::new(&self.bright_node); let mut file = OpenOptions::new() .write(true) - .open(&self.bright_node) + .open(&path) .map_err(|err| match err.kind() { std::io::ErrorKind::NotFound => { RogError::MissingLedBrightNode((&self.bright_node).into(), err) } _ => RogError::Path((&self.bright_node).into(), err), })?; - file.write_all(&[brightness]) + file.write_all(&[brightness.as_char_code()]) .map_err(|err| RogError::Read("buffer".into(), err))?; Ok(()) } diff --git a/rog-dbus/src/zbus_led.rs b/rog-dbus/src/zbus_led.rs index cd016531..37b3c641 100644 --- a/rog-dbus/src/zbus_led.rs +++ b/rog-dbus/src/zbus_led.rs @@ -23,7 +23,7 @@ use std::sync::{Arc, Mutex}; use zbus::{dbus_proxy, Connection, Result}; -use rog_types::{aura_modes::AuraEffect, aura_perkey::KeyColourArray}; +use rog_types::{aura_modes::{AuraEffect, LedBrightness}, aura_perkey::KeyColourArray}; const BLOCKING_TIME: u64 = 40; // 100ms = 10 FPS, max 50ms = 20 FPS, 40ms = 25 FPS @@ -39,7 +39,7 @@ trait Daemon { fn prev_led_mode(&self) -> zbus::Result<()>; /// SetBrightness method - fn set_brightness(&self, brightness: u8) -> zbus::Result<()>; + fn set_brightness(&self, brightness: LedBrightness) -> zbus::Result<()>; /// SetLedMode method fn set_led_mode(&self, effect: &AuraEffect) -> zbus::Result<()>; @@ -80,7 +80,7 @@ impl<'a> LedProxy<'a> { } #[inline] - pub fn set_led_brightness(&self, level: u8) -> Result<()> { + pub fn set_led_brightness(&self, level: LedBrightness) -> Result<()> { self.0.set_brightness(level)?; Ok(()) } diff --git a/rog-types/src/aura_modes.rs b/rog-types/src/aura_modes.rs index 42ed78da..b15ed514 100644 --- a/rog-types/src/aura_modes.rs +++ b/rog-types/src/aura_modes.rs @@ -10,6 +10,32 @@ use serde_derive::{Deserialize, Serialize}; use std::str::FromStr; use zvariant_derive::Type; +#[derive(Debug, Copy, Clone, PartialEq, Deserialize, Serialize, Type)] +pub enum LedBrightness { + Off, + Low, + Med, + High, +} + +impl LedBrightness { + pub fn as_char_code(&self) -> u8 { + std::char::from_digit(*self as u32, 10).unwrap() as u8 + } +} + +impl From for LedBrightness { + fn from(bright: u32) -> Self { + match bright { + 0 => LedBrightness::Off, + 1 => LedBrightness::Low, + 2 => LedBrightness::Med, + 3 => LedBrightness::High, + _ => LedBrightness::Med, + } + } +} + #[derive(Debug, Clone, PartialEq, Copy, Deserialize, Serialize, Type)] pub struct Colour(pub u8, pub u8, pub u8);