4

I've created a UWP app that takes advantage of the Windows.Gaming.Input namespace, but when I deploy to my Raspberry Pi 2 B running Windows 10 IoT Core, the Gamepad.GetCurrentReading() method returns a default instance of the GamepadReading. (i.e. everything is 0)

Debugging on my local machine seems to work. Is there anything additional needed to get this API working on my device?

P.S. I noticed that one of the samples uses HidDevice, so I'll look into that as an alternative in the mean time.

bricelam
  • 28,825
  • 9
  • 92
  • 117

1 Answers1

1

Here is my (incomplete) workaround. It's a drop-in replacement for the Gamepad class.

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
        };
    }
}
bricelam
  • 28,825
  • 9
  • 92
  • 117