From e63f9fa8a4c9d06ac41ccaf2904a69617853ce6b Mon Sep 17 00:00:00 2001 From: "Leonid Satanovsky (home profile)" <539045+leosat@users.noreply.github.com> Date: Fri, 6 Feb 2026 20:52:26 +0300 Subject: [PATCH 1/2] Inertia and Damper are also condition-ed effects. The four condition-ed effects are spring, friction, damper, inertia: Ref: Universal Serial Bus (USB) Device Class Definition for Physical Interface Devices (PID) https://www.usb.org/sites/default/files/documents/pid1_01.pdf page 11, Table 3: Effect Types --- src/ff.rs | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/src/ff.rs b/src/ff.rs index 0241e52..9902f46 100644 --- a/src/ff.rs +++ b/src/ff.rs @@ -111,8 +111,6 @@ impl From for ff_condition_effect { #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum FFEffectKind { - Damper, - Inertia, Constant { /// The strength of the effect. level: i16, @@ -149,6 +147,14 @@ pub enum FFEffectKind { /// Condition data for each axis. condition: [FFCondition; 2], }, + Damper { + /// Condition data for each axis. + condition: [FFCondition; 2], + }, + Inertia { + /// Condition data for each axis. + condition: [FFCondition; 2], + }, Rumble { /// The magnitude of the heavy motor. strong_magnitude: u16, @@ -160,8 +166,8 @@ pub enum FFEffectKind { impl From for FFEffectCode { fn from(other: FFEffectKind) -> Self { match other { - FFEffectKind::Damper => FFEffectCode::FF_DAMPER, - FFEffectKind::Inertia => FFEffectCode::FF_INERTIA, + FFEffectKind::Damper { .. } => FFEffectCode::FF_DAMPER, + FFEffectKind::Inertia { .. } => FFEffectCode::FF_INERTIA, FFEffectKind::Constant { .. } => FFEffectCode::FF_CONSTANT, FFEffectKind::Ramp { .. } => FFEffectCode::FF_RAMP, FFEffectKind::Periodic { .. } => FFEffectCode::FF_PERIODIC, @@ -241,8 +247,6 @@ pub struct FFEffectData { impl From for FFEffectData { fn from(value: sys::ff_effect) -> Self { let kind = match FFEffectCode::from_index(value.type_ as usize) { - FFEffectCode::FF_DAMPER => FFEffectKind::Damper, - FFEffectCode::FF_INERTIA => FFEffectKind::Inertia, FFEffectCode::FF_CONSTANT => { let constant = unsafe { value.u.constant }; @@ -293,6 +297,20 @@ impl From for FFEffectData { condition: [condition[0].into(), condition[1].into()], } } + FFEffectCode::FF_DAMPER => { + let condition = unsafe { value.u.condition }; + + FFEffectKind::Damper { + condition: [condition[0].into(), condition[1].into()], + } + } + FFEffectCode::FF_INERTIA => { + let condition = unsafe { value.u.condition }; + + FFEffectKind::Inertia { + condition: [condition[0].into(), condition[1].into()], + } + } FFEffectCode::FF_RUMBLE => { let rumble = unsafe { value.u.rumble }; @@ -353,7 +371,10 @@ impl From for sys::ff_effect { effect.u.periodic.phase = phase; effect.u.periodic.envelope = envelope.into(); } - FFEffectKind::Spring { condition } | FFEffectKind::Friction { condition } => { + FFEffectKind::Spring { condition } + | FFEffectKind::Friction { condition } + | FFEffectKind::Damper { condition } + | FFEffectKind::Inertia { condition } => { effect.u.condition = [condition[0].into(), condition[1].into()]; } FFEffectKind::Rumble { From 255093b62f9fb408a1a1ff2d39e412656badef43 Mon Sep 17 00:00:00 2001 From: "Leonid Satanovsky (home profile)" <539045+leosat@users.noreply.github.com> Date: Fri, 6 Feb 2026 21:10:53 +0300 Subject: [PATCH 2/2] Removed "catch-all" match arm in effects structs conversion routine as it masks erroneous cases such as forgotten to be handled properly effects. --- src/ff.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ff.rs b/src/ff.rs index 9902f46..af78688 100644 --- a/src/ff.rs +++ b/src/ff.rs @@ -384,7 +384,6 @@ impl From for sys::ff_effect { effect.u.rumble.strong_magnitude = strong_magnitude; effect.u.rumble.weak_magnitude = weak_magnitude; } - _ => (), } effect