Skip to content

Commit c65234a

Browse files
author
Rene Damm
authored
FIX: A number of problems with HID joysticks (#806).
1 parent 0d1fe6a commit c65234a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1100
-662
lines changed

Assets/Demo/SteamController/SteamDemoController.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,23 @@ private static void RuntimeInitializeOnLoad()
3636
InputSystem.RegisterLayout<SteamDemoController>(matches: deviceMatcher);
3737
}
3838

39+
[InputControl]
3940
public StickControl move { get; protected set; }
41+
[InputControl]
4042
public Vector2Control look { get; protected set; }
43+
[InputControl]
4144
public ButtonControl fire { get; protected set; }
45+
[InputControl]
4246
public ButtonControl jump { get; protected set; }
47+
[InputControl]
4348
public ButtonControl menu { get; protected set; }
49+
[InputControl]
4450
public ButtonControl steamEnterMenu { get; protected set; }
51+
[InputControl]
4552
public Vector2Control navigate { get; protected set; }
53+
[InputControl]
4654
public ButtonControl click { get; protected set; }
55+
[InputControl]
4756
public ButtonControl steamExitMenu { get; protected set; }
4857

4958
protected override void FinishSetup()
@@ -86,6 +95,7 @@ protected override void ResolveSteamActions(ISteamControllerAPI api)
8695
public SteamHandle<InputAction> navigateHandle { get; private set; }
8796
public SteamHandle<InputAction> clickHandle { get; private set; }
8897
public SteamHandle<InputAction> steamExitMenuHandle { get; private set; }
98+
8999
private SteamActionSetInfo[] m_ActionSets;
90100
public override ReadOnlyArray<SteamActionSetInfo> steamActionSets
91101
{
@@ -126,7 +136,10 @@ public unsafe struct SteamDemoControllerState : IInputStateTypeInfo
126136
{
127137
public FourCC format
128138
{
129-
get { return new FourCC('S', 't', 'e', 'a'); }
139+
get
140+
{
141+
return new FourCC('S', 't', 'e', 'a');
142+
}
130143
}
131144

132145
[InputControl(name = "fire", layout = "Button", bit = 0)]

Assets/QA/Input_Test/Scenes.meta

Lines changed: 0 additions & 8 deletions
This file was deleted.

Assets/Tests/InputSystem/CoreTests_Actions.cs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4564,6 +4564,11 @@ public void Actions_CanCreateVector2Composite()
45644564
[Category("Actions")]
45654565
public void Actions_Vector2Composite_RespectsButtonPressurePoint()
45664566
{
4567+
// The stick has deadzones on the up/down/left/right buttons to get rid of stick
4568+
// noise. For this test, simplify things by getting rid of deadzones.
4569+
InputSystem.settings.defaultDeadzoneMin = 0;
4570+
InputSystem.settings.defaultDeadzoneMax = 1;
4571+
45674572
var gamepad = InputSystem.AddDevice<Gamepad>();
45684573

45694574
// Set up classic WASD control.
@@ -4583,31 +4588,31 @@ public void Actions_Vector2Composite_RespectsButtonPressurePoint()
45834588

45844589
// Up.
45854590
value = null;
4586-
InputSystem.QueueStateEvent(gamepad, new GamepadState() { leftStick = Vector2.up });
4591+
InputSystem.QueueStateEvent(gamepad, new GamepadState { leftStick = Vector2.up });
45874592
InputSystem.Update();
45884593

45894594
Assert.That(value, Is.Not.Null);
45904595
Assert.That(value.Value, Is.EqualTo(Vector2.up));
45914596

45924597
// Up (slightly above press point)
45934598
value = null;
4594-
InputSystem.QueueStateEvent(gamepad, new GamepadState() { leftStick = Vector2.up * pressPoint * 1.01f });
4599+
InputSystem.QueueStateEvent(gamepad, new GamepadState { leftStick = Vector2.up * pressPoint * 1.01f });
45954600
InputSystem.Update();
45964601

45974602
Assert.That(value, Is.Not.Null);
45984603
Assert.That(value.Value, Is.EqualTo(Vector2.up));
45994604

46004605
// Up (slightly below press point)
46014606
value = null;
4602-
InputSystem.QueueStateEvent(gamepad, new GamepadState() { leftStick = Vector2.up * pressPoint * 0.99f });
4607+
InputSystem.QueueStateEvent(gamepad, new GamepadState { leftStick = Vector2.up * pressPoint * 0.99f });
46034608
InputSystem.Update();
46044609

46054610
Assert.That(value, Is.Not.Null);
46064611
Assert.That(value.Value, Is.EqualTo(Vector2.zero));
46074612

46084613
// Up left.
46094614
value = null;
4610-
InputSystem.QueueStateEvent(gamepad, new GamepadState() { leftStick = Vector2.up + Vector2.left });
4615+
InputSystem.QueueStateEvent(gamepad, new GamepadState { leftStick = Vector2.up + Vector2.left });
46114616
InputSystem.Update();
46124617

46134618
Assert.That(value, Is.Not.Null);
@@ -4616,7 +4621,7 @@ public void Actions_Vector2Composite_RespectsButtonPressurePoint()
46164621

46174622
// Up left (up slightly above press point)
46184623
value = null;
4619-
InputSystem.QueueStateEvent(gamepad, new GamepadState() { leftStick = Vector2.up * pressPoint * 1.01f + Vector2.left });
4624+
InputSystem.QueueStateEvent(gamepad, new GamepadState { leftStick = Vector2.up * pressPoint * 1.01f + Vector2.left });
46204625
InputSystem.Update();
46214626

46224627
Assert.That(value, Is.Not.Null);
@@ -4625,7 +4630,7 @@ public void Actions_Vector2Composite_RespectsButtonPressurePoint()
46254630

46264631
// Up left (up slightly below press point)
46274632
value = null;
4628-
InputSystem.QueueStateEvent(gamepad, new GamepadState() { leftStick = Vector2.up * pressPoint * 0.99f + Vector2.left });
4633+
InputSystem.QueueStateEvent(gamepad, new GamepadState { leftStick = Vector2.up * pressPoint * 0.99f + Vector2.left });
46294634
InputSystem.Update();
46304635

46314636
Assert.That(value, Is.Not.Null);
@@ -5161,10 +5166,10 @@ public void Actions_CanCreateButtonWithTwoModifiersComposite()
51615166
Set(gamepad.leftStick, new Vector2(0, 0.75f));
51625167
Assert.That(trace,
51635168
Started(action,
5164-
value: 0.75f,
5169+
value: new AxisDeadzoneProcessor().Process(0.75f),
51655170
control: gamepad.leftStick.up)
51665171
.AndThen(Performed(action,
5167-
value: 0.75f,
5172+
value: new AxisDeadzoneProcessor().Process(0.75f),
51685173
control: gamepad.leftStick.up)));
51695174

51705175
trace.Clear();
@@ -5176,10 +5181,10 @@ public void Actions_CanCreateButtonWithTwoModifiersComposite()
51765181
// one of the constituents change.
51775182
Assert.That(trace,
51785183
Performed(action,
5179-
value: 0.75f,
5184+
value: new AxisDeadzoneProcessor().Process(0.75f),
51805185
control: gamepad.dpad.up)
51815186
.AndThen(Performed(action,
5182-
value: 0.75f,
5187+
value: new AxisDeadzoneProcessor().Process(0.75f),
51835188
control: gamepad.leftTrigger)));
51845189

51855190
trace.Clear();

Assets/Tests/InputSystem/CoreTests_Controls.cs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -275,18 +275,26 @@ public void Controls_SticksProvideAccessToHalfAxes()
275275
InputSystem.QueueStateEvent(gamepad, new GamepadState {leftStick = new Vector2(0.5f, 0.5f)});
276276
InputSystem.Update();
277277

278-
Assert.That(gamepad.leftStick.up.ReadValue(), Is.EqualTo(0.5).Within(0.000001));
279-
Assert.That(gamepad.leftStick.down.ReadValue(), Is.EqualTo(0.0).Within(0.000001));
280-
Assert.That(gamepad.leftStick.right.ReadValue(), Is.EqualTo(0.5).Within(0.000001));
281-
Assert.That(gamepad.leftStick.left.ReadValue(), Is.EqualTo(0.0).Within(0.000001));
278+
Assert.That(gamepad.leftStick.up.ReadValue(),
279+
Is.EqualTo(new AxisDeadzoneProcessor().Process(0.5f)));
280+
Assert.That(gamepad.leftStick.down.ReadValue(),
281+
Is.EqualTo(new AxisDeadzoneProcessor().Process(0.0f)));
282+
Assert.That(gamepad.leftStick.right.ReadValue(),
283+
Is.EqualTo(new AxisDeadzoneProcessor().Process(0.5f)));
284+
Assert.That(gamepad.leftStick.left.ReadValue(),
285+
Is.EqualTo(new AxisDeadzoneProcessor().Process(0.0f)));
282286

283287
InputSystem.QueueStateEvent(gamepad, new GamepadState {leftStick = new Vector2(-0.5f, -0.5f)});
284288
InputSystem.Update();
285289

286-
Assert.That(gamepad.leftStick.up.ReadValue(), Is.EqualTo(0.0).Within(0.000001));
287-
Assert.That(gamepad.leftStick.down.ReadValue(), Is.EqualTo(0.5).Within(0.000001));
288-
Assert.That(gamepad.leftStick.right.ReadValue(), Is.EqualTo(0.0).Within(0.000001));
289-
Assert.That(gamepad.leftStick.left.ReadValue(), Is.EqualTo(0.5).Within(0.000001));
290+
Assert.That(gamepad.leftStick.up.ReadValue(),
291+
Is.EqualTo(new AxisDeadzoneProcessor().Process(0.0f)));
292+
Assert.That(gamepad.leftStick.down.ReadValue(),
293+
Is.EqualTo(new AxisDeadzoneProcessor().Process(0.5f)));
294+
Assert.That(gamepad.leftStick.right.ReadValue(),
295+
Is.EqualTo(new AxisDeadzoneProcessor().Process(0.0f)));
296+
Assert.That(gamepad.leftStick.left.ReadValue(),
297+
Is.EqualTo(new AxisDeadzoneProcessor().Process(0.5f)));
290298
}
291299

292300
[Test]

Assets/Tests/InputSystem/CoreTests_Devices.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1823,6 +1823,18 @@ public void Devices_CanCreateGenericJoystick()
18231823
Assert.That(joystick.trigger, Is.Not.Null);
18241824
}
18251825

1826+
[Test]
1827+
[Category("Devices")]
1828+
public void Devices_JoysticksHaveDeadzonesOnStick()
1829+
{
1830+
var joystick = InputSystem.AddDevice<Joystick>();
1831+
1832+
InputSystem.QueueStateEvent(joystick, new JoystickState {stick = new Vector2(0.001f, 0.002f)});
1833+
InputSystem.Update();
1834+
1835+
Assert.That(joystick.stick.ReadValue(), Is.EqualTo(Vector2.zero));
1836+
}
1837+
18261838
[Test]
18271839
[Category("Devices")]
18281840
public void Devices_PointerDeltasDoNotAccumulateFromPreviousFrame()

Assets/Tests/InputSystem/CoreTests_Layouts.cs

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ public void Layouts_CanSetControlParametersThroughControlAttribute()
173173

174174
var gamepad = InputSystem.AddDevice<Gamepad>();
175175

176-
Assert.That(gamepad.leftStick.up.clamp, Is.True);
176+
Assert.That(gamepad.leftStick.up.clamp, Is.EqualTo(AxisControl.Clamp.AfterNormalize));
177177
Assert.That(gamepad.leftStick.up.clampMin, Is.EqualTo(0));
178178
Assert.That(gamepad.leftStick.up.clampMax, Is.EqualTo(1));
179179
}
@@ -320,7 +320,7 @@ public void Layouts_CanSetParametersOnControlInJson()
320320
""controls"" : [
321321
{
322322
""name"" : ""rightTrigger"",
323-
""parameters"" : ""clamp=true,clampMin=0.123,clampMax=0.456""
323+
""parameters"" : ""clamp=1,clampMin=0.123,clampMax=0.456""
324324
}
325325
]
326326
}
@@ -330,7 +330,7 @@ public void Layouts_CanSetParametersOnControlInJson()
330330

