我有一个WPF dotnetCore3.1桌面应用程序。在某种程度上,它使用操纵杆来控制RS232串行设备。插入操纵杆后,用户可以从下拉菜单中选择它,然后软件开始对其进行轮询,求平均,然后将控件发送到串行设备。这使用Windows.Gaming.Input.RawGameController
从下拉菜单中进行选择会导致此初始化程序
private void UpdateController()
{
if (selectedController != null)
{
buttonStates = new bool[selectedController.ButtonCount];
axisPositions = new double[selectedController.AxisCount];
switchpositions = new GameControllerSwitchPosition[selectedController.SwitchCount];
selectedController.GetCurrentReading(buttonStates, switchpositions, axisPositions);
}
else
{
buttonStates = Array.Empty<bool>();
axisPositions = Array.Empty<double>();
switchpositions = Array.Empty<GameControllerSwitchPosition>();
}
}
轮询看起来像这样
private async void ControlAsync()
{
// If axiscount < 2 then don't bother
if (selectedController != null && selectedController.AxisCount > 1)
{
selectedController.GetCurrentReading(buttonStates, switchpositions, axisPositions);
controlBuffer[0] += axisPositions[0];
controlBuffer[1] += axisPositions[1];
// Debug.WriteLine($"Controller: {axisPositions[0]}, {axisPositions[1]}");
}
// 0.5 is the neutral position
else
{
controlBuffer[0] += 0.5;
controlBuffer[1] += 0.5;
}
if (++controlCounter == controlCount)
{
controlCounter = 0;
PositionerController.PanAxisPositon = controlBuffer[0] / controlCount;
PositionerController.TiltAxisPositon = controlBuffer[1] / controlCount;
controlBuffer[0] = 0;
controlBuffer[1] = 0;
await PositionerController.Control().ConfigureAwait(true);
}
}
问题在于,无论操纵杆在什么位置,操纵杆通常都会出现报告(0.0,0.0)(向左下方完整显示),而中立位置为(0.5,0.5)。除非并且直到操纵杆被移动,否则这不会正确更新,这意味着串行设备(物理设备)将对用户起飞。 我还没有想出一种可靠的方法来解决此问题。我遇到了一些麻烦,例如锁定输入直到看到除0,0之外的其他东西,但似乎应该有一种更简洁/更标准的方法来实现此目的。
这似乎并不是Windows.Gaming.Imput API特有的,因为在另一个项目中,我们读取了带有嵌入式C固件的操纵杆,因此出现了同样的问题。