diff --git a/src/controller.rs b/src/controller.rs index cdc9b56..5a6c5db 100644 --- a/src/controller.rs +++ b/src/controller.rs @@ -61,7 +61,14 @@ impl Controller { let neg = mapping.neg; let pos = mapping.pos; - axis_presses(value, pair_value, neg, pos) + let (mut pressed, mut released) = axis_presses(value, pair_value, neg, pos); + if let Some(other) = mapping.pair.and_then(|p| self.map_axis(&event.id, &p)) { + let (other_pressed, other_released) = + axis_presses(pair_value, value, other.neg, other.pos); + pressed = pressed.union(other_pressed); + released = released.union(other_released); + } + (pressed, released) } _ => { return None; @@ -135,7 +142,7 @@ fn axis_presses(value: f32, pair_value: f32, neg: VBKey, pos: VBKey) -> (VBKey, let mut released = VBKey::empty(); let magnitude = value.hypot(pair_value); - let abs_angle = pair_value.atan2(value); + let abs_angle = pair_value.atan2(value).abs(); if magnitude < 0.65 { released = released.union(neg).union(pos); @@ -204,4 +211,18 @@ mod tests { assert_eq!(pressed, POS); assert_eq!(released, NEG); } + + #[test] + fn ignores_diagonal_noise() { + let (pressed, released) = axis_presses(-1.0, -0.1484245, NEG, POS); + assert_eq!(pressed, NEG); + assert_eq!(released, POS); + } + + #[test] + fn ignores_small_values() { + let (pressed, released) = axis_presses(-0.1484245, -1.0, NEG, POS); + assert_eq!(pressed, NONE); + assert_eq!(released, BOTH); + } }