331331
var device = (Gamepad)InputSystem.AddDevice("MyDevice");
332332

333-
Assert.That(device.rightTrigger.clamp, Is.True);
333+
Assert.That(device.rightTrigger.clamp, Is.EqualTo(AxisControl.Clamp.BeforeNormalize));
334334
Assert.That(device.rightTrigger.clampMin, Is.EqualTo(0.123).Within(0.00001f));
335335
Assert.That(device.rightTrigger.clampMax, Is.EqualTo(0.456).Within(0.00001f));
336336
}
@@ -434,7 +434,7 @@ public void Layouts_BooleanParameterDefaultsToTrueIfValueOmitted()
434434
""controls"" : [
435435
{
436436
""name"" : ""leftStick/x"",
437-
""parameters"" : ""clamp""
437+
""parameters"" : ""normalize""
438438
}
439439
]
440440
}
@@ -443,7 +443,7 @@ public void Layouts_BooleanParameterDefaultsToTrueIfValueOmitted()
443443
InputSystem.RegisterLayout(json);
444444
var device = InputDevice.Build<Gamepad>("MyDevice");
445445

446-
Assert.That(device.leftStick.x.clamp, Is.True);
446+
Assert.That(device.leftStick.x.normalize, Is.True);
447447
}
448448

449449
[InputControlLayout(commonUsages = new[] {"LeftHand", "RightHand"})]
@@ -1207,6 +1207,43 @@ public void Layouts_CanHaveOneControlUseStateOfAnotherControl()
12071207
Assert.That(testControl.stateBlock.bitOffset, Is.EqualTo(device.leftStick.x.stateBlock.bitOffset));
12081208
}
12091209

