diff options
-rw-r--r-- | spnav.py | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/spnav.py b/spnav.py new file mode 100644 index 0000000..9079114 --- /dev/null +++ b/spnav.py @@ -0,0 +1,80 @@ +from ctypes import cdll, c_int, c_uint, c_void_p, byref, Structure, Union + +libspnav = cdll.LoadLibrary('libspnav.so') + +SPNAV_EVENT_ANY = 0 +SPNAV_EVENT_MOTION = 1 +SPNAV_EVENT_BUTTON = 2 + +class spnav_event_motion(Structure): + _fields_ = [('type', c_int), + ('x', c_int), + ('y', c_int), + ('z', c_int), + ('rx', c_int), + ('ry', c_int), + ('rz', c_int), + ('period', c_uint), + ('data', c_void_p)] + +class spnav_event_button(Structure): + _fields_ = [('type', c_int), + ('press', c_int), + ('bnum', c_int)] + +class spnav_event(Union): + _fields_ = [('type', c_int), + ('motion', spnav_event_motion), + ('button', spnav_event_button) ] + + def __str__(self): + if self.type == SPNAV_EVENT_ANY: + return 'SPNAV_EVENT_ANY' + elif self.type == SPNAV_EVENT_MOTION: + m = self.motion + return 'SPNAV_EVENT_MOTION t(%d,%d,%d) r(%d,%d,%d)' % (m.x, m.y, m.z, m.rx, m.ry, m.rz) + elif self.type == SPNAV_EVENT_BUTTON: + if self.button.press: + state = 'down' + else: + state = 'up' + return 'SPNAV_EVENT_BUTTON %d %s' % (self.button.bnum, state) + +def spnav_open(): + if libspnav.spnav_open() == -1: + raise Exception('failed to connect to the space navigator daemon') + +def spnav_close(): + libspnav.spnav_close() + +def spnav_fd(): + return libspnav.spnav_fd() + +def spnav_wait_event(): + ev = spnav_event() + ret = libspnav.spnav_wait_event(byref(ev)) + if ret: + return ev + else: + raise Exception('non-zero return code from spnav_wait_event()') + +def spnav_poll_event(): + ev = spnav_event() + ret = libspnav.spnav_poll_event(byref(ev)) + if ret == 0: + return None + else: + return ev + +def spnav_remove_events(event_type): + return libspnav.spnav_remove_events(event_type) + +if __name__ == '__main__': + spnav_open() + try: + while True: + ev = spnav_wait_event() + print ev + finally: + spnav_close() + |