package org.squidy.nodes;
import java.net.DatagramPacket;
import java.nio.charset.Charset;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlType;
import org.squidy.manager.controls.Slider;
import org.squidy.manager.data.DataConstant;
import org.squidy.manager.data.Processor;
import org.squidy.manager.data.Property;
import org.squidy.manager.data.impl.DataPosition2D;
import org.squidy.manager.model.AbstractNode;
import org.squidy.manager.protocol.udp.UDPListener;
import org.squidy.manager.protocol.udp.UDPServer;
import org.squidy.nodes.ipoint.HHIHandData;
import org.squidy.nodes.ipoint.Position;
import sun.tools.tree.DoStatement;
import com.google.gson.Gson;
/**
* <code>iPoint</code>.
*
* <pre>
* Date: September 17, 2010
* Time: 10:47:02 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$
* @since 1.5
*/
@XmlType(name = "iPoint")
@Processor(
types = { Processor.Type.OUTPUT },
name = "iPoint",
tags = { "HHI", "Heinrich Hertz Institute", "Fraunhofer", "gesture", "pointing", "freehand" }
)
public class iPoint extends AbstractNode {
// public static final DataConstant TRACKER_STATE = DataConstant.get(TrackerState.class, "TRACKER_STATE");
//
// public enum TrackerState {
// POINTING, FULL_HAND, FIST, FINGER_AND_THUMB, VICTORY
// }
public static final DataConstant TRACKER_STATE = DataConstant.get(String.class, "TRACKER_STATE");
public static final String TRACKER_STATE_INVALID = "Invalid";
public static final String TRACKER_STATE_POINTING = "pointing";
public static final String TRACKER_STATE_FULL_HAND = "full hand";
public static final String TRACKER_STATE_FIST = "fist";
public static final String TRACKER_STATE_FINGER_AND_THUMB = "finger and thumb";
public static final String TRACKER_STATE_VICTORY = "victory";
// ################################################################################
// BEGIN OF PROPERTIES
// ################################################################################
@XmlAttribute(name = "boundary-x-left")
@Property(
name = "Boundary X Left",
description = "Indicates the left boundary value of the x-axis"
)
@Slider(
minimumValue = -250,
maximumValue = 250,
majorTicks = 100,
minorTicks = 50,
showTicks = true,
showLabels = true,
type = Integer.class
)
private int boundaryXLeft = -140;
public int getBoundaryXLeft() {
return boundaryXLeft;
}
public void setBoundaryXLeft(int boundaryXLeft) {
this.boundaryXLeft = boundaryXLeft;
}
// ################################################################################
@XmlAttribute(name = "boundary-x-right")
@Property(
name = "Boundary X Right",
description = "Indicates the right boundary value of the x-axis"
)
@Slider(
minimumValue = -250,
maximumValue = 250,
majorTicks = 100,
minorTicks = 50,
showTicks = true,
showLabels = true,
type = Integer.class
)
private int boundaryXRight = 140;
public int getBoundaryXRight() {
return boundaryXRight;
}
public void setBoundaryXRight(int boundaryXRight) {
this.boundaryXRight = boundaryXRight;
}
// ################################################################################
@XmlAttribute(name = "boundary-y-upper")
@Property(
name = "Boundary Y Upper",
description = "Indicates the upper boundary value of the y-axis"
)
@Slider(
minimumValue = 0,
maximumValue = 1000,
majorTicks = 250,
minorTicks = 100,
showTicks = true,
showLabels = true,
type = Integer.class
)
private int boundaryYUpper = 600;
public int getBoundaryYUpper() {
return boundaryYUpper;
}
public void setBoundaryYUpper(int boundaryYUpper) {
this.boundaryYUpper = boundaryYUpper;
}
// ################################################################################
@XmlAttribute(name = "boundary-y-lower")
@Property(
name = "Boundary Y Lower",
description = "Indicates the lower boundary value of the y-axis"
)
@Slider(
minimumValue = 0,
maximumValue = 1000,
majorTicks = 250,
minorTicks = 100,
showTicks = true,
showLabels = true,
type = Integer.class
)
private int boundaryYLower = 280;
public int getBoundaryYLower() {
return boundaryYLower;
}
public void setBoundaryYLower(int boundaryYLower) {
this.boundaryYLower = boundaryYLower;
}
// ################################################################################
// END OF PROPERTIES
// ################################################################################
private UDPServer server;
/* (non-Javadoc)
* @see org.squidy.manager.model.AbstractNode#onStart()
*/
@Override
public void onStart() {
super.onStart();
final Gson gson = new Gson();
server = new UDPServer(3000);
server.addUDPListener(new UDPListener() {
public void parseData(String s) {
// System.out.printf("ECHO %s\n", s);
}
public void parseData(byte[] data) {
// System.out.println(data.length);
//// HHIHandData handData = gson.fromJson(new String(data, Charset.forName("UTF-8")), HHIHandData.class);
//
// System.out.println(new String(data, Charset.forName("UTF-8")));
}
public void receive(DatagramPacket packet) {
String s = new String(packet.getData(), packet.getOffset(), packet.getLength(), Charset.forName("UTF-8"));
// System.out.println(s);
HHIHandData handData = gson.fromJson(s, HHIHandData.class);
if (TRACKER_STATE_POINTING.equals(handData.getAction()) ||
TRACKER_STATE_VICTORY.equals(handData.getAction()) ||
TRACKER_STATE_FINGER_AND_THUMB.equals(handData.getAction())) {
doPublishIfIsInBoundaries(handData.getFingerTip(), boundaryXLeft, boundaryXRight, boundaryYUpper, boundaryYLower, handData.getAction());
}
else if (TRACKER_STATE_FULL_HAND.equals(handData.getAction()) ||
TRACKER_STATE_FIST.equals(handData.getAction())) {
// System.out.println(handData.getHandCenter());
doPublishIfIsInBoundaries(handData.getHandCenter(), -200, 200, 145, 45, handData.getAction());
}
}
});
// Gson gson = new Gson();
// gson.
}
private void doPublishIfIsInBoundaries(Position position, int boundaryXLeft, int boundaryXRight, int boundaryYUpper, int boundaryYLower, String action) {
double x = 0;
double posX = position.getdPosX();
if (posX >= boundaryXLeft && posX <= boundaryXRight) {
x = (posX - boundaryXLeft) / Math.abs(boundaryXRight - boundaryXLeft);
// minimize tracking error rate
if (x < 0.01) {
return;
}
else if (x > 0.99)
return;
}
double y = 0;
double posY = position.getdPosY();
if (posY >= boundaryYLower && posY <= boundaryYUpper) {
y = (posY - boundaryYLower) / Math.abs(boundaryYUpper - boundaryYLower);
// minimize tracking error rate
if (y < 0.01) {
return;
}
else if (y > 0.99)
return;
}
if (x == 0 || y == 0)
return;
DataPosition2D dataPosition2D = new DataPosition2D(iPoint.class, x, y);
dataPosition2D.setAttribute(TRACKER_STATE, action);
publish(dataPosition2D);
}
/* (non-Javadoc)
* @see org.squidy.manager.model.AbstractNode#onStop()
*/
@Override
public void onStop() {
super.onStop();
if (server != null) {
server.close();
server = null;
}
}
}