//+build linux
package evdev
import "core:fmt"
import "core:os"
import "core:intrinsics"
import "core:sys/unix"
// Hopefully safe definition.
@(private)
Timeval :: struct {
tv_sec: int,
tv_usec: int,
}
// /dev/input/by-id/usb-Microsoft_Controller_30324B4530303836313733373439-event-joystick
InputEvent :: struct {
time: Timeval,
type: EventType,
code: u16,
value: uint,
}
EventType :: enum u16 {
Syn = 0x00,
Key = 0x01,
Rel = 0x02,
Abs = 0x03,
Msc = 0x04,
Sw = 0x05,
Led = 0x11,
Snd = 0x12,
Rep = 0x14,
Ff = 0x15,
Pwr = 0x16,
FfStatus = 0x17,
Max = 0x1f,
}
AbsAxis :: enum {
X = 0x00,
Y = 0x01,
Z = 0x02,
Rx = 0x03,
Ry = 0x04,
Rz = 0x05,
Throttle = 0x06,
Rudder = 0x07,
Wheel = 0x08,
Gas = 0x09,
Brake = 0x0a,
Hat0X = 0x10,
Hat0Y = 0x11,
Hat1X = 0x12,
Hat1Y = 0x13,
Hat2X = 0x14,
Hat2Y = 0x15,
Hat3X = 0x16,
Hat3Y = 0x17,
Pressure = 0x18,
Distance = 0x19,
TiltX = 0x1a,
TiltY = 0x1b,
ToolWidth = 0x1c,
Volume = 0x20,
Profile = 0x21,
Misc = 0x28,
Reserved = 0x2e,
MtSlot = 0x2,
MtTouchMajor = 0x30,
MtTouchMinor = 0x31,
MtWidthMajor = 0x32,
MtWidthMinor = 0x33,
MtOrientation = 0x34,
MtPositionX = 0x35,
MtPositionY = 0x36,
MtToolType = 0x37,
MtBlobId = 0x38,
MtTrackingId = 0x39,
MtPressure = 0x3a,
MtDistance = 0x3b,
MtToolX = 0x3c,
MtToolY = 0x3d,
}
Button :: enum {
Misc = 0x100,
Num0 = 0x100,
Num1 = 0x101,
Num2 = 0x102,
Num3 = 0x103,
Num4 = 0x104,
Num5 = 0x105,
Num6 = 0x106,
Num7 = 0x107,
Num8 = 0x108,
Num9 = 0x109,
Mouse = 0x110,
Left = 0x110,
Right = 0x111,
Middle = 0x112,
Side = 0x113,
Extra = 0x114,
Forward = 0x115,
Back = 0x116,
Task = 0x117,
Joystick = 0x120,
Trigger = 0x120,
Thumb = 0x121,
Thumb2 = 0x122,
Top = 0x123,
Top2 = 0x124,
Pinkie = 0x125,
Base = 0x126,
Base2 = 0x127,
Base3 = 0x128,
Base4 = 0x129,
Base5 = 0x12a,
Base6 = 0x12b,
Dead = 0x12f,
GamepaD = 0x130,
South = 0x130,
A = South,
East = 0x131,
B = East,
C = 0x132,
North = 0x133,
X = North,
West = 0x134,
Y = West,
Z = 0x135,
Tl = 0x136,
Tr = 0x137,
Tl2 = 0x138,
Tr2 = 0x139,
Select = 0x13a,
Start = 0x13b,
Mode = 0x13c,
Thumbl = 0x13d,
Thumbr = 0x13e,
Digi = 0x140,
ToolPen = 0x140,
ToolRubber = 0x141,
ToolBrush = 0x142,
ToolPencil = 0x143,
ToolAirbrush = 0x144,
ToolFinger = 0x145,
ToolMouse = 0x146,
ToolLens = 0x147,
ToolQuinttap = 0x148, /* Five fingers on trackpad =*/
Stylus3 = 0x149,
Touch = 0x14a,
Stylus = 0x14b,
Stylus2 = 0x14c,
ToolDoubletap = 0x14d,
ToolTripletap = 0x14e,
ToolQuadtap = 0x14f, /* Four fingers on trackpad =*/
Wheel = 0x150,
GearDown = 0x150,
GearUp = 0x151,
}
InputAbsinfo :: struct {
value: i16,
minimum: i16,
maximum: i16,
fuzz: i16,
flag: i16,
resolution: i16,
}
InputKeymap :: struct {
flags: u8,
len: u8,
index: u16,
keycode: u32,
scancode: [32]u8,
}
get_abs_axis :: proc(handle: os.Handle, axis: AbsAxis) -> InputAbsinfo {
absinfo: InputAbsinfo
result := int(
intrinsics.syscall(
unix.SYS_ioctl,
uintptr(handle),
uintptr(EVIOCGABS | ((0x40 + uint(axis)) << IOC_NRSHIFT)),
uintptr(&absinfo),
),
)
if result < 0 {
fmt.printf("error: %d - %s\n", result, string(strerror(result)))
}
// fmt.printf("\t%#v\n", absinfo)
return absinfo
}
get_key :: proc(handle: os.Handle) -> [(0x2ff + 7) / 8]u8 {
buffer: [(0x2ff + 7) / 8]u8
result := int(
intrinsics.syscall(
unix.SYS_ioctl,
uintptr(handle),
uintptr(EVIOCGKEY),
uintptr(&buffer[0]),
),
)
if result < 0 {
fmt.printf("error: %d - %s\n", result, string(strerror(result)))
}
return buffer
}