diff --git a/readme.md b/readme.md index 85592ba..64ebedb 100644 --- a/readme.md +++ b/readme.md @@ -3,7 +3,7 @@ Welcome to HidApi.Net a modern .NET 6 cross platform C# binding for the C [HIDAPI] library. Supported platforms are Linux, OSX and Windows. -Supported HIDAPI version: 0.13 +Supported HIDAPI version: Up to 0.14 ## Use To use the library please reference the [nuget package](https://www.nuget.org/packages/HidApi.Net/) in your project. Additionally it is required to either ensure that [HIDAPI] is available on the host system or is distributed as part of your application. diff --git a/src/HidApi.Net/Device.cs b/src/HidApi.Net/Device.cs index f0657ed..f87ccc7 100644 --- a/src/HidApi.Net/Device.cs +++ b/src/HidApi.Net/Device.cs @@ -271,6 +271,28 @@ public string GetIndexedString(int stringIndex, int maxLength = 128) return WCharT.GetString(buffer); } + /// + /// Gets the report descriptor of the device. + /// + /// Max length of the expected data. + /// The report descriptor + /// Available since hidapi 0.14.0 + /// Raised if bufLength is less than 0 + public ReadOnlySpan GetReportDescriptor(int bufSize = 4096) + { + if (bufSize < 0) + throw new ArgumentOutOfRangeException(nameof(bufSize), bufSize, "Please provide a positive value"); + + var data = new byte[bufSize]; + ReadOnlySpan spanData = data; + var result = NativeMethods.GetReportDescriptor(handle, spanData); + + if (result == -1) + HidException.Throw(handle); + + return spanData[..result]; + } + /// /// Frees all unmanaged resources. /// diff --git a/src/HidApi.Net/Internal/NativeMethods.cs b/src/HidApi.Net/Internal/NativeMethods.cs index 08464a9..3fbf878 100644 --- a/src/HidApi.Net/Internal/NativeMethods.cs +++ b/src/HidApi.Net/Internal/NativeMethods.cs @@ -89,6 +89,11 @@ public static int GetInputReport(DeviceSafeHandle device, ReadOnlySpan dat return GetInputReport(device, ref MemoryMarshal.GetReference(data), (nuint) data.Length); } + public static int GetReportDescriptor(DeviceSafeHandle device, ReadOnlySpan buf) + { + return GetReportDescriptor(device, ref MemoryMarshal.GetReference(buf), (nuint) buf.Length); + } + [DllImport(Library, EntryPoint = "hid_init")] public static extern int Init(); @@ -146,6 +151,9 @@ public static int GetInputReport(DeviceSafeHandle device, ReadOnlySpan dat [DllImport(Library, EntryPoint = "hid_get_indexed_string")] private static extern int GetIndexedString(DeviceSafeHandle device, int stringIndex, ref byte buffer, nuint maxLength); + [DllImport(Library, EntryPoint = "hid_get_report_descriptor")] + private static extern int GetReportDescriptor(DeviceSafeHandle device, ref byte buf, nuint bufSize); + [DllImport(Library, EntryPoint = "hid_error")] public static extern unsafe byte* Error(DeviceSafeHandle device);