package kukaWii.wiiHandle.filter; import java.util.ArrayList; import java.util.List; import kukaWii.wiiHandle.packet.AbstractPacket; import kukaWii.wiiHandle.packet.AccelerometerPacket; import kukaWii.wiiHandle.packet.MotionPlusPacket; public class InterferenceFilter extends AbstractPacketFilter { double xbefore = 0; double ybefore = 0; double zbefore = 0; //Dieser Filter behandelt einfachste Störungen und zu schnelle Bewegungen @Override public AbstractPacket compute(AbstractPacket input) { List<AbstractPacket> queue = new ArrayList<AbstractPacket>(); input = maxG(input); input = interfere(input); return input; } private boolean compare(double x, double y, double z) { if (x != 0 && y != 0 && z != 0) { if (x > xbefore * 2 || y > ybefore * 2 || z > zbefore * 2) { return true; } xbefore = x; ybefore = y; zbefore = z; } return false; } //Ab einem Wert von 4G wird die beschleunigung als zu schnell angesehen und verwirft das Packet private AbstractPacket maxG(AbstractPacket packet) { if (packet instanceof AccelerometerPacket) { double x, y, z; x = ((AccelerometerPacket) packet).getX(); y = ((AccelerometerPacket) packet).getY(); z = ((AccelerometerPacket) packet).getZ(); if (x >= 4 || y >= 4 || z >= 4) { return null; } } return packet; } //Wenn ein Packet unmöglich zu den anderen Packets passt, dann wird dieses verworfen. //TODO empirische Untersuchung, was es für Interferenzen geben könnte. private AbstractPacket interfere(AbstractPacket packet) { double x = 0; double y = 0; double z = 0; if (packet instanceof AccelerometerPacket) { x = ((AccelerometerPacket) packet).getX(); y = ((AccelerometerPacket) packet).getY(); z = ((AccelerometerPacket) packet).getZ(); boolean toogreat = compare(x, y, z); if (toogreat == true) { return null; } } if (packet instanceof MotionPlusPacket) { double roll; double pitch; double yaw; } return packet; } }