/
joy.py
73 lines (66 loc) · 2.82 KB
/
joy.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
import gobject #needed for sending signals
import struct #needed for holding chunks of data
class Joystick(gobject.GObject):
'''The Joystick class is a GObject that sends signals that represent
Joystick events'''
EVENT_BUTTON = 0x01 #button pressed/released
EVENT_AXIS = 0x02 #axis moved
EVENT_INIT = 0x80 #button/axis initialized
#see http://docs.python.org/library/struct.html for the format determination
EVENT_FORMAT = "IhBB"
EVENT_SIZE = struct.calcsize(EVENT_FORMAT)
# we need a few signals to send data to the main
'''signals will return 4 variables as follows:
1. a string representing if the signal is from an axis or a button
2. an integer representation of a particular button/axis
3. an integer representing axis direction or button press/release
4. an integer representing the "init" of the button/axis
'''
__gsignals__ = {
'axis' :
(gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,
(gobject.TYPE_INT,gobject.TYPE_INT,gobject.TYPE_INT)),
'button' :
(gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,
(gobject.TYPE_INT,gobject.TYPE_INT,gobject.TYPE_INT))
}
def __init__(self,dev_num):
gobject.GObject.__init__(self)
#define the device
device = '/dev/input/js%s' % dev_num
#error check that this can be read
try:
#open the joystick device
self.device = open(device)
#keep an eye on the device, when there is data to read, execute the read function
gobject.io_add_watch(self.device,gobject.IO_IN,self.read_buttons)
except Exception,ex:
#raise an exception
raise Exception( ex )
def read_buttons(self, arg0='', arg1=''):
''' read the button and axis press event from the joystick device
and emit a signal containing the event data
'''
#read self.EVENT_SIZE bytes from the joystick
read_event = self.device.read(self.EVENT_SIZE)
#get the event structure values from the read event
time, value, type, number = struct.unpack(self.EVENT_FORMAT, read_event)
#get just the button/axis press event from the event type
event = type & ~self.EVENT_INIT
#get just the INIT event from the event type
init = type & ~event
if event == self.EVENT_AXIS:
signal = "axis"
elif event == self.EVENT_BUTTON:
signal = "button"
if signal:
#print("%s %s %s %s" % (signal,number,value,init) )
self.emit(signal,number,value,init)
return True
if __name__ == "__main__":
try:
j = Joystick(0)
loop = gobject.MainLoop()
loop.run()
except Exception,e:
print(e)