front_processing/extern/TUIO_JAVA/src/TUIO/TuioClient.java
changeset 3 92f19af39024
parent 0 6fefd4afe506
child 9 0f44b7360c8d
--- a/front_processing/extern/TUIO_JAVA/src/TUIO/TuioClient.java	Fri Mar 09 18:15:12 2012 +0100
+++ b/front_processing/extern/TUIO_JAVA/src/TUIO/TuioClient.java	Thu Mar 15 13:33:21 2012 +0100
@@ -38,6 +38,8 @@
  */ 
 public class TuioClient implements OSCListener {
 	
+	public String comm;
+	
 	private int port = 3333;
 	private OSCPortIn oscPort;
 	private boolean connected = false;
@@ -47,13 +49,20 @@
 	private Hashtable<Long,TuioCursor> cursorList = new Hashtable<Long,TuioCursor>();
 	private Vector<Long> aliveCursorList = new Vector<Long>();
 	private Vector<Long> newCursorList = new Vector<Long>();
+	private Hashtable<Long,TuioString> stringList = new Hashtable<Long,TuioString>();
+	private Vector<Long> aliveStringList = new Vector<Long>();
+	private Vector<Long> newStringList = new Vector<Long>();
 
 	private Vector<TuioObject> frameObjects = new Vector<TuioObject>();
 	private Vector<TuioCursor> frameCursors = new Vector<TuioCursor>();
+	private Vector<TuioString> frameStrings = new Vector<TuioString>();
 
 	private Vector<TuioCursor> freeCursorList = new Vector<TuioCursor>();
 	private int maxCursorID = -1;
 	
+	private Vector<TuioString> freeStringList = new Vector<TuioString>();
+	private int maxStringID = -1;
+	
 	private long currentFrame = 0;
 	private TuioTime currentTime;
 
@@ -86,7 +95,8 @@
 		try {
 			oscPort = new OSCPortIn(port);
 			oscPort.addListener("/tuio/2Dobj",this);
-			oscPort.addListener("/tuio/2Dcur",this);
+			oscPort.addListener("/tuio/3Dcur",this);
+			oscPort.addListener("/tuio/_siP",this);
 			oscPort.startListening();
 			connected = true;
 		} catch (Exception e) {
@@ -153,7 +163,16 @@
 	 */
 	public Vector<TuioCursor> getTuioCursors() {
 		return new Vector<TuioCursor>(cursorList.values());
-	}	
+	}
+	
+	/**
+	 * Returns a Vector of all currently active TuioStrings
+	 *
+	 * @return  a Vector of all currently active TuioStrings
+	 */
+	public Vector<TuioString> getTuioStrings() {
+		return new Vector<TuioString>(stringList.values());
+	}
 
 	/**
 	 * Returns the TuioObject corresponding to the provided Session ID
@@ -173,6 +192,16 @@
 	 */
 	public TuioCursor getTuioCursor(long s_id) {
 		return cursorList.get(s_id);
+	}
+
+	/**
+	 * Returns the TuioString corresponding to the provided Session ID
+	 * or NULL if the Session ID does not refer to an active TuioString
+	 *
+	 * @return  an active TuioString corresponding to the provided Session ID or NULL
+	 */
+	public TuioString getTuioString(long s_id) {
+		return stringList.get(s_id);
 	}	
 
 	/**
@@ -305,30 +334,31 @@
 				}
 				frameObjects.clear();
 			}
-		} else if (address.equals("/tuio/2Dcur")) {
+		} else if (address.equals("/tuio/3Dcur")) {
 
 			if (command.equals("set")) {
 
 				long s_id  = ((Integer)args[1]).longValue();
 				float xpos = ((Float)args[2]).floatValue();
 				float ypos = ((Float)args[3]).floatValue();
-				float xspeed = ((Float)args[4]).floatValue();
-				float yspeed = ((Float)args[5]).floatValue();
-				float maccel = ((Float)args[6]).floatValue();
+				float zpos = ((Float)args[4]).floatValue();
+				float xspeed = ((Float)args[5]).floatValue();
+				float yspeed = ((Float)args[6]).floatValue();
+				float maccel = ((Float)args[7]).floatValue();
 				
 				if (cursorList.get(s_id) == null) {
 									
-					TuioCursor addCursor = new TuioCursor(s_id, -1 ,xpos,ypos);
+					TuioCursor addCursor = new TuioCursor(s_id, -1 ,xpos,ypos,zpos);
 					frameCursors.addElement(addCursor);
 					
 				} else {
 				
 					TuioCursor tcur = cursorList.get(s_id);
 					if (tcur==null) return;
-					if ((tcur.xpos!=xpos) || (tcur.ypos!=ypos) || (tcur.x_speed!=xspeed) || (tcur.y_speed!=yspeed) || (tcur.motion_accel!=maccel)) {
+					if ((tcur.xpos!=xpos) || (tcur.ypos!=ypos) || (tcur.zpos!=zpos) || (tcur.x_speed!=xspeed) || (tcur.y_speed!=yspeed) || (tcur.motion_accel!=maccel)) {
 
-						TuioCursor updateCursor = new TuioCursor(s_id,tcur.getCursorID(),xpos,ypos);
-						updateCursor.update(xpos,ypos,xspeed,yspeed,maccel);
+						TuioCursor updateCursor = new TuioCursor(s_id,tcur.getCursorID(),xpos,ypos,zpos);
+						updateCursor.update(xpos,ypos,zpos,xspeed,yspeed,maccel);
 						frameCursors.addElement(updateCursor);
 					}
 				}
@@ -420,7 +450,7 @@
 									freeCursorList.removeElement(closestCursor);
 								} else maxCursorID = c_id;		
 								
-								TuioCursor addCursor = new TuioCursor(currentTime,tcur.getSessionID(),c_id,tcur.getX(),tcur.getY());
+								TuioCursor addCursor = new TuioCursor(currentTime,tcur.getSessionID(),c_id,tcur.getX(),tcur.getY(),tcur.getZ());
 								cursorList.put(addCursor.getSessionID(),addCursor);
 								
 								for (int i=0;i<listenerList.size();i++) {
@@ -432,10 +462,10 @@
 							default:
 								
 								TuioCursor updateCursor = cursorList.get(tcur.getSessionID());
-								if ( (tcur.getX()!=updateCursor.getX() && tcur.getXSpeed()==0) || (tcur.getY()!=updateCursor.getY() && tcur.getYSpeed()==0) )
-									updateCursor.update(currentTime,tcur.getX(),tcur.getY());
+								if ( (tcur.getX()!=updateCursor.getX() && tcur.getXSpeed()==0) || (tcur.getY()!=updateCursor.getY() && tcur.getYSpeed()==0) || (tcur.getZ()!=updateCursor.getZ()) )
+									updateCursor.update(currentTime,tcur.getX(),tcur.getY(),tcur.getZ());
 								else 
-									updateCursor.update(currentTime,tcur.getX(),tcur.getY(),tcur.getXSpeed(),tcur.getYSpeed(),tcur.getMotionAccel());
+									updateCursor.update(currentTime,tcur.getX(),tcur.getY(),tcur.getZ(),tcur.getXSpeed(),tcur.getYSpeed(),tcur.getMotionAccel());
 									
 								for (int i=0;i<listenerList.size();i++) {
 									TuioListener listener = (TuioListener)listenerList.elementAt(i);
@@ -457,7 +487,157 @@
 				
 				frameCursors.clear();
 			} 
+		} else if (address.equals("/tuio/_siP")) {
 
+			if (command.equals("set")) {
+
+				long s_id  = ((Integer)args[1]).longValue();
+				String msg = args[2].toString();
+				
+				if (stringList.get(s_id) == null) {
+									
+					TuioString addString = new TuioString(s_id, -1, msg);
+					frameStrings.addElement(addString);
+					
+				} else {
+				
+					TuioString tstr = stringList.get(s_id);
+					if (tstr==null) return;
+					if (!tstr.getMessage().equals(msg)) {
+
+						TuioString updateString = new TuioString(s_id,tstr.getStringID(),msg);
+						updateString.update(msg);
+						frameStrings.addElement(updateString);
+					}
+				}
+				
+				//System.out.println("set cur " + s_id+" "+xpos+" "+ypos+" "+xspeed+" "+yspeed+" "+maccel);
+				
+			} else if (command.equals("alive")) {
+	
+				newStringList.clear();
+				for (int i=1;i<args.length;i++) {
+					// get the message content
+					long s_id = ((Integer)args[i]).longValue();
+					newStringList.addElement(s_id);
+					// reduce the cursor list to the lost cursors
+					if (aliveStringList.contains(s_id)) 
+						aliveStringList.removeElement(s_id);
+				}
+				
+				// remove the remaining cursors
+				for (int i=0;i<aliveStringList.size();i++) {
+					TuioString removeString = stringList.get(aliveStringList.elementAt(i));
+					if (removeString==null) continue;
+					removeString.remove(currentTime);
+					frameStrings.addElement(removeString);
+				}
+								
+			} else if (command.equals("fseq")) {
+				long fseq = ((Integer)args[1]).longValue();
+				boolean lateFrame = false;
+				
+				if (fseq>0) {
+					if (fseq>currentFrame) currentTime = TuioTime.getSessionTime();
+					if ((fseq>=currentFrame) || ((currentFrame-fseq)>100)) currentFrame = fseq;
+					else lateFrame = true;
+				} else if (TuioTime.getSessionTime().subtract(currentTime).getTotalMilliseconds()>100) {
+					currentTime = TuioTime.getSessionTime();
+				}
+				if (!lateFrame) {
+
+					Enumeration<TuioString> frameEnum = frameStrings.elements();
+					while(frameEnum.hasMoreElements()) {
+						TuioString tstr = frameEnum.nextElement();
+						
+						switch (tstr.getTuioState()) {
+							case TuioString.TUIO_REMOVED:
+							
+								TuioString removeString = tstr;
+								removeString.remove(currentTime);
+								
+								for (int i=0;i<listenerList.size();i++) {
+									TuioListener listener = (TuioListener)listenerList.elementAt(i);
+									if (listener!=null) listener.removeTuioString(removeString);
+								}
+
+								stringList.remove(removeString.getSessionID());
+
+								if (removeString.getStringID()==maxStringID) {
+									maxStringID = -1;
+									if (stringList.size()>0) {
+										Enumeration<TuioString> slist = stringList.elements();
+										while (slist.hasMoreElements()) {
+											int sl_id = slist.nextElement().getStringID();
+											if (sl_id>maxStringID) maxStringID=sl_id;
+										}
+										
+										Enumeration<TuioString> flist = freeStringList.elements();
+										while (flist.hasMoreElements()) {
+											int sl_id = flist.nextElement().getStringID();
+											if (sl_id>=maxStringID) freeStringList.removeElement(sl_id);
+										}
+									} else freeStringList.clear();
+								} else if (removeString.getStringID()<maxStringID) {
+									freeStringList.addElement(removeString);
+								}
+								
+								break;
+
+							case TuioString.TUIO_ADDED:
+
+								int sl_id = stringList.size();
+								if ((stringList.size()<=maxStringID) && (freeStringList.size()>0)) {
+									TuioString closestString = freeStringList.firstElement();
+									Enumeration<TuioString> testList = freeStringList.elements();
+									while (testList.hasMoreElements()) {
+										TuioString testString = testList.nextElement();
+										//if (testString.getDistance(tstr)<closestString.getDistance(tstr))
+										closestString = testString;
+									}
+									sl_id = closestString.getStringID();
+									freeStringList.removeElement(closestString);
+								} else maxStringID = sl_id;		
+								
+								TuioString addString = new TuioString(currentTime,tstr.getSessionID(),sl_id,tstr.getMessage());
+								stringList.put(addString.getSessionID(),addString);
+								
+								for (int i=0;i<listenerList.size();i++) {
+									TuioListener listener = (TuioListener)listenerList.elementAt(i);
+									if (listener!=null) listener.addTuioString(addString);
+								}
+								break;
+								
+							default:
+								
+								TuioString updateString = stringList.get(tstr.getSessionID());
+								if ( tstr.getMessage()!=updateString.getMessage() )
+									updateString.update(currentTime,tstr.getMessage());
+								else 
+									updateString.update(currentTime,tstr.getMessage());
+									
+								for (int i=0;i<listenerList.size();i++) {
+									TuioListener listener = (TuioListener)listenerList.elementAt(i);
+									if (listener!=null) listener.updateTuioString(updateString);
+								}
+						}
+					}
+					
+					for (int i=0;i<listenerList.size();i++) {
+						TuioListener listener = (TuioListener)listenerList.elementAt(i);
+						if (listener!=null) listener.refresh(new TuioTime(currentTime));
+					}
+					
+					Vector<Long> buffer = aliveStringList;
+					aliveStringList = newStringList;
+					// recycling the vector
+					newStringList = buffer;				
+				}
+				
+				frameStrings.clear();
+			} 
 		}
+		
+		
 	}
 }