1210+
[Test]
1211+
[Category("Layouts")]
1212+
public void Layouts_CanHaveOneControlUseStateOfAnotherControl_EvenWhenStateSetupIsChangedInDerivedLayout()
1213+
{
1214+
const string controlJson = @"
1215+
{
1216+
""name"" : ""MyControl"",
1217+
""extend"" : ""Vector2"",
1218+
""controls"" : [
1219+
{ ""name"" : ""x"", ""layout"" : ""Axis"" },
1220+
{ ""name"" : ""y"", ""layout"" : ""Axis"", ""useStateFrom"" : ""x"" }
1221+
]
1222+
}
1223+
";
1224+
1225+
const string deviceJson = @"
1226+
{
1227+
""name"" : ""MyDevice"",
1228+
""extend"" : ""Sensor"",
1229+
""controls"" : [
1230+
{ ""name"" : ""ctrl"", ""layout"" : ""MyControl"" },
1231+
{ ""name"" : ""ctrl/x"", ""format"" : ""BIT"", ""bit"" : 12, ""offset"" : 21, ""sizeInBits"" : 7 }
1232+
]
1233+
}
1234+
";
1235+
1236+
InputSystem.RegisterLayout(controlJson);
1237+
InputSystem.RegisterLayout(deviceJson);
1238+
1239+
var device = InputDevice.Build<InputDevice>("MyDevice");
1240+
1241+
Assert.That(device["ctrl/y"].stateBlock.format, Is.EqualTo(new FourCC("BIT")));
1242+
Assert.That(device["ctrl/y"].stateBlock.sizeInBits, Is.EqualTo(7));
1243+
Assert.That(device["ctrl/y"].stateBlock.byteOffset, Is.EqualTo(21));
1244+
Assert.That(device["ctrl/y"].stateBlock.bitOffset, Is.EqualTo(12));
1245+
}
1246+
12101247
[Test]
12111248
[Category("Layouts")]
12121249
public void Layouts_CanAddChildControlToExistingControl()
@@ -1264,7 +1301,7 @@ public void TODO_Layouts_WhenModifyingChildControlsByPath_DependentControlsUsing
12641301
InputSystem.RegisterLayout(baseJson);
12651302
InputSystem.RegisterLayout(derivedJson);
12661303

