Support both normal and extended VMulti

This commit is contained in:
X9VoiD 2023-11-07 03:07:38 +08:00
parent 300fe0ebe4
commit a69fe346b2
3 changed files with 78 additions and 8 deletions

View file

@ -1,5 +1,5 @@
using System.Numerics;
using OpenTabletDriver.Plugin.Attributes;
using OpenTabletDriver.Plugin;
using OpenTabletDriver.Plugin.Platform.Display;
using OpenTabletDriver.Plugin.Platform.Pointer;
using OpenTabletDriver.Plugin.Tablet;
@ -13,6 +13,7 @@ namespace VoiDPlugins.OutputMode
public unsafe abstract class WinInkBasePointer : IPressureHandler, ITiltHandler, IEraserHandler, ISynchronousPointer
{
private readonly Vector2 _conversionFactor;
private readonly int _pressureConv;
private readonly IVirtualScreen _screen;
private ThinOSPointer? _osPointer;
private Vector2 _internalPos;
@ -44,9 +45,25 @@ namespace VoiDPlugins.OutputMode
SharedStore.SetOrAdd(TIP_PRESSED, false);
}
if (Instance.Extended)
{
Log.Write(name, "Using extended VMulti digitizer");
_pressureConv = 16383;
}
else
{
_pressureConv = 8191;
}
VMultiInstance<DigitizerInputReport> createInstance()
{
return new VMultiInstance<DigitizerInputReport>(name, new DigitizerInputReport());
return new VMultiInstance<DigitizerInputReport>(name, extended =>
{
if (extended)
return DigitizerInputReport.Extended();
else
return DigitizerInputReport.Normal();
});
}
}
@ -60,7 +77,7 @@ namespace VoiDPlugins.OutputMode
public void SetPressure(float percentage)
{
RawPointer->Pressure = (ushort)(percentage * 16383);
RawPointer->Pressure = (ushort)(percentage * _pressureConv);
}
public void SetTilt(Vector2 tilt)

View file

@ -6,9 +6,12 @@ namespace VoiDPlugins.Library.VMulti.Device
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct DigitizerInputReport
{
public const byte NormalReportID = 0x05;
public const byte ExtendedReportID = 0x06;
public DigitizerInputReport()
{
Header = new VMultiReportHeader(Unsafe.SizeOf<DigitizerInputReport>(), 0x06);
Header = new VMultiReportHeader(Unsafe.SizeOf<DigitizerInputReport>(), ExtendedReportID);
X = 0;
Y = 0;
Pressure = 0;
@ -16,6 +19,26 @@ namespace VoiDPlugins.Library.VMulti.Device
YTilt = 0;
}
private DigitizerInputReport(byte reportId)
{
Header = new VMultiReportHeader(Unsafe.SizeOf<DigitizerInputReport>(), reportId);
X = 0;
Y = 0;
Pressure = 0;
XTilt = 0;
YTilt = 0;
}
public static DigitizerInputReport Normal()
{
return new DigitizerInputReport(NormalReportID);
}
public static DigitizerInputReport Extended()
{
return new DigitizerInputReport(ExtendedReportID);
}
public VMultiReportHeader Header;
public ushort X; // X position of the pen from 0 to 32767
public ushort Y; // Y position of the pen from 0 to 32767

View file

@ -1,6 +1,8 @@
using System;
using System.Linq;
using System.Runtime.CompilerServices;
using HidSharp;
using HidSharp.Reports;
using OpenTabletDriver.Plugin;
using VoiDPlugins.Library.VMulti.Device;
@ -9,14 +11,16 @@ namespace VoiDPlugins.Library.VMulti
public class VMultiInstance
{
private readonly HidStream? _device;
private readonly bool _extended;
protected readonly byte[] Buffer;
public unsafe VMultiReportHeader* Header { get; }
public bool Extended => _extended;
public unsafe VMultiInstance(string name, int size)
{
Buffer = GC.AllocateArray<byte>(size, true);
Header = (VMultiReportHeader*)Unsafe.AsPointer(ref Buffer[0]);
_device = Retrieve(name);
_device = Retrieve(name, out _extended);
}
public void Write()
@ -44,10 +48,12 @@ namespace VoiDPlugins.Library.VMulti
return (buttons & bit) != 0;
}
private static HidStream? Retrieve(string Name)
private static HidStream? Retrieve(string Name, out bool extended)
{
HidStream? VMultiDev = null;
foreach (var device in DeviceList.Local.GetHidDevices(productID: 47820))
var devices = DeviceList.Local.GetHidDevices(vendorID: 255, productID: 47820).ToArray();
foreach (var device in devices)
{
if (device.GetMaxOutputReportLength() == 65 && device.GetMaxInputReportLength() == 65)
{
@ -56,7 +62,25 @@ namespace VoiDPlugins.Library.VMulti
}
}
if (VMultiDev == null)
bool normal = false;
extended = false;
foreach (var device in devices)
{
if (device.GetMaxInputReportLength() == 10)
{
var reportDescriptor = device.GetReportDescriptor();
if (reportDescriptor.TryGetReport(ReportType.Input, DigitizerInputReport.NormalReportID, out _))
normal = true;
if (reportDescriptor.TryGetReport(ReportType.Input, DigitizerInputReport.ExtendedReportID, out _))
extended = true;
}
if (normal && extended)
break;
}
if (VMultiDev == null || (!normal && !extended))
{
Log.WriteNotify(Name, "Cannot find VirtualHID. Install VMulti driver here: https://github.com/X9VoiD/vmulti-bin/releases/latest", LogLevel.Error);
}
@ -74,5 +98,11 @@ namespace VoiDPlugins.Library.VMulti
Pointer = (T*)Unsafe.AsPointer(ref Buffer[0]);
*Pointer = initialValue;
}
public unsafe VMultiInstance(string name, Func<bool, T> initialValue) : base(name, Unsafe.SizeOf<T>())
{
Pointer = (T*)Unsafe.AsPointer(ref Buffer[0]);
*Pointer = initialValue(Extended);
}
}
}