为什么Gamepad.GetCurrentReading()不起作用?

时间:2016-01-31 01:32:04

标签: raspberry-pi uwp windowsiot

我创建了一个利用Windows.Gaming.Input命名空间的UWP应用,但是当我部署到运行Windows 10 IoT Core的Raspberry Pi 2 B时,Gamepad.GetCurrentReading()方法返回默认值GamepadReading的实例。 (即一切都是0

在我的本地计算机上进行调试似乎有效。是否需要其他任何方法才能在我的设备上运行此API?

P.S。我注意到其中一个样本uses HidDevice,所以我会在同一时间内将其作为替代方案。

1 个答案:

答案 0 :(得分:1)

这是我的(不完整的)解决方法。它是Gamepad类的替代品。

class HidGamepad
{
    static readonly List<HidGamepad> _gamepads = new List<HidGamepad>();
    GamepadReading _currentReading;

    static HidGamepad()
    {
        var deviceSelector = HidDevice.GetDeviceSelector(0x01, 0x05);
        var watcher = DeviceInformation.CreateWatcher(deviceSelector);
        watcher.Added += HandleAdded;
        watcher.Start();
    }

    private HidGamepad(HidDevice device)
    {
        device.InputReportReceived += HandleInputReportRecieved;
    }

    public static event EventHandler<HidGamepad> GamepadAdded;

    public static IReadOnlyList<HidGamepad> Gamepads
        => _gamepads;

    public GamepadReading GetCurrentReading()
        => _currentReading;

    static async void HandleAdded(DeviceWatcher sender, DeviceInformation args)
    {
        var hidDevice = await HidDevice.FromIdAsync(args.Id, FileAccessMode.Read);
        if (hidDevice == null) return;

        var gamepad = new HidGamepad(hidDevice);
        _gamepads.Add(gamepad);
        GamepadAdded?.Invoke(null, gamepad);
    }

    void HandleInputReportRecieved(
        HidDevice sender, HidInputReportReceivedEventArgs args)
    {
        var leftThumbstickX = args.Report.GetNumericControl(0x01, 0x30).Value;
        var leftThumbstickY = args.Report.GetNumericControl(0x01, 0x31).Value;

        _currentReading = new GamepadReading
        {
            LeftThumbstickX = (leftThumbstickX - 32768) / 32768.0,
            LeftThumbstickY = (leftThumbstickY - 32768) / -32768.0
        };
    }
}