/*
* UdpParser.java
*
* Created on November 12, 2007, 9:39 AM
*
*
*/
package logic;
import messages.PlaneDataObject;
/**
* UDP Parser, der X-Plane-UDP-Daten für die interne Verwendung transformiert.
* @author David Merz
*/
public class UdpParser {
/**
* Generiert eine neue Instanz des UDP-Parser
*/
public UdpParser() {
}
/**
* Transformiert UDP-Daten in ein PlaneDataObject.
* Die Methode liest nur Breiten- und Laengengrade sowie Hoehe über Meer aus (ID 18).
* Andere Byte-Packets werden verworfen. Falls kein Paket mit ID 18 existiert, wird <code>null</code> zurückgegeben.
* @param buffer Byte-Array; UDP input von XPlane.
* @param ip Die IP des Senders. Wird für dne Namen des PlaneDataObjects verwendet.
* @return PlaneDataObject oder null.
*/
public final PlaneDataObject getPlaneData(final byte[] buffer, final String ip) {
//Checks for DataObject No. 18 from XPlane, rest is discarded. If no Object 18 exists, return is null
if ((buffer != null & ip != null)) {
int currentIndex = 5;
while (currentIndex + 4 < buffer.length) {
int indexNum = 0;
for (int i = currentIndex; i < currentIndex + 4; i++) {
indexNum <<= 8;
indexNum += new Byte(buffer[i]).intValue();
}
if (indexNum == 18 && currentIndex + 16 < buffer.length) {
return new PlaneDataObject(ip,"xplane8",
this.getData(buffer, currentIndex + 4),
this.getData(buffer, currentIndex + 8),
this.getData(buffer, currentIndex + 12),0,0);
} else if (currentIndex + 36 < buffer.length) {
currentIndex += 36;
} else {
return null;
}
}
}
return null;
}
/**
* Wandelt Bytestrings in Float-Werte um.
* @param buffer Der Bytearray, aus dem der Float ausgelesen wird.
* @param start Start-Index, ab welchem gelesen wird
* @return Rückgabe: Float-Wert aus dem Bytestring.
*/
private float getData(final byte[] buffer, final int start) {
return java.nio.ByteBuffer.wrap(buffer).getFloat(start);
}
}