-
Notifications
You must be signed in to change notification settings - Fork 1
/
joystick.py
166 lines (120 loc) · 5.88 KB
/
joystick.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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
from xml.dom.minidom import *
from threads import threaded
from xkeys import XKeys
from mouse import mouseKeys
class JoyStickAxis():
def __init__(self, lowKey, highKey):
self.low = lowKey
self.high = highKey
self.low_active = False
self.high_active = False
class JoyStick():
def __init__(self):
self.axis = { }
self.buttons = { }
def print_info(self):
print "Joystick mappings found : "
for axis in self.axis.keys():
print " - axis %s direction low mapped to key %s" % (axis, self.axis[axis].low)
print " - axis %s direction high mapped to key %s" % (axis, self.axis[axis].high)
for key in self.buttons:
print " - button %s mapped to key %s" % (key, self.buttons[key])
class JKeys:
def __init__(self, document):
self.joysticks = {}
for joy_node in document.getElementsByTagName("joystick"):
joy = JoyStick()
for axis_node in joy_node.getElementsByTagName("axis"):
axis = JoyStickAxis( axis_node.getAttribute("low"), axis_node.getAttribute("high"))
joy.axis[ axis_node.getAttribute("number") ] = axis
for button_node in joy_node.getElementsByTagName("button"):
joy.buttons[button_node.getAttribute("number")] = button_node.getAttribute("key")
self.joysticks[int(joy_node.getAttribute("id"))] = joy
joy.print_info()
try:
import pygame
except:
print "You need to install pygame to capture joystick controls"
pygame.init()
self.nbJoy = pygame.joystick.get_count()
for i in range(self.nbJoy):
pygame.joystick.Joystick(i).init()
if self.nbJoy == 0:
print "Sorry no joysticks found!!"
elif self.nbJoy != len(self.joysticks):
print "%d joysticks configured, only %d joysticks found" % (len(self.joysticks), self.nbJoy)
self.debug = False
@threaded
def run(self):
if self.nbJoy != 0:
import pygame
pygame.display.init()
pygame.time.set_timer(1, 100)
capture_events = [pygame.JOYBUTTONDOWN, pygame.JOYAXISMOTION, pygame.JOYBUTTONUP, pygame.JOYHATMOTION]
x = XKeys()
mouse = {}
# clear out all pre existing pygame events else we get 1 of each
pygame.event.clear()
def key_press( key ):
if key.lower().startswith("mouse_"):
key = key.split("_")[1]
if not mouse.has_key(key):
mouse[key] = mouseKeys()
else:
x.SendKeyRelease( key )
mouse[key].StartMouseMove(key)
else:
x.SendKeyPress( key )
def key_release( key ):
if key.lower().startswith("mouse_"):
key = key.split("_")[1]
if mouse.has_key(key):
mouse[key].StopMouseMove()
else:
x.SendKeyRelease( key )
while True:
pygame.event.pump()
ev = pygame.event.wait()
if ev.type in capture_events:
joy = self.joysticks[ ev.joy ]
if ev.type == pygame.JOYHATMOTION:
res = gethatcode(ev)
if self.debug: print "UNHANDLED JOY HAT code: ", res
elif ev.type == pygame.JOYBUTTONDOWN:
button = str(ev.button)
if joy.buttons.has_key(button):
key_code = joy.buttons[button]
if self.debug: print "Button down : " + key_code
key_press( key_code )
elif ev.type == pygame.JOYBUTTONUP:
button = str(ev.button)
if joy.buttons.has_key(button):
key_code = joy.buttons[button]
if self.debug: print "Button up : " + key_code
key_release( key_code )
elif ev.type == pygame.JOYAXISMOTION:
axis_number = str(ev.axis)
if joy.axis.has_key(axis_number):
axis = joy.axis[axis_number]
if ev.value < 0:
if self.debug: print "Button down : " + axis.low
key_press( axis.low )
axis.low_active = True
elif ev.value > 0:
if self.debug: print "Button down : " + axis.high
key_press( axis.high )
axis.high_active = True
else:
if axis.low_active:
if self.debug: print "Button up : " + axis.low
key_release( axis.low )
axis.low_active = False
if axis.high_active:
if self.debug: print "Button up : " + axis.high
key_release( axis.high )
axis.high_active = False
pygame.display.quit()
return res
def __del__(self):
import pygame
pygame.quit()