tuio_server.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #!/usr/bin/env python
  2. from OSC import OSCServer
  3. from logger import Logger
  4. class TuioServer2D(Logger):
  5. _tuio_address = ('localhost', 3333)
  6. def __init__(self, handler_obj, **kwargs):
  7. super(TuioServer2D, self).__init__(**kwargs)
  8. for handler in ('point_down', 'point_up', 'point_move'):
  9. if not hasattr(handler_obj, handler):
  10. raise RuntimeError('Handler "%s" is not defined.' % handler)
  11. # OSC server that listens to incoming TUIO events
  12. self.server = OSCServer(self.__class__._tuio_address)
  13. #self.server.addDefaultHandlers()
  14. self.server.addMsgHandler('/tuio/2Dobj', self._receive)
  15. self.server.addMsgHandler('/tuio/2Dcur', self._receive)
  16. self.server.addMsgHandler('/tuio/2Dblb', self._receive)
  17. # List of alive seddion id's
  18. self.alive = set()
  19. # List of session id's of points that have generated a 'point_down'
  20. # event
  21. self.down = set()
  22. self.handler_obj = handler_obj
  23. def _receive(self, addr, tags, data, source):
  24. surface = addr[8:]
  25. self.log('Received message <surface=%s tags="%s" data=%s source=%s>' \
  26. % (surface, tags, data, source), 2)
  27. msg_type = data[0]
  28. # FIXME: Ignore obj/blb events?
  29. if surface != 'cur':
  30. return
  31. if msg_type == 'alive':
  32. alive = set(data[1:])
  33. released = self.alive - alive
  34. self.alive = alive
  35. if released:
  36. self.log('Released %s.' % ', '.join(map(str, released)))
  37. self.down -= released
  38. for sid in released:
  39. self.handler_obj.point_up(sid)
  40. elif msg_type == 'set':
  41. sid, x, y = data[1:4]
  42. if sid not in self.alive:
  43. raise ValueError('Point with sid "%d" is not alive.' % sid)
  44. # Check if 'point_down' has already been triggered. If so, trigger
  45. # a 'point_move' event instead
  46. if sid in self.down:
  47. self.log('Moved %d to (%s, %s).' % (sid, x, y))
  48. self.handler_obj.point_move(sid, x, y)
  49. else:
  50. self.log('Down %d at (%s, %s).' % (sid, x, y))
  51. self.down.add(sid)
  52. self.handler_obj.point_down(sid, x, y)
  53. def start(self):
  54. self.log('Starting OSC server')
  55. self.server.serve_forever()
  56. def stop(self):
  57. self.log('Stopping OSC server')
  58. self.server.close()
  59. if __name__ == '__main__':
  60. import sys
  61. class Handler(Logger):
  62. def point_down(self, sid, x, y):
  63. self.log('Point down: sid=%d (%s, %s)' % (sid, x, y))
  64. def point_up(self, sid):
  65. self.log('Point up: sid=%d' % sid)
  66. def point_move(self, sid, x, y):
  67. self.log('Point move: sid=%d (%s, %s)' % (sid, x, y))
  68. v = 1 if len(sys.argv) < 2 else int(sys.argv[1])
  69. server = TuioServer2D(Handler(verbose=v), verbose=v)
  70. server.start()