Windows.Gaming.Input.RawGameController初始化为错误状态

时间:2020-11-11 15:13:58

标签: c# .net-core joystick

我有一个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固件的操纵杆,因此出现了同样的问题。

0 个答案:

没有答案