1267-
var device = InputDevice.Build<InputDevice>("Deriver");
1304+
var device = InputDevice.Build<InputDevice>("Derived");
12681305

12691306
Assert.That(device["stick"].stateBlock.sizeInBits, Is.EqualTo(2 * 2 * 8));
12701307
}

Assets/Tests/InputSystem/Plugins/AndroidTests.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,14 @@ public void Devices_SupportsAndroidGamepad()
8888
Assert.That(controller.rightStick.ReadValue(), Is.EqualTo(rightStickDeadzone.Process(new Vector2(rightStick.x, -rightStick.y))));
8989

9090
Assert.That(controller.leftStick.left.ReadValue(), Is.EqualTo(0.0f));
91-
Assert.That(controller.leftStick.right.ReadValue(), Is.EqualTo(leftStick.x));
91+
Assert.That(controller.leftStick.right.ReadValue(), Is.EqualTo(new AxisDeadzoneProcessor().Process(leftStick.x)));
9292
Assert.That(controller.leftStick.up.ReadValue(), Is.EqualTo(0.0f));
93-
Assert.That(controller.leftStick.down.ReadValue(), Is.EqualTo(leftStick.y));
93+
Assert.That(controller.leftStick.down.ReadValue(), Is.EqualTo(new AxisDeadzoneProcessor().Process(leftStick.y)));
9494

