Cleaned up implementation of getDREFs in the Java client.

- Removed unnecessary loop to try to read several times.
 - Fixed the way that readUDP detects the length of received packets.
This commit is contained in:
Jason Watkins
2015-05-05 11:53:52 -07:00
parent 7f1af73c3c
commit 8f4d50929f

View File

@@ -175,12 +175,12 @@ public class XPlaneConnect implements AutoCloseable
*/
private byte[] readUDP() throws IOException
{
byte[] buffer = new byte[2048];
byte[] buffer = new byte[65536];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
try
{
socket.receive(packet);
return Arrays.copyOf(buffer, buffer[4]);
return Arrays.copyOf(buffer, packet.getLength());
}
catch (SocketTimeoutException ex)
{
@@ -293,37 +293,29 @@ public class XPlaneConnect implements AutoCloseable
sendUDP(os.toByteArray());
//Read response
for(int i = 0; i < 40; ++i)
byte[] data = readUDP();
if(data.length == 0)
{
byte[] data = readUDP();
if(data.length == 0)
{
continue;
}
if(data.length < 6)
{
throw new Error("Response too short"); //TODO: Make custom error type
}
if(data[5] != drefs.length)
{
throw new Error("Unexpected response length"); //TODO: Make custom error type
}
float[][] result = new float[drefs.length][];
ByteBuffer bb = ByteBuffer.wrap(data);
bb.order(ByteOrder.LITTLE_ENDIAN);
int cur = 6;
for(int j = 0; j < result.length; ++j)
{
result[j] = new float[data[cur++]];
for(int k = 0; k < result[j].length; ++k) //TODO: There must be a better way to do this
{
result[j][k] = bb.getFloat(cur);
cur += 4;
}
}
return result;
throw new IOException("No response received.");
}
throw new IOException("No response received.");
if(data.length < 6)
{
throw new IOException("Response too short");
}
float[][] result = new float[drefs.length][];
ByteBuffer bb = ByteBuffer.wrap(data);
bb.order(ByteOrder.LITTLE_ENDIAN);
int cur = 6;
for(int j = 0; j < result.length; ++j)
{
result[j] = new float[data[cur++]];
for(int k = 0; k < result[j].length; ++k) //TODO: There must be a better way to do this
{
result[j][k] = bb.getFloat(cur);
cur += 4;
}
}
return result;
}
public void sendDREF(String dref, float value) throws IOException