Merge pull request #44 from jason-watkins/feature/sendCTRL
Add support for multiplayer aircraft to sendCTRL
This commit is contained in:
@@ -373,7 +373,12 @@ short sendPOSI(struct xpcSocket recfd, short ACNum, short numArgs, float valueAr
|
|||||||
|
|
||||||
short sendCTRL(struct xpcSocket recfd, short numArgs, float valueArray[])
|
short sendCTRL(struct xpcSocket recfd, short numArgs, float valueArray[])
|
||||||
{
|
{
|
||||||
char message[26] = {0};
|
return sendpCTRL(recfd, numArgs, valueArray, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
short sendpCTRL(struct xpcSocket recfd, short numArgs, float valueArray[], char acNum)
|
||||||
|
{
|
||||||
|
char message[27] = { 0 };
|
||||||
int i;
|
int i;
|
||||||
short position = 5;
|
short position = 5;
|
||||||
|
|
||||||
@@ -406,11 +411,11 @@ short sendCTRL(struct xpcSocket recfd, short numArgs, float valueArray[])
|
|||||||
// Float Values
|
// Float Values
|
||||||
memcpy(&message[position],&val,sizeof(float));
|
memcpy(&message[position],&val,sizeof(float));
|
||||||
position += sizeof(float);
|
position += sizeof(float);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
message[position] = acNum;
|
||||||
|
|
||||||
sendUDP(recfd, message, 26);
|
sendUDP(recfd, message, 27);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -509,17 +514,21 @@ short readPOSI(struct xpcSocket recfd, float resultArray[], int arraySize, floa
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
float readCTRL(struct xpcSocket recfd, float resultArray[4], short *gear)
|
xpcCtrl readCTRL(struct xpcSocket recfd)
|
||||||
{
|
{
|
||||||
char buf[5000] = {0};
|
xpcCtrl result;
|
||||||
readUDP(recfd,buf, NULL);
|
char buf[5000] = { 0 };
|
||||||
|
readUDP(recfd, buf, NULL);
|
||||||
|
|
||||||
if (buf[0] != '\0') // Buffer is not empty
|
if (buf[0] != '\0') // Buffer is not empty
|
||||||
{
|
{
|
||||||
return parseCTRL(buf, resultArray, gear);
|
result = parseCTRL(buf);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
return NAN;
|
{
|
||||||
|
result.aircraft = -1;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//PARSE
|
//PARSE
|
||||||
@@ -610,21 +619,38 @@ short parsePOSI(const char my_message[], float resultArray[], int arraySize, flo
|
|||||||
return my_message[5]; // Aircraft
|
return my_message[5]; // Aircraft
|
||||||
}
|
}
|
||||||
|
|
||||||
float parseCTRL(const char my_message[], float resultArray[], short *gear)
|
xpcCtrl parseCTRL(const char data[])
|
||||||
{
|
{
|
||||||
int i;
|
xpcCtrl result;
|
||||||
float flaps = 0;
|
unsigned char len = data[4];
|
||||||
|
//Preconditions
|
||||||
// Controls
|
//Validate message prefix to ensure we are looking at the right kind of packet.
|
||||||
for (i = 0; i < 4; i++)
|
if (strncmp(data, "CTRL", 4) != 0)
|
||||||
{
|
{
|
||||||
memcpy(&resultArray[i],&my_message[5+4*i],4);
|
result.aircraft = -1;
|
||||||
}
|
}
|
||||||
|
//Legacy packets that don't specify an aircraft number should be 22 bytes long.
|
||||||
// Gear, Flaps
|
//Packets specifying an A/C num should be 24 bytes.
|
||||||
*gear = (short) my_message[21];
|
else if (len != 26 && len != 27)
|
||||||
|
{
|
||||||
memcpy(&flaps,&my_message[22],4);
|
result.aircraft = -1;
|
||||||
|
}
|
||||||
return flaps;
|
//Everything checks out, so we can skip over the header and copy the raw data
|
||||||
|
//into the struct.
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//NOTE: It's tempting to just do a single memcpy here, but we can't do that because the
|
||||||
|
// compiler is allowed to add padding to the struct type.
|
||||||
|
result.pitch = *((float*)(data + 5));
|
||||||
|
result.roll = *((float*)(data + 9));
|
||||||
|
result.yaw = *((float*)(data + 13));
|
||||||
|
result.throttle = *((float*)(data + 17));
|
||||||
|
result.gear = data[21];
|
||||||
|
result.flaps = *((float*)(data + 22));
|
||||||
|
if (len == 27)
|
||||||
|
{
|
||||||
|
result.aircraft = data[26];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,17 @@
|
|||||||
int sock;
|
int sock;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
float pitch;
|
||||||
|
float roll;
|
||||||
|
float yaw;
|
||||||
|
float throttle;
|
||||||
|
char gear;
|
||||||
|
float flaps;
|
||||||
|
char aircraft;
|
||||||
|
} xpcCtrl;
|
||||||
|
|
||||||
// Basic Functions
|
// Basic Functions
|
||||||
struct xpcSocket openUDP(unsigned short port, const char *xpIP, unsigned short xpPort);
|
struct xpcSocket openUDP(unsigned short port, const char *xpIP, unsigned short xpPort);
|
||||||
@@ -58,9 +69,10 @@
|
|||||||
short sendPOSI(struct xpcSocket recfd, short ACNum, short numArgs, float valueArray[]);
|
short sendPOSI(struct xpcSocket recfd, short ACNum, short numArgs, float valueArray[]);
|
||||||
|
|
||||||
// Controls
|
// Controls
|
||||||
float parseCTRL(const char my_message[], float resultArray[4], short *gear);
|
xpcCtrl parseCTRL(const char data[]);
|
||||||
float readCTRL(struct xpcSocket recfd, float resultArray[4], short *gear);
|
xpcCtrl readCTRL(struct xpcSocket recfd);
|
||||||
short sendCTRL(struct xpcSocket recfd, short numArgs, float valueArray[]);
|
short sendCTRL(struct xpcSocket recfd, short numArgs, float valueArray[]);
|
||||||
|
short sendpCTRL(struct xpcSocket recfd, short numArgs, float valueArray[], char acNum);
|
||||||
|
|
||||||
// DREF Manipulation
|
// DREF Manipulation
|
||||||
short readDREF(struct xpcSocket recfd, float *resultArray[], short arraySizes[]);
|
short readDREF(struct xpcSocket recfd, float *resultArray[], short arraySizes[]);
|
||||||
|
|||||||
@@ -410,7 +410,7 @@ public class XPlaneConnect implements AutoCloseable
|
|||||||
* @param aircraft The aircraft to set. 0 for the player's aircraft.
|
* @param aircraft The aircraft to set. 0 for the player's aircraft.
|
||||||
* @throws IOException If the command cannot be sent.
|
* @throws IOException If the command cannot be sent.
|
||||||
*/
|
*/
|
||||||
private void sendCTRL(float[] ctrl, int aircraft) throws IOException
|
public void sendCTRL(float[] ctrl, int aircraft) throws IOException
|
||||||
{
|
{
|
||||||
//Preconditions
|
//Preconditions
|
||||||
if(ctrl == null)
|
if(ctrl == null)
|
||||||
@@ -421,13 +421,9 @@ public class XPlaneConnect implements AutoCloseable
|
|||||||
{
|
{
|
||||||
throw new IllegalArgumentException("ctrl must have 6 or fewer elements.");
|
throw new IllegalArgumentException("ctrl must have 6 or fewer elements.");
|
||||||
}
|
}
|
||||||
if(aircraft < 0)
|
if(aircraft < 0 || aircraft > 9)
|
||||||
{
|
{
|
||||||
throw new IllegalArgumentException("aircraft must be non-negative.");
|
throw new IllegalArgumentException("aircraft must be non-negative and less than 9.");
|
||||||
}
|
|
||||||
if(aircraft != 0) //TODO: Implement support for non-player aircraft on plugin side.
|
|
||||||
{
|
|
||||||
throw new Error("Non-player aircraft not supported yet.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Pad command values and convert to bytes
|
//Pad command values and convert to bytes
|
||||||
@@ -461,6 +457,7 @@ public class XPlaneConnect implements AutoCloseable
|
|||||||
cur += 4;
|
cur += 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
bb.put(cur, (byte)aircraft);
|
||||||
|
|
||||||
//Build and send message
|
//Build and send message
|
||||||
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||||
|
|||||||
@@ -52,7 +52,10 @@ import XPlaneConnect.*
|
|||||||
for i=1:min(length(ctrl),length(control))
|
for i=1:min(length(ctrl),length(control))
|
||||||
control(i) = ctrl(i);
|
control(i) = ctrl(i);
|
||||||
end
|
end
|
||||||
dataStream = [dataStream, typecast(single(control),'uint8')];
|
dataStream = [dataStream, typecast(single(control(1:4)),'uint8')];
|
||||||
|
dataStream = [dataStream, uint8(control(5))];
|
||||||
|
dataStream = [dataStream, typecast(single(control(6)),'uint8')];
|
||||||
|
dataStream = [dataStream, uint8(acft)];
|
||||||
|
|
||||||
% Send DATA
|
% Send DATA
|
||||||
status = sendUDP(dataStream, IP, port);
|
status = sendUDP(dataStream, IP, port);
|
||||||
|
|||||||
@@ -234,59 +234,118 @@ short sendDATATest() // sendDATA test
|
|||||||
|
|
||||||
short sendCTRLTest() // sendCTRL test
|
short sendCTRLTest() // sendCTRL test
|
||||||
{
|
{
|
||||||
printf("sendCTRL - ");
|
printf("sendCTRL - ");
|
||||||
|
|
||||||
// Initialize
|
// Initialize
|
||||||
int i; // Iterator
|
int i; // Iterator
|
||||||
char DREFArray[100][100];
|
char DREFArray[100][100];
|
||||||
float CTRL[6] = {0.0};
|
float CTRL[6] = { 0.0 };
|
||||||
float *recDATA[100];
|
float *recDATA[100];
|
||||||
short DREFSizes[100];
|
short DREFSizes[100];
|
||||||
struct xpcSocket sendPort, recvPort;
|
struct xpcSocket sendPort, recvPort;
|
||||||
short result;
|
short result;
|
||||||
|
|
||||||
// Setup
|
// Setup
|
||||||
for (i = 0; i < 100; i++) {
|
for (i = 0; i < 100; i++) {
|
||||||
recDATA[i] = (float *) malloc(40*sizeof(float));
|
recDATA[i] = (float *)malloc(40 * sizeof(float));
|
||||||
memset(DREFArray[i],0,100);
|
memset(DREFArray[i], 0, 100);
|
||||||
}
|
}
|
||||||
sendPort = openUDP( 49066, "127.0.0.1", 49009 );
|
sendPort = openUDP(49066, "127.0.0.1", 49009);
|
||||||
recvPort = openUDP( 49008, "127.0.0.1", 49009 );
|
recvPort = openUDP(49008, "127.0.0.1", 49009);
|
||||||
strcpy(DREFArray[0],"sim/cockpit2/controls/yoke_pitch_ratio");
|
strcpy(DREFArray[0], "sim/cockpit2/controls/yoke_pitch_ratio");
|
||||||
strcpy(DREFArray[1],"sim/cockpit2/controls/yoke_roll_ratio");
|
strcpy(DREFArray[1], "sim/cockpit2/controls/yoke_roll_ratio");
|
||||||
strcpy(DREFArray[2],"sim/cockpit2/controls/yoke_heading_ratio");
|
strcpy(DREFArray[2], "sim/cockpit2/controls/yoke_heading_ratio");
|
||||||
strcpy(DREFArray[3],"sim/flightmodel/engine/ENGN_thro");
|
strcpy(DREFArray[3], "sim/flightmodel/engine/ENGN_thro");
|
||||||
strcpy(DREFArray[4],"sim/cockpit/switches/gear_handle_status");
|
strcpy(DREFArray[4], "sim/cockpit/switches/gear_handle_status");
|
||||||
strcpy(DREFArray[5],"sim/flightmodel/controls/flaprqst");
|
strcpy(DREFArray[5], "sim/flightmodel/controls/flaprqst");
|
||||||
for (i = 0; i < 100; i++) {
|
for (i = 0; i < 100; i++) {
|
||||||
DREFSizes[i] = (int)strlen(DREFArray[i]);
|
DREFSizes[i] = (int)strlen(DREFArray[i]);
|
||||||
}
|
}
|
||||||
CTRL[3] = 0.8; // Throttle
|
CTRL[3] = 0.8; // Throttle
|
||||||
CTRL[4] = 1; // Gear
|
CTRL[4] = 1; // Gear
|
||||||
CTRL[5] = 0.5; // Flaps
|
CTRL[5] = 0.5; // Flaps
|
||||||
|
|
||||||
// Execute
|
|
||||||
sendCTRL(sendPort, 6, CTRL);
|
|
||||||
result = requestDREF(sendPort, recvPort, DREFArray, DREFSizes, 6, recDATA, DREFSizes); // Test
|
|
||||||
|
|
||||||
// Close
|
|
||||||
closeUDP(sendPort);
|
|
||||||
closeUDP(recvPort);
|
|
||||||
|
|
||||||
// Tests
|
|
||||||
if ( result < 0 )// Request 1 value
|
|
||||||
{
|
|
||||||
return -6;
|
|
||||||
}
|
|
||||||
for (i=0;i<6;i++)
|
|
||||||
{
|
|
||||||
if (fabs(recDATA[i][0]-CTRL[i])>1e-4)
|
|
||||||
{
|
|
||||||
return -i - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
// Execute
|
||||||
|
sendCTRL(sendPort, 6, CTRL);
|
||||||
|
result = requestDREF(sendPort, recvPort, DREFArray, DREFSizes, 6, recDATA, DREFSizes); // Test
|
||||||
|
|
||||||
|
// Close
|
||||||
|
closeUDP(sendPort);
|
||||||
|
closeUDP(recvPort);
|
||||||
|
|
||||||
|
// Tests
|
||||||
|
if (result < 0)// Request 1 value
|
||||||
|
{
|
||||||
|
return -6;
|
||||||
|
}
|
||||||
|
for (i = 0; i<6; i++)
|
||||||
|
{
|
||||||
|
if (fabs(recDATA[i][0] - CTRL[i])>1e-4)
|
||||||
|
{
|
||||||
|
return -i - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
short sendpCTRLTest()
|
||||||
|
{
|
||||||
|
printf("sendNonPlayerCTRL - ");
|
||||||
|
|
||||||
|
// Initialize
|
||||||
|
int i; // Iterator
|
||||||
|
char DREFArray[100][100];
|
||||||
|
float CTRL[6] = { 0.0 };
|
||||||
|
float *recDATA[100];
|
||||||
|
short DREFSizes[100];
|
||||||
|
struct xpcSocket sendPort, recvPort;
|
||||||
|
short result;
|
||||||
|
|
||||||
|
// Setup
|
||||||
|
for (i = 0; i < 100; i++)
|
||||||
|
{
|
||||||
|
recDATA[i] = (float *)malloc(40 * sizeof(float));
|
||||||
|
memset(DREFArray[i], 0, 100);
|
||||||
|
}
|
||||||
|
sendPort = openUDP(49066, "127.0.0.1", 49009);
|
||||||
|
recvPort = openUDP(49008, "127.0.0.1", 49009);
|
||||||
|
strcpy(DREFArray[0], "sim/multiplayer/position/plane1_yolk_pitch");
|
||||||
|
strcpy(DREFArray[1], "sim/multiplayer/position/plane1_yolk_roll");
|
||||||
|
strcpy(DREFArray[2], "sim/multiplayer/position/plane1_yolk_yaw");
|
||||||
|
strcpy(DREFArray[3], "sim/multiplayer/position/plane1_throttle");
|
||||||
|
strcpy(DREFArray[4], "sim/multiplayer/position/plane1_gear_deploy");
|
||||||
|
strcpy(DREFArray[5], "sim/multiplayer/position/plane1_flap_ratio");
|
||||||
|
for (i = 0; i < 100; i++)
|
||||||
|
{
|
||||||
|
DREFSizes[i] = (int)strlen(DREFArray[i]);
|
||||||
|
}
|
||||||
|
CTRL[3] = 0.8; // Throttle
|
||||||
|
CTRL[4] = 1; // Gear
|
||||||
|
CTRL[5] = 0.5; // Flaps
|
||||||
|
|
||||||
|
// Execute
|
||||||
|
sendpCTRL(sendPort, 6, CTRL, 1);
|
||||||
|
result = requestDREF(sendPort, recvPort, DREFArray, DREFSizes, 9, recDATA, DREFSizes); // Test
|
||||||
|
|
||||||
|
// Close
|
||||||
|
closeUDP(sendPort);
|
||||||
|
closeUDP(recvPort);
|
||||||
|
|
||||||
|
// Tests
|
||||||
|
if (result < 0)// Request 1 value
|
||||||
|
{
|
||||||
|
return -6;
|
||||||
|
}
|
||||||
|
for (i = 0; i<6; i++)
|
||||||
|
{
|
||||||
|
if (fabs(recDATA[i][0] - CTRL[i])>1e-4)
|
||||||
|
{
|
||||||
|
return -i - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
short sendPOSITest() // sendPOSI test
|
short sendPOSITest() // sendPOSI test
|
||||||
@@ -486,8 +545,9 @@ int main(int argc, const char * argv[])
|
|||||||
runTest(sendReadTest);
|
runTest(sendReadTest);
|
||||||
runTest(requestDREFTest);
|
runTest(requestDREFTest);
|
||||||
runTest(sendDREFTest);
|
runTest(sendDREFTest);
|
||||||
runTest(sendDATATest);
|
runTest(sendDATATest);
|
||||||
runTest(sendCTRLTest);
|
runTest(sendCTRLTest);
|
||||||
|
runTest(sendpCTRLTest);
|
||||||
runTest(sendPOSITest);
|
runTest(sendPOSITest);
|
||||||
runTest(pauseTest);
|
runTest(pauseTest);
|
||||||
runTest(connTest);
|
runTest(connTest);
|
||||||
|
|||||||
@@ -303,12 +303,12 @@ public class XPlaneConnectTest
|
|||||||
public void testSendCTRL() throws IOException
|
public void testSendCTRL() throws IOException
|
||||||
{
|
{
|
||||||
String[] drefs = {
|
String[] drefs = {
|
||||||
"sim/cockpit2/controls/yoke_pitch_ratio",
|
"sim/cockpit2/controls/yoke_pitch_ratio",
|
||||||
"sim/cockpit2/controls/yoke_roll_ratio",
|
"sim/cockpit2/controls/yoke_roll_ratio",
|
||||||
"sim/cockpit2/controls/yoke_heading_ratio",
|
"sim/cockpit2/controls/yoke_heading_ratio",
|
||||||
"sim/flightmodel/engine/ENGN_thro",
|
"sim/flightmodel/engine/ENGN_thro",
|
||||||
"sim/cockpit/switches/gear_handle_status",
|
"sim/cockpit/switches/gear_handle_status",
|
||||||
"sim/flightmodel/controls/flaprqst"
|
"sim/flightmodel/controls/flaprqst"
|
||||||
};
|
};
|
||||||
float[] ctrl = new float[] {0, 0, 1, 0.8F, 0, 1};
|
float[] ctrl = new float[] {0, 0, 1, 0.8F, 0, 1};
|
||||||
try(XPlaneConnect xpc = new XPlaneConnect())
|
try(XPlaneConnect xpc = new XPlaneConnect())
|
||||||
@@ -326,6 +326,40 @@ public class XPlaneConnectTest
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSendCTRL_NPC() throws IOException
|
||||||
|
{
|
||||||
|
String[] drefs1 = {
|
||||||
|
"sim/multiplayer/position/plane1_yolk_pitch",
|
||||||
|
"sim/multiplayer/position/plane1_yolk_roll",
|
||||||
|
"sim/multiplayer/position/plane1_yolk_yaw",
|
||||||
|
"sim/multiplayer/position/plane1_throttle"
|
||||||
|
};
|
||||||
|
String[] drefs2 = {
|
||||||
|
"sim/multiplayer/position/plane1_gear_deploy",
|
||||||
|
"sim/multiplayer/position/plane1_flap_ratio"
|
||||||
|
};
|
||||||
|
float[] ctrl = new float[] {0, 0, 1, 0.8F, 0, 0.5F};
|
||||||
|
try(XPlaneConnect xpc = new XPlaneConnect())
|
||||||
|
{
|
||||||
|
xpc.sendCTRL(ctrl, 1);
|
||||||
|
float[][] result1 = xpc.requestDREFs(drefs1);
|
||||||
|
float[][] result2 = xpc.requestDREFs(drefs2);
|
||||||
|
if(result1.length != 4 || result2.length != 2)
|
||||||
|
{
|
||||||
|
fail();
|
||||||
|
}
|
||||||
|
for(int i = 0; i < 4; ++i)
|
||||||
|
{
|
||||||
|
assertEquals(ctrl[i], result1[i][0], 1e-2);
|
||||||
|
}
|
||||||
|
for(int i = 0; i < 2; ++i)
|
||||||
|
{
|
||||||
|
assertEquals(ctrl[i + 4], result2[i][0], 1e-2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test(expected = IllegalArgumentException.class)
|
@Test(expected = IllegalArgumentException.class)
|
||||||
public void testSendCTRL_NullCtrl() throws IOException
|
public void testSendCTRL_NullCtrl() throws IOException
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -22,5 +22,23 @@ for i=1:length(CTRL)-1
|
|||||||
assert(abs(result{i}(1)-CTRL(i))<1e-4,['CTRLTest: DATA set unsucessful-',num2str(i)]);
|
assert(abs(result{i}(1)-CTRL(i))<1e-4,['CTRLTest: DATA set unsucessful-',num2str(i)]);
|
||||||
end
|
end
|
||||||
|
|
||||||
|
DREFS = {'sim/multiplayer/position/plane1_yolk_pitch',...
|
||||||
|
'sim/multiplayer/position/plane1_yolk_roll',...
|
||||||
|
'sim/multiplayer/position/plane1_yolk_yaw',...
|
||||||
|
'sim/multiplayer/position/plane1_throttle',...
|
||||||
|
'sim/multiplayer/position/plane1_gear_deploy',...
|
||||||
|
'sim/multiplayer/position/plane1_flap_ratio'};
|
||||||
|
THROT = rand();
|
||||||
|
CTRL = [0.0, 0.0, 1.0, THROT, 0.0, 1.0];
|
||||||
|
|
||||||
|
sendCTRL(CTRL, 1);
|
||||||
|
result = requestDREF(DREFS);
|
||||||
|
|
||||||
|
assert(isequal(length(result),6),'CTRLTest: requestDREF unsucessful-wrong number of elements returned');
|
||||||
|
assert(isequal(length(result{4}),8),'CTRLTest: requestDREF unsucessful- element 1 incorrect size (should be size 8)');
|
||||||
|
for i=1:length(CTRL)-1
|
||||||
|
assert(abs(result{i}(1)-CTRL(i))<1e-4,['CTRLTest: DATA set unsucessful-',num2str(i)]);
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -719,47 +719,79 @@ int handlePOSI(char buf[])
|
|||||||
int handleCTRL(char buf[])
|
int handleCTRL(char buf[])
|
||||||
{
|
{
|
||||||
char logmsg[100];
|
char logmsg[100];
|
||||||
float flaps;
|
xpcCtrl ctrl;
|
||||||
float controls[4] = {0.0};
|
float thr[8] = { 0 };
|
||||||
float throtArray[8] = {0};
|
|
||||||
short i;
|
short i;
|
||||||
short gear = -1;
|
|
||||||
|
|
||||||
// UPDATE LOG
|
// UPDATE LOG
|
||||||
sprintf(logmsg,"[CTRL] Message Received (Conn %i)", current_connection+1);
|
sprintf(logmsg,"[CTRL] Message Received (Conn %i)", current_connection+1);
|
||||||
updateLog(logmsg, strlen(logmsg));
|
updateLog(logmsg, strlen(logmsg));
|
||||||
|
|
||||||
flaps = parseCTRL(buf,controls,&gear);
|
ctrl = parseCTRL(buf);
|
||||||
|
if (ctrl.aircraft < 0) //parseCTRL failed
|
||||||
if ( flaps != flaps ) // Is NaN
|
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
if (ctrl.aircraft > 19) //Can only handle 19 non-player aircraft right now
|
||||||
// SET CONTROLS
|
|
||||||
XPLMSetDataf(XPLMDataRefs[11][0],controls[0]);
|
|
||||||
XPLMSetDataf(XPLMDataRefs[11][1],controls[1]);
|
|
||||||
XPLMSetDataf(XPLMDataRefs[11][2],controls[2]);
|
|
||||||
|
|
||||||
// SET Throttle
|
|
||||||
for ( i=0; i<8; i++ )
|
|
||||||
{
|
{
|
||||||
throtArray[i]=controls[3];
|
return 2;
|
||||||
}
|
}
|
||||||
XPLMSetDatavf(XPLMDataRefs[25][0],throtArray,0,8);
|
if (ctrl.aircraft == 0) //player aircraft
|
||||||
XPLMSetDatavf(XPLMDataRefs[26][0],throtArray,0,8);
|
|
||||||
setDREF(XPLMFindDataRef("sim/flightmodel/engine/ENGN_thro_override"),controls,3,1);
|
|
||||||
|
|
||||||
// SET Gear/Flaps
|
|
||||||
if ( gear != -1 )
|
|
||||||
{
|
{
|
||||||
setGEAR(0, gear, 0); // Gear
|
// SET CONTROLS
|
||||||
|
XPLMSetDataf(XPLMDataRefs[11][0], ctrl.pitch);
|
||||||
|
XPLMSetDataf(XPLMDataRefs[11][1], ctrl.roll);
|
||||||
|
XPLMSetDataf(XPLMDataRefs[11][2], ctrl.yaw);
|
||||||
|
|
||||||
|
// SET Throttle
|
||||||
|
for (i = 0; i<8; i++)
|
||||||
|
{
|
||||||
|
thr[i] = ctrl.throttle;
|
||||||
|
}
|
||||||
|
XPLMSetDatavf(XPLMDataRefs[25][0], thr, 0, 8);
|
||||||
|
XPLMSetDatavf(XPLMDataRefs[26][0], thr, 0, 8);
|
||||||
|
setDREF(XPLMFindDataRef("sim/flightmodel/engine/ENGN_thro_override"), thr, 0, 1);
|
||||||
|
|
||||||
|
// SET Gear/Flaps
|
||||||
|
if (ctrl.gear != -1)
|
||||||
|
{
|
||||||
|
setGEAR(0, ctrl.gear, 0); // Gear
|
||||||
|
}
|
||||||
|
if (ctrl.flaps < -999.5 || ctrl.flaps > -997.5) // Flaps
|
||||||
|
{
|
||||||
|
XPLMSetDataf(XPLMDataRefs[13][3], ctrl.flaps);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ( flaps < -999.5 || flaps > -997.5 ) // Flaps
|
else //non-player aircraft
|
||||||
{
|
{
|
||||||
XPLMSetDataf(XPLMDataRefs[13][3],flaps);
|
// SET CONTROLS
|
||||||
}
|
XPLMSetDataf(multiplayer[ctrl.aircraft][14], ctrl.pitch);
|
||||||
|
XPLMSetDataf(multiplayer[ctrl.aircraft][15], ctrl.roll);
|
||||||
|
XPLMSetDataf(multiplayer[ctrl.aircraft][16], ctrl.yaw);
|
||||||
|
|
||||||
|
// SET Throttle
|
||||||
|
for (i = 0; i<8; i++)
|
||||||
|
{
|
||||||
|
thr[i] = ctrl.throttle;
|
||||||
|
}
|
||||||
|
XPLMSetDatavf(multiplayer[ctrl.aircraft][13], thr, 0, 8);
|
||||||
|
|
||||||
|
// SET Gear/Flaps
|
||||||
|
if (ctrl.gear != -1)
|
||||||
|
{
|
||||||
|
float gear[10];
|
||||||
|
for (int i = 0; i < 10; ++i)
|
||||||
|
{
|
||||||
|
gear[i] = ctrl.gear;
|
||||||
|
}
|
||||||
|
XPLMSetDatavf(multiplayer[ctrl.aircraft][6], gear, 0, 10);
|
||||||
|
}
|
||||||
|
if (ctrl.flaps < -999.5 || ctrl.flaps > -997.5) // Flaps
|
||||||
|
{
|
||||||
|
XPLMSetDataf(multiplayer[ctrl.aircraft][7], ctrl.flaps);
|
||||||
|
XPLMSetDataf(multiplayer[ctrl.aircraft][8], ctrl.flaps);
|
||||||
|
}
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -32,7 +32,7 @@
|
|||||||
#include "xpcPluginTools.h"
|
#include "xpcPluginTools.h"
|
||||||
|
|
||||||
XPLMDataRef XPLMDataRefs[134][8];
|
XPLMDataRef XPLMDataRefs[134][8];
|
||||||
XPLMDataRef multiplayer[19][8];
|
XPLMDataRef multiplayer[20][17];
|
||||||
XPLMDataRef AIswitch;
|
XPLMDataRef AIswitch;
|
||||||
|
|
||||||
void readMessage(struct xpcSocket * recSocket, struct XPCMessage * pMessage)
|
void readMessage(struct xpcSocket * recSocket, struct XPCMessage * pMessage)
|
||||||
@@ -234,22 +234,42 @@ void buildXPLMDataRefs()
|
|||||||
|
|
||||||
|
|
||||||
// Multiplayer
|
// Multiplayer
|
||||||
for ( i = 0; i < 19; i++ )
|
for ( i = 1; i < 20; i++ )
|
||||||
{
|
{
|
||||||
sprintf(multi,"sim/multiplayer/position/plane%i_x",i); // X
|
sprintf(multi, "sim/multiplayer/position/plane%i_x", i); // X
|
||||||
multiplayer[i][0] = XPLMFindDataRef(multi);
|
multiplayer[i][0] = XPLMFindDataRef(multi);
|
||||||
sprintf(multi,"sim/multiplayer/position/plane%i_y",i); // Y
|
sprintf(multi, "sim/multiplayer/position/plane%i_y", i); // Y
|
||||||
multiplayer[i][1] = XPLMFindDataRef(multi);
|
multiplayer[i][1] = XPLMFindDataRef(multi);
|
||||||
sprintf(multi,"sim/multiplayer/position/plane%i_z",i); // Z
|
sprintf(multi,"sim/multiplayer/position/plane%i_z", i); // Z
|
||||||
multiplayer[i][2] = XPLMFindDataRef(multi);
|
multiplayer[i][2] = XPLMFindDataRef(multi);
|
||||||
sprintf(multi,"sim/multiplayer/position/plane%i_the",i); // Theta (Pitch)
|
sprintf(multi,"sim/multiplayer/position/plane%i_the", i); // Theta (Pitch)
|
||||||
multiplayer[i][3] = XPLMFindDataRef(multi);
|
multiplayer[i][3] = XPLMFindDataRef(multi);
|
||||||
sprintf(multi,"sim/multiplayer/position/plane%i_phi",i); // Phi (Roll)
|
sprintf(multi,"sim/multiplayer/position/plane%i_phi", i); // Phi (Roll)
|
||||||
multiplayer[i][4] = XPLMFindDataRef(multi);
|
multiplayer[i][4] = XPLMFindDataRef(multi);
|
||||||
sprintf(multi,"sim/multiplayer/position/plane%i_psi",i); // Psi (Heading-True)
|
sprintf(multi,"sim/multiplayer/position/plane%i_psi", i); // Psi (Heading-True)
|
||||||
multiplayer[i][5] = XPLMFindDataRef(multi);
|
multiplayer[i][5] = XPLMFindDataRef(multi);
|
||||||
sprintf(multi,"sim/multiplayer/position/plane%i_gear_deploy",i); // Landing Gear
|
sprintf(multi, "sim/multiplayer/position/plane%i_gear_deploy", i); // Landing Gear
|
||||||
multiplayer[i][6] = XPLMFindDataRef(multi);
|
multiplayer[i][6] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_flap_ratio", i);
|
||||||
|
multiplayer[i][7] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_flap_ratio2", i);
|
||||||
|
multiplayer[i][8] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_spoiler_ratio", i);
|
||||||
|
multiplayer[i][9] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_speedbrake_ratio", i);
|
||||||
|
multiplayer[i][10] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_slat_ratio", i);
|
||||||
|
multiplayer[i][11] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_wing_sweep", i);
|
||||||
|
multiplayer[i][12] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_throttle", i);
|
||||||
|
multiplayer[i][13] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_yolk_pitch", i);
|
||||||
|
multiplayer[i][14] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_yolk_roll", i);
|
||||||
|
multiplayer[i][15] = XPLMFindDataRef(multi);
|
||||||
|
sprintf(multi, "sim/multiplayer/position/plane%i_yolk_yaw", i);
|
||||||
|
multiplayer[i][16] = XPLMFindDataRef(multi);
|
||||||
}
|
}
|
||||||
AIswitch = XPLMFindDataRef("sim/operation/override/override_plane_ai_autopilot");
|
AIswitch = XPLMFindDataRef("sim/operation/override/override_plane_ai_autopilot");
|
||||||
}
|
}
|
||||||
@@ -358,12 +378,9 @@ int printBufferToLog(struct XPCMessage & msg)
|
|||||||
}
|
}
|
||||||
else if (strncmp(msg.head,"CTRL",4)==0)
|
else if (strncmp(msg.head,"CTRL",4)==0)
|
||||||
{// Header = CTRL (Control)
|
{// Header = CTRL (Control)
|
||||||
float flaps;
|
xpcCtrl ctrl = parseCTRL(msg.msg);
|
||||||
float controls[4];
|
|
||||||
short gear;
|
|
||||||
flaps = parseCTRL(msg.msg,controls,&gear);
|
|
||||||
|
|
||||||
sprintf(logmsg,"%s (%f %f %f) %f %hi %f",logmsg, controls[0], controls[1], controls[2], controls[3] , gear, flaps);
|
sprintf(logmsg,"%s (%f %f %f) %f %hi %f",logmsg, ctrl.pitch, ctrl.roll, ctrl.yaw, ctrl.throttle, ctrl.gear, ctrl.flaps);
|
||||||
|
|
||||||
updateLog(logmsg,strlen(logmsg));
|
updateLog(logmsg,strlen(logmsg));
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
#include "XPLMDataAccess.h"
|
#include "XPLMDataAccess.h"
|
||||||
|
|
||||||
extern XPLMDataRef XPLMDataRefs[134][8];
|
extern XPLMDataRef XPLMDataRefs[134][8];
|
||||||
extern XPLMDataRef multiplayer[19][8];
|
extern XPLMDataRef multiplayer[20][17];
|
||||||
extern XPLMDataRef AIswitch;
|
extern XPLMDataRef AIswitch;
|
||||||
|
|
||||||
struct XPCMessage
|
struct XPCMessage
|
||||||
|
|||||||
Reference in New Issue
Block a user