/**
* Squidy Interaction Library is free software: you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* Squidy Interaction Library is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Squidy Interaction Library. If not, see
* <http://www.gnu.org/licenses/>.
*
* 2009 Human-Computer Interaction Group, University of Konstanz.
* <http://hci.uni-konstanz.de>
*
* Please contact info@squidy-lib.de or visit our website
* <http://www.squidy-lib.de> for further information.
*/
package org.squidy.nodes;
import java.util.Timer;
import java.util.Vector;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlType;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.squidy.manager.ProcessException;
import org.squidy.manager.controls.CheckBox;
import org.squidy.manager.controls.TextField;
import org.squidy.manager.data.DataConstant;
import org.squidy.manager.data.Processor;
import org.squidy.manager.data.Property;
import org.squidy.manager.data.Processor.Status;
import org.squidy.manager.data.impl.DataDigital;
import org.squidy.manager.data.impl.DataPosition2D;
import org.squidy.manager.model.AbstractNode;
import org.squidy.nodes.reactivision.TuioClient;
import org.squidy.nodes.reactivision.TuioCursor;
import org.squidy.nodes.reactivision.TuioListener;
import org.squidy.nodes.reactivision.TuioObject;
/**
* <code>ReacTIVision2</code>.
*
* <pre>
* Date: Okt 30, 2009
* Time: 15:08:41 PM
* </pre>
*
* @author Nicolas Hirrle, <a
* href="mailto:nihirrle@htwg-konstanz.de">nihirrle@htwg-konstanz.de</a>
* Human-Computer Interaction Group University of Konstanz
*
* @version $Id: ReacTIVision2.java 772 2011-09-16 15:39:44Z raedle $
* @since 1.1.0
* @deprecated Use {@link ReacTIVision} instead
*/
@Deprecated
@XmlType(name = "reacTIVision2")
@Processor(
name = "reacTIVision2",
icon = "/org/squidy/nodes/image/48x48/reactivision.png",
description = "/org/squidy/nodes/html/ReacTIVision.html",
types = { Processor.Type.INPUT },
tags = { "reactivision", "fiducial", "id", "token" },
status = Status.UNSTABLE
)
public class ReacTIVision2 extends AbstractNode {
// Logger to log info, error, debug,... messages.
private static final Log LOG = LogFactory.getLog(ReacTIVision2.class);
public static final DataConstant FIDUCIAL_ID = DataConstant.get(
Integer.class, "FIDUCIAL_ID");
public static final DataConstant TUIO_TOKEN = DataConstant.get(
String.class, "TUIO_TOKEN");
public static final DataConstant TUIO_CURSOR = DataConstant.get(
String.class, "TUIO_CURSOR");
public static final DataConstant TUIO_ALIVE = DataConstant.get(
Vector.class, "TUIO_ALIVE");
// ################################################################################
// BEGIN OF ADJUSTABLES
// ################################################################################
@XmlAttribute(name = "port")
@Property(name = "Port", description = "The port on which the reacTIVision node receives TUIO messages.")
@TextField
private int port = 4444;
/**
* @return the port
*/
public final int getPort() {
return port;
}
/**
* @param port
* the port to set
*/
public final void setPort(int port) {
this.port = port;
if (tuioClient != null) {
stop();
start();
}
}
@XmlAttribute(name = "counter-clockwise-angle")
@Property(name = "Counter clockwise angle", description = "Returns the object angle in a counter clockwise manner."
)
@CheckBox
private boolean counterClockwiseAngle = false;
public boolean isCounterClockwiseAngle() {
return counterClockwiseAngle;
}
public void setCounterClockwiseAngle(boolean counterClockwiseAngle) {
this.counterClockwiseAngle = counterClockwiseAngle;
}
// ################################################################################
// END OF ADJUSTABLES
// ################################################################################
private TuioClient tuioClient;
private long lastTime;
/*
* (non-Javadoc)
*
* @see org.squidy.manager.ReflectionProcessable#onStart()
*/
@Override
public void onStart() throws ProcessException {
tuioClient = new TuioClient(port);
tuioClient.addTuioListener(new TuioListener() {
/*
* (non-Javadoc)
*
* @see
* org.squidy.manager.input.impl.reactivision.TuioListener
* #addTuioCursor
* (org.squidy.manager.input.impl.reactivision.TuioCursor)
*/
public void addTuioCursor(TuioCursor tuioCursor) {
// DataPosition2D dataPosition2D = new
// DataPosition2D(TUIO.class, tuioCursor.getX(),
// tuioCursor.getY());
// dataPosition2D.setAttribute(TUIO.TUIO_ORIGIN_ADDRESS,
// "/tuio/2Dcur");
// dataPosition2D.setAttribute(DataConstant.FRAME_SEQUENCE_ID,
// -1);
// dataPosition2D.setAttribute(DataConstant.SESSION_ID, ((Long)
// tuioCursor.getSessionID()).intValue());
// dataPosition2D.setAttribute(TUIO.TUIO_MOVEMENT_VECTOR_X,
// tuioCursor.getSpeedX());
// dataPosition2D.setAttribute(TUIO.TUIO_MOVEMENT_VECTOR_Y,
// tuioCursor.getSpeedY());
// dataPosition2D.setAttribute(TUIO.TUIO_MOTION_ACCELERATION,
// tuioCursor.getMotionAccel());
// dataPosition2D.setAttribute(TUIO_CURSOR, "down");
// publish(dataPosition2D);
}
/*
* (non-Javadoc)
*
* @see
* org.squidy.manager.input.impl.reactivision.TuioListener
* #addTuioObject
* (org.squidy.manager.input.impl.reactivision.TuioObject)
*/
public void addTuioObject(TuioObject tuioObject) {
publishTokenCapacity();
// if (LOG.isDebugEnabled()) {
// LOG.debug("Added TUIO object with id: " +
// tuioObject.getFiducialID());
// }
//
// DataDigital dd = new DataDigital(TUIO.class, true);
// dd.setAttribute(TUIO_TOKEN, "down");
// publish(dd);
//
// DataPosition2D dataPosition2D = new
// DataPosition2D(TUIO.class, tuioObject.getX(),
// tuioObject.getY());
// dataPosition2D.setAttribute(TUIO.TUIO_ORIGIN_ADDRESS,"/tuio/2Dobj");
// dataPosition2D.setAttribute(DataConstant.FRAME_SEQUENCE_ID,
// -1);
// dataPosition2D.setAttribute(DataConstant.SESSION_ID, ((Long)
// tuioObject.getSessionID()).intValue());
// dataPosition2D.setAttribute(FIDUCIAL_ID,
// tuioObject.getFiducialID());
// dataPosition2D.setAttribute(TUIO.TUIO_MOVEMENT_VECTOR_X,
// tuioObject.getSpeedX());
// dataPosition2D.setAttribute(TUIO.TUIO_MOVEMENT_VECTOR_Y,
// tuioObject.getSpeedY());
// dataPosition2D.setAttribute(TUIO.TUIO_ROTATION_VECTOR_A,
// tuioObject.getRotationSpeed());
// dataPosition2D.setAttribute(TUIO.TUIO_ANGLE_A,
// tuioObject.getAngle());
// dataPosition2D.setAttribute(TUIO.TUIO_ROTATION_ACCELERATION,
// tuioObject.getRotationAccel());
// dataPosition2D.setAttribute(TUIO.TUIO_MOTION_ACCELERATION,
// tuioObject.getMotionAccel());
// dataPosition2D.setAttribute(TUIO_TOKEN, "down");
// publish(dataPosition2D);
}
private long minTime = Long.MAX_VALUE;
private long time = 0;
/*
* (non-Javadoc)
*
* @see
* org.squidy.manager.input.impl.reactivision.TuioListener
* #refresh(long)
*/
public void refresh(long timestamp) {
if (time == 0) {
time = timestamp;
} else {
if (minTime > (timestamp - time)) {
minTime = timestamp - time;
}
System.out.println(minTime);
time = timestamp;
}
// if (LOG.isDebugEnabled()) {
// LOG.debug("Refresh");
// }
// List<IData> dataToPublish = new ArrayList<IData>();
Vector<Integer> aliveObjects = new Vector<Integer>();
Vector<TuioObject> tuioObjects = tuioClient.getTuioObjects();
for (TuioObject tuioObjectTmp : tuioObjects) {
aliveObjects.add(((Long) tuioObjectTmp.getSessionID())
.intValue());
}
if (System.currentTimeMillis() - lastTime >= 10) {
DataPosition2D dataPosition2D = new DataPosition2D();
dataPosition2D.setAttribute(TUIO_ALIVE, aliveObjects);
dataPosition2D.setAttribute(TUIO.ORIGIN_ADDRESS,
"/tuio/2Dobj");
dataPosition2D.setAttribute(TUIO_CURSOR, "refreshed");
publish(dataPosition2D);
}
// Vector<TuioObject> objects = tuioClient.getTuioObjects();
// if (System.currentTimeMillis() - lastTime >= 10)
// {
// for (int i=0; i<objects.size(); i++)
// {
// TuioObject tuioObject = objects.get(i);
// //System.out.println(System.currentTimeMillis());
// //System.out.println(tuioObject.);
// //int id = ((Long) tuioObject.getSessionID()).intValue();
// //if (lastUpdateTime.containsKey(id) ||
// lastUpdateTime.isEmpty())
// //{
// //long lastUpdated = -1;
// //if (!lastUpdateTime.isEmpty())
// // lastUpdated = lastUpdateTime.get(((Long)
// tuioObject.getSessionID()).intValue());
//
//
// DataPosition2D dataPosition2D = new
// DataPosition2D(TUIO.class, tuioObject.getX(),
// tuioObject.getY());
// dataPosition2D.setAttribute(TUIO.TUIO_ORIGIN_ADDRESS,"/tuio/2Dobj");
// dataPosition2D.setAttribute(DataConstant.FRAME_SEQUENCE_ID,
// -1);
// dataPosition2D.setAttribute(DataConstant.SESSION_ID, ((Long)
// tuioObject.getSessionID()).intValue());
// dataPosition2D.setAttribute(FIDUCIAL_ID,
// tuioObject.getFiducialID());
// dataPosition2D.setAttribute(TUIO.TUIO_MOVEMENT_VECTOR_X,
// tuioObject.getSpeedX());
// dataPosition2D.setAttribute(TUIO.TUIO_MOVEMENT_VECTOR_Y,
// tuioObject.getSpeedY());
// dataPosition2D.setAttribute(TUIO.TUIO_ROTATION_VECTOR_A,
// tuioObject.getRotationSpeed());
// dataPosition2D.setAttribute(TUIO.TUIO_ANGLE_A,
// counterClockwiseAngle ? ((float)((2 * Math.PI) -
// tuioObject.getAngle())) : tuioObject.getAngle());
// dataPosition2D.setAttribute(TUIO.TUIO_ROTATION_ACCELERATION,
// tuioObject.getRotationAccel());
// dataPosition2D.setAttribute(TUIO.TUIO_MOTION_ACCELERATION,
// tuioObject.getMotionAccel());
// dataPosition2D.setAttribute(TUIO_TOKEN, "refreshed");
// dataToPublish.add(dataPosition2D);
// }
// publish(dataToPublish);
// }
// dataToPublish.clear();
}
/*
* (non-Javadoc)
*
* @see
* org.squidy.manager.input.impl.reactivision.TuioListener
* #removeTuioCursor
* (org.squidy.manager.input.impl.reactivision.TuioCursor)
*/
public void removeTuioCursor(TuioCursor tuioCursor) {
// DataPosition2D dataPosition2D = new
// DataPosition2D(TUIO.class, tuioCursor.getX(),
// tuioCursor.getY());
// dataPosition2D.setAttribute(TUIO.TUIO_ORIGIN_ADDRESS,
// "/tuio/2Dcur");
// dataPosition2D.setAttribute(DataConstant.FRAME_SEQUENCE_ID,
// -1);
// dataPosition2D.setAttribute(DataConstant.SESSION_ID, ((Long)
// tuioCursor.getSessionID()).intValue());
// dataPosition2D.setAttribute(TUIO.TUIO_MOVEMENT_VECTOR_X,
// tuioCursor.getSpeedX());
// dataPosition2D.setAttribute(TUIO.TUIO_MOVEMENT_VECTOR_Y,
// tuioCursor.getSpeedY());
// dataPosition2D.setAttribute(TUIO.TUIO_MOTION_ACCELERATION,
// tuioCursor.getMotionAccel());
// dataPosition2D.setAttribute(TUIO_CURSOR, "lifted");
// publish(dataPosition2D);
}
private Timer removeTimer = new Timer();
private void publishTokenCapacity() {
DataDigital DDtimeout = new DataDigital();
DDtimeout.setAttribute(DataConstant.TIMEOUT, true);
DDtimeout.setAttribute(ReacTIVision2.TUIO_TOKEN, String
.valueOf(tuioClient.getTuioObjects().capacity()));
DDtimeout.setAttribute(DataConstant.IDENTIFIER, String
.valueOf(Thread.currentThread().getId()));
DDtimeout.setFlag(true);
publish(DDtimeout);
}
/*
* (non-Javadoc)
*
* @see
* org.squidy.manager.input.impl.reactivision.TuioListener
* #removeTuioObject
* (org.squidy.manager.input.impl.reactivision.TuioObject)
*/
public void removeTuioObject(TuioObject tuioObject) {
publishTokenCapacity();
// if(tuioClient.getTuioObjects().capacity() == 0){
// removeTimer.schedule(new TimerTask() {
// @Override
// public void run() {
// DataDigital DDtimeout = new DataDigital();
//
// DDtimeout.setAttribute(DataConstant.TIMEOUT, true);
// DDtimeout.setAttribute(ReacTIVision.TUIO_TOKEN,
// String.valueOf(tuioClient.getTuioObjects().capacity()));
// DDtimeout.setAttribute(DataConstant.IDENTIFIER,
// String.valueOf(Thread.currentThread().getId()));
// DDtimeout.setFlag(true);
//
// publish(DDtimeout);
// }
// }, timeout);
// }
// System.out.println("removed token:" +
// tuioObject.getFiducialID());
// System.out.println("token number:" +
// tuioClient.getTuioObjects().capacity());
//
// //last remove will not update, since no refresh occures
// if(tuioClient.getTuioObjects().capacity() == 0){
// DataPosition2D dataPosition2D = new
// DataPosition2D(TUIO.class, tuioObject.getX(),
// tuioObject.getY());
// dataPosition2D.setAttribute(TUIO.TUIO_ORIGIN_ADDRESS,"/tuio/2Dobj");
// dataPosition2D.setAttribute(DataConstant.FRAME_SEQUENCE_ID,
// -1);
// dataPosition2D.setAttribute(DataConstant.SESSION_ID, ((Long)
// tuioObject.getSessionID()).intValue());
// dataPosition2D.setAttribute(FIDUCIAL_ID,
// tuioObject.getFiducialID());
// dataPosition2D.setAttribute(TUIO.TUIO_MOVEMENT_VECTOR_X,
// tuioObject.getSpeedX());
// dataPosition2D.setAttribute(TUIO.TUIO_MOVEMENT_VECTOR_Y,
// tuioObject.getSpeedY());
// dataPosition2D.setAttribute(TUIO.TUIO_ROTATION_VECTOR_A,
// tuioObject.getRotationSpeed());
// dataPosition2D.setAttribute(TUIO.TUIO_ANGLE_A,
// tuioObject.getAngle());
// dataPosition2D.setAttribute(TUIO.TUIO_ROTATION_ACCELERATION,
// tuioObject.getRotationAccel());
// dataPosition2D.setAttribute(TUIO.TUIO_MOTION_ACCELERATION,
// tuioObject.getMotionAccel());
// dataPosition2D.setAttribute(TUIO_TOKEN, "lifted");
// publish(dataPosition2D);
// }
// if (LOG.isDebugEnabled()) {
// LOG.debug("Removed TUIO object with id: " +
// tuioObject.getFiducialID());
// }
// if (LOG.isDebugEnabled()) {
// LOG.debug("Remove TUIO object with id: " +
// tuioObject.getFiducialID());
// }
// DataDigital dd = new DataDigital(TUIO.class, false);
// dd.setAttribute(TUIO_TOKEN, "lifted");
// publish(dd);
//
// // DataToken dataToken = new DataToken(ReacTIVision.class,
// "DataToken" + tuioObject.getFiducialID(), tuioObject.getX(),
// tuioObject.getY());
// // dataToken.setAttribute(DataConstant.SESSION_ID, ((Long)
// tuioObject.getSessionID()).intValue());
// // dataToken.setAttribute(FIDUCIAL_ID,
// tuioObject.getFiducialID());
// // dataToken.setAttribute(DataConstant.get(Float.class,
// "Rotation"), (float) tuioObject.getAngle());
// DataPosition2D dataPosition2D = new
// DataPosition2D(TUIO.class, tuioObject.getX(),
// tuioObject.getY());
// dataPosition2D.setAttribute(TUIO.TUIO_ORIGIN_ADDRESS,"/tuio/2Dobj");
// dataPosition2D.setAttribute(DataConstant.FRAME_SEQUENCE_ID,
// -1);
// dataPosition2D.setAttribute(DataConstant.SESSION_ID, ((Long)
// tuioObject.getSessionID()).intValue());
// dataPosition2D.setAttribute(FIDUCIAL_ID,
// tuioObject.getFiducialID());
// dataPosition2D.setAttribute(TUIO.TUIO_MOVEMENT_VECTOR_X,
// tuioObject.getSpeedX());
// dataPosition2D.setAttribute(TUIO.TUIO_MOVEMENT_VECTOR_Y,
// tuioObject.getSpeedY());
// dataPosition2D.setAttribute(TUIO.TUIO_ROTATION_VECTOR_A,
// tuioObject.getRotationSpeed());
// dataPosition2D.setAttribute(TUIO.TUIO_ANGLE_A,
// tuioObject.getAngle());
// dataPosition2D.setAttribute(TUIO.TUIO_ROTATION_ACCELERATION,
// tuioObject.getRotationAccel());
// dataPosition2D.setAttribute(TUIO.TUIO_MOTION_ACCELERATION,
// tuioObject.getMotionAccel());
// dataPosition2D.setAttribute(TUIO_TOKEN, "lifted");
// publish(dataPosition2D);
}
/*
* (non-Javadoc)
*
* @see
* org.squidy.manager.input.impl.reactivision.TuioListener
* #updateTuioCursor
* (org.squidy.manager.input.impl.reactivision.TuioCursor)
*/
public void updateTuioCursor(TuioCursor tuioCursor) {
// DataPosition2D dataPosition2D = new
// DataPosition2D(TUIO.class, tuioCursor.getX(),
// tuioCursor.getY());
// dataPosition2D.setAttribute(TUIO.TUIO_ORIGIN_ADDRESS,
// "/tuio/2Dcur");
// dataPosition2D.setAttribute(DataConstant.FRAME_SEQUENCE_ID,
// -1);
// dataPosition2D.setAttribute(DataConstant.SESSION_ID, ((Long)
// tuioCursor.getSessionID()).intValue());
// dataPosition2D.setAttribute(TUIO.TUIO_MOVEMENT_VECTOR_X,
// tuioCursor.getSpeedX());
// dataPosition2D.setAttribute(TUIO.TUIO_MOVEMENT_VECTOR_Y,
// tuioCursor.getSpeedY());
// dataPosition2D.setAttribute(TUIO.TUIO_MOTION_ACCELERATION,
// tuioCursor.getMotionAccel());
// dataPosition2D.setAttribute(TUIO_CURSOR, "updated");
//
// publish(dataPosition2D);
}
/*
* (non-Javadoc)
*
* @see
* org.squidy.manager.input.impl.reactivision.TuioListener
* #updateTuioObject
* (org.squidy.manager.input.impl.reactivision.TuioObject)
*/
public void updateTuioObject(TuioObject tuioObject) {
// if (LOG.isDebugEnabled()) {
// LOG.debug("Update of TUIO object with id: " +
// tuioObject.getFiducialID());
// }
// DataToken dataToken = new DataToken(ReacTIVision.class,
// "DataToken" + tuioObject.getFiducialID(), tuioObject.getX(),
// tuioObject.getY());
// dataToken.setAttribute(DataConstant.SESSION_ID, ((Long)
// tuioObject.getSessionID()).intValue());
// dataToken.setAttribute(FIDUCIAL_ID,
// tuioObject.getFiducialID());
// dataToken.setAttribute(DataConstant.get(Float.class,
// "Rotation"), (float) tuioObject.getAngle());
// if(tuioObject.getUpdateTime() != -1)
// lastUpdateTime = tuioObject.getUpdateTime();
// System.out.println(tuioObject.getState());
Vector<TuioObject> tuioObjects = tuioClient.getTuioObjects();
Vector<Integer> aliveObjects = new Vector<Integer>();
for (TuioObject tuioObjectTmp : tuioObjects) {
aliveObjects.add(((Long) tuioObjectTmp.getSessionID())
.intValue());
}
// .getSessionID()).intValue()
DataPosition2D dataPosition2D = new DataPosition2D(TUIO.class,
tuioObject.getX(), tuioObject.getY());
dataPosition2D.setAttribute(TUIO.ORIGIN_ADDRESS,
"/tuio/2Dobj");
dataPosition2D.setAttribute(DataConstant.FRAME_SEQUENCE_ID, -1);
dataPosition2D.setAttribute(DataConstant.SESSION_ID,
((Long) tuioObject.getSessionID()).intValue());
dataPosition2D.setAttribute(FIDUCIAL_ID, tuioObject
.getFiducialID());
dataPosition2D.setAttribute(TUIO.MOVEMENT_VECTOR_X,
tuioObject.getSpeedX());
dataPosition2D.setAttribute(TUIO.MOVEMENT_VECTOR_Y,
tuioObject.getSpeedY());
dataPosition2D.setAttribute(TUIO.ROTATION_VECTOR_A,
tuioObject.getRotationSpeed());
dataPosition2D
.setAttribute(
TUIO.ANGLE_A,
counterClockwiseAngle ? ((float) ((2 * Math.PI) - tuioObject
.getAngle()))
: tuioObject.getAngle());
dataPosition2D.setAttribute(TUIO.ROTATION_ACCELERATION,
tuioObject.getRotationAccel());
dataPosition2D.setAttribute(TUIO.MOTION_ACCELERATION,
tuioObject.getMotionAccel());
dataPosition2D.setAttribute(TUIO_ALIVE, aliveObjects);
dataPosition2D.setAttribute(TUIO_TOKEN, "updated");
publish(dataPosition2D);
lastTime = System.currentTimeMillis();
}
});
tuioClient.connect();
}
/*
* (non-Javadoc)
*
* @see org.squidy.manager.ReflectionProcessable#onStop()
*/
@Override
public void onStop() throws ProcessException {
lastTime = 0;
if (tuioClient != null) {
tuioClient.disconnect();
tuioClient = null;
}
}
}