/**
* 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.optitrack;
import java.io.IOException;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
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.ComboBox;
import org.squidy.manager.controls.TextField;
import org.squidy.manager.data.DataConstant;
import org.squidy.manager.data.IDataContainer;
import org.squidy.manager.data.Processor;
import org.squidy.manager.data.Property;
import org.squidy.manager.data.domainprovider.impl.EndianDomainProvider;
import org.squidy.manager.data.impl.DataDigital;
import org.squidy.manager.data.impl.DataPosition2D;
import org.squidy.manager.model.AbstractNode;
import org.squidy.manager.util.DataUtility;
import org.squidy.nodes.optitrack.utils.TrackingConstant;
import org.squidy.nodes.optitrack.utils.TrackingUtility;
import com.illposed.osc.Endian;
import com.illposed.osc.OSCBundle;
import com.illposed.osc.OSCListener;
import com.illposed.osc.OSCMessage;
import com.illposed.osc.OSCPortIn;
import com.illposed.osc.OSCPortOut;
/**
* <code>TUIO4Optitrack</code>.
*
* <pre>
* Date: May 23, 2008
* Time: 3:12:59 PM
* </pre>
*
* @author Roman Rädle, <a href="mailto:Roman.Raedle@uni-konstanz.de">Roman.
* Raedle@uni-konstanz.de</a>, University of Konstanz
* @version $Id: TUIO4Optitrack.java 528 2011-02-22 14:10:36Z faeh $ * @since 1.0.0 * @since 1.0.0
* @since 1.0.0
*/
@XmlType(name = "TUIO4Optitrack")
@Processor(
name = "TUIO4Optitrack",
icon = "/org/squidy/nodes/image/48x48/tuio_logo.png",
description = "/org/squidy/nodes/html/TUIO.html",
types = { Processor.Type.INPUT, Processor.Type.OUTPUT },
tags = { "tuio", "tangible", "interface","optitrack" }
)
public class TUIO4Optitrack extends AbstractNode {
// Log to log info, error, debug,... messages.
private static final Log LOG = LogFactory.getLog(TUIO4Optitrack.class);
// ################################################################################
// BEGIN OF DATA CONSTANTS
// ################################################################################
// ################################################################################
// BEGIN OF TUIO4Optitrack DEFINED PARAMETERS
// ################################################################################
public static final DataConstant SESSION_ID = DataConstant.SESSION_ID;
public static final DataConstant FIDUCIAL_ID = DataConstant.get(Integer.class, "TUIO_FIDUCIAL_ID");
public static final DataConstant MOVEMENT_VECTOR_X = DataConstant.get(Float.class, "TUIO_MOVEMENT_VECTOR_X");
public static final DataConstant MOVEMENT_VECTOR_Y = DataConstant.get(Float.class, "TUIO_MOVEMENT_VECTOR_Y");
public static final DataConstant MOTION_ACCELERATION = DataConstant.get(Float.class, "TUIO_MOTION_ACCELERATION");
public static final DataConstant ROTATION_ACCELERATION = DataConstant.get(Float.class, "TUIO_ROTATION_ACCELERATION");
public static final DataConstant ROTATION_VECTOR_A = DataConstant.get(Float.class, "TUIO_ROTATION_A");
public static final DataConstant TUIO_TOKEN = DataConstant.get(Boolean.class, "TUIO_TOKEN");
public static final DataConstant ANGLE_A = DataConstant.get(Float.class, "TUIO_ANGLE_A");
public static final DataConstant ANGLE_B = DataConstant.get(Float.class, "TUIO_ANGLE_B");
public static final DataConstant ANGLE_C = DataConstant.get(Float.class, "TUIO_ANGLE_C");
// ################################################################################
// END OF TUIO4Optitrack DEFINED PARAMETERS
// ################################################################################
// ################################################################################
// BEGIN OF TUIO4Optitrack 1.1 DEFINED PARAMETERS
// ################################################################################
public static final DataConstant WIDTH = DataConstant.get(Float.class, "TUIO_WIDTH");
public static final DataConstant HEIGHT = DataConstant.get(Float.class, "TUIO_HEIGHT");
public static final DataConstant AREA = DataConstant.get(Float.class, "TUIO_AREA");
// ################################################################################
// END OF TUIO4Optitrack 1.1 DEFINED PARAMETERS
// ################################################################################
// ################################################################################
// BEGIN OF FREE DEFINED PARAMETERS
// ################################################################################
public static final DataConstant ORIGIN_ADDRESS = DataConstant.get(String.class, "TUIO_ORIGIN_ADDRESS");
public static final DataConstant OBJECT_STATE = DataConstant.get(String.class, "TUIO_OBJECT_STATE");
public static final DataConstant HAND_WIDTH = DataConstant.get(Float.class, "TUIO_HAND_WIDTH");
public static final DataConstant HAND_HEIGHT = DataConstant.get(Float.class, "TUIO_HAND_HEIGHT");
// ################################################################################
// END OF FREE DEFINED PARAMETERS
// ################################################################################
// ################################################################################
// BEGIN OF TUIO4Optitrack MESSAGE TYPES
// ################################################################################
public static final String MESSAGE_TYPE_SOURCE_SIMULATOR = "simulator";
public static final String MESSAGE_TYPE_ALIVE = "alive";
public static final String MESSAGE_TYPE_SET = "set";
public static final String MESSAGE_TYPE_FSEQ = "fseq";
// ################################################################################
// BEGIN OF TUIO4Optitrack MESSAGE TYPES
// ################################################################################
// ################################################################################
// BEGIN OF TUIO4Optitrack PROFILES
// ################################################################################
public static final String PROFILE_2D_CURSOR = "/tuio/2Dcur";
public static final String PROFILE_2D_OBJECT = "/tuio/2Dobj";
public static final String PROFILE_2D_BLOB = "/tuio/2Dblb";
// ################################################################################
// BEGIN OF TUIO4Optitrack PROFILES
// ################################################################################
// ################################################################################
// END OF DATA CONSTANTS
// ################################################################################
// ################################################################################
// BEGIN OF ADJUSTABLES
// ################################################################################
@XmlAttribute(name = "address-outgoing")
@Property(
name = "Address outgoing",
group = "Connection Settings",
description = "The outgoing address for the TUIO4Optitrack server."
)
@TextField
private String addressOutgoing = "127.0.0.1";
/**
* @return the addressOutgoing
*/
public final String getAddressOutgoing() {
return addressOutgoing;
}
/**
* @param addressOutgoing the addressOutgoing to set
*/
public final void setAddressOutgoing(String addressOutgoing) {
this.addressOutgoing = addressOutgoing;
}
@XmlAttribute(name = "port-outgoing")
@Property(
name = "Port outgoing",
group = "Connection Settings",
description = "The outgoing port for the TUIO4Optitrack server."
)
@TextField
private int portOutgoing = 3333;
/**
* @return the portOutgoing
*/
public final int getPortOutgoing() {
return portOutgoing;
}
/**
* @param portOutgoing the portOutgoing to set
*/
public final void setPortOutgoing(int portOutgoing) {
this.portOutgoing = portOutgoing;
}
@XmlAttribute(name = "port-incoming")
@Property(
name = "Port incoming",
group = "Connection Settings",
description = "The incoming port for the TUIO4Optitrack server."
)
@TextField
protected int portIncoming = 3333;
/**
* @return the portIncoming
*/
public final int getPortIncoming() {
return portIncoming;
}
/**
* @param portIncoming the portIncoming to set
*/
public void setPortIncoming(int portIncoming) {
this.portIncoming = portIncoming;
}
@XmlAttribute(name = "endian")
@Property(
name = "Endian",
description = "Indicates which endian strategy will be used to identify bytes or not."
)
@ComboBox(
domainProvider = EndianDomainProvider.class
)
private Endian endian = Endian.LITTLE_ENDIAN;
/**
* @return the endian
*/
public final Endian getEndian() {
return endian;
}
/**
* @param endian
* the endian to set
*/
public final void setEndian(Endian endian) {
this.endian = endian;
if (isProcessing()) {
// Restart the osc server with new endian strategy.
stopOSCServer();
startOSCServer();
}
}
@XmlAttribute(name = "timeout")
@Property(name = "Timeout", description = "Timeout after which a Token Lifted Message will be sent if no Tokens are recognized.")
@TextField
protected int timeout = 200;
public int getTimeout() {
return timeout;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
@XmlAttribute(name = "update-rate")
@Property(
name = "Update Rate (fps)",
description = "Updae Rate (fps)"
)
@TextField
private int updateRate = 60;
/**
* @return the portOutgoing
*/
public final int getUpdateRate() {
return updateRate;
}
/**
* @param portOutgoing the portOutgoing to set
*/
public final void setUpdateRate(int updateRate) {
this.updateRate = updateRate;
}
// ################################################################################
// END OF ADJUSTABLES
// ################################################################################
private OSCPortOut oscPortOut;
private OSCPortIn oscPortIn;
private List<DataPosition2D> tokenList = new ArrayList<DataPosition2D>(0);
// private OSCPortOut oscPortOut;
private long currentTimeout;
private boolean tokenUpdated = false;
/* (non-Javadoc)
* @see org.squidy.manager.ReflectionProcessable#onStart()
*/
@Override
public void onStart() {
startOSCServer();
currentTimeout = System.currentTimeMillis();
new Thread() {
private int lastTokenCount = 0;
boolean publishedTokenLifted = true;
boolean publishedTokenDown = false;
public void run() {
super.run();
while (isProcessing()) {
long currentTime = System.currentTimeMillis();
int tokenCount = tokenList.size();
if (tokenCount > lastTokenCount) {
if( !publishedTokenDown ){
publishTokenDown(tokenList.get(0));
publishedTokenDown = true;
publishedTokenLifted = false;
}
}
else if (tokenCount == 0 && !publishedTokenLifted && (currentTimeout + timeout) < currentTime) {
tokenList.clear();
publishTokenLifted();
publishedTokenLifted = true;
publishedTokenDown = false;
}
lastTokenCount = tokenCount;
try {
tokenList.clear();
long sleep = timeout;//Math.max((currentTimeout + 500)-currentTime, 10);
Thread.sleep(sleep);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
}
/**
* @param data
*/
private void publishTokenDown(DataPosition2D data) {
int markerId = (Integer) data.getAttribute(FIDUCIAL_ID);
DataDigital dd = new DataDigital(TUIO4Optitrack.class, true);
dd.setAttribute(FIDUCIAL_ID, markerId);
dd.setAttribute(TUIO_TOKEN, true);
publish(dd);
if (LOG.isDebugEnabled()) {
// LOG.debug("Token " + markerId + " down.");
}
}
/**
*
*/
private void publishTokenLifted() {
DataDigital dd = new DataDigital(TUIO4Optitrack.class, false);
dd.setAttribute(TUIO_TOKEN, false);
publish(dd);
if (LOG.isDebugEnabled()) {
// LOG.debug("Token lifted.");
}
}
/* (non-Javadoc)
* @see org.squidy.manager.ReflectionProcessable#onStop()
*/
@Override
public void onStop() {
stopOSCServer();
}
/**
*
*/
protected void startOSCServer() {
try {
oscPortOut = new OSCPortOut(InetAddress.getByName(addressOutgoing), portOutgoing);
}
catch (SocketException e) {
throw new ProcessException(e.getMessage(), e);
}
catch (UnknownHostException e) {
throw new ProcessException(e.getMessage(), e);
}
try {
oscPortIn = new OSCPortIn(portIncoming, endian);
}
catch (SocketException e) {
throw new ProcessException(e.getMessage(), e);
}
oscPortIn.addListener("/tuio/2Dcur", new OSCListener() {
/* (non-Javadoc)
* @see com.illposed.osc.OSCListener#acceptMessages(java.util.Date, com.illposed.osc.OSCMessage[])
*/
public void acceptMessages(Date time, OSCMessage[] messages) {
List<DataPosition2D> cursors = new ArrayList<DataPosition2D>(1);
int fseq = -1;
for (OSCMessage message : messages) {
Object[] arguments = message.getArguments();
if ("fseq".equals(arguments[0])) {
fseq = (Integer) arguments[1];
}
}
for (OSCMessage message : messages) {
Object[] arguments = message.getArguments();
if ("set".equals(arguments[0])) {
int sessionId = (Integer) arguments[1];
float x = (Float) arguments[2];
float y = (Float) arguments[3];
float movementVectorX = (Float) arguments[4];
float movementVectorY = (Float) arguments[5];
float motionAcceleration = (Float) arguments[6];
DataPosition2D dataPosition2D = new DataPosition2D(TUIO4Optitrack.class, x, y);
dataPosition2D.setAttribute(ORIGIN_ADDRESS, "/tuio/2Dcur");
dataPosition2D.setAttribute(DataConstant.FRAME_SEQUENCE_ID, fseq);
dataPosition2D.setAttribute(DataConstant.SESSION_ID, sessionId);
dataPosition2D.setAttribute(MOVEMENT_VECTOR_X, movementVectorX);
dataPosition2D.setAttribute(MOVEMENT_VECTOR_Y, movementVectorY);
dataPosition2D.setAttribute(MOTION_ACCELERATION, motionAcceleration);
cursors.add(dataPosition2D);
}
}
publish(cursors);
}
});
oscPortIn.addListener("/tuio/2Dobj", new OSCListener() {
/*
* (non-Javadoc)
*
* @see com.illposed.osc.OSCListener#acceptMessages(java.util.Date,
* com.illposed.osc.OSCMessage[])
*/
public void acceptMessages(Date time, OSCMessage[] messages) {
List<DataPosition2D> tokens = new ArrayList<DataPosition2D>(1);
int fseq = -1;
for (OSCMessage message : messages) {
Object[] arguments = message.getArguments();
if ("fseq".equals(arguments[0])) {
fseq = (Integer) arguments[1];
}
}
for (OSCMessage message : messages) {
Object[] arguments = message.getArguments();
if ("set".equals(arguments[0])) {
int sessionId = (Integer) arguments[1];
int markerId = (Integer) arguments[2];
float x = (Float) arguments[3];
float y = (Float) arguments[4];
float angle = (Float) arguments[5];
float movementVectorX = (Float) arguments[6];
float movementVectorY = (Float) arguments[7];
float rotationVector = (Float) arguments[8];
float motionAcceleration = (Float) arguments[9];
float rotationAcceleration = (Float) arguments[10];
DataPosition2D dataPosition2D = new DataPosition2D(TUIO4Optitrack.class, x, y);
dataPosition2D.setAttribute(ORIGIN_ADDRESS,
"/tuio/2Dobj");
dataPosition2D.setAttribute(
DataConstant.FRAME_SEQUENCE_ID, fseq);
dataPosition2D.setAttribute(DataConstant.SESSION_ID,
sessionId);
dataPosition2D.setAttribute(FIDUCIAL_ID, markerId);
dataPosition2D.setAttribute(MOVEMENT_VECTOR_X,
movementVectorX);
dataPosition2D.setAttribute(MOVEMENT_VECTOR_Y,
movementVectorY);
dataPosition2D.setAttribute(ROTATION_VECTOR_A,
rotationVector);
dataPosition2D.setAttribute(ANGLE_A, angle);
dataPosition2D.setAttribute(ROTATION_ACCELERATION,
rotationAcceleration);
dataPosition2D.setAttribute(MOTION_ACCELERATION,
motionAcceleration);
tokenUpdated = true;
tokenList.clear();
tokens.add(dataPosition2D);
tokenList.add(dataPosition2D);
}
}
publish(tokens);
}
});
// oscPortIn.addListener("/tuio/_sxyXYmaPP", new OSCListener() {
// public void acceptMessages(Date time, OSCMessage[] messages) {
//
// List<DataPosition2D> cursors = new ArrayList<DataPosition2D>(1);
//
// int fseq = -1;
// for (OSCMessage message : messages) {
// Object[] arguments = message.getArguments();
// if ("fseq".equals(arguments[0])) {
// fseq = (Integer) arguments[1];
// }
// }
//
// for (OSCMessage message : messages) {
// Object[] arguments = message.getArguments();
//
// if ("set".equals(arguments[0])) {
//
// int sessionId = (Integer) arguments[1];
// float x = (Float) arguments[2];
// float y = (Float) arguments[3];
// float movementVectorX = (Float) arguments[4];
// float movementVectorY = (Float) arguments[5];
// float motionAcceleration = (Float) arguments[6];
// float angleA = (Float) arguments[6];
// float handWidth = (Float) arguments[6];
// float handHeight = (Float) arguments[6];
//
// DataPosition2D dataPosition2D = new DataPosition2D(TUIO4Optitrack.class, x, y);
// dataPosition2D.setAttribute(ORIGIN_ADDRESS, "/tuio/_sxyXYmaPP");
// dataPosition2D.setAttribute(DataConstant.FRAME_SEQUENCE_ID, fseq);
// dataPosition2D.setAttribute(DataConstant.SESSION_ID, sessionId);
// dataPosition2D.setAttribute(MOVEMENT_VECTOR_X, movementVectorX);
// dataPosition2D.setAttribute(MOVEMENT_VECTOR_Y, movementVectorY);
// dataPosition2D.setAttribute(MOTION_ACCELERATION, motionAcceleration);
// dataPosition2D.setAttribute(ANGLE_A, angleA);
// dataPosition2D.setAttribute(HAND_WIDTH, handWidth);
// dataPosition2D.setAttribute(HAND_HEIGHT, handHeight);
//
// cursors.add(dataPosition2D);
// }
// }
//
// publish(cursors);
// }
// });
// oscPortIn.addListener("/tuio/_sxyXYma", new OSCListener() {
//
// /* (non-Javadoc)
// * @see com.illposed.osc.OSCListener#acceptMessages(java.util.Date, com.illposed.osc.OSCMessage[])
// */
// public void acceptMessages(Date time, OSCMessage[] messages) {
//
// List<DataPosition2D> cursors = new ArrayList<DataPosition2D>(1);
//
// int fseq = -1;
// for (OSCMessage message : messages) {
// Object[] arguments = message.getArguments();
// if ("fseq".equals(arguments[0])) {
// fseq = (Integer) arguments[1];
// }
// }
//
// for (OSCMessage message : messages) {
// Object[] arguments = message.getArguments();
//
// if ("set".equals(arguments[0])) {
//
// int sessionId = (Integer) arguments[1];
// float x = (Float) arguments[2];
// float y = (Float) arguments[3];
// float movementVectorX = (Float) arguments[4];
// float movementVectorY = (Float) arguments[5];
// float motionAcceleration = (Float) arguments[6];
// float angleA = (Float) arguments[7];
//
// DataPosition2D dataPosition2D = new DataPosition2D(TUIO4Optitrack.class, x, y);
// dataPosition2D.setAttribute(ORIGIN_ADDRESS, "/tuio/_sxyXYma");
// dataPosition2D.setAttribute(DataConstant.FRAME_SEQUENCE_ID, fseq);
// dataPosition2D.setAttribute(DataConstant.SESSION_ID, sessionId);
// dataPosition2D.setAttribute(MOVEMENT_VECTOR_X, movementVectorX);
// dataPosition2D.setAttribute(MOVEMENT_VECTOR_Y, movementVectorY);
// dataPosition2D.setAttribute(MOTION_ACCELERATION, motionAcceleration);
// dataPosition2D.setAttribute(ANGLE_A, angleA);
//
// cursors.add(dataPosition2D);
// }
// }
//
// publish(cursors);
// }
// });
oscPortIn.startListening();
}
/**
*
*/
protected void stopOSCServer() {
if (oscPortIn != null) {
oscPortIn.stopListening();
oscPortIn.close();
oscPortIn = null;
}
if (oscPortOut != null) {
//oscPortIn.stopListening();
oscPortOut.close();
oscPortIn = null;
}
}
// ################################################################################
// BEGIN OF Processing
// ################################################################################
private int frameId = 0;
/**
* @return
*/
private synchronized int getSessionId() {
if (frameId > Integer.MAX_VALUE) {
frameId = 0;
}
return ++frameId;
}
private int lastBodySet = 0;
private int tuioCounter = 0;
private int[] tuioBody = new int[100];
private int[] currentTUIO = new int[100];
private int frameID = 0;
private int fingerID = 0;
private int gestureCounter = 0;
private int lastFrame = 0;
private long lastFrameSent = 0;
/* (non-Javadoc)
* @see org.squidy.manager.data.logic.ReflectionProcessable#beforeDataContainerProcessing(org.squidy.manager.data.IDataContainer)
*/
@Override
public IDataContainer preProcess(IDataContainer dataContainer) {
List<DataPosition2D> dataPositions2D = DataUtility.getDataOfType(DataPosition2D.class, dataContainer);
if (dataPositions2D.size() <= 0) {
return null;
}
OSCBundle bundle = new OSCBundle(new Date(dataContainer.getTimestamp()));
OSCMessage fseq2DCur = new OSCMessage("/tuio/2Dcur");
fseq2DCur.addArgument("fseq");
bundle.addPacket(fseq2DCur);
OSCMessage alive2DCur = new OSCMessage("/tuio/2Dcur");
alive2DCur.addArgument("alive");
bundle.addPacket(alive2DCur);
// Iterate 2D cursors.
boolean sendTUIO = false;
for (DataPosition2D dataPosition2D : dataPositions2D)
{
if (dataPosition2D.hasAttribute(TrackingConstant.TUIOID))
{
// String originAddress = (String) dataPosition2D.getAttribute(ORIGIN_ADDRESS);
if (tuioBody[Integer.valueOf(dataPosition2D.getAttribute(TrackingConstant.RIGIDBODYID).toString())] !=
Integer.valueOf(dataPosition2D.getAttribute(TrackingConstant.TUIOID).toString()) &&
Integer.valueOf(dataPosition2D.getAttribute(TrackingConstant.TUIOID).toString()) > 0)
{
tuioBody[Integer.valueOf(dataPosition2D.getAttribute(TrackingConstant.RIGIDBODYID).toString())] =
Integer.valueOf(dataPosition2D.getAttribute(TrackingConstant.TUIOID).toString());
currentTUIO[Integer.valueOf(dataPosition2D.getAttribute(TrackingConstant.RIGIDBODYID).toString())] = ++tuioCounter;
}
gestureCounter = currentTUIO[Integer.valueOf(dataPosition2D.getAttribute(TrackingConstant.RIGIDBODYID).toString())];
// frameID = Integer.valueOf(dataPosition2D.getAttribute(DataConstant.GROUP_ID).toString());
fingerID = Integer.valueOf(dataPosition2D.getAttribute(TrackingConstant.RIGIDBODYID).toString());
dataPosition2D.setAttribute(TUIO4Optitrack.SESSION_ID, gestureCounter);
//lastFrame = frameID;
OSCMessage set;
if (fseq2DCur.getArguments().length < 2)
{
fseq2DCur.addArgument(frameID);
}
// printMessage(fseq2DCur);
// alive2DCur.addArgument(gestureCounter);
// System.out.println("TUIO4Optitrack ID " + Integer.valueOf(dataPosition2D.getAttribute(TrackingConstant.TUIOID).toString()));
if (TrackingUtility.getAttributesAlpha(dataPosition2D, TrackingConstant.SENDTUIO).equalsIgnoreCase("LAST"))
{
sendTUIO = false;
}else if (Integer.valueOf(dataPosition2D.getAttribute(TrackingConstant.TUIOID).toString()) > 0)
{
alive2DCur.addArgument(gestureCounter);
set = prepare2DCur(dataPosition2D);
// printMessage(set);
bundle.addPacket(set);
sendTUIO = true;
// System.out.println(" TUIO4Optitrack " + "\t"+ currentTUIO[Integer.valueOf(dataPosition2D.getAttribute(TrackingConstant.RIGIDBODYID).toString())] +"\t"+
// Integer.valueOf(dataPosition2D.getAttribute(DataConstant.GROUP_ID).toString()));
}
}
}
// System.out.println(System.currentTimeMillis() + " " + lastFrameSent + " " + (lastFrameSent + (1/updateRate *1000) < System.currentTimeMillis()) + " " +(1.0/(double)updateRate *1000.0));
try {
if (sendTUIO && (lastFrameSent == 0 || (lastFrameSent + ((1.0/(double)updateRate) *1000.0) < System.currentTimeMillis())))
{
lastFrameSent = System.currentTimeMillis();
oscPortOut.send(bundle);
// System.out.println("SEND NOW " + bundle.toString());
// printMessage(alive2DCur);
// printMessage(fseq2DCur);
lastFrame = frameID;
frameID++;
}else
{
if(lastFrame > 0)
{
oscPortOut.send(bundle);
lastFrameSent = System.currentTimeMillis();
// System.out.println("SEND LAST " + bundle.toString());
// printMessage(alive2DCur);
// printMessage(fseq2DCur);
lastFrame = 0;
tuioCounter++;
frameID++;
}
// System.out.println("No send");
}
}
catch (IOException e) {
throw new ProcessException(e.getMessage(), e);
}
return super.preProcess(dataContainer);
}
/**
* @param dataPosition2D
* @return
*/
private OSCMessage prepare2DCur(DataPosition2D dataPosition2D) {
OSCMessage set = new OSCMessage("/tuio/2Dcur");
set.addArgument("set");
//System.out.print(" \t set " + currentTUIO[Integer.valueOf(dataPosition2D.getAttribute(TrackingConstant.RIGIDBODYID).toString())]);
set.addArgument(Integer.valueOf(dataPosition2D.getAttribute(TUIO4Optitrack.SESSION_ID).toString()));
set.addArgument((float) dataPosition2D.getX());
set.addArgument((float) dataPosition2D.getY());
set.addArgument(dataPosition2D.getAttribute(MOVEMENT_VECTOR_X));
set.addArgument(dataPosition2D.getAttribute(MOVEMENT_VECTOR_Y));
set.addArgument(dataPosition2D.getAttribute(MOTION_ACCELERATION));
return set;
}
/**
* @param dataPosition2D
* @return
*/
private OSCMessage prepare_sxyXYmaPP(DataPosition2D dataPosition2D) {
OSCMessage set = new OSCMessage("/tuio/_sxyXYmaPP");
set.addArgument("set");
set.addArgument(dataPosition2D.getAttribute(DataConstant.SESSION_ID));
set.addArgument((float) dataPosition2D.getX());
set.addArgument((float) dataPosition2D.getY());
set.addArgument(dataPosition2D.getAttribute(MOVEMENT_VECTOR_X));
set.addArgument(dataPosition2D.getAttribute(MOVEMENT_VECTOR_Y));
set.addArgument(dataPosition2D.getAttribute(MOTION_ACCELERATION));
set.addArgument(dataPosition2D.getAttribute(ANGLE_A));
set.addArgument(dataPosition2D.getAttribute(HAND_WIDTH));
set.addArgument(dataPosition2D.getAttribute(HAND_HEIGHT));
return set;
}
/**
* @param dataPosition2D
* @return
*/
private OSCMessage prepare_sxyXYma(DataPosition2D dataPosition2D) {
OSCMessage set = new OSCMessage("/tuio/_sxyXYma");
set.addArgument("set");
set.addArgument(dataPosition2D.getAttribute(DataConstant.SESSION_ID));
set.addArgument((float) dataPosition2D.getX());
set.addArgument((float) dataPosition2D.getY());
set.addArgument(dataPosition2D.getAttribute(MOVEMENT_VECTOR_X));
set.addArgument(dataPosition2D.getAttribute(MOVEMENT_VECTOR_Y));
set.addArgument(dataPosition2D.getAttribute(MOTION_ACCELERATION));
set.addArgument(dataPosition2D.getAttribute(ANGLE_A));
return set;
}
private void printMessage(OSCMessage message) {
StringBuilder sb = new StringBuilder();
sb.append(message.getAddress()).append(",");
for (Object o : message.getArguments()) {
sb.append(o).append(",");
}
System.out.println(sb);
}
// ################################################################################
// END OF Processing
// ################################################################################
}