/** * */ package org.squidy.nodes; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlType; import org.squidy.manager.controls.Slider; import org.squidy.manager.data.IData; import org.squidy.manager.data.Processor; import org.squidy.manager.data.Property; import org.squidy.manager.data.Processor.Status; import org.squidy.manager.data.impl.DataButton; import org.squidy.manager.data.impl.DataDigital; import org.squidy.manager.data.impl.DataPosition2D; import org.squidy.manager.model.AbstractNode; /** * <code>DataPositionDwelling</code>. * * <pre> * Date: Sep 21, 2010 * Time: 6:48:27 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: DataPositionDwelling.java 772 2011-09-16 15:39:44Z raedle $ * @since 1.5.0 */ @XmlType(name = "DataPositionDwelling") @Processor( name = "DataPosition Dwelling", types = { Processor.Type.FILTER }, tags = { "screen", "dwelling", "position" }, status = Status.UNSTABLE ) public class DataPositionDwelling extends AbstractNode { // ################################################################################ // BEGIN OF PROPERTIES // ################################################################################ @XmlAttribute(name = "release-threshold") @Property( name = "Release Threshold", suffix = "\u0025" ) @Slider( minimumValue = 0, maximumValue = 100, majorTicks = 50, minorTicks = 25, showTicks = true, showLabels = true, type = Integer.class ) private int releaseThreshold = 250; public int getReleaseThreshold() { return releaseThreshold; } public void setReleaseThreshold(int releaseThreshold) { this.releaseThreshold = releaseThreshold; } @XmlAttribute(name = "movement-threshold") @Property( name = "Movement Threshold", suffix = "\u0025" ) @Slider( minimumValue = 0, maximumValue = 100, majorTicks = 50, minorTicks = 25, showTicks = true, showLabels = true, type = Integer.class ) private int movementThreshold = 2; public int getMovementThreshold() { return movementThreshold; } public void setMovementThreshold(int movementThreshold) { this.movementThreshold = movementThreshold; } @XmlAttribute(name = "minimum-dwelling-time") @Property( name = "Minimum Dwelling Time", suffix = "ms" ) @Slider( minimumValue = 0, maximumValue = 5000, majorTicks = 1000, minorTicks = 500, showTicks = true, showLabels = true, type = Integer.class ) private int minimumDwellingTime = 750; public int getMinimumDwellingTime() { return minimumDwellingTime; } public void setMinimumDwellingTime(int minimumDwellingTime) { this.minimumDwellingTime = minimumDwellingTime; } @XmlAttribute(name = "maximum-dwelling-time") @Property( name = "Maximum Dwelling Time", suffix = "ms" ) @Slider( minimumValue = 0, maximumValue = 5000, majorTicks = 1000, minorTicks = 500, showTicks = true, showLabels = true, type = Integer.class ) private int maximumDwellingTime = 1000; public int getMaximumDwellingTime() { return maximumDwellingTime; } public void setMaximumDwellingTime(int maximumDwellingTime) { this.maximumDwellingTime = maximumDwellingTime; } // ################################################################################ // END OF PROPERTIES // ################################################################################ private DataPosition2D dwellAroundPosition; private long lastReleaseTime; public IData process(DataPosition2D dataPosition2D) { if (System.currentTimeMillis() - lastReleaseTime < releaseThreshold) { return null; } if (dwellAroundPosition == null) { dwellAroundPosition = dataPosition2D.getClone(); return dataPosition2D; } long dwellTime = dataPosition2D.getTimestamp() - dwellAroundPosition.getTimestamp(); double dwellDistance = dwellAroundPosition.distance(dataPosition2D); if (dwellTime > maximumDwellingTime) { dwellAroundPosition = null; return dataPosition2D; } if (dwellDistance > ((double) movementThreshold) / 100.0) { dwellAroundPosition = null; return dataPosition2D; } if (dwellTime > minimumDwellingTime) { publish(new DataButton(DataPositionDwelling.class, DataButton.BUTTON_1, true)); try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } publish(new DataButton(DataPositionDwelling.class, DataButton.BUTTON_1, false)); lastReleaseTime = System.currentTimeMillis(); return null; } return dataPosition2D; } }