mirror of
https://gitlab.com/asus-linux/asusctl.git
synced 2026-02-06 00:15:04 +01:00
Strongly type the Led brightness
This commit is contained in:
@@ -7,14 +7,14 @@ use std::str::FromStr;
|
|||||||
|
|
||||||
#[derive(Options)]
|
#[derive(Options)]
|
||||||
pub struct LedBrightness {
|
pub struct LedBrightness {
|
||||||
level: Option<u8>,
|
level: Option<u32>,
|
||||||
}
|
}
|
||||||
impl LedBrightness {
|
impl LedBrightness {
|
||||||
pub fn new(level: Option<u8>) -> Self {
|
pub fn new(level: Option<u32>) -> Self {
|
||||||
LedBrightness { level }
|
LedBrightness { level }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn level(&self) -> Option<u8> {
|
pub fn level(&self) -> Option<u32> {
|
||||||
self.level
|
self.level
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,13 +7,7 @@ use daemon::{
|
|||||||
};
|
};
|
||||||
use gumdrop::{Opt, Options};
|
use gumdrop::{Opt, Options};
|
||||||
use rog_dbus::AuraDbusClient;
|
use rog_dbus::AuraDbusClient;
|
||||||
use rog_types::{
|
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}};
|
||||||
anime_matrix::{AniMeDataBuffer, FULL_PANE_LEN},
|
|
||||||
aura_modes::{AuraEffect, AuraModeNum},
|
|
||||||
cli_options::{AniMeActions, AniMeStatusValue},
|
|
||||||
gfx_vendors::GfxVendors,
|
|
||||||
profile::{FanLevel, ProfileCommand, ProfileEvent},
|
|
||||||
};
|
|
||||||
use std::env::args;
|
use std::env::args;
|
||||||
use yansi_term::Colour::Green;
|
use yansi_term::Colour::Green;
|
||||||
use yansi_term::Colour::Red;
|
use yansi_term::Colour::Red;
|
||||||
@@ -202,7 +196,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
let level = dbus.proxies().led().get_led_brightness()?;
|
let level = dbus.proxies().led().get_led_brightness()?;
|
||||||
println!("Current keyboard led brightness: {}", level.to_string());
|
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(<aura_modes::LedBrightness>::from(level))?,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
use crate::laptops::LaptopLedData;
|
use crate::laptops::LaptopLedData;
|
||||||
use log::{error, warn};
|
use log::{error, info, warn};
|
||||||
use rog_types::aura_modes::{AuraEffect, AuraModeNum, AuraMultiZone, AuraZone};
|
use rog_types::aura_modes::{AuraEffect, AuraModeNum, AuraMultiZone, AuraZone, LedBrightness};
|
||||||
use serde_derive::{Deserialize, Serialize};
|
use serde_derive::{Deserialize, Serialize};
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
use std::fs::{File, OpenOptions};
|
use std::fs::{File, OpenOptions};
|
||||||
@@ -8,9 +8,28 @@ use std::io::{Read, Write};
|
|||||||
|
|
||||||
pub static AURA_CONFIG_PATH: &str = "/etc/asusd/aura.conf";
|
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<AuraModeNum, AuraEffect>,
|
||||||
|
pub multizone: Option<AuraMultiZone>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AuraConfigV320 {
|
||||||
|
pub(crate) fn into_current(self) -> AuraConfig {
|
||||||
|
AuraConfig {
|
||||||
|
brightness: <LedBrightness>::from(self.brightness),
|
||||||
|
current_mode: self.current_mode,
|
||||||
|
builtins: self.builtins,
|
||||||
|
multizone: self.multizone,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize)]
|
#[derive(Deserialize, Serialize)]
|
||||||
pub struct AuraConfig {
|
pub struct AuraConfig {
|
||||||
pub brightness: u8,
|
pub brightness: LedBrightness,
|
||||||
pub current_mode: AuraModeNum,
|
pub current_mode: AuraModeNum,
|
||||||
pub builtins: BTreeMap<AuraModeNum, AuraEffect>,
|
pub builtins: BTreeMap<AuraModeNum, AuraEffect>,
|
||||||
pub multizone: Option<AuraMultiZone>,
|
pub multizone: Option<AuraMultiZone>,
|
||||||
@@ -19,7 +38,7 @@ pub struct AuraConfig {
|
|||||||
impl Default for AuraConfig {
|
impl Default for AuraConfig {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
AuraConfig {
|
AuraConfig {
|
||||||
brightness: 1,
|
brightness: LedBrightness::Med,
|
||||||
current_mode: AuraModeNum::Static,
|
current_mode: AuraModeNum::Static,
|
||||||
builtins: BTreeMap::new(),
|
builtins: BTreeMap::new(),
|
||||||
multizone: None,
|
multizone: None,
|
||||||
@@ -48,6 +67,11 @@ impl AuraConfig {
|
|||||||
} else {
|
} else {
|
||||||
if let Ok(data) = serde_json::from_str(&buf) {
|
if let Ok(data) = serde_json::from_str(&buf) {
|
||||||
return data;
|
return data;
|
||||||
|
} else if let Ok(data) = serde_json::from_str::<AuraConfigV320>(&buf) {
|
||||||
|
let config = data.into_current();
|
||||||
|
config.write();
|
||||||
|
info!("Updated AuraConfig version");
|
||||||
|
return config;
|
||||||
}
|
}
|
||||||
warn!("Could not deserialise {}", AURA_CONFIG_PATH);
|
warn!("Could not deserialise {}", AURA_CONFIG_PATH);
|
||||||
panic!("Please remove {} then restart asusd", AURA_CONFIG_PATH);
|
panic!("Please remove {} then restart asusd", AURA_CONFIG_PATH);
|
||||||
|
|||||||
@@ -10,10 +10,7 @@ use crate::{
|
|||||||
laptops::{LaptopLedData, ASUS_KEYBOARD_DEVICES},
|
laptops::{LaptopLedData, ASUS_KEYBOARD_DEVICES},
|
||||||
};
|
};
|
||||||
use log::{error, info, warn};
|
use log::{error, info, warn};
|
||||||
use rog_types::{
|
use rog_types::{LED_MSG_LEN, aura_modes::{AuraEffect, AuraModeNum, LedBrightness}};
|
||||||
aura_modes::{AuraEffect, AuraModeNum},
|
|
||||||
LED_MSG_LEN,
|
|
||||||
};
|
|
||||||
use std::fs::OpenOptions;
|
use std::fs::OpenOptions;
|
||||||
use std::io::{Read, Write};
|
use std::io::{Read, Write};
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
@@ -99,7 +96,7 @@ impl crate::ZbusAdd for DbusKbdBacklight {
|
|||||||
/// LED commands are split between Brightness, Modes, Per-Key
|
/// LED commands are split between Brightness, Modes, Per-Key
|
||||||
#[dbus_interface(name = "org.asuslinux.Daemon")]
|
#[dbus_interface(name = "org.asuslinux.Daemon")]
|
||||||
impl DbusKbdBacklight {
|
impl DbusKbdBacklight {
|
||||||
fn set_brightness(&mut self, brightness: u8) {
|
fn set_brightness(&mut self, brightness: LedBrightness) {
|
||||||
if let Ok(ctrl) = self.inner.try_lock() {
|
if let Ok(ctrl) = self.inner.try_lock() {
|
||||||
ctrl.set_brightness(brightness)
|
ctrl.set_brightness(brightness)
|
||||||
.map_err(|err| warn!("{}", err))
|
.map_err(|err| warn!("{}", err))
|
||||||
@@ -245,9 +242,9 @@ impl crate::CtrlTask for CtrlKbdBacklight {
|
|||||||
file.read_exact(&mut buf)
|
file.read_exact(&mut buf)
|
||||||
.map_err(|err| RogError::Read("buffer".into(), err))?;
|
.map_err(|err| RogError::Read("buffer".into(), err))?;
|
||||||
if let Some(num) = char::from(buf[0]).to_digit(10) {
|
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.read();
|
||||||
self.config.brightness = num as u8;
|
self.config.brightness = num.into();
|
||||||
self.config.write();
|
self.config.write();
|
||||||
}
|
}
|
||||||
return Ok(());
|
return Ok(());
|
||||||
@@ -319,17 +316,18 @@ impl CtrlKbdBacklight {
|
|||||||
Ok(buf[0])
|
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()
|
let mut file = OpenOptions::new()
|
||||||
.write(true)
|
.write(true)
|
||||||
.open(&self.bright_node)
|
.open(&path)
|
||||||
.map_err(|err| match err.kind() {
|
.map_err(|err| match err.kind() {
|
||||||
std::io::ErrorKind::NotFound => {
|
std::io::ErrorKind::NotFound => {
|
||||||
RogError::MissingLedBrightNode((&self.bright_node).into(), err)
|
RogError::MissingLedBrightNode((&self.bright_node).into(), err)
|
||||||
}
|
}
|
||||||
_ => RogError::Path((&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))?;
|
.map_err(|err| RogError::Read("buffer".into(), err))?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ use std::sync::{Arc, Mutex};
|
|||||||
|
|
||||||
use zbus::{dbus_proxy, Connection, Result};
|
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
|
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<()>;
|
fn prev_led_mode(&self) -> zbus::Result<()>;
|
||||||
|
|
||||||
/// SetBrightness method
|
/// SetBrightness method
|
||||||
fn set_brightness(&self, brightness: u8) -> zbus::Result<()>;
|
fn set_brightness(&self, brightness: LedBrightness) -> zbus::Result<()>;
|
||||||
|
|
||||||
/// SetLedMode method
|
/// SetLedMode method
|
||||||
fn set_led_mode(&self, effect: &AuraEffect) -> zbus::Result<()>;
|
fn set_led_mode(&self, effect: &AuraEffect) -> zbus::Result<()>;
|
||||||
@@ -80,7 +80,7 @@ impl<'a> LedProxy<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_led_brightness(&self, level: u8) -> Result<()> {
|
pub fn set_led_brightness(&self, level: LedBrightness) -> Result<()> {
|
||||||
self.0.set_brightness(level)?;
|
self.0.set_brightness(level)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,32 @@ use serde_derive::{Deserialize, Serialize};
|
|||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use zvariant_derive::Type;
|
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<u32> 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)]
|
#[derive(Debug, Clone, PartialEq, Copy, Deserialize, Serialize, Type)]
|
||||||
pub struct Colour(pub u8, pub u8, pub u8);
|
pub struct Colour(pub u8, pub u8, pub u8);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user