This demo demonstrates the usage of the SpaceDevice object in the cgkit.spacedevice module which can be used to access events from a SpaceMouse or SpaceBall. You can use this module to add support for a SpaceDevice in your own Python application. The demo simply prints the events generated from a SpaceDevice to the console.
Note however, that you don’t have to do all this if you are using the cgkit viewer tool. In this case, the tool already does this low level stuff and you simply have to connect to the appropriate event (SPACE_MOTION, SPACE_BUTTON_DOWN, SPACE_BUTTON_UP and SPACE_ZERO).
The demo only runs on Windows and requires pygame v1.7.1 (or higher).
Here is the script:
######################################################################
# SpaceDevice demo
#
# This demo demonstrates the usage of the SpaceDevice object in the
# cgkit.spacedevice module which can be used to access events from
# a SpaceMouse or SpaceBall. You can use this module to add support
# for a SpaceDevice in your own Python application. The demo simply
# prints the events generated from a SpaceDevice to the console.
#
# The general steps are as follows:
#
# 1) Create a SpaceDevice object.
#
# 2) Open the device using the open() method. This requires a windows
# handle of the window that will receive the SpaceDevice events.
#
# 3) For every system event received call the translateWin32Event()
# method and check if the event was generated by a SpaceDevice.
# If it was, check for the event type and process the event.
#
# 4) When the application terminates, call the close() method to
# close the device.
#
# This demo uses pygame as GUI toolkit (v1.7.1 is required).
# You can use any other GUI toolkit as long as it 1) lets you obtain
# the native window handle of a window and 2) provides access to
# system events.
#
# Note that you don't have to do all this if you are using the cgkit
# viewer tool. In this case, the tool already does this low level
# stuff and you simply have to connect to the appropriate event
# (SPACE_MOTION, SPACE_BUTTON_DOWN, SPACE_BUTTON_UP and SPACE_ZERO).
######################################################################
import sys
import pygame
from pygame.locals import *
from cgkit import spacedevice
# handleSystemEvent
def handleSystemEvent(evt):
"""Handle a system event.
evt is a pygame event object that contains a system event. The function
first checks if the event was generated by a SpaceDevice and if it was,
it prints the event data.
"""
# sdev is the global SpaceDevice object
global sdev
# Translate the system event into a SpaceDevice event...
res, evttype, data = sdev.translateWin32Event(evt.msg, evt.wparam, evt.lparam)
# Check if the event actually was an event generated from
# the SpaceMouse or SpaceBall...
if res!=spacedevice.RetVal.IS_EVENT:
return
# Motion event?
if evttype==spacedevice.EventType.MOTION_EVENT:
t,r,period = data
print "Motion: trans:%s rot:%s period:%d"%(t, r, period)
# Button event?
elif evttype==spacedevice.EventType.BUTTON_EVENT:
pressed, released = data
print "Button: pressed:%s released:%s"%(pressed, released)
# Zero event?
elif evttype==spacedevice.EventType.ZERO_EVENT:
print "Zero"
######################################################################
# Check if cgkit was compiled with SpaceDevice support...
if not spacedevice.available():
print "No SpaceDevice functionality available"
sys.exit(1)
# Initialize pygame...
passed, failed = pygame.init()
if failed>0:
print "Error initializing pygame"
sys.exit(1)
# Open a window...
pygame.display.set_caption("SpaceDevice demo")
srf = pygame.display.set_mode((640,480))
# Enable system events...
pygame.event.set_allowed(SYSWMEVENT)
# Initialize the Space Device...
sdev = spacedevice.SpaceDevice()
info = pygame.display.get_wm_info()
hwnd = info["window"]
sdev.open("Demo", hwnd)
# Print some information about the driver and the device...
major, minor, build, versionstr, datestr = sdev.getDriverInfo()
print "Driver info:"
print "------------"
print "%s, v%d.%d.%d, %s\n"%(versionstr, major, minor, build, datestr)
devtyp, numbuttons, numdegrees, canbeep, firmware = sdev.getDeviceInfo()
print "Device info:"
print "------------"
print "Device ID:",sdev.getDeviceID()
print "Type :",devtyp
print "#Buttons :",numbuttons
print "#Degrees :",numdegrees
print "Can beep :",canbeep
print "Firmware :",firmware
print ""
# Event loop...
running = True
while running:
# Get a list of events...
events = pygame.event.get()
# Process the events...
for evt in events:
# Close button?
if evt.type==QUIT:
running=False
# Escape key?
elif evt.type==KEYDOWN and evt.key==27:
running=False
# System event?
elif evt.type==SYSWMEVENT:
handleSystemEvent(evt)
# Close the SpaceDevice
sdev.close()