9595
Assert.That(controller.rightStick.left.ReadValue(), Is.EqualTo(0.0f));
96-
Assert.That(controller.rightStick.right.ReadValue(), Is.EqualTo(rightStick.x));
96+
Assert.That(controller.rightStick.right.ReadValue(), Is.EqualTo(new AxisDeadzoneProcessor().Process(rightStick.x)));
9797
Assert.That(controller.rightStick.up.ReadValue(), Is.EqualTo(0.0f));
98-
Assert.That(controller.rightStick.down.ReadValue(), Is.EqualTo(rightStick.y));
98+
Assert.That(controller.rightStick.down.ReadValue(), Is.EqualTo(new AxisDeadzoneProcessor().Process(rightStick.y)));
9999

100100
Assert.That(controller.leftTrigger.ReadValue(), Is.EqualTo(0.123).Within(0.000001));
101101
Assert.That(controller.rightTrigger.ReadValue(), Is.EqualTo(0.456).Within(0.000001));
@@ -121,14 +121,14 @@ public void Devices_SupportsAndroidGamepad()
121121

122122
InputSystem.Update();
123123

124-
Assert.That(controller.leftStick.left.ReadValue(), Is.EqualTo(leftStick.x));
124+
Assert.That(controller.leftStick.left.ReadValue(), Is.EqualTo(new AxisDeadzoneProcessor().Process(leftStick.x)));
125125
Assert.That(controller.leftStick.right.ReadValue(), Is.EqualTo(0.0f));
126-
Assert.That(controller.leftStick.up.ReadValue(), Is.EqualTo(leftStick.y));
126+
Assert.That(controller.leftStick.up.ReadValue(), Is.EqualTo(new AxisDeadzoneProcessor().Process(leftStick.y)));
127127
Assert.That(controller.leftStick.down.ReadValue(), Is.EqualTo(0.0f));
128128

129-
Assert.That(controller.rightStick.left.ReadValue(), Is.EqualTo(rightStick.x));
129+
Assert.That(controller.rightStick.left.ReadValue(), Is.EqualTo(new AxisDeadzoneProcessor().Process(rightStick.x)));
130130
Assert.That(controller.rightStick.right.ReadValue(), Is.EqualTo(0.0f));
131-
Assert.That(controller.rightStick.up.ReadValue(), Is.EqualTo(rightStick.y));
131+
Assert.That(controller.rightStick.up.ReadValue(), Is.EqualTo(new AxisDeadzoneProcessor().Process(rightStick.y)));
132132
Assert.That(controller.rightStick.down.ReadValue(), Is.EqualTo(0.0f));
133133
}
134134

0 commit comments

Comments
 (0)