package kukaWii.wiiHandle.filter; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.List; import java.util.concurrent.BlockingQueue; import kukaWii.wiiHandle.packet.AbstractPacket; import kukaWii.wiiHandle.packet.AccelerometerPacket; import kukaWii.wiiHandle.packet.MotionPlusPacket; /* * Dies ist eine Beispielimplementation eines Durchschnittswertefilters. * Diese Klasse schmeißt stark abweichende Werte, oder Störungen aus dem Wertestrom und puffert nach. */ public class MovingAverageFilter extends AbstractPacketFilter { private List<AbstractPacket> queue = new ArrayList<AbstractPacket>(); @Override public AbstractPacket compute(AbstractPacket input) { double x = 0; double y = 0; double z = 0; boolean processed = false; AbstractPacket calcInput = null; //Füge ein Packet der Liste hinzu. if (input instanceof AccelerometerPacket) { x = ((AccelerometerPacket) input).getX(); y = ((AccelerometerPacket) input).getY(); z = ((AccelerometerPacket) input).getZ(); logValues(x, y, z); queue.add(input); } /* if (input instanceof MotionPlusPacket) { double pitch = ((MotionPlusPacket) input).getPitch(); double pitchdownspeed = ((MotionPlusPacket) input) .getPitchDownSpeed(); double roll = ((MotionPlusPacket) input).getRoll(); double rollleftspeed = ((MotionPlusPacket) input) .getRollLeftSpeed(); double yaw = ((MotionPlusPacket) input).getYaw(); double yawleftspeed = ((MotionPlusPacket) input).getYawLeftSpeed(); } */ //Wenn 5 Pakete gequeued wurden, dann fange die Berechnung an. //Testimplementation von einem Durchschnittswert. if (queue.lastIndexOf(input) == 4) { double[] calcX = new double[5]; double[] calcY = new double[5]; double[] calcZ = new double[5]; for (int i = 0; i <= queue.lastIndexOf(input); i++) { AbstractPacket packet = queue.get(i); if (packet instanceof AccelerometerPacket){ calcX[i] = ((AccelerometerPacket) packet).getX(); calcY[i] = ((AccelerometerPacket) packet).getY(); calcZ[i] = ((AccelerometerPacket) packet).getZ(); } } for (int i = 0; i <= calcX.length; i++){ calcX[0] = calcX[0] + calcX[i]; calcY[0] = calcY[0] + calcY[i]; calcZ[0] = calcZ[0] + calcZ[i]; } calcX[0] = calcX[0]/calcX.length; calcY[0] = calcY[0]/calcY.length; calcZ[0] = calcZ[0]/calcZ.length; ((AccelerometerPacket)calcInput).setX(calcX[0]); ((AccelerometerPacket)calcInput).setX(calcY[0]); ((AccelerometerPacket)calcInput).setX(calcZ[0]); processed = true; } //Gebe das neu errechnete Paket zurück wenn processed = true ist, ansonsten null. if (processed == true) { return calcInput; } else return null; } private void logValues(double x, double y, double z) { System.out.println("X Beschleunigung: " + x); System.out.println("Y Beschleunigung: " + y); System.out.println("Z Beschleunigung: " + z); } }