package org.squidy.nodes.optitrack;
import java.util.AbstractQueue;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.KeyStroke;
import javax.swing.Timer;
import javax.swing.text.JTextComponent.KeyBinding;
import javax.vecmath.Point2d;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlType;
import org.squidy.manager.controls.CheckBox;
import org.squidy.manager.controls.ComboBox;
import org.squidy.manager.controls.TextField;
import org.squidy.manager.controls.ComboBoxControl.ComboBoxItemWrapper;
import org.squidy.manager.data.DataConstant;
import org.squidy.manager.data.IData;
import org.squidy.manager.data.IDataContainer;
import org.squidy.manager.data.Processor;
import org.squidy.manager.data.Property;
import org.squidy.manager.data.domainprovider.DomainProvider;
import org.squidy.manager.data.impl.DataDigital;
import org.squidy.manager.data.impl.DataPosition2D;
import org.squidy.manager.data.impl.DataPosition3D;
import org.squidy.manager.data.impl.DataPosition6D;
import org.squidy.manager.model.AbstractNode;
import org.squidy.manager.util.DataUtility;
import org.squidy.nodes.Keyboard;
import org.squidy.nodes.optitrack.RigidBody.RBIDDomainProvider;
import org.squidy.nodes.optitrack.utils.TrackingConstant;
import org.squidy.nodes.optitrack.utils.TrackingUtility;
/*<code>DataBlocker</code>.
*
* <pre>
* Date: Jan 29 2010
* Time: 1:35:05 AM
* </pre>
*
* @author Simo Faeh, < href="mailto:simon.faeh@uni-konstanz.de">Simon.Faeh@uni-konstanz.de</>, University f Konstanz
*
* @version $Id: OptitrackPrint.java 373 2010-08-08 12:06:21Z raedle $
*/
@XmlType(name = "Datablocker")
@Processor(
name = "Datablocker",
icon = "/org/squidy/nodes/image/48x48/datablocker.png",
description = "",
types = { Processor.Type.OUTPUT },
tags = { "datanlocker", "block", "debugging" }
)
public class DataBlocker extends AbstractNode {
// ################################################################################
// BEGIN OF ADJUSTABLES
// ################################################################################
@XmlAttribute(name = "keyID")
@Property(
name = "Key",
description = "Key to be pressed"
)
@TextField
private String keyStroke = "-";
public final String getKeyStroke() {
return keyStroke;
}
public final void setKeyStroke(String key) {
this.keyStroke = key;
}
// ################################################################################
@XmlAttribute(name = "identKeyWord")
@Property(
name = "Permitted keywords Keyword",
description = "Datatypes with this identifier will be blocked (multiple keywords seperaty with ;)"
)
@ComboBox(domainProvider = KWDomainProvider.class)
private String keyWord = "";
public final String getKeyWord() {
return keyWord;
}
public final void setKeyWord(String keyWord) {
this.keyWord = keyWord;
}
// ################################################################################
@XmlAttribute(name = "fps")
@Property(
name = "Allowed frame count",
description = "Number of frames to be blocked"
)
@TextField
private int fps = 0;
public final int getFps() {
return fps;
}
public final void setFps(int fps) {
this.fps = fps;
}
// ################################################################################
@XmlAttribute(name = "multiScreenMode")
@Property(name = "Multi-Screen Mode", description = "If enabled, only sends (0,0) if all Pipes are (0,0)")
@CheckBox
private boolean multiScreenMode = false;
public boolean getMultiScreenMode() {
return multiScreenMode;
}
public void setMultiScreenMode(boolean multiScreenMode) {
this.multiScreenMode = multiScreenMode;
}
// ################################################################################
@XmlAttribute(name = "block2D")
@Property(name = "Block 2D Data", description = "Block 2D Data")
@CheckBox
private boolean blockData2D = false;
public boolean getBlockData2D() {
return blockData2D;
}
public void setBlockData2D(boolean blockData2D) {
this.blockData2D = blockData2D;
}
// ################################################################################
@XmlAttribute(name = "block3D")
@Property(name = "Block 3D Data", description = "Block 3D Data")
@CheckBox
private boolean blockData3D = false;
public boolean getBlockData3D() {
return blockData3D;
}
public void setBlockData3D(boolean blockData3D) {
this.blockData3D = blockData3D;
}
// ################################################################################
@XmlAttribute(name = "block6D")
@Property(name = "Block 6D Data", description = "Block 6D Data")
@CheckBox
private boolean blockData6D = false;
public boolean getBlockData6D() {
return blockData6D;
}
public void setBlockData6D(boolean blockData6D) {
this.blockData6D = blockData6D;
}
// ################################################################################
@XmlAttribute(name = "blockDigital")
@Property(name = "Block DataDigital", description = "Block DigitalData")
@CheckBox
private boolean blockDataDigital = false;
public boolean getBlockDataDigital() {
return blockDataDigital;
}
public void setBlockDataDigital(boolean blockDataDigital) {
this.blockDataDigital = blockDataDigital;
}
// ################################################################################
@XmlAttribute(name = "rigidBodyID")
@Property(
name = "Blocked RigidBodies",
description = "ID of RigidBodies to block"
)
@ComboBox(domainProvider = RBIDDomainProvider.class)
private int rigidBodyID = TrackingConstant.RB_HANDRIGHT;
public final int getRigidBodyID() {
return rigidBodyID;
}
public final void setRigidBodyID(int rID) {
this.rigidBodyID = rID;
}
// ################################################################################
// END OF ADJUSTABLES
// ################################################################################
// ################################################################################
// BEGIN OF DOMAIN PROVIDERS
// ################################################################################
public static class RBIDDomainProvider implements DomainProvider {
/*
* (non-Javadoc)
*
* @see org.squidy.manager.data.domainprovider.DomainProvider#getValues()
*/
public Object[] getValues() {
ComboBoxItemWrapper[] values = new ComboBoxItemWrapper[8];
values[0] = new ComboBoxItemWrapper(0, "Unspecified");
values[1] = new ComboBoxItemWrapper(TrackingConstant.RB_HANDRIGHT, "Glove (right)");
values[2] = new ComboBoxItemWrapper(TrackingConstant.RB_HANDLEFT, "Glove (left)");
values[3] = new ComboBoxItemWrapper(TrackingConstant.RB_PEN, "Pen");
values[4] = new ComboBoxItemWrapper(TrackingConstant.RB_LASER, "Laser-Pointer");
values[5] = new ComboBoxItemWrapper(TrackingConstant.RB_IPHONE, "iPhone1");
values[6] = new ComboBoxItemWrapper(TrackingConstant.RB_IPHONE2, "iPhone2");
values[7] = new ComboBoxItemWrapper(TrackingConstant.RB_MOBILEDISPLAY, "Mobile-Display");
return values;
}
}
// ################################################################################
public static class KWDomainProvider implements DomainProvider {
/*
* (non-Javadoc)
*
* @see org.squidy.manager.data.domainprovider.DomainProvider#getValues()
*/
public Object[] getValues() {
ComboBoxItemWrapper[] values = new ComboBoxItemWrapper[5];
values[0] = new ComboBoxItemWrapper(TrackingConstant.KEY_NOKEY, "Unspecified");
values[1] = new ComboBoxItemWrapper(TrackingConstant.KEY_ONSCREEN, "Screen Coordinates");
values[2] = new ComboBoxItemWrapper(TrackingConstant.KEY_OFFSCREEN, "Offscreen Coordinates");
values[3] = new ComboBoxItemWrapper(TrackingConstant.KEY_OVERSIZESCREEN, "Oversize Coordinates");
values[4] = new ComboBoxItemWrapper(TrackingConstant.KEY_ENTERSCREEN, "Enter Screen Coordinates");
return values;
}
}
//################################################################################
// END OF DOMAIN PROVIDERS
// ################################################################################
private boolean keyPressed = false;
private int frameCounter2D, frameCounter3D, frameCounter6D = 0;
private int d2dCounter = 0;
private DataPosition2D prevD2D;
private long last2d = 0;
private long last3d = 0;
private long last6d = 0;
private Timer publishTimer;
private AbstractQueue<Point2d> d2dHistory;
@Override
public void onStart()
{
//d2dHistory = new AbstractQueue();
}
@Override
public IDataContainer preProcess(IDataContainer dataContainer)
{
List<DataPosition2D> l2d = DataUtility.getDataOfType(DataPosition2D.class, dataContainer);
if (l2d.size() > 0)
{
if (this.keyWord.length() > 0)
{
if (l2d.get(0).hasAttribute((TrackingConstant.KEYWORD)))
{
String ident = String.valueOf(l2d.get(0).getAttribute(TrackingConstant.KEYWORD));
if (!ident.contains(keyWord))
{
return null;
}
}else
{
return null;
}
}
if (getBlockData2D() && getFps() > 0)
{
if (last2d == 0 || (last2d + (1.0/ (double)fps * 1000.0) < System.currentTimeMillis()))
{
last2d = System.currentTimeMillis();
return dataContainer;
}else
{
return null;
}
}
}
if (getBlockData3D() && fps > 0)
{
List<DataPosition3D> l3d = DataUtility.getDataOfType(DataPosition3D.class, dataContainer);
if (l3d.size() > 0)
{
if (last3d == 0 || (last3d + (1.0/ (double)fps * 1000.0) < System.currentTimeMillis()))
{
last3d = System.currentTimeMillis();
return dataContainer;
}else
{
return null;
}
}
}
if (getBlockData6D() && fps > 0)
{
List<DataPosition6D> l6d = DataUtility.getDataOfType(DataPosition6D.class, dataContainer);
if (l6d.size() > 0)
{
if (last6d == 0 || (last6d + (1.0/ (double)fps * 1000.0) < System.currentTimeMillis()))
{
last6d = System.currentTimeMillis();
return dataContainer;
}else
{
return null;
}
}
}
return dataContainer;
}
public IData process(DataPosition2D d2d)
{
if (multiScreenMode)
{
if (d2d.getX()== 0 && d2d.getY() == 0)
{
if (prevD2D.getX() > 0 && prevD2D.getY() > 0)
{
d2d = prevD2D.getClone();
prevD2D.setX(0);
prevD2D.setY(0);
}
}
}
// d2dHistory.add(new Point2d(d2d.getX(),d2d.getY()))
if (d2d.hasAttribute(TrackingConstant.RIGIDBODYID) && this.rigidBodyID > 0)
{
if (Integer.valueOf(d2d.getAttribute(TrackingConstant.RIGIDBODYID).toString()) != this.rigidBodyID)
return null;
}
if (keyPressed && getBlockData2D())
{
return null;
}else
{
return d2d;
}
}
public IData process(DataPosition3D d3d)
{
if (d3d.hasAttribute(TrackingConstant.RIGIDBODYID))
{
if (Integer.valueOf(d3d.getAttribute(TrackingConstant.RIGIDBODYID).toString()) == this.rigidBodyID)
return null;
}
if (keyPressed && getBlockData3D())
{
return null;
}else
{
return d3d;
}
}
public IData process(DataPosition6D d6d)
{
if (d6d.hasAttribute(TrackingConstant.RIGIDBODYID))
{
if (Integer.valueOf(d6d.getAttribute(TrackingConstant.RIGIDBODYID).toString()) == this.rigidBodyID)
return null;
}
if (keyPressed && getBlockData6D())
{
return null;
}else
{
return d6d;
}
}
public DataDigital process(DataDigital dataDigital)
{
if (dataDigital.hasAttribute(Keyboard.KEY_EVENT))
{
Integer key_event = (Integer) dataDigital.getAttribute(Keyboard.KEY_EVENT);
System.out.println(key_event);
System.out.println(KeyStroke.getKeyStroke(this.keyStroke) + " == " + KeyStroke.getKeyStroke(key_event.intValue(),0));
if (KeyStroke.getKeyStroke(this.keyStroke) == KeyStroke.getKeyStroke(key_event.intValue(),0))
{
if (dataDigital.getFlag())
keyPressed = !keyPressed;
}
}
if (keyPressed && getBlockDataDigital())
return null;
else
return dataDigital;
}
}