1
2
3
4 package org.ximtec.igesture.io.tuio;
5
6 import java.awt.Color;
7 import java.awt.Dimension;
8 import java.util.HashSet;
9 import java.util.Hashtable;
10 import java.util.List;
11 import java.util.Set;
12
13 import javax.swing.BorderFactory;
14
15 import org.ximtec.igesture.Recogniser;
16 import org.ximtec.igesture.core.Gesture;
17 import org.ximtec.igesture.core.GestureSample3D;
18 import org.ximtec.igesture.io.AbstractGestureDevice;
19 import org.ximtec.igesture.io.tuio.interfaces.AbstractTuioCursor;
20 import org.ximtec.igesture.io.tuio.interfaces.AbstractTuioObject;
21 import org.ximtec.igesture.io.tuio.tuio3D.TuioCursor3D;
22 import org.ximtec.igesture.io.tuio.tuio3D.TuioObject3D;
23 import org.ximtec.igesture.util.Constant;
24 import org.ximtec.igesture.util.additions3d.AccelerationSample;
25 import org.ximtec.igesture.util.additions3d.Accelerations;
26 import org.ximtec.igesture.util.additions3d.Point3D;
27 import org.ximtec.igesture.util.additions3d.RecordedGesture3D;
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 public class TuioReader3D extends AbstractGestureDevice<RecordedGesture3D, Point3D> implements ITuioReader{
49
50
51 private Hashtable<Long,RecordedGesture3D> gestures = new Hashtable<Long,RecordedGesture3D>();
52
53
54 private Hashtable<Long,AbstractTuioObject> objectList = new Hashtable<Long,AbstractTuioObject>();
55
56 private Hashtable<Long,AbstractTuioCursor> cursorList = new Hashtable<Long,AbstractTuioCursor>();
57
58
59 private TuioConnection connection;
60
61
62 private Recogniser recogniser;
63
64 private boolean debug = false;
65
66 private GestureSample3D gesture3D;
67 private RecordedGesture3D lastRecordedGesture3DAdded;
68
69
70
71
72 public TuioReader3D()
73 {
74 this(new Integer(TuioConstants.DEFAULT_PORT));
75 }
76
77
78
79
80
81 public TuioReader3D(Integer port)
82 {
83
84
85
86 connection = new TuioConnection(port.intValue());
87
88 setDeviceID(String.valueOf(port));
89 setConnectionType(Constant.CONNECTION_TUIO);
90 setDeviceType(Constant.TYPE_3D);
91 setName("Tuio Service on Port "+port);
92
93 lastRecordedGesture3DAdded = new RecordedGesture3D();
94 gesture3D = new GestureSample3D(this,"", lastRecordedGesture3DAdded);
95 }
96
97
98
99
100
101 public void setRecogniser(Recogniser recogniser)
102 {
103 this.recogniser = recogniser;
104 }
105
106 private void debug(String message)
107 {
108 if(debug)
109 System.out.println("[TUIO]: "+message);
110 }
111
112
113
114
115 @Override
116 public void connect() {
117 connection.connect();
118 setIsConnected(connection.isConnected());
119
120 Set<String> list = new HashSet<String>();
121 list.add(TuioConstants.TUIO_CURSOR_3D);
122 list.add(TuioConstants.TUIO_OBJECT_3D);
123 addTuioMessages(list);
124 }
125
126
127
128
129 @Override
130 public void disconnect() {
131 connection.disconnect();
132 setIsConnected(connection.isConnected());
133 }
134
135
136
137
138 @Override
139 public void clear() {
140 lastRecordedGesture3DAdded = new RecordedGesture3D();
141 gesture3D = new GestureSample3D(this,"",lastRecordedGesture3DAdded);
142 fireGestureEvent(gesture3D);
143 }
144
145
146
147
148 @Override
149 public void dispose() {
150 removeAllListener();
151 lastRecordedGesture3DAdded = new RecordedGesture3D();
152 gesture3D = new GestureSample3D(this,"",lastRecordedGesture3DAdded);
153 }
154
155
156
157
158 @Override
159 public List<Point3D> getChunks() {
160 return null;
161 }
162
163
164
165
166 @Override
167 public Gesture<RecordedGesture3D> getGesture() {
168 return new GestureSample3D(this,gesture3D.getName(),lastRecordedGesture3DAdded);
169 }
170
171
172
173
174 @Override
175 public void init() {
176 }
177
178
179
180
181
182 private void addTuioMessages(Set<String> modifiers) {
183 connection.addTuioListener(this, modifiers);
184 }
185
186
187
188
189
190 private void removeTuioMessages(Set<String> modifiers) {
191 connection.removeTuioListener(this, modifiers);
192 }
193
194
195
196
197
198
199
200
201
202
203
204 private AccelerationSample createAccelerationSample(double xs, double ys, double zs, double ms, double macc, long time)
205 {
206 double dt = ms/macc;
207 AccelerationSample sample = new AccelerationSample(xs/dt,ys/dt,zs/dt,time);
208 return sample;
209 }
210
211
212
213
214 @Override
215 public void addTuioCursor(AbstractTuioCursor atcur) {
216 TuioCursor3D tcur = (TuioCursor3D)atcur;
217 if (!cursorList.containsKey(tcur.getSessionID()))
218 {
219 cursorList.put(tcur.getSessionID(), tcur);
220
221
222
223 long time = tcur.getTuioTime().add(tcur.getStartTime()).getTotalMilliseconds();
224
225
226
227
228 RecordedGesture3D gesture = new RecordedGesture3D();
229 Point3D point = new Point3D(tcur.getX(),tcur.getY(),tcur.getZ(),time);
230 gesture.add(point);
231
232
233 Accelerations accelerations = new Accelerations();
234 AccelerationSample sample = createAccelerationSample(tcur.getXSpeed(),tcur.getYSpeed(),tcur.getZSpeed(),tcur.getMotionSpeed(),tcur.getMotionSpeed(),time);
235
236 accelerations.addSample(sample);
237
238 gesture.setAccelerations(accelerations);
239
240 gestures.put(tcur.getSessionID(), gesture);
241 }
242 debug("add cur "+tcur.getCursorID()+" ("+tcur.getSessionID()+") "+tcur.getX()+" "+tcur.getY()+" "+tcur.getZ());
243 }
244
245
246
247
248 @Override
249 public void addTuioObject(AbstractTuioObject atobj) {
250 TuioObject3D tobj = (TuioObject3D)atobj;
251 if(!objectList.containsKey(tobj.getSessionID()))
252 {
253 objectList.put(tobj.getSessionID(),tobj);
254
255
256
257 long time = tobj.getTuioTime().add(tobj.getStartTime()).getTotalMilliseconds();
258
259
260 RecordedGesture3D gesture = new RecordedGesture3D();
261 Point3D point = new Point3D(tobj.getX(),tobj.getY(),tobj.getZ(),time);
262 gesture.add(point);
263
264 Accelerations accelerations = new Accelerations();
265 AccelerationSample sample = createAccelerationSample(tobj.getXSpeed(),tobj.getYSpeed(),tobj.getZSpeed(),tobj.getMotionSpeed(),tobj.getMotionAccel(),time);
266
267 accelerations.addSample(sample);
268
269 gesture.setAccelerations(accelerations);
270
271 gestures.put(tobj.getSessionID(), gesture);
272
273 }
274 debug("add obj "+tobj.getSymbolID()+" ("+tobj.getSessionID()+") "+tobj.getX()+" "+tobj.getY()+" "+tobj.getZ());
275 }
276
277
278
279
280 @Override
281 public void refresh(TuioTime ftime) {
282 }
283
284
285
286
287 @Override
288 public void removeTuioCursor(AbstractTuioCursor atcur) {
289 TuioCursor3D tcur = (TuioCursor3D)atcur;
290 cursorList.remove(tcur.getSessionID());
291
292 lastRecordedGesture3DAdded = gestures.get(tcur.getSessionID());
293 fireGestureEvent(gesture3D);
294 if(recogniser != null)
295 {
296
297 recogniser.recognise(new GestureSample3D(this,org.sigtec.util.Constant.EMPTY_STRING, lastRecordedGesture3DAdded),false);
298
299
300 }
301
302
303 gestures.remove(tcur.getSessionID());
304
305 debug("del cur "+tcur.getCursorID()+" ("+tcur.getSessionID()+")");
306 }
307
308
309
310
311 @Override
312 public void removeTuioObject(AbstractTuioObject atobj) {
313 TuioObject3D tobj = (TuioObject3D)atobj;
314 objectList.remove(tobj.getSessionID());
315
316 RecordedGesture3D record = gestures.get(tobj.getSessionID());
317
318
319 if(record.size() > 1)
320 {
321 lastRecordedGesture3DAdded = record;
322 fireGestureEvent(getGesture());
323 if(recogniser != null)
324 {
325
326 recogniser.recognise(new GestureSample3D(this,org.sigtec.util.Constant.EMPTY_STRING, gestures.get(tobj.getSessionID())),false);
327
328
329 }
330 }
331
332 gestures.remove(tobj.getSessionID());
333
334 debug("del obj "+tobj.getSymbolID()+" ("+tobj.getSessionID()+")");
335 }
336
337
338
339
340 @Override
341 public void updateTuioCursor(AbstractTuioCursor atcur) {
342 TuioCursor3D tcur = (TuioCursor3D)atcur;
343 if(gestures.containsKey(tcur.getSessionID()))
344 {
345
346
347 long time = tcur.getTuioTime().add(tcur.getStartTime()).getTotalMilliseconds();
348
349
350 Point3D p = new Point3D(tcur.getX(),tcur.getY(),tcur.getZ(),time);
351 RecordedGesture3D gesture = gestures.get(tcur.getSessionID());
352 gesture.add(p);
353
354 AccelerationSample sample = createAccelerationSample(tcur.getXSpeed(),tcur.getYSpeed(),tcur.getZSpeed(),tcur.getMotionSpeed(),tcur.getMotionAccel(),time);
355
356 Accelerations accelerations = gesture.getAccelerations();
357 accelerations.addSample(sample);
358
359
360 TuioCursor3D demo = (TuioCursor3D)cursorList.get(tcur.getSessionID());
361 demo.update(tcur);
362 }
363 debug("set cur "+tcur.getCursorID()+" ("+tcur.getSessionID()+") "+tcur.getX()+" "+tcur.getY()+" "+tcur.getMotionSpeed()+" "+tcur.getMotionAccel());
364 }
365
366
367
368
369 @Override
370 public void updateTuioObject(AbstractTuioObject atobj) {
371 TuioObject3D tobj = (TuioObject3D)atobj;
372 if(gestures.containsKey(tobj.getSessionID()))
373 {
374
375
376 long time = tobj.getTuioTime().add(tobj.getStartTime()).getTotalMilliseconds();
377
378
379 Point3D p = new Point3D(tobj.getX(),tobj.getY(),tobj.getZ(),time);
380 RecordedGesture3D gesture = gestures.get(tobj.getSessionID());
381 gesture.add(p);
382
383 AccelerationSample sample = createAccelerationSample(tobj.getXSpeed(),tobj.getYSpeed(),tobj.getZSpeed(),tobj.getMotionSpeed(),tobj.getMotionAccel(),time);
384
385 Accelerations accelerations = gesture.getAccelerations();
386 accelerations.addSample(sample);
387
388
389 TuioObject3D demo = (TuioObject3D)objectList.get(tobj.getSessionID());
390 demo.update(tobj);
391 }
392 debug("set obj "+tobj.getSymbolID()+" ("+tobj.getSessionID()+") "+tobj.getX()+" "+tobj.getY()+" "+tobj.getZ());
393 }
394
395 @Override
396 public TuioReaderPanel getPanel()
397 {
398 return getPanel(new Dimension(200,200));
399 }
400
401 @Override
402 public TuioReaderPanel getPanel(Dimension dimension)
403 {
404 TuioReaderPanel panel = new TuioReaderPanel(this,TuioReaderPanel.TYPE_3D);
405 panel.setSize(dimension);
406 panel.setPreferredSize(dimension);
407 panel.setOpaque(true);
408 panel.setBackground(Color.WHITE);
409 panel.setBorder(BorderFactory.createLineBorder(Color.BLUE));
410 return panel;
411 }
412
413 }