/**
*
*/
package org.squidy.nodes;
import java.awt.event.KeyEvent;
import java.util.concurrent.ConcurrentLinkedQueue;
import javax.xml.bind.annotation.XmlType;
import org.squidy.manager.data.IData;
import org.squidy.manager.data.Processor;
import org.squidy.manager.data.impl.DataDigital;
import org.squidy.manager.data.impl.DataKey;
import org.squidy.manager.data.impl.DataPosition2D;
import org.squidy.manager.model.AbstractNode;
/**
* <code>StaticGestureRecognizer2D</code>.
*
* <pre>
* Date: September 20, 2010
* Time: 11:57:02 AM
* </pre>
*
* @author Roman Rädle, <a
* href="mailto:Roman.Raedle@uni-konstanz.de">Roman.
* Raedle@uni-konstanz.de</a>, University of Konstanz
* @version $Id$
* @since 1.5
*/
@XmlType(name = "StaticGestureRecognizer2D")
@Processor(
types = { Processor.Type.OUTPUT },
name = "Static Gesture Recognizer 2D",
tags = { "gesture", "recognizer", "static" }
)
public class StaticGestureRecognizer2D extends AbstractNode {
// ################################################################################
// BEGIN OF PROPERTIES
// ################################################################################
// ################################################################################
// END OF PROPERTIES
// ################################################################################
private ConcurrentLinkedQueue<DataPosition2D> dataPositions;
private long releaseTimestamp = 0;
/* (non-Javadoc)
* @see org.squidy.manager.model.AbstractNode#onStart()
*/
@Override
public void onStart() {
super.onStart();
dataPositions = new ConcurrentLinkedQueue<DataPosition2D>();
}
/* (non-Javadoc)
* @see org.squidy.manager.model.AbstractNode#onStop()
*/
@Override
public void onStop() {
super.onStop();
dataPositions.clear();
dataPositions = null;
}
private boolean slideMode = false;
/**
* @param dataPosition2D
* @return
*/
public IData process(DataPosition2D dataPosition2D) {
// if (!slideMode && iPoint.TRACKER_STATE_VICTORY.equals(dataPosition2D.getAttribute(iPoint.TRACKER_STATE))) {
// System.out.println("SHOW SLIDES");
// slideMode = true;
// return null;
// }
//
// slideMode = false;
// Continue only if full hand is tracked.
if (!dataPosition2D.hasAttribute(iPoint.TRACKER_STATE) ||
!iPoint.TRACKER_STATE_FULL_HAND.equals(dataPosition2D.getAttribute(iPoint.TRACKER_STATE)))
return dataPosition2D;
if (dataPosition2D.getX() < 0.0001) {
return dataPosition2D;
}
if (System.currentTimeMillis() - releaseTimestamp < 2000) {
return dataPosition2D;
}
// Add current position.
dataPositions.add(dataPosition2D);
if (dataPositions.size() < 10) {
return dataPosition2D;
}
// Remove data if queue size is larger than 10.
while (dataPositions.size() > 10) {
dataPositions.poll();
}
// System.out.println(dataPosition2D.getX());
boolean leftToRight = false;
boolean rightToLeft = false;
double xMovement = dataPositions.peek().getX();
int counter = 0;
for (DataPosition2D position : dataPositions) {
if (leftToRight && rightToLeft) {
break;
}
// System.out.println(position.getX());
if (xMovement > position.getX()) {
leftToRight = true;
counter++;
}
else if (xMovement < position.getX()) {
rightToLeft = true;
counter++;
}
xMovement = position.getX();
}
// System.out.println(counter + " | " + leftToRight + " | " + rightToLeft);
// Reset queue if movement switched into another direction.
// if (leftToRight && rightToLeft) {
// System.out.println("clear");
//// releaseTimestamp = System.currentTimeMillis();
// dataPositions.clear();
// return dataPosition2D;
// }
// else
if (leftToRight && !rightToLeft && counter > 8) {
System.out.println("Release left to right");
releaseTimestamp = System.currentTimeMillis();
dataPositions.clear();
DataDigital keyDown = new DataDigital(StaticGestureRecognizer2D.class, true);
keyDown.setAttribute(Keyboard.KEY_EVENT, KeyEvent.VK_RIGHT);
publish(keyDown);
DataDigital keyUp = new DataDigital(StaticGestureRecognizer2D.class, false);
keyUp.setAttribute(Keyboard.KEY_EVENT, KeyEvent.VK_RIGHT);
publish(keyUp);
}
else if (!leftToRight && rightToLeft && counter > 8) {
System.out.println("Release right to left");
releaseTimestamp = System.currentTimeMillis();
dataPositions.clear();
DataDigital keyDown = new DataDigital(StaticGestureRecognizer2D.class, true);
keyDown.setAttribute(Keyboard.KEY_EVENT, KeyEvent.VK_LEFT);
publish(keyDown);
DataDigital keyUp = new DataDigital(StaticGestureRecognizer2D.class, false);
keyUp.setAttribute(Keyboard.KEY_EVENT, KeyEvent.VK_LEFT);
publish(keyUp);
}
return dataPosition2D;
}
}