From d7f835b3325611ad25209c9a25256b46d4944827 Mon Sep 17 00:00:00 2001 From: Stan Seibert Date: Thu, 4 Aug 2011 18:56:09 -0400 Subject: ctypes module for using libspnav from python --- spnav.py | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 spnav.py (limited to 'spnav.py') 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() + -- cgit