/*
* Copyright Inria and Bordeaux University.
* Author Jeremy Laviole. jeremy.laviole@inria.fr
* PapAR project is the open-source version of the
* PapARt project. License is LGPLv3, distributed with the sources.
* This project can also distributed with standard commercial
* licence for closed-sources projects.
*/
package fr.inria.papart.calibration;
import processing.core.PApplet;
import processing.data.XML;
import toxi.geom.Vec3D;
/**
*
* @author jiii
*/
public class PlanarTouchCalibration extends Calibration {
static final String PLANAR_TOUCH_CALIBRATION_XML_NAME = "PlanarTouchCalibration";
static final String MAX_DIST_XML_NAME = "MaxDistance";
static final String MIN_COPO_SIZE_XML_NAME = "MinConnectedCompoSize";
static final String MIN_HEIGHT_XML_NAME = "MinHeight";
static final String MAX_RECURSION_XML_NAME = "MaxRecursion";
static final String TRACKING_FORGET_TIME_XML_NAME = "TrackingForgetTime";
static final String TRACKING_MAX_DIST_TIME_XML_NAME = "TrackingMaxDist";
static final String SEARCH_DEPTH_XML_NAME = "SearchDepth";
static final String PRECISION_XML_NAME = "Precision";
// Variable parameters... going to a specific class for saving.
private float maximumDistance = 10f; // in mm
private float minimumHeight = 1; // mm
private int minimumComponentSize = 3; // in px
private int searchDepth = 10;
private int maximumRecursion = 500;
private int precision = 2; // pixels
// tracking
private int trackingForgetTime = 250; // ms
private float trackingMaxDistance = 30; // in mm
// TODO: implement this !
@Override
public boolean isValid() {
return true;
}
private XML createXML() {
XML root = new XML(PLANAR_TOUCH_CALIBRATION_XML_NAME);
setIn(root);
return root;
}
private void setIn(XML xml) {
xml.setFloat(MAX_DIST_XML_NAME, maximumDistance);
xml.setFloat(MIN_HEIGHT_XML_NAME, minimumHeight);
xml.setInt(MIN_COPO_SIZE_XML_NAME, minimumComponentSize);
xml.setInt(MAX_RECURSION_XML_NAME, maximumRecursion);
xml.setInt(SEARCH_DEPTH_XML_NAME, searchDepth);
xml.setInt(PRECISION_XML_NAME, precision);
xml.setInt(TRACKING_FORGET_TIME_XML_NAME, trackingForgetTime);
xml.setFloat(TRACKING_MAX_DIST_TIME_XML_NAME, trackingMaxDistance);
}
private void getFrom(XML xml) {
maximumDistance = xml.getFloat(MAX_DIST_XML_NAME);
minimumComponentSize = xml.getInt(MIN_COPO_SIZE_XML_NAME);
minimumHeight = xml.getFloat(MIN_HEIGHT_XML_NAME);
maximumRecursion = xml.getInt(MAX_RECURSION_XML_NAME);
searchDepth = xml.getInt(SEARCH_DEPTH_XML_NAME);
precision = xml.getInt(PRECISION_XML_NAME);
trackingForgetTime = xml.getInt(TRACKING_FORGET_TIME_XML_NAME);
trackingMaxDistance = xml.getFloat(TRACKING_MAX_DIST_TIME_XML_NAME);
}
public void setTo(PlanarTouchCalibration calib) {
this.maximumDistance = calib.maximumDistance;
this.maximumRecursion = calib.maximumRecursion;
this.minimumComponentSize = calib.minimumComponentSize;
this.minimumHeight = calib.minimumHeight;
this.searchDepth = calib.searchDepth;
this.precision = calib.precision;
this.trackingForgetTime = calib.trackingForgetTime;
this.trackingMaxDistance = calib.trackingMaxDistance;
}
@Override
public void addTo(XML xml) {
xml.addChild(createXML());
}
@Override
public void replaceIn(XML xml) {
XML element = xml.getChild(PLANAR_TOUCH_CALIBRATION_XML_NAME);
setIn(element);
}
@Override
public void loadFrom(PApplet parent, String fileName) {
XML root = parent.loadXML(fileName);
XML planarTouchCalibNode = root.getChild(PLANAR_TOUCH_CALIBRATION_XML_NAME);
getFrom(planarTouchCalibNode);
}
public float getMaximumDistance() {
return maximumDistance;
}
public void setMaximumDistance(float maximumDistance) {
this.maximumDistance = maximumDistance;
}
public int getMinimumComponentSize() {
return minimumComponentSize;
}
public void setMinimumComponentSize(int minimumComponentSize) {
this.minimumComponentSize = minimumComponentSize;
}
public float getMinimumHeight() {
return minimumHeight;
}
public void setMinimumHeight(float minimumHeight) {
this.minimumHeight = minimumHeight;
}
public int getMaximumRecursion() {
return maximumRecursion;
}
public void setMaximumRecursion(int maximumRecursion) {
this.maximumRecursion = maximumRecursion;
}
public int getTrackingForgetTime() {
return trackingForgetTime;
}
public void setTrackingForgetTime(int trackingForgetTime) {
this.trackingForgetTime = trackingForgetTime;
}
public int getSearchDepth() {
return searchDepth;
}
/**
* Number of neighbours seen at a time.
*
* @param searchDepth
*/
public void setSearchDepth(int searchDepth) {
this.searchDepth = searchDepth;
}
public int getPrecision() {
return precision;
}
/**
* Precision is how much we divide the resolution on X and Y. A precision of
* 1 is the best, 2 or 3 is OKĀ for touch, 4 or 5 is OK for a hovering hand
*
* @param precision
*/
public void setPrecision(int precision) {
this.precision = precision;
}
public float getTrackingMaxDistance() {
return this.trackingMaxDistance;
}
public void setTrackingMaxDistance(float trackDistance) {
this.trackingMaxDistance = trackDistance;
}
}