Skip to content

Commit 483a0ed

Browse files
committed
fix D-pad
1 parent 2a1ceff commit 483a0ed

File tree

1 file changed

+57
-6
lines changed

1 file changed

+57
-6
lines changed

fixes/raw_ps4/controller.py

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,53 @@
2222
# Create a virtual keyboard
2323
ui = UInput()
2424

25+
# They must have last value and dead zone state to not interfere and remove the noise
26+
LASTX = 0
27+
LASTY = 0
28+
INDEADZONE_X = True
29+
INDEADZONE_Y = True
30+
INDEADZONE_Z = True
31+
INDEADZONE_RZ = True
32+
2533
print(f"Listening for input from {device.name}...")
2634

2735
for event in device.read_loop():
2836
if event.type == e.EV_ABS: # Detects D-pad, Sticks and Triggers
37+
if event.code == e.ABS_HAT0X: # Left (-1) / Right (1)
38+
if event.value == -1: # Press Left Arrow
39+
LASTX = -1
40+
ui.write(e.EV_KEY, e.KEY_LEFT, 1)
41+
ui.syn()
42+
elif event.value == 1: # Press Right Arrow
43+
LASTX = 1
44+
ui.write(e.EV_KEY, e.KEY_RIGHT, 1)
45+
ui.syn()
46+
elif event.value == 0 and LASTX == -1: # Release Left Arrow
47+
LASTX = 0
48+
ui.write(e.EV_KEY, e.KEY_LEFT, 0)
49+
ui.syn()
50+
elif event.value == 0 and LASTX == 1: # Release Right Arrow
51+
LASTX = 0
52+
ui.write(e.EV_KEY, e.KEY_RIGHT, 0)
53+
ui.syn()
54+
55+
if event.code == e.ABS_HAT0Y: # Up (-1) / Down (1)
56+
if event.value == -1: # Press Up Arrow
57+
LASTY = -1
58+
ui.write(e.EV_KEY, e.KEY_UP, 1)
59+
ui.syn()
60+
elif event.value == 1: # Press Down Arrow
61+
LASTY = 1
62+
ui.write(e.EV_KEY, e.KEY_DOWN, 1)
63+
ui.syn()
64+
elif event.value == 0 and LASTY == -1: # Release Up Arrow
65+
LASTY = 0
66+
ui.write(e.EV_KEY, e.KEY_UP, 0)
67+
ui.syn()
68+
elif event.value == 0 and LASTY == 1: # Release Down Arrow
69+
LASTY = 0
70+
ui.write(e.EV_KEY, e.KEY_DOWN, 0)
71+
ui.syn()
2972
"""
3073
Sticks and Triggers
3174
ABS_X and ABS_Y 0 means left stick is most to the left or most down
@@ -45,44 +88,52 @@
4588
threshold we can start with a 8 way square.
4689
"""
4790
if event.code == e.ABS_X: # Left stick X
48-
last_x = event.value
4991
if event.value < 63: # Left threshold
92+
INDEADZONE_X = False
5093
ui.write(e.EV_KEY, e.KEY_LEFT, 1) # Press Left Arrow
5194
ui.syn()
5295
elif event.value > 192: # Right threshold
96+
INDEADZONE_X = False
5397
ui.write(e.EV_KEY, e.KEY_RIGHT, 1) # Press Right Arrow
5498
ui.syn()
55-
else:
99+
elif not INDEADZONE_X:
100+
INDEADZONE_X = True
56101
ui.write(e.EV_KEY, e.KEY_LEFT, 0)
57102
ui.write(e.EV_KEY, e.KEY_RIGHT, 0)
58103
ui.syn()
59104

60105
elif event.code == e.ABS_Y: # Left stick Y
61-
last_y = event.value
62106
if event.value < 63: # Up threshold
107+
INDEADZONE_Y = False
63108
ui.write(e.EV_KEY, e.KEY_UP, 1) # Press Up Arrow
64109
ui.syn()
65110
elif event.value > 192: # Down threshold
111+
INDEADZONE_Y = False
66112
ui.write(e.EV_KEY, e.KEY_DOWN, 1) # Press Down Arrow
67113
ui.syn()
68-
else:
114+
elif not INDEADZONE_Y:
115+
INDEADZONE_Y = True
69116
ui.write(e.EV_KEY, e.KEY_UP, 0)
70117
ui.write(e.EV_KEY, e.KEY_DOWN, 0)
71118
ui.syn()
72119

73120
elif event.code == e.ABS_Z: # Left trigger Z
74121
if event.value > 200:
122+
INDEADZONE_Z = False
75123
ui.write(e.EV_KEY, e.KEY_S, 1) # Activate S
76124
ui.syn()
77-
else:
125+
elif not INDEADZONE_Z:
126+
INDEADZONE_Z = True
78127
ui.write(e.EV_KEY, e.KEY_S, 0) # Deactivate S
79128
ui.syn()
80129

81130
elif event.code == e.ABS_RZ: # Right trigger Z
82131
if event.value > 200:
132+
INDEADZONE_RZ = False
83133
ui.write(e.EV_KEY, e.KEY_C, 1) # Activate C
84134
ui.syn()
85-
else:
135+
elif not INDEADZONE_RZ:
136+
INDEADZONE_RZ = True
86137
ui.write(e.EV_KEY, e.KEY_C, 0) # Deactivate C
87138
ui.syn()
88139

0 commit comments

Comments
 (0)