From a46c7386f4357d859553e4ec7050056744a9d87a Mon Sep 17 00:00:00 2001 From: Chris Teubert Date: Fri, 24 Apr 2015 15:29:02 -0700 Subject: [PATCH 01/10] minor Java Update - Spelling fix --- Java/src/XPlaneConnect.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Java/src/XPlaneConnect.java b/Java/src/XPlaneConnect.java index 8297061..f59e18c 100644 --- a/Java/src/XPlaneConnect.java +++ b/Java/src/XPlaneConnect.java @@ -731,7 +731,7 @@ public class XPlaneConnect implements AutoCloseable * Sets the port on which the client will receive data from X-Plane. * * @param port The new incoming port number. - * @throws IOException If the command cannnot be sent. + * @throws IOException If the command cannot be sent. */ public void setCONN(int port) throws IOException { From d1df7f7b89caadb841743b076c49efd7567a4513 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Fri, 24 Apr 2015 16:33:39 -0700 Subject: [PATCH 02/10] Deleted out of date user guides. The GitHub wiki now provides the information previously contained in these guides. --- C/User Guide (C).txt | 192 ----------------------------- MATLAB/Documentation (MATLAB).html | 115 ----------------- MATLAB/pages/clearUDPBuffer.html | 37 ------ MATLAB/pages/closeUDP.html | 36 ------ MATLAB/pages/openUDP.html | 39 ------ MATLAB/pages/pauseSim.html | 36 ------ MATLAB/pages/readDATA.html | 59 --------- MATLAB/pages/readUDP.html | 43 ------- MATLAB/pages/requestDREF.html | 37 ------ MATLAB/pages/selectDATA.html | 39 ------ MATLAB/pages/sendCTRL.html | 48 -------- MATLAB/pages/sendDATA.html | 46 ------- MATLAB/pages/sendDREF.html | 48 -------- MATLAB/pages/sendPOSI.html | 50 -------- MATLAB/pages/sendSTRU.html | 39 ------ MATLAB/pages/sendUDP.html | 39 ------ MATLAB/pages/setConn.html | 37 ------ 17 files changed, 940 deletions(-) delete mode 100644 C/User Guide (C).txt delete mode 100644 MATLAB/Documentation (MATLAB).html delete mode 100644 MATLAB/pages/clearUDPBuffer.html delete mode 100644 MATLAB/pages/closeUDP.html delete mode 100644 MATLAB/pages/openUDP.html delete mode 100644 MATLAB/pages/pauseSim.html delete mode 100644 MATLAB/pages/readDATA.html delete mode 100644 MATLAB/pages/readUDP.html delete mode 100644 MATLAB/pages/requestDREF.html delete mode 100644 MATLAB/pages/selectDATA.html delete mode 100644 MATLAB/pages/sendCTRL.html delete mode 100644 MATLAB/pages/sendDATA.html delete mode 100644 MATLAB/pages/sendDREF.html delete mode 100644 MATLAB/pages/sendPOSI.html delete mode 100644 MATLAB/pages/sendSTRU.html delete mode 100644 MATLAB/pages/sendUDP.html delete mode 100644 MATLAB/pages/setConn.html diff --git a/C/User Guide (C).txt b/C/User Guide (C).txt deleted file mode 100644 index 7fcc94e..0000000 --- a/C/User Guide (C).txt +++ /dev/null @@ -1,192 +0,0 @@ -X-Plane Connect-C (XPC-C) Readme - -DESCRIPTION - XPC-C is a series of C functions that facilitate communication with X-Plane. - ------------------------------------ -SETUP - Before using XPC Functions you must - 1. Copy the folder "[XPC Directory]/xpcPlugin/XPlaneConnect" to the "[X-Plane Directory]/Resources/plugins" directory. - 2. Put in X-Plane CD 1 or X-Plane USB Key. - 3. Start X-Plane. - 4. #include "xplaneConnect.h" - ------------------------------------ -BASIC FUNCTIONS - 1. openUDP opens a UDP Socket for communication. This is used to send data or receive. - INPUT: - port (unsigned short): Port Number (ex:49067) - xpIP (char *): IP Address of the computer running x-plane - xpPort (unsigned short): Port number that the X-Plane/ xpcPlugin Receives on (send -1 for default (49009), Typically xpcPlugin is 49009) - - OUTPUT: - socket (xpcSocket): The Opened Socket - - USE: - unsigned short portNumber = 49067; - struct xpcSocket theSocket = openUDP(portNumber, “127.0.0.1”, 49009); - - 2. closeUDP closes an opened UDP Socket for communication. This is to be done after the program has finished using that socket. Use opedUDP to open socket. - INPUT: - socket (xpcSocket): The Opened Socket - - USE: - closeUDP(theSocket); - - 3. setCONN sets the return port for requested datarefs. - INPUT: - socket (xpcSocket): Socket to use to send the command - recPort (unsigned Short): Port number for requested dataref values to be sent to - - OUTPUT: - status (short): 0 if successful - - USE: - char IP[16] = "127.0.0.1"; - struct xpcSocket theSocket = openUDP(49067); - setCONN(theSocket,IP,49009,49022); // Sets receive address to 49022; - - 4. pauseSim pauses/resumes the x-plane simulation - INPUT: - socket (xpcSocket): Socket to use to send the command - pause (short): 1=Pause, 0=Resume - - OUTPUT: - status (short): 0 if successful - - USE: - char IP[16] = "127.0.0.1"; - struct xpcSocket theSocket = openUDP(49067); - pauseSim(theSocket, IP, 49009, 1); - - 5. sendDATA set the value of a state in the "DATA Input & Output" Table - INPUT: - socket (xpcSocket): Socket to use to send the command - dataArray (float[][9]): Array of data to be sent. The first element of each row is the item # (corresponding to the number on the X-Plane "DATA Input & Output" Screen). Send -999 to leave the value unchanged. - rows (unsigned short): Number of rows of data being sent - - OUTPUT: - status (short): 0 if successful - - USE: - char IP[16] = "127.0.0.1"; - struct xpcSocket theSocket = openUDP(49067); - float data[] = {{14, 1, -999, -999, -999, -999, -999, -999, -999},{25, 0.8, 0.8, -999, -999, -999, -999, -999, -999}}; // Gear and Throttle - sendDATA(theSocket,IP,49009,data,2); - - 6. sendPOSI set the position of an aircraft - INPUT: - socket (xpcSocket): Socket to use to send the command - ACNum (short): Number of aircraft to be moved, use 0 for main aircraft (ownPlane). - numArgs (short): Number of Arguments to be sent (size of position array) - position (float []): Arguments corresponding to aircrafts position - position[0] = Latitude - position[1] = Longitude - position[2] = Altitude (m MSL) - position[3] = Roll (deg) - position[4] = Pitch (deg) - position[5] = True Heading (deg) - position[6] = Gear (0=up, 1=down) - - OUTPUT: - status (short): 0 if successful - - USE: - char IP[16] = "127.0.0.1"; - struct xpcSocket theSocket = openUDP(49067); - float posit[] = {37.5242422, -122.06899, 2500, 0, 0, 0, 1}; - sendPOSI(theSocket, IP, 49009, 7, posit); - - 7. sendCTRL send control commands to the aircraft - INPUT: - socket (xpcSocket): Socket to use to send the command - numArgs (short): Number of Arguments to be sent (size of control array) - control (float []): Arguments corresponding to aircraft control command - control[0] = Latitudinal Stick [-1,1] - control[1] = Longitudinal Stick [-1,1] - control[2] = Pedal [-1, 1] - control[3] = Throttle [-1, 1] - control[4] = Gear (0=up, 1=down) - control[5] = Flaps [0, 1] - - OUTPUT: - status (short): 0 if successful - - USE: - char IP[16] = "127.0.0.1"; - struct xpcSocket theSocket = openUDP(49067); - float ctrl[] = {0, 0, 0, 0.8, 0, 1}; - sendCTRL(theSocket, IP, 49009, 6, ctrl); - - 8. sendDREF set the value of a specific dataref. Dataref list found at http://www.xsquawkbox.net/xpsdk/docs/DataRefs.html - INPUT: - socket (xpcSocket): Socket to use to send the command - dataRef (char *): Dataref to be set (with or without "sim/" preceeding it) - length (short): length of dataref string - values (float *): Array of values to be sent - length2 (short): Number of values in values array - - OUTPUT: - status (short): 0 if successful - - USE: - char IP[16] = "127.0.0.1"; - struct xpcSocket theSocket = openUDP(49067); - char theDREF[] = "cockpit/switches/gear_handle_status"; - float value = 1; - sendDREF(theSocket, IP, 49009, theDREF, strlen(theDREF), &value, 1); - - 9. requestDREF Request the value of specific dref(s). Dataref list found at http://www.xsquawkbox.net/xpsdk/docs/DataRefs.html - INPUT: - outSocket (xpcSocket): Socket to use to send the command - inSocket (xpcSocket): Socket to use to receive the result - DREFArray (char[][100]): Array of DataRefs to be requested - DREFSizes (int[]): Array of string lengths for each DataRef in DREFArray - listLength (short): Number of DataRefs in DREFArray - result (*float[]): Array of pointers to the values returned - arrayLen (short[]): Array where each element corresponds to the number of elements in the float array. - - OUTPUT: - length (short): Number of Values Returned - - USE: - char IP[16] = "127.0.0.1"; - struct xpcSocket theSocket = openUDP(49067); - char DREFArray[][100] = {"sim/cockpit/switches/gear_handle_status"}; - requestDREF(theSocket, IP, 49009, DREFArray, strlen(DREFArray[0]),1); - - 10. sendTEXT write some text to the screen. - INPUT: - outSocket (xpcSocket): Socket to use to send the command - message (char*): The string to be wrote to the screen - x (int): The x position where the text will be written. Set to -1 to use default position. - y (int): The y position where the text will be written. Set to -1 to use default position. - ------------------------------------ -ADVANCED FUNCTIONS (These are mostly used by the xpcPlugin to read requests) - 1. sendUDP - 2. readUDP - 3. readDATA - 4. parseDATA - 5. readPOSI - 6. parsePOSI - 7. readCTRL - 8. parseCTRL - 9. readRequest - 10. parseRequest - 11. parseDREF - 12. readDREF - ------------------------------------ -PLANNED FUNCTIONS - 1. sendVIEW - 2. parseVIEW - 3. readVIEW - 4. sendWYPT - 5. parseWYPT - 6. readWYPT - 7. selectDATA - ------------------------------------ -CONTACT - Email Christopher Teubert (christopher.a.teubert@nasa.gov) with any questions. diff --git a/MATLAB/Documentation (MATLAB).html b/MATLAB/Documentation (MATLAB).html deleted file mode 100644 index 87ba7c9..0000000 --- a/MATLAB/Documentation (MATLAB).html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - XPlaneConnect Toolbox - - - - -

XPC-MATLAB

-Chris Teubert (Christopher.A.Teubert@nasa.gov)
- -

Summary

-XPC-MATLAB is a series of MATLAB functions that facilitate communication with X-Plane. This toolbox allows for the real-time application of active control to an XPlane simulation, flight visualization, record state during a flight, or interact with a mission using UDP. - -

Table of Contents

-
    -
  1. Functions
  2. -
  3. Setup -
  4. Use
  5. -
  6. Example
  7. -
  8. Future Work
  9. -
  10. Notices and Disclaimers
  11. -
  12. Change Log
  13. -
- -

Functions

-

Basic Package

- - -
  - - sendDATA: - Send X-Plane Formatted DATA over UDP
  - - sendPOSI: - Send Position and orientation update command to X-Plane over UDP for any aircraft (own or traffic)
  - - sendCTRL: - Send control commands to X-Plane over UDP for any aircraft (own or traffic)
  - - sendDREF: - Set any X-Plane internal variable (dataref) over UDP
  - - selectDATA: - Choose specific X-Plane DATA parameters to be sent by X-Plane over UDP
  - - setConn: - Sets the return port for requested datarefs.
  - - pauseSim: - Pause simulation
  - - openUDP: - Script that opens an UDP Socket
  - - closeUDP: - Script that closes an UDP Socket
- -

Advanced/Special-Use Functions

- -
  - - clearUDPBuffer: - Script that clears an UDP Socket Buffer
  - - readDATA: - Read X-Plane Formatted Data from UDP Socket
  - - readUDP: - Read Array from UDP Socket
  - - sendSTRU: - Send a MATLAB structure over UDP
  - - sendUDP: - Send array over UDP
- -

Future

- -
  - - requestDREF: - Request the value of a specific data ref
  - - drawWaypoint: - NOT FUNCTIONAL
- -

Setup

-Before using XPC Functions you must -1. Install X-Plane (http://www.x-plane.com) -2. Copy the file xpcPlugin.xpl to the "[X-Plane Directory]/Resources/plugins" directory. - a. For Mac xpcPlugin can be found in the "[XPlaneConnect]/xpcPlugin/Mac" directory. - a. For Windows xpcPlugin can be found in the "[XPlaneConnect]/xpcPlugin/Win" directory. -3. Insert X-Plane CD 1 or X-Plane USB Key. -4. Start X-Plane. -5. import XPlaneConnect.* - -

Examples

-

Files

-TO BE ADDED -

Description

- -

Future Work

- - -

Notices and Disclaimers

-Notices:
-Copyright ©2013-2014 United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All Rights Reserved.
- -
Disclaimers: - -

No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL SOFTWARE, AND DISTRIBUTES IT "AS IS."

- -

Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT.

- -
X-Plane API
-Copyright (c) 2008, Sandy Barbour and Ben Supnik All rights reserved.
-

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

- - -

X-Plane API SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

- - - diff --git a/MATLAB/pages/clearUDPBuffer.html b/MATLAB/pages/clearUDPBuffer.html deleted file mode 100644 index f09b945..0000000 --- a/MATLAB/pages/clearUDPBuffer.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - XPlaneConnect Toolbox-ClearUDPBuffer - - - - -<-- Back
-

clearUDPBuffer

-Script that clears an UDP Socket Buffer - -

Inputs

- - -

Outputs

- - -

Use

-1. import XPlaneConnect.*;
-2. Socket = openUDP(49005);
-3. Socket = clearUDPBuffer(Socket);
- -

Change Log

-10/02/14: [CT] V0.9: Updated to work with updated xpcPlugin
-09/12/13: [CT] Add optional arguments
-09/10/13: [CT] Code created

-<-- Back
- - - \ No newline at end of file diff --git a/MATLAB/pages/closeUDP.html b/MATLAB/pages/closeUDP.html deleted file mode 100644 index e2a64c5..0000000 --- a/MATLAB/pages/closeUDP.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - XPlaneConnect Toolbox-closeUDP - - - - -<-- Back
-

closeUDP

-Script that closes a UDP Socket - -

Inputs

- - -

Outputs

- - -

Use

-1. import XPlaneConnect.*;
-2. Socket = openUDP(49005);
-3. Status = closeUDP(Socket);
- -

Change Log

-10/02/14: [CT] V0.9: Updated to work with updated xpcPlugin
-09/10/13: [CT] Code created

-<-- Back
- - - \ No newline at end of file diff --git a/MATLAB/pages/openUDP.html b/MATLAB/pages/openUDP.html deleted file mode 100644 index d13ed2b..0000000 --- a/MATLAB/pages/openUDP.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - XPlaneConnect Toolbox-openUDP - - - - -<-- Back
-

openUDP

-Script that opens a UDP Socket - -

Inputs

- - -

Outputs

- - -

Use

-1. import XPlaneConnect.*;
-2. Socket = openUDP(49005);%Open socket at port 49005 with timeout of 0.1 seconds

-or

-2. Socket = openUDP(49005,200);%Open socket at port 49005 with timeout of 0.2 seconds

- -

Change Log

-10/02/14: [CT] V0.9: Updated to work with updated xpcPlugin
-09/12/13: [CT] Added optional timeout input argument
-09/10/13: [CT] Code created

-<-- Back
- - - \ No newline at end of file diff --git a/MATLAB/pages/pauseSim.html b/MATLAB/pages/pauseSim.html deleted file mode 100644 index bf799c0..0000000 --- a/MATLAB/pages/pauseSim.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - XPlaneConnect Toolbox-pauseSim - - - - -<-- Back
-

pauseSim

- -

Inputs

- - -

Outputs

- - -

Use

-1. import XPlaneConnect.*;
-2. status = pauseSim(1);
- -

Change Log

-10/02/14: [CT] V0.9: Updated to work with updated xpcPlugin
-06/10/13: [CT] Code created

-<-- Back
- - - \ No newline at end of file diff --git a/MATLAB/pages/readDATA.html b/MATLAB/pages/readDATA.html deleted file mode 100644 index 12cef1b..0000000 --- a/MATLAB/pages/readDATA.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - XPlaneConnect Toolbox-readDATA - - - - -<-- Back
-

readDATA

-Reads UDP Socket and interprets data - -

Inputs

- - -

Outputs

-If data is X-Plane data format: - -If data is matlab structure: - -If data is any other format: - - -

Use

-1. import XPlaneConnect.*;
-2. socket = openUDP(49005);
-3. data = readDATA(socket);
-4. status = closeUDP(socket);

- -or

- -1. import XPlaneConnect.*;
-2. data = readDATA(49005); - -

Note

-NOTE: sending in a port number instead of an opened socket clears the UDP buffer. This only works if the data is being sent at a fast rate. Sending in a UDP Socket reads the first packet in the buffer.
- -

Change Log

-10/02/14: [CT] V0.9: Updated to work with updated xpcPlugin
-09/10/13: [CT] Updated to receive UDP socket or port number
-06/10/13: [CT] Code created

-<-- Back
- - - \ No newline at end of file diff --git a/MATLAB/pages/readUDP.html b/MATLAB/pages/readUDP.html deleted file mode 100644 index 8a636f2..0000000 --- a/MATLAB/pages/readUDP.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - XPlaneConnect Toolbox-readUDP - - - - -<-- Back
-

readUDP

-Read Array from UDP Socket - -

Inputs

- - -

Outputs

- - -

Use

-1. import XPlaneConnect.*;
-2. socket = openUDP(49005);
-3. data = readUDP(socket);
-4. status = closeUDP(socket);

- -or

- -1. import XPlaneConnect.*;
-2. data = readUDP(49005);
- -

Note

-NOTE: sending in a port number instead of an opened socket clears the UDP buffer. This only works if the data is being sent at a fast rate. Sending in a UDP Socket reads the first packet in the buffer. - -

Change Log

-10/02/14: [CT] V0.9: Updated to work with updated xpcPlugin
-09/08/13: [CT] Added option for either UDP Socket or port number input
-06/10/13: [CT] Code created

-<-- Back
\ No newline at end of file diff --git a/MATLAB/pages/requestDREF.html b/MATLAB/pages/requestDREF.html deleted file mode 100644 index ff822de..0000000 --- a/MATLAB/pages/requestDREF.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - XPlaneConnect Toolbox-requestDREF - - - - -<-- Back
-

requestDREF

- -

Inputs

- - -

Outputs

- - -

Use

-1. import XPlaneConnect.*;
-2. DREFArray = {'sim/cockpit2/controls/yoke_heading_ratio','sim/cockpit2/controls/yoke_roll_ratio'};
-3. status = requestDREF( DREFArray, '172.0.100.54' );
- -

Change Log

-10/02/14: [CT] V0.9: Updated to work with updated xpcPlugin
-06/10/13: [CT] Code created

-<-- Back
- - - \ No newline at end of file diff --git a/MATLAB/pages/selectDATA.html b/MATLAB/pages/selectDATA.html deleted file mode 100644 index 2a9e3e0..0000000 --- a/MATLAB/pages/selectDATA.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - XPlaneConnect Toolbox-selectDATA - - - - -<-- Back
-

selectDATA

-Choose specific X-Plane parameters to be send over UDP - -

Inputs

- - -

Outputs

- - -

Use

-1. import XPlaneConnect.*;
-2. values = [1, 2, 3, 27, 40]; -3. status = selectDATA(values,'127.0.0.1',49005);
- -

Change Log

-10/02/14: [CT] V0.9: Updated to work with updated xpcPlugin
-04/18/14: [CT] V0.2: Added Versioning
-06/10/13: [CT] Code created

-<-- Back
- - - \ No newline at end of file diff --git a/MATLAB/pages/sendCTRL.html b/MATLAB/pages/sendCTRL.html deleted file mode 100644 index 9bb501a..0000000 --- a/MATLAB/pages/sendCTRL.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - XPlaneConnect Toolbox-sendCTRL - - - - -<-- Back
-

sendCTRL

-Send position and orientation update command to X-Plane over UDP. This requires the X-Plane Connect Plugin to be running - -

Inputs

- - -

Outputs

- - -

Use

-1. import XPlaneConnect.*;
-2. ctrl = [0, 0, 0, 0.8, 0, 0]; -3. status = sendCTRL(ctrl); % Set position of own aircraft
-4. status2 = sendCTRL(ctrl,1); % Set position of aircraft 1
- -

Change Log

-10/02/14: [CT] V0.9 Updated to use new xpcPlugin
-09/26/14: [CT] Code created

-<-- Back
- - - \ No newline at end of file diff --git a/MATLAB/pages/sendDATA.html b/MATLAB/pages/sendDATA.html deleted file mode 100644 index 02df49d..0000000 --- a/MATLAB/pages/sendDATA.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - XPlaneConnect Toolbox-sendDATA - - - - -<-- Back
-

sendDATA

-Send X-Plane formatted DATA over UDP. This function is used to change one of the parameters listed in the x-plane udp data screen (see http://www.nuclearprojects.com/xplane/images/xp_datainout.jpg) - -

Inputs

- - -

Outputs

- - -

Use

-1. import XPlaneConnect.*;
-2. data = struct('h',14,'d',[1,-998,-998,-998,-998,-998,-998,-998]); %Set Gear
-3. %Send the data array to port 49005 on the computer at IP address 172.0.100.54.
-4. status = sendDATA(data, '172.0.100.54', 49005); - -

note

-Note: send the value -998 to not overwrite that parameter. That is, if -998 is sent, the parameter will stay at the current X-Plane value
- -

Change Log

-10/01/14: [CT] V0.9: updated to function with new xpcPlugin
-06/10/13: [CT] First created

-<-- Back
- - - \ No newline at end of file diff --git a/MATLAB/pages/sendDREF.html b/MATLAB/pages/sendDREF.html deleted file mode 100644 index c5dd742..0000000 --- a/MATLAB/pages/sendDREF.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - XPlaneConnect Toolbox-sendCTRL - - - - -<-- Back
-

sendCTRL

-Send position and orientation update command to X-Plane over UDP. This requires the X-Plane Connect Plugin to be running - -

Inputs

- - -

Outputs

- - -

Use

-1. import XPlaneConnect.*
-2. dataRef = 'sim/aircraft/parts/acf_gear_deploy'; // Landing Gear
-3. Value = 0;
-4. status = sendDREF(dataRef, Value);
- -

Change Log

-10/02/14: [CT] V0.9: Updated to use new xpcPlugin -06/10/13: [CT] Code created

- -<-- Back
- - - \ No newline at end of file diff --git a/MATLAB/pages/sendPOSI.html b/MATLAB/pages/sendPOSI.html deleted file mode 100644 index 4642b96..0000000 --- a/MATLAB/pages/sendPOSI.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - XPlaneConnect Toolbox-sendDREF - - - - -<-- Back
-

sendPosition

-Send position and orientation update command to X-Plane over UDP. This requires the X-Plane Connect Plugin to be running - -

Inputs

- - -

Outputs

- - -

Use

-1. import XPlaneConnect.*;
-2. latlon = [37.4185718,-121.935565]; %Lat,lon of NASA Ames Research Center
-3. alt = 500; %meters above sea level
-4. orient = [0,20,180]; %Orientation (roll,pitch,yaw/heading). 20 degrees yaw, heading south
-5. status = sendPOSI([latlon,alt,orient]); % Set position of own aircraft
-6. status2 = sendPOSI([[latlon(1)+0.005,latlon(2)],alt,orient],1); % Set position of aircraft 1
- -

Change Log

-10/02/14: [CT] V0.9 Updated to use new xpcPlugin
-06/10/13: [CT] Code created

-<-- Back
- - - \ No newline at end of file diff --git a/MATLAB/pages/sendSTRU.html b/MATLAB/pages/sendSTRU.html deleted file mode 100644 index 7ec9b57..0000000 --- a/MATLAB/pages/sendSTRU.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - XPlaneConnect Toolbox-sendSTRU - - - - -<-- Back
-

sendSTRU

-Send a MATLAB structure over UDP - -

Inputs

- - -

Outputs

- - -

Use

-1. import XPlaneConnect.*;
-2. data = struct('a',[1:20],'b',1.853,'name','Example Structure');
-3. #Send the data structure to port 49005 on the computer at IP address 172.0.100.54
-4. status = sendSTRU( data, '172.0.100.54', 49005 );
- -

Change Log

-10/02/14: [CT] V0.9: Updated to work with updated xpcPlugin
-08/01/13: [CT] Code created

-<-- Back
- - - \ No newline at end of file diff --git a/MATLAB/pages/sendUDP.html b/MATLAB/pages/sendUDP.html deleted file mode 100644 index 92e4ae4..0000000 --- a/MATLAB/pages/sendUDP.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - XPlaneConnect Toolbox-sendUDP - - - - -<-- Back
-

sendUDP

-Send an one dimensional array of type uint8 data over an UDP connection - -

Inputs

- - -

Outputs

- - -

Use

-1. import XPlaneConnect.*;
-2. data = uint8([1:20]);
-3. #Send the data array to port 49005 on the computer at IP address 172.0.100.54.
-4. status = sendUDP( data, '172.0.100.54', 49005 );
- -

Change Log

-10/02/14: [CT] V0.9: Updated to work with updated xpcPlugin
-06/10/13: [CT] Code created

-<-- Back
- - - \ No newline at end of file diff --git a/MATLAB/pages/setConn.html b/MATLAB/pages/setConn.html deleted file mode 100644 index 568f929..0000000 --- a/MATLAB/pages/setConn.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - XPlaneConnect Toolbox-setConn - - - - -<-- Back
-

setConn

-Send a command to set up the port where you will receive data on this computer. - -

Inputs

- - -

Outputs

- - -

Use

-1. import XPlaneConnect.*
-2. status = setConn(49011);
- -

Change Log

-10/02/14: [CT] V0.9: Updated to work with updated xpcPlugin
-04/21/14: [CT] V0.2: First Version

-<-- Back
- - - \ No newline at end of file From a53c39a1a8ba0573c0a527afae1c16f154dcde3a Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Sat, 25 Apr 2015 19:06:38 -0700 Subject: [PATCH 03/10] Fixed bug causing TEXT strings to not be cleared correctly. - Includes updated Windows binaries. --- xpcPlugin/Drawing.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xpcPlugin/Drawing.cpp b/xpcPlugin/Drawing.cpp index 3b26c13..d08afdf 100644 --- a/xpcPlugin/Drawing.cpp +++ b/xpcPlugin/Drawing.cpp @@ -218,7 +218,7 @@ namespace XPC //Enable drawing if necessary if (!msgEnabled) { - XPLMRegisterDrawCallback(MessageDrawCallback, xplm_Phase_LastCockpit, 0, NULL); + XPLMRegisterDrawCallback(MessageDrawCallback, xplm_Phase_Window, 0, NULL); msgEnabled = true; } } From 3c43517e44c85c4a09f154900ee33d55f605ef1b Mon Sep 17 00:00:00 2001 From: Chris Teubert Date: Sun, 26 Apr 2015 13:48:06 -0700 Subject: [PATCH 04/10] Fix Bug in getDREF Response MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix Bug- readUDP loop in getDREF Response only ran once no matter what. This wasn’t enough time for the plugin to send a response. Note: You can try increasing the timeout, but the plugin has to have a socket with a timeout of 1ms or less. If the timeout is higher than that a lag is introduced. --- C/src/xplaneConnect.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/C/src/xplaneConnect.c b/C/src/xplaneConnect.c index 9e7ba5b..b065bd0 100755 --- a/C/src/xplaneConnect.c +++ b/C/src/xplaneConnect.c @@ -432,23 +432,24 @@ int getDREFResponse(XPCSocket sock, float* values[], unsigned char count, int si // Read data. Try 40 times to read, then give up. // TODO: Why not just set the timeout to 40ms? int result; - for (int i = 0; i < 512; ++i) + for (int i = 0; i < 40; ++i) { result = readUDP(sock, buffer, 65536); if (result > 0) { break; } - if (result < 0) - { -#ifdef _WIN32 - printError("getDREFs", "Read operation failed. (%d)", WSAGetLastError()); -#else - printError("getDREFs", "Read operation failed."); -#endif - return -1; - } } + + if (result < 0) + { +#ifdef _WIN32 + printError("getDREFs", "Read operation failed. (%d)", WSAGetLastError()); +#else + printError("getDREFs", "Read operation failed."); +#endif + return -1; + } if (result < 6) { From f4129f5008e1789d9c3393d3578547a7563819af Mon Sep 17 00:00:00 2001 From: Chris Teubert Date: Sun, 26 Apr 2015 13:48:29 -0700 Subject: [PATCH 05/10] Added a comment --- xpcPlugin/DataManager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/xpcPlugin/DataManager.cpp b/xpcPlugin/DataManager.cpp index abdf5b8..fba2466 100644 --- a/xpcPlugin/DataManager.cpp +++ b/xpcPlugin/DataManager.cpp @@ -25,6 +25,7 @@ namespace std { + // Note: This is required for unordered_map template <> struct hash { From 1883aa0afeb5bc36c2db6f902d643fc65dfc62f9 Mon Sep 17 00:00:00 2001 From: Chris Teubert Date: Sun, 26 Apr 2015 13:49:09 -0700 Subject: [PATCH 06/10] mac Binary/new project structure --- xpcPlugin/XPlaneConnect/mac.xpl | Bin 116732 -> 120912 bytes xpcPlugin/xpcPlugin.xcodeproj/project.pbxproj | 28 +++++++++++------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/xpcPlugin/XPlaneConnect/mac.xpl b/xpcPlugin/XPlaneConnect/mac.xpl index 0a2fa5546d09983c5b0324561cc39a327e7c41ac..e96e68c1984ab90c0b1b27188cc8daf27b4f177d 100755 GIT binary patch delta 32873 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 V`KbCvll`mCs0P(;IjcVR{{RoE5;*_> delta 31067 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 B5Xt}m diff --git a/xpcPlugin/xpcPlugin.xcodeproj/project.pbxproj b/xpcPlugin/xpcPlugin.xcodeproj/project.pbxproj index 079fa8a..3c80015 100755 --- a/xpcPlugin/xpcPlugin.xcodeproj/project.pbxproj +++ b/xpcPlugin/xpcPlugin.xcodeproj/project.pbxproj @@ -76,35 +76,43 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - AC4E46B809C2E0B3006B7E1B /* C Source */ = { + AC4E46B809C2E0B3006B7E1B /* src */ = { isa = PBXGroup; children = ( BE37D95E187C8B0F0033B082 /* XPCPlugin.cpp */, BEDC620218EDF1A7005DB364 /* xplaneConnect.c */, - BEDC620318EDF1A7005DB364 /* xplaneConnect.h */, BEABAD2B1AE041A3007BA7DA /* DataManager.cpp */, - BEABAD2C1AE041A3007BA7DA /* DataManager.h */, BEABAD2D1AE041A3007BA7DA /* DataMaps.cpp */, - BEABAD2E1AE041A3007BA7DA /* DataMaps.h */, BEABAD2F1AE041A3007BA7DA /* Drawing.cpp */, - BEABAD301AE041A3007BA7DA /* Drawing.h */, BEABAD311AE041A3007BA7DA /* Log.cpp */, - BEABAD321AE041A3007BA7DA /* Log.h */, BEABAD331AE041A3007BA7DA /* Message.cpp */, - BEABAD341AE041A3007BA7DA /* Message.h */, BEABAD351AE041A3007BA7DA /* MessageHandlers.cpp */, - BEABAD361AE041A3007BA7DA /* MessageHandlers.h */, BEABAD3D1AE0498D007BA7DA /* UDPSocket.cpp */, + ); + name = src; + sourceTree = ""; + }; + BE953E0B1AEB183400CE4A8C /* inc */ = { + isa = PBXGroup; + children = ( + BEDC620318EDF1A7005DB364 /* xplaneConnect.h */, + BEABAD2C1AE041A3007BA7DA /* DataManager.h */, + BEABAD2E1AE041A3007BA7DA /* DataMaps.h */, + BEABAD301AE041A3007BA7DA /* Drawing.h */, + BEABAD321AE041A3007BA7DA /* Log.h */, + BEABAD341AE041A3007BA7DA /* Message.h */, + BEABAD361AE041A3007BA7DA /* MessageHandlers.h */, BEABAD3E1AE0498D007BA7DA /* UDPSocket.h */, ); - name = "C Source"; + name = inc; sourceTree = ""; }; D607B15F09A5563000699BC3 = { isa = PBXGroup; children = ( D6A7BDAD16A1DEA700D1426A /* Frameworks */, - AC4E46B809C2E0B3006B7E1B /* C Source */, + AC4E46B809C2E0B3006B7E1B /* src */, + BE953E0B1AEB183400CE4A8C /* inc */, D607B19A09A556E400699BC3 /* Products */, ); sourceTree = ""; From 31609f904fcb97e3b9286369a0d538b23b07d6db Mon Sep 17 00:00:00 2001 From: Chris Teubert Date: Sun, 26 Apr 2015 14:07:12 -0700 Subject: [PATCH 07/10] fixed bug in sendDATATest The wrong array was being set in the test sendDATATest(). We should make the test more complete so this can be caught. --- TestScripts/C Tests/main.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/TestScripts/C Tests/main.c b/TestScripts/C Tests/main.c index 9ecca83..dca0291 100644 --- a/TestScripts/C Tests/main.c +++ b/TestScripts/C Tests/main.c @@ -180,9 +180,9 @@ int sendDATATest() // sendDATA test { "sim/aircraft/parts/acf_gear_deploy" }; - float* data[100]; + float* data[100]; // array for result of getDREFs int sizes[100]; - float DATA[4][9]; + float DATA[4][9]; // Array for sendDATA XPCSocket sock = openUDP("127.0.0.1", 49009, 49066); // Setup @@ -198,9 +198,9 @@ int sendDATATest() // sendDATA test data[i][j] = -998; } } - data[0][0] = 14; // Gear - data[0][1] = 1; - data[0][2] = 0; + DATA[0][0] = 14; // Gear + DATA[0][1] = 1; + DATA[0][2] = 0; // Execution sendDATA(sock, DATA, 1); From bdc4a04f1f78c50f11aab0cc3889a2a89fcc7dbe Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Mon, 27 Apr 2015 08:51:10 -0700 Subject: [PATCH 08/10] Fixed minor issues reported by Visual Studio code analysis tool. --- xpcPlugin/MessageHandlers.cpp | 2 +- xpcPlugin/UDPSocket.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/xpcPlugin/MessageHandlers.cpp b/xpcPlugin/MessageHandlers.cpp index 04296ad..3691559 100644 --- a/xpcPlugin/MessageHandlers.cpp +++ b/xpcPlugin/MessageHandlers.cpp @@ -257,7 +257,7 @@ namespace XPC for (int i = 0; i < numCols; ++i) { unsigned char dataRef = (unsigned char)values[i][0]; - if (dataRef > 134) + if (dataRef >= 134) { #if LOG_VERBOSITY > 0 Log::FormatLine("[DATA] ERROR: DataRef # must be between 0 - 134 (Received: %hi)", (int)dataRef); diff --git a/xpcPlugin/UDPSocket.cpp b/xpcPlugin/UDPSocket.cpp index a2383e8..3b5cf3a 100644 --- a/xpcPlugin/UDPSocket.cpp +++ b/xpcPlugin/UDPSocket.cpp @@ -162,7 +162,7 @@ namespace XPC inet_ntop(AF_INET, &sin->sin_addr, ip, INET6_ADDRSTRLEN); int len = strnlen(ip, INET6_ADDRSTRLEN); ip[len++] = ':'; - sprintf(ip + len, "%d", ntohs((*sin).sin_port)); + sprintf(ip + len, "%u", ntohs((*sin).sin_port)); break; } case AF_INET6: @@ -171,7 +171,7 @@ namespace XPC inet_ntop(AF_INET6, &sin->sin6_addr, ip, INET6_ADDRSTRLEN); int len = strnlen(ip, INET6_ADDRSTRLEN); ip[len++] = ':'; - sprintf(ip + len, "%d", ntohs((*sin).sin6_port)); + sprintf(ip + len, "%u", ntohs((*sin).sin6_port)); break; } default: From 22a2adf5f223d5d826e36aab7c0c65118c08870b Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Mon, 27 Apr 2015 09:26:17 -0700 Subject: [PATCH 09/10] More static analysis fixes. --- xpcPlugin/DataManager.cpp | 2 +- xpcPlugin/Drawing.cpp | 12 +++++------- xpcPlugin/Log.cpp | 2 +- xpcPlugin/XPlaneConnect/mac.xpl | Bin 120912 -> 120912 bytes 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/xpcPlugin/DataManager.cpp b/xpcPlugin/DataManager.cpp index fba2466..75e4c2e 100644 --- a/xpcPlugin/DataManager.cpp +++ b/xpcPlugin/DataManager.cpp @@ -439,7 +439,7 @@ namespace XPC #endif float gearArray[10]; - if ((gear < -8.5f && gear > 9.5f) || (gear < -997.9f && gear > -999.1f)) + if ((gear < -8.5f && gear > -9.5f) || (gear < -997.9f && gear > -999.1f)) { return; } diff --git a/xpcPlugin/Drawing.cpp b/xpcPlugin/Drawing.cpp index d08afdf..e7245ad 100644 --- a/xpcPlugin/Drawing.cpp +++ b/xpcPlugin/Drawing.cpp @@ -136,13 +136,11 @@ namespace XPC float py = XPLMGetDataf(planeYref); float pz = XPLMGetDataf(planeZref); - Waypoint* g; - LocalPoint* l; //Convert to local for (size_t i = 0; i < numWaypoints; ++i) { - g = &waypoints[i]; - l = &localPoints[i]; + Waypoint* g = &waypoints[i]; + LocalPoint* l = &localPoints[i]; XPLMWorldToLocal(g->latitude, g->longitude, g->altitude, &l->x, &l->y, &l->z); } @@ -153,7 +151,7 @@ namespace XPC glBegin(GL_LINES); for (size_t i = 0; i < numWaypoints; ++i) { - l = &localPoints[i]; + LocalPoint* l = &localPoints[i]; glVertex3f((float)l->x, (float)l->y, (float)l->z); glVertex3f((float)l->x, -1000.0F, (float)l->z); } @@ -164,7 +162,7 @@ namespace XPC glBegin(GL_LINE_STRIP); for (size_t i = 0; i < numWaypoints; ++i) { - l = &localPoints[i]; + LocalPoint* l = &localPoints[i]; glVertex3f((float)l->x, (float)l->y, (float)l->z); } glEnd(); @@ -173,7 +171,7 @@ namespace XPC glColor3f(1.0F, 1.0F, 1.0F); for (size_t i = 0; i < numWaypoints; ++i) { - l = &localPoints[i]; + LocalPoint* l = &localPoints[i]; float xoff = (float)l->x - px; float yoff = (float)l->y - py; float zoff = (float)l->z - pz; diff --git a/xpcPlugin/Log.cpp b/xpcPlugin/Log.cpp index 22c6a18..c08de8d 100644 --- a/xpcPlugin/Log.cpp +++ b/xpcPlugin/Log.cpp @@ -78,13 +78,13 @@ namespace XPC void Log::FormatLine(const char* format, ...) { va_list args; - va_start(args, format); FILE* fd = fopen("XPCLog.txt", "a"); if (!fd) { return; } + va_start(args, format); WriteTime(fd); vfprintf(fd, format, args); diff --git a/xpcPlugin/XPlaneConnect/mac.xpl b/xpcPlugin/XPlaneConnect/mac.xpl index e96e68c1984ab90c0b1b27188cc8daf27b4f177d..a0459cd7b7888fe404502956d4870fa6cbbbb510 100755 GIT binary patch delta 17475 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 Date: Mon, 27 Apr 2015 10:02:31 -0700 Subject: [PATCH 10/10] Renamed "setDREF" function back to "sendDREF". --- C/src/xplaneConnect.c | 2 +- C/src/xplaneConnect.h | 2 +- C/xpcExample/xpcExample/src/main.cpp | 2 +- Java/Examples/BasicOperation/src/Main.java | 2 +- Java/src/XPlaneConnect.java | 6 +++--- MATLAB/+XPlaneConnect/XPlaneConnect.jar | Bin 6791 -> 6808 bytes .../+XPlaneConnect/{setDREF.m => sendDREF.m} | 2 +- TestScripts/C Tests/main.c | 2 +- TestScripts/Java Tests/XPlaneConnectTest.java | 14 +++++++------- .../{setDREFTest.m => sendDREFTest.m} | 4 ++-- TestScripts/MATLAB Tests/tests.m | 2 +- 11 files changed, 19 insertions(+), 19 deletions(-) rename MATLAB/+XPlaneConnect/{setDREF.m => sendDREF.m} (96%) rename TestScripts/MATLAB Tests/{setDREFTest.m => sendDREFTest.m} (89%) diff --git a/C/src/xplaneConnect.c b/C/src/xplaneConnect.c index b065bd0..ec44366 100755 --- a/C/src/xplaneConnect.c +++ b/C/src/xplaneConnect.c @@ -362,7 +362,7 @@ int readDATA(XPCSocket sock, float data[][9], int rows) /*****************************************************************************/ /**** DREF functions ****/ /*****************************************************************************/ -int setDREF(XPCSocket sock, const char* dref, float value[], int size) +int sendDREF(XPCSocket sock, const char* dref, float value[], int size) { // Setup command // 5 byte header + max 255 char dref name + max 255 values * 4 bytes per value = 1279 diff --git a/C/src/xplaneConnect.h b/C/src/xplaneConnect.h index 3a2a02e..8b38193 100644 --- a/C/src/xplaneConnect.h +++ b/C/src/xplaneConnect.h @@ -133,7 +133,7 @@ int sendDATA(XPCSocket sock, float data[][9], int rows); /// \param values An array of values representing the data to set. /// \param size The number of elements in values. /// \returns 0 if successful, otherwise a negative value. -int setDREF(XPCSocket sock, const char* dref, float value[], int size); +int sendDREF(XPCSocket sock, const char* dref, float value[], int size); /// Gets the value of the specified dataref. /// diff --git a/C/xpcExample/xpcExample/src/main.cpp b/C/xpcExample/xpcExample/src/main.cpp index 325622d..acc9219 100644 --- a/C/xpcExample/xpcExample/src/main.cpp +++ b/C/xpcExample/xpcExample/src/main.cpp @@ -93,7 +93,7 @@ int main() const char* dref = "sim/cockpit/switches/gear_handle_status"; // Gear handle data reference float gear = 0; // Stow gear - setDREF(sock, dref, &gear, 1); // Set gear to stow + sendDREF(sock, dref, &gear, 1); // Set gear to stow // Simulate for 10 seconds sleep(10); diff --git a/Java/Examples/BasicOperation/src/Main.java b/Java/Examples/BasicOperation/src/Main.java index 86d0648..1ab5bcc 100644 --- a/Java/Examples/BasicOperation/src/Main.java +++ b/Java/Examples/BasicOperation/src/Main.java @@ -71,7 +71,7 @@ public class Main try { Thread.sleep(10000); } catch (InterruptedException ex) {} System.out.println("Stowing landing gear"); - xpc.setDREF("sim/cockpit/switches/gear_handle_status", 1); + xpc.sendDREF("sim/cockpit/switches/gear_handle_status", 1); //Let sim run for 10 seconds try { Thread.sleep(10000); } catch (InterruptedException ex) {} diff --git a/Java/src/XPlaneConnect.java b/Java/src/XPlaneConnect.java index f59e18c..faa2204 100644 --- a/Java/src/XPlaneConnect.java +++ b/Java/src/XPlaneConnect.java @@ -306,9 +306,9 @@ public class XPlaneConnect implements AutoCloseable throw new IOException("No response received."); } - public void setDREF(String dref, float value) throws IOException + public void sendDREF(String dref, float value) throws IOException { - setDREF(dref, new float[] {value}); + sendDREF(dref, new float[] {value}); } /** @@ -318,7 +318,7 @@ public class XPlaneConnect implements AutoCloseable * @param value An array of floating point values whose structure depends on the dref specified. * @throws IOException If the command cannot be sent. */ - public void setDREF(String dref, float[] value) throws IOException + public void sendDREF(String dref, float[] value) throws IOException { //Preconditions if(dref == null) diff --git a/MATLAB/+XPlaneConnect/XPlaneConnect.jar b/MATLAB/+XPlaneConnect/XPlaneConnect.jar index edf9b739c8d56a5583ddc34dc3387973751d5355..495f2229d11ca87415c21a6aea892282f2fefe8e 100644 GIT binary patch delta 5737 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 G0000viW-Xm diff --git a/MATLAB/+XPlaneConnect/setDREF.m b/MATLAB/+XPlaneConnect/sendDREF.m similarity index 96% rename from MATLAB/+XPlaneConnect/setDREF.m rename to MATLAB/+XPlaneConnect/sendDREF.m index 13e6f00..65e23aa 100644 --- a/MATLAB/+XPlaneConnect/setDREF.m +++ b/MATLAB/+XPlaneConnect/sendDREF.m @@ -1,4 +1,4 @@ -function setDREF( dref, value, socket ) +function sendDREF( dref, value, socket ) % sendDREF Sends a command to X-Plane that sets the given DREF. % % Inputs diff --git a/TestScripts/C Tests/main.c b/TestScripts/C Tests/main.c index dca0291..487b351 100644 --- a/TestScripts/C Tests/main.c +++ b/TestScripts/C Tests/main.c @@ -150,7 +150,7 @@ int sendDREFTest() // sendDREF test } // Execution - setDREF(sock, drefs[0], &value, 1); + sendDREF(sock, drefs[0], &value, 1); int result = getDREFs(sock, drefs, data, 1, sizes); // Close diff --git a/TestScripts/Java Tests/XPlaneConnectTest.java b/TestScripts/Java Tests/XPlaneConnectTest.java index 8eb2b69..aed0883 100644 --- a/TestScripts/Java Tests/XPlaneConnectTest.java +++ b/TestScripts/Java Tests/XPlaneConnectTest.java @@ -308,7 +308,7 @@ public class XPlaneConnectTest float gearHandle = xpc.getDREF(dref)[0]; float value = gearHandle > 0.5 ? 0 : 1; - xpc.setDREF(dref, value); + xpc.sendDREF(dref, value); float result = xpc.getDREF(dref)[0]; assertEquals(value, result, 1e-4); @@ -320,7 +320,7 @@ public class XPlaneConnectTest { try(XPlaneConnect xpc = new XPlaneConnect()) { - xpc.setDREF(null, 0); + xpc.sendDREF(null, 0); fail(); } } @@ -332,7 +332,7 @@ public class XPlaneConnectTest try(XPlaneConnect xpc = new XPlaneConnect()) { - xpc.setDREF(dref, null); + xpc.sendDREF(dref, null); fail(); } } @@ -343,7 +343,7 @@ public class XPlaneConnectTest String dref = "sim/cockpit/switches/gear_handle_status"; try(XPlaneConnect xpc = new XPlaneConnect()) { - xpc.setDREF(dref, new float[0]); + xpc.sendDREF(dref, new float[0]); fail(); } } @@ -358,7 +358,7 @@ public class XPlaneConnectTest String dref = "sim/cockpit/switches/gear_handle_status"; try(XPlaneConnect xpc = new XPlaneConnect()) { - xpc.setDREF(dref, new float[200]); + xpc.sendDREF(dref, new float[200]); } } @@ -368,7 +368,7 @@ public class XPlaneConnectTest String dref = "sim/cockpit/switches/i/am/a/very/long/fake/dref/that/is/over/255/characters/./which/means/that/my/length/cant/be/encoded/in/the/single/byte/allocated/by/the/message/format/,/so/i/should/cause/an/exception/instead/./i/am/still/not/long/enough/./almost/there"; try(XPlaneConnect xpc = new XPlaneConnect()) { - xpc.setDREF(dref, 0); + xpc.sendDREF(dref, 0); fail(); } } @@ -379,7 +379,7 @@ public class XPlaneConnectTest String dref = ""; try(XPlaneConnect xpc = new XPlaneConnect()) { - xpc.setDREF(dref, 0); + xpc.sendDREF(dref, 0); fail(); } } diff --git a/TestScripts/MATLAB Tests/setDREFTest.m b/TestScripts/MATLAB Tests/sendDREFTest.m similarity index 89% rename from TestScripts/MATLAB Tests/setDREFTest.m rename to TestScripts/MATLAB Tests/sendDREFTest.m index 70077b3..33741c2 100644 --- a/TestScripts/MATLAB Tests/setDREFTest.m +++ b/TestScripts/MATLAB Tests/sendDREFTest.m @@ -1,4 +1,4 @@ -function setDREFTest( ) +function sendDREFTest( ) %SENDREADTEST Summary of this function goes here % Detailed explanation goes here addpath('../../MATLAB') @@ -7,7 +7,7 @@ import XPlaneConnect.* DREFS = {'sim/cockpit/switches/gear_handle_status'}; value = randi([0 10]); -setDREF(DREFS{1},value); +sendDREF(DREFS{1},value); result = getDREFs(DREFS); assert(isequal(length(result),1),'setDREFTest: requestDREF unsucessful-wrong number of elements returned'); diff --git a/TestScripts/MATLAB Tests/tests.m b/TestScripts/MATLAB Tests/tests.m index ec2329f..6871686 100644 --- a/TestScripts/MATLAB Tests/tests.m +++ b/TestScripts/MATLAB Tests/tests.m @@ -13,7 +13,7 @@ disp(['XPC Tests-MATLAB (', os, ')']); theTests = {{@openCloseTest, 'Open/Close Test', 0},... {@sendTEXTTest,'TEXT Test', 0},... {@getDREFsTest,'Request DREF Test', 0},... - {@setDREFTest,'Send DREF Test', 0},... + {@sendDREFTest,'Send DREF Test', 0},... {@DATATest,'DATA Test', 0},... {@CTRLTest,'CTRL Test', 0},... {@POSITest,'POSI Test', 0},...