Defining custom input device
Hello there, I am currently struggling so much with defining my custom input device. I think I've done everything properly but I can't get any data from my device. I'm sure the device works because I checked that in Device Monitoring Studio.
Raw hex data looks like that:
01 11 f6 1d 92 4d ff 7f
Byte 0 -> Report Id
Byte 1 -> Buttons
Byte 2-3 -> PositionX
Byte 4-5 -> PositionY
Byte 6-7 -> Pressure
I defined state representation and device class in this way:
[StructLayout(LayoutKind.Explicit, Size = 8)]
public struct EpsonPenState : IInputStateTypeInfo
{
public FourCC format => new FourCC('H', 'I', 'D');
[FieldOffset(0)] public byte reportId;
[InputControl(name = "tipSwitch", layout = "Button", bit = 0, displayName = "Tip Switch")]
[InputControl(name = "barrelSwitch", layout = "Button", bit = 1, displayName = "Barrel Switch")]
[InputControl(name = "invert", layout = "Button", bit = 2, displayName = "Invert")]
[InputControl(name = "eraser", layout = "Button", bit = 3, displayName = "Eraser")]
[InputControl(name = "inRange", layout = "Button", bit = 4, displayName = "In Range")]
[FieldOffset(1)]
public byte buttons;
[InputControl(name ="positionX", layout = "Analog", displayName = "Position X")]
[FieldOffset(2)]
public ushort positionX;
[InputControl(name = "positionY", layout = "Analog", displayName = "Position X")]
[FieldOffset(4)]
public ushort positionY;
[InputControl(layout = "Analog",name = "pressure", usage = "Pressure", defaultState = 0.0f)]
[FieldOffset(6)]
public ushort pressure;
}
#if UNITY_EDITOR
[InitializeOnLoad]
#endif
[InputControlLayout(stateType = typeof(EpsonPenState))]
public class EpsonPen : InputDevice
{
public static EpsonPen current { get; private set; }
#if UNITY_EDITOR
static EpsonPen()
{
Initialize();
}
#endif
[RuntimeInitializeOnLoadMethod]
private static void Initialize()
{
InputSystem.RegisterLayout<EpsonPen>(
matches: new InputDeviceMatcher()
.WithInterface("HID")
.WithManufacturer("EPSON")
.WithProduct("EPSON EPSON 725Wi")
.WithVersion("4660")
.WithCapability<int>("inputReportSize", 8)
.WithCapability("vendorId", 0x4B8)
.WithCapability("productId", 0x327));
}
public ButtonControl tipSwitch { get; private set; }
public ButtonControl barrelSwitch { get; private set; }
public ButtonControl invert { get; private set; }
public ButtonControl eraser { get; private set; }
public ButtonControl inRange { get; private set; }
public AxisControl positionX { get; private set; }
public AxisControl positionY { get; private set; }
public AxisControl pressure { get; private set; }
protected override void FinishSetup()
{
base.FinishSetup();
tipSwitch = GetChildControl<ButtonControl>("tipSwitch");
barrelSwitch = GetChildControl<ButtonControl>("barrelSwitch");
invert = GetChildControl<ButtonControl>("invert");
eraser = GetChildControl<ButtonControl>("eraser");
inRange = GetChildControl<ButtonControl>("inRange");
positionX = GetChildControl<AxisControl>("positionX");
positionY = GetChildControl<AxisControl>("positionY");
pressure = GetChildControl<AxisControl>("pressure");
}
public override void MakeCurrent()
{
base.MakeCurrent();
current = this;
}
protected override void OnRemoved()
{
base.OnRemoved();
if (current == this)
current = null;
}
}
It seems to be chaotic now but I've tried 26 different configurations and none of them works. Device is present in Input Debug but none of the values is changing.
Your answer
Follow this Question
Related Questions
PointAndClick 1 Answer
How use ANDROID NAVIGATION BUTTONS 0 Answers
Touch Controls without virtual joystick 0 Answers
how can i touch the fast objects ? 1 Answer
i need help making a dash ability for my endless runner game 2 Answers