/// <summary> /// Get all our usages, those are typically the buttons currently pushed on a gamepad. /// For a remote control it's usually just the one button that was pushed. /// </summary> private void GetUsages(byte[] aInputReport) { //Do proper parsing of our HID report //First query our usage count uint usageCount = 0; Win32.USAGE_AND_PAGE[] usages = null; Win32.HidStatus status = Win32.Function.HidP_GetUsagesEx(Win32.HIDP_REPORT_TYPE.HidP_Input, 0, usages, ref usageCount, Device.PreParsedData, aInputReport, (uint)aInputReport.Length); if (status == Win32.HidStatus.HIDP_STATUS_BUFFER_TOO_SMALL) { //Allocate a large enough buffer usages = new Win32.USAGE_AND_PAGE[usageCount]; //...and fetch our usages status = Win32.Function.HidP_GetUsagesEx(Win32.HIDP_REPORT_TYPE.HidP_Input, 0, usages, ref usageCount, Device.PreParsedData, aInputReport, (uint)aInputReport.Length); if (status != Win32.HidStatus.HIDP_STATUS_SUCCESS) { Debug.WriteLine("Second pass could not parse HID data: " + status.ToString()); } } else if (status != Win32.HidStatus.HIDP_STATUS_SUCCESS) { Debug.WriteLine("First pass could not parse HID data: " + status.ToString()); } Debug.WriteLine("Usage count: " + usageCount.ToString()); //Copy usages into this event if (usages != null) { foreach (USAGE_AND_PAGE up in usages) { //Debug.WriteLine("UsagePage: 0x" + usages[0].UsagePage.ToString("X4")); //Debug.WriteLine("Usage: 0x" + usages[0].Usage.ToString("X4")); //Add this usage to our list Usages.Add(up.Usage); } } }
/// <summary> /// Typically fetches values of a joystick/gamepad axis and dpad directions. /// </summary> /// <param name="aInputReport"></param> private void GetUsageValues(byte[] aInputReport) { if (Device.InputValueCapabilities == null) { return; } foreach (HIDP_VALUE_CAPS caps in Device.InputValueCapabilities) { if (caps.IsRange) { //What should we do with those guys? continue; } //Now fetch and add our usage value uint usageValue = 0; Win32.HidStatus status = Win32.Function.HidP_GetUsageValue(Win32.HIDP_REPORT_TYPE.HidP_Input, caps.UsagePage, caps.LinkCollection, caps.NotRange.Usage, ref usageValue, Device.PreParsedData, aInputReport, (uint)aInputReport.Length); if (status == Win32.HidStatus.HIDP_STATUS_SUCCESS) { UsageValues[caps] = usageValue; } } }