feat: change limits dynamically

This commit is contained in:
Denis Benato
2025-10-11 20:51:57 +02:00
parent 180d63620b
commit 0dba22529c
5 changed files with 143 additions and 35 deletions

View File

@@ -55,6 +55,25 @@ impl AsusArmouryAttribute {
String::from(self.attr.name())
}
fn resolve_i32_value(refreshed: Option<i32>, cached: &AttrValue) -> i32 {
refreshed
.or_else(|| match cached {
AttrValue::Integer(i) => Some(*i),
_ => None,
})
.unwrap_or(-1)
}
pub async fn emit_limits(&self, connection: &Connection) -> Result<(), RogError> {
let path = dbus_path_for_attr(self.attr.name());
let signal = SignalEmitter::new(connection, path)?;
self.min_value_changed(&signal).await?;
self.max_value_changed(&signal).await?;
self.scalar_increment_changed(&signal).await?;
self.current_value_changed(&signal).await?;
Ok(())
}
pub async fn move_to_zbus(self, connection: &Connection) -> Result<(), RogError> {
let path = dbus_path_for_attr(self.attr.name());
connection
@@ -117,6 +136,35 @@ impl AsusArmouryAttribute {
}
}
#[derive(Clone, Default)]
pub struct ArmouryAttributeRegistry {
attrs: Vec<AsusArmouryAttribute>,
}
impl ArmouryAttributeRegistry {
pub fn push(&mut self, attr: AsusArmouryAttribute) {
self.attrs.push(attr);
}
pub async fn emit_limits(&self, connection: &Connection) -> Result<(), RogError> {
let mut last_err: Option<RogError> = None;
for attr in &self.attrs {
if let Err(e) = attr.emit_limits(connection).await {
error!(
"Failed to emit updated limits for attribute '{}': {e:?}",
attr.attribute_name()
);
last_err = Some(e);
}
}
if let Some(err) = last_err {
Err(err)
} else {
Ok(())
}
}
}
impl crate::Reloadable for AsusArmouryAttribute {
async fn reload(&mut self) -> Result<(), RogError> {
info!("Reloading {}", self.attr.name());
@@ -256,26 +304,20 @@ impl AsusArmouryAttribute {
#[zbus(property)]
async fn min_value(&self) -> i32 {
match self.attr.min_value() {
AttrValue::Integer(i) => *i,
_ => -1,
}
Self::resolve_i32_value(self.attr.refresh_min_value(), self.attr.min_value())
}
#[zbus(property)]
async fn max_value(&self) -> i32 {
match self.attr.max_value() {
AttrValue::Integer(i) => *i,
_ => -1,
}
Self::resolve_i32_value(self.attr.refresh_max_value(), self.attr.max_value())
}
#[zbus(property)]
async fn scalar_increment(&self) -> i32 {
match self.attr.scalar_increment() {
AttrValue::Integer(i) => *i,
_ => -1,
}
Self::resolve_i32_value(
self.attr.refresh_scalar_increment(),
self.attr.scalar_increment(),
)
}
#[zbus(property)]
@@ -393,7 +435,8 @@ pub async fn start_attributes_zbus(
power: AsusPower,
attributes: FirmwareAttributes,
config: Arc<Mutex<Config>>,
) -> Result<(), RogError> {
) -> Result<ArmouryAttributeRegistry, RogError> {
let mut registry = ArmouryAttributeRegistry::default();
for attr in attributes.attributes() {
let mut attr = AsusArmouryAttribute::new(
attr.clone(),
@@ -402,6 +445,8 @@ pub async fn start_attributes_zbus(
config.clone(),
);
let registry_attr = attr.clone();
if let Err(e) = attr.reload().await {
error!(
"Skipping attribute '{}' due to reload error: {e:?}",
@@ -430,9 +475,12 @@ pub async fn start_attributes_zbus(
if let Err(e) = attr.move_to_zbus(conn).await {
error!("Failed to register attribute '{attr_name}' on zbus: {e:?}");
continue;
}
registry.push(registry_attr);
}
Ok(())
Ok(registry)
}
pub async fn set_config_or_default(