-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgamepad.py
110 lines (98 loc) · 2.84 KB
/
gamepad.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
from inputs import get_gamepad
from time import sleep
from threading import Thread
from colorama import init, Fore
init(autoreset=True)
_COMMANDS = dict(
DIE="ACT(0)",
LEFT="LEFT",
RIGHT="RIGHT",
UP="UP",
DOWN="DOWN",
JUMP="ACT(1)",
JUMP_LEFT="ACT(1),LEFT",
JUMP_RIGHT="ACT(1),RIGHT",
JUMP_UP="ACT(1),UP",
JUMP_DOWN="ACT(1),DOWN",
PULL_LEFT="ACT(2),LEFT",
PULL_RIGHT="ACT(2),RIGHT",
PULL_UP="ACT(2),UP",
PULL_DOWN="ACT(2),DOWN",
FIRE_LEFT="ACT(3),LEFT",
FIRE_RIGHT="ACT(3),RIGHT",
FIRE_UP="ACT(3),UP",
FIRE_DOWN="ACT(3),DOWN",
NULL="",
)
class GamepadRoboController:
def __init__(self):
self.firing_hold = 0
self.jump_hold = 0
self.grab_hold = 0
self.last_direction = "UP"
self.move = 0
t = Thread(target=self.g_ask)
t.start()
def btn_act(self, btn, value):
if btn == "BTN_SOUTH":
self.firing_hold = value
elif btn == "BTN_NORTH":
self.jump_hold = value
elif btn == "BTN_WEST":
self.grab_hold = value
# print([self.firing_hold, self.jump_hold, self.grab_hold])
def dir_act(self, axis, value):
if value != 0:
self.move = 1
if axis == "ABS_HAT0Y":
# Save last direction
self.last_direction = (
"DOWN"
if value == 1
else "UP"
if value == -1
else self.last_direction
)
elif axis == "ABS_HAT0X":
self.last_direction = (
"RIGHT"
if value == 1
else "LEFT"
if value == -1
else self.last_direction
)
# print([self.last_direction, self.move])
def g_ask(self):
while True:
self.get_gamepad_action()
def get_action_code(self):
n = 0
if self.firing_hold:
n = 3
elif self.grab_hold:
n = 2
elif self.jump_hold:
n = 1
if n != 0:
# return if action commited
self.move = 0
return f"ACT({n})," + self.last_direction
elif self.move:
self.move = 0
return self.last_direction
else:
return ""
def get_gamepad_action(self):
events = get_gamepad()
for event in events:
# print(event.code, event.state)
if event.ev_type == "Key":
self.btn_act(event.code, event.state)
if event.ev_type == "Absolute":
self.dir_act(event.code, event.state)
if __name__ == "__main__":
print("running as main")
gp = GamepadRoboController()
while True:
sleep(1)
print(gp.get_action_code())