diff options
author | Stan Seibert <stan@mtrr.org> | 2011-08-04 18:56:09 -0400 |
---|---|---|
committer | Stan Seibert <stan@mtrr.org> | 2011-08-04 18:56:09 -0400 |
commit | d7f835b3325611ad25209c9a25256b46d4944827 (patch) | |
tree | 8744cfeb8fa7bc2e0f8929257ff94b585f8a86dc /spnav.py | |
parent | d17c6aac2ff0627c83af1951f81d4835d527229f (diff) | |
download | chroma-d7f835b3325611ad25209c9a25256b46d4944827.tar.gz chroma-d7f835b3325611ad25209c9a25256b46d4944827.tar.bz2 chroma-d7f835b3325611ad25209c9a25256b46d4944827.zip |
ctypes module for using libspnav from python
Diffstat (limited to 'spnav.py')
-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() + |