self.queue = Queue()
self.startup = Queue()
self.nmotes = nmotes
+ self.selectedWiimoteIndex = 0
self.timeout = timeout
self.setDaemon(1)
self._paused = False
self.start()
self.startup.get(True) # wait for the thread to get started and acquire the motes
+ self.eventCallBack = _default_event_cb
def run(self):
'''This runs in a separate thread'''
found = wiiuse.find(self.wiimotes, self.nmotes, self.timeout)
self.actual_nmotes = wiiuse.connect(self.wiimotes, self.nmotes)
- self.previousPositions = {}
for i in range(self.nmotes):
wiiuse.set_leds(self.wiimotes[i], wiiuse.LED[i])
- self.previousPositions[self.wiimotes[i][0].unid] = (0, 0)
self.go = self.actual_nmotes != 0
if self._paused : continue
try :
if wiiuse.poll(self.wiimotes, self.nmotes) :
- for i in range(self.nmotes):
+ for i in range(self.nmotes) :
m = self.wiimotes[i]
if m[0].event == wiiuse.EVENT:
- self.event_cb(m)
+ self.eventCallBack(self, i, m)
except :
pass
- #try:
- # wiiuse.poll(self.wiimotes, self.nmotes)
- #except:
- # pass
-
- # allow executing functions in this thread
while True:
try:
func, args = self.queue.get_nowait()
except Empty:
break
- print 'do:', func.__name__, args
func(*args)
def pause(self) :
def resume(self) :
self._paused = False
+
+ def selectWiimote(self, wiimoteIndex) :
+ self.selectedWiimoteIndex = wiimoteIndex
def do(self, func, *args):
'''Run the function in the thread handling the wiimote'''
- self.queue.put((func, args))
-
- def event_cb(self, wmp):
- '''Called when the library has some data for the user.'''
- wm = wmp[0]
-# if wm.btns:
-# for name,b in wiiuse.button.items():
-# if wiiuse.is_just_pressed(wm, b):
-# pygame.event.post(pygame.event.Event(WIIMOTE_BUTTON_PRESS, button=name,
-# time=time.time(),
-# id=wm.unid))
-#
-# if wm.btns_released:
-# for name,b in wiiuse.button.items():
-# if wiiuse.is_released(wm, b):
-# pygame.event.post(pygame.event.Event(WIIMOTE_BUTTON_RELEASE, button=name,
-# time=time.time(),
-# id=wm.unid))
-#
-# if True:
-# pygame.event.post(pygame.event.Event(WIIMOTE_ACCEL,
-# orient=(wm.orient.roll, wm.orient.pitch,
-# wm.orient.yaw),
-# accel=(wm.gforce.x, wm.gforce.y, wm.gforce.z),
-# time=time.time(),
-# id=wm.unid))
- if True:
- #dots = [ (wm.ir.dot[i].visible, wm.ir.dot[i].x, wm.ir.dot[i].y) for i in range(4) ]
- #pygame.event.post(pygame.event.Event(WIIMOTE_IR,
- # dots=dots,
- # cursor=(wm.ir.x, wm.ir.y, wm.ir.z),
- # time=time.time(),
- # id=wm.unid))
-
- dots = [ (wm.ir.dot[i].visible, wm.ir.dot[i].x, wm.ir.dot[i].y) for i in range(4) ]
- cursor=(wm.ir.x, wm.ir.y, wm.ir.z)
- pos = cursor[:2]
- previousPos = self.previousPositions[wm.unid]
- rel = (pos[0] - previousPos[0], pos[1] - previousPos[1])
- self.previousPositions[wm.unid] = pos
-
- evt = pygame.event.Event(pygame.MOUSEMOTION,
- pos = pos,
- rel = rel,
- buttons = [],
- dots=dots,
- cursor=(wm.ir.x, wm.ir.y, wm.ir.z),
- time=time.time(),
- wiimoteid=wm.unid)
- pygame.event.post(evt)
-
-
-# if wm.exp.type == wiiuse.EXP_NUNCHUK:
-# nc = wm.exp.u.nunchuk
-#
-# for name,b in wiiuse.nunchuk_button.items():
-# if wiiuse.is_just_pressed(nc, b):
-# pygame.event.post(pygame.event.Event(NUNCHUK_BUTTON_PRESS, button=name,
-# time=time.time(),
-# id=wm.unid))
-# elif wiiuse.is_released(nc, b):
-# pygame.event.post(pygame.event.Event(NUNCHUK_BUTTON_RELEASE, button=name,
-# time=time.time(),
-# id=wm.unid))
-#
-# pygame.event.post(pygame.event.Event(NUNCHUK_ACCEL,
-# orient=(nc.orient.roll, nc.orient.pitch,
-# nc.orient.yaw),
-# accel=(nc.gforce.x, nc.gforce.y, nc.gforce.z),
-# time=time.time(),
-# id=wm.unid))
-# pygame.event.post(pygame.event.Event(NUNCHUK_JOY,
-# angle=nc.js.ang,
-# mag=nc.js.mag,
-# time=time.time(),
-# id=wm.unid))
+ self.queue.put((func, args))
def control_cb(self, wmp, attachment, speaker, ir, led, battery):
'''Could check the battery level and such here'''
wiiuse.disconnect(self.wiimotes[i])
self.go = False
+ def get_count(self):
+ return self.actual_nmotes
+
+
+def _default_event_cb(self, id, wmp):
+ '''Called when the library has some data for the user.'''
+ if id != self.selectedWiimoteIndex : return
+ wm = wmp[0]
+ pos = (wm.ir.x, wm.ir.y)
+ pygame.mouse.set_pos(pos)
+
+ eventType = None
+
+ if wm.btns and \
+ wiiuse.is_just_pressed(wm, wiiuse.button['B']) :
+ event = pygame.event.Event(pygame.MOUSEBUTTONDOWN,
+ pos = pos,
+ button = 1)
+ pygame.event.post(event)
+
+ if wm.btns_released and \
+ wiiuse.is_released(wm, wiiuse.button['B']):
+ event = pygame.event.Event(pygame.MOUSEBUTTONUP,
+ pos = pos,
+ button = 1)
+ pygame.event.post(event)
+
+
+
WT = None
-def init(nmotes, timeout):
+def init(nmotes, timeout, screenResolution=(660, 370), position='ABOVE'):
'''Initialize the module.'''
global WT
if WT:
return
WT = wiimote_thread(nmotes, timeout)
+
+ if position == 'ABOVE' :
+ position = wiiuse.IR_ABOVE
+ elif position == 'BELOW' :
+ position = wiiuse.IR_BELOW
+ else :
+ position = wiiuse.IR_ABOVE
+
+
+ nmotes = get_count()
+ for i in range(nmotes) :
+ wm = Wiimote(i) # access the wiimote object
+ wm.enable_accels(0) # turn off acceleration reporting
+ wm.enable_ir(1, vres = screenResolution, position=position)
+
def get_count():
'''How many Wiimotes were found?'''
- return WT.actual_nmotes
+ return WT.get_count()
def quit():
'''Gracefully shutdown the connection and turn off the wiimote leds'''
enable |= wiiuse.ORIENT_THRESH
else:
disable |= wiiuse.ORIENT_THRESH
- print enable, disable
WT.do(wiiuse.set_flags, self.wm, enable, disable)
def set_orient_thresh(self, thresh):