-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhidraw.py
132 lines (110 loc) · 3.7 KB
/
hidraw.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#!/usr/bin/env python
import sys
import struct
import uinput
import subprocess
last_btn = None
device = uinput.Device([
uinput.KEY_1,
uinput.KEY_2,
uinput.KEY_3,
uinput.KEY_4,
uinput.KEY_5,
uinput.KEY_6,
uinput.KEY_7,
uinput.KEY_8,
uinput.KEY_9,
uinput.KEY_0,
uinput.KEY_ENTER,
uinput.KEY_UP,
uinput.KEY_DOWN,
uinput.KEY_LEFT,
uinput.KEY_RIGHT,
uinput.KEY_ESC,
uinput.KEY_MUTE,
uinput.KEY_VOLUMEUP,
uinput.KEY_VOLUMEDOWN,
uinput.KEY_PAGEUP,
uinput.KEY_PAGEDOWN,
uinput.KEY_HOME,
uinput.KEY_SCROLLUP,
uinput.KEY_SCROLLDOWN,
])
def bar(val, l=20):
return ("%02.2f " % (val / 2**9,)).rjust(8) + (
"#" * int((val + 2**15) / 2**16 * l)
).ljust(l)
with open(sys.argv[1], "rb") as fd:
while True:
pkt_type = fd.read(1)
if not pkt_type:
# EOF
break
if pkt_type == b"\xfd":
# ...read the rest
chunk = fd.read(19)
(
unk1,
cnt,
gyro1,
gyro2,
gyro3,
acc1,
acc2,
acc3,
btn_pressed,
btn_code,
wheel,
) = struct.unpack(">BBxxhhhhhhBBB", chunk)
if not (last_btn is btn_code) or ((btn_pressed == 128) and (btn_code == 0)):
match btn_code:
case 16:
device.emit_click(uinput.KEY_0)
case 17:
device.emit_click(uinput.KEY_1)
case 18:
device.emit_click(uinput.KEY_2)
case 19:
device.emit_click(uinput.KEY_3)
case 20:
device.emit_click(uinput.KEY_4)
case 21:
device.emit_click(uinput.KEY_5)
case 22:
device.emit_click(uinput.KEY_6)
case 23:
device.emit_click(uinput.KEY_7)
case 24:
device.emit_click(uinput.KEY_8)
case 25:
device.emit_click(uinput.KEY_9)
case 2:
device.emit_click(uinput.KEY_VOLUMEUP)
case 3:
device.emit_click(uinput.KEY_VOLUMEDOWN)
#case 0: Causing issues even with trying to account for it above. Every key release triggers this case.
# device.emit_click(uinput.KEY_PAGEUP)
case 1:
device.emit_click(uinput.KEY_PAGEDOWN)
case 9:
device.emit_click(uinput.KEY_MUTE)
case 124:
device.emit_click(uinput.KEY_HOME)
case 64:
device.emit_click(uinput.KEY_UP)
case 65:
device.emit_click(uinput.KEY_DOWN)
case 7:
device.emit_click(uinput.KEY_LEFT)
case 6:
device.emit_click(uinput.KEY_RIGHT)
case 40:
device.emit_click(uinput.KEY_ESC)
last_btn = btn_code
match wheel:
case 1:
subprocess.Popen(['xdotool', 'click', '4'])
case 255:
subprocess.Popen(['xdotool', 'click', '5'])
else:
print("Unknown packet type:", pkt_type)