Added getCTRL and getPOSI support to Java client.
This commit is contained in:
@@ -398,6 +398,47 @@ public class XPlaneConnect implements AutoCloseable
|
|||||||
sendUDP(os.toByteArray());
|
sendUDP(os.toByteArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the control surface information for the specified airplane.
|
||||||
|
*
|
||||||
|
* @param ac The aircraft to get control surface information for.
|
||||||
|
* @return An array containing control surface data in the same format as {@code sendCTRL}.
|
||||||
|
* @throws IOException If the command cannot be sent or a response cannot be read.
|
||||||
|
*/
|
||||||
|
public float[] getCTRL(int ac) throws IOException
|
||||||
|
{
|
||||||
|
// Send request
|
||||||
|
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||||
|
os.write("GETC".getBytes(StandardCharsets.UTF_8));
|
||||||
|
os.write(0xFF); //Placeholder for message length
|
||||||
|
os.write(ac);
|
||||||
|
sendUDP(os.toByteArray());
|
||||||
|
|
||||||
|
// Read response
|
||||||
|
byte[] data = readUDP();
|
||||||
|
if(data.length == 0)
|
||||||
|
{
|
||||||
|
throw new IOException("No response received.");
|
||||||
|
}
|
||||||
|
if(data.length < 31)
|
||||||
|
{
|
||||||
|
throw new IOException("Response too short");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse response
|
||||||
|
float[] result = new float[7];
|
||||||
|
ByteBuffer bb = ByteBuffer.wrap(data);
|
||||||
|
bb.order(ByteOrder.LITTLE_ENDIAN);
|
||||||
|
result[0] = bb.getFloat(5);
|
||||||
|
result[1] = bb.getFloat(9);
|
||||||
|
result[2] = bb.getFloat(13);
|
||||||
|
result[3] = bb.getFloat(17);
|
||||||
|
result[4] = bb.get(21);
|
||||||
|
result[5] = bb.getFloat(22);
|
||||||
|
result[6] = bb.getFloat(27);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sends command to X-Plane setting control surfaces on the player ac.
|
* Sends command to X-Plane setting control surfaces on the player ac.
|
||||||
*
|
*
|
||||||
@@ -494,6 +535,44 @@ public class XPlaneConnect implements AutoCloseable
|
|||||||
sendUDP(os.toByteArray());
|
sendUDP(os.toByteArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets position information for the specified airplane.
|
||||||
|
*
|
||||||
|
* @param ac The aircraft to get position information for.
|
||||||
|
* @return An array containing control surface data in the same format as {@code sendPOSI}.
|
||||||
|
* @throws IOException If the command cannot be sent or a response cannot be read.
|
||||||
|
*/
|
||||||
|
public float[] getPOSI(int ac) throws IOException
|
||||||
|
{
|
||||||
|
// Send request
|
||||||
|
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||||
|
os.write("GETP".getBytes(StandardCharsets.UTF_8));
|
||||||
|
os.write(0xFF); //Placeholder for message length
|
||||||
|
os.write(ac);
|
||||||
|
sendUDP(os.toByteArray());
|
||||||
|
|
||||||
|
// Read response
|
||||||
|
byte[] data = readUDP();
|
||||||
|
if(data.length == 0)
|
||||||
|
{
|
||||||
|
throw new IOException("No response received.");
|
||||||
|
}
|
||||||
|
if(data.length < 34)
|
||||||
|
{
|
||||||
|
throw new IOException("Response too short");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse response
|
||||||
|
float[] result = new float[7];
|
||||||
|
ByteBuffer bb = ByteBuffer.wrap(data);
|
||||||
|
bb.order(ByteOrder.LITTLE_ENDIAN);
|
||||||
|
for(int i = 0; i < 7; ++i)
|
||||||
|
{
|
||||||
|
result[i] = bb.getFloat(6 + 4 * i);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the position of the player ac.
|
* Sets the position of the player ac.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -698,4 +698,31 @@ public class XPlaneConnectTest
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetPOSI() throws IOException
|
||||||
|
{
|
||||||
|
float[] values = { 37.524F, -122.06899F, 2500.0F, 45.0F, -45.0F, 15.0F, 1.0F };
|
||||||
|
try(XPlaneConnect xpc = new XPlaneConnect())
|
||||||
|
{
|
||||||
|
xpc.pauseSim(true);
|
||||||
|
xpc.sendPOSI(values);
|
||||||
|
float[] actual = xpc.getPOSI(0);
|
||||||
|
|
||||||
|
assertArrayEquals(values, actual, 1e-4F);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetCTRL() throws IOException
|
||||||
|
{
|
||||||
|
float[] values = { 0.0F, 0.0F, 0.0F, 0.8F, 1.0F, 0.5F, -1.5F };
|
||||||
|
try(XPlaneConnect xpc = new XPlaneConnect())
|
||||||
|
{
|
||||||
|
xpc.sendCTRL(values);
|
||||||
|
float[] actual = xpc.getCTRL(0);
|
||||||
|
|
||||||
|
assertArrayEquals(values, actual, 1e-4F);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user