From f26fe8c88457e3dabaff7ba577bb70f090ba7116 Mon Sep 17 00:00:00 2001 From: Sander Datema Date: Sun, 28 Jun 2020 09:10:27 +0200 Subject: [PATCH 01/13] Add sendCOMM method for Python 3 --- Python3/src/xpc.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Python3/src/xpc.py b/Python3/src/xpc.py index c7f5ec97..56671017 100644 --- a/Python3/src/xpc.py +++ b/Python3/src/xpc.py @@ -425,6 +425,25 @@ def sendWYPT(self, op, points): buffer = struct.pack(("<4sxBB" + str(len(points)) + "f").encode(), b"WYPT", op, len(points), *points) self.sendUDP(buffer) + def sendCOMM(self, comm): + """Sets the specified datarefs to the specified values. + + Args: + drefs: A list of names of the datarefs to set. + """ + if comm is None: + raise ValueError("comm must be non-empty.") + + buffer = struct.pack(b"<4sx", b"COMM") + if len(comm) == 0 or len(comm) > 255: + raise ValueError("comm must be a non-empty string less than 256 characters.") + + # Pack message + fmt = " Date: Sun, 19 Jul 2020 15:08:29 -0500 Subject: [PATCH 02/13] re-org and get compiling --- Java/.project | 17 ++ .../org.eclipse.core.resources.prefs | 2 + Java/.settings/org.eclipse.m2e.core.prefs | 4 + Java/Examples/.project | 17 ++ .../org.eclipse.core.resources.prefs | 2 + .../.settings/org.eclipse.m2e.core.prefs | 4 + .../libs/XPlaneConnect.jar | Bin 8657 -> 0 bytes Java/Examples/Playback/.classpath | 27 +++ Java/Examples/Playback/.gitignore | 1 + Java/Examples/Playback/.project | 23 +++ .../org.eclipse.core.resources.prefs | 3 + .../.settings/org.eclipse.jdt.core.prefs | 8 + .../.settings/org.eclipse.m2e.core.prefs | 4 + Java/Examples/Playback/pom.xml | 12 ++ .../java/gov/nasa/xpc/ex}/Main.java | 6 +- Java/Examples/basic-operation/.classpath | 27 +++ Java/Examples/basic-operation/.gitignore | 1 + .../.idea/compiler.xml | 0 .../.idea/copyright/profiles_settings.xml | 0 .../.idea/libraries/Java.xml | 0 .../.idea/misc.xml | 0 .../.idea/modules.xml | 0 .../.idea/vcs.xml | 0 Java/Examples/basic-operation/.project | 23 +++ .../org.eclipse.core.resources.prefs | 3 + .../.settings/org.eclipse.jdt.core.prefs | 8 + .../.settings/org.eclipse.m2e.core.prefs | 4 + .../BasicOperation.iml | 0 Java/Examples/basic-operation/pom.xml | 12 ++ .../src/main/java/gov/nasa/xpc/ex}/Main.java | 0 Java/Examples/continuous-operation/.classpath | 27 +++ Java/Examples/continuous-operation/.gitignore | 1 + .../.idea/.name | 0 .../.idea/compiler.xml | 0 .../.idea/copyright/profiles_settings.xml | 0 .../.idea/libraries/XPlaneConnect.xml | 0 .../.idea/misc.xml | 0 .../.idea/modules.xml | 0 .../.idea/vcs.xml | 0 Java/Examples/continuous-operation/.project | 23 +++ .../org.eclipse.core.resources.prefs | 3 + .../.settings/org.eclipse.jdt.core.prefs | 8 + .../.settings/org.eclipse.m2e.core.prefs | 4 + .../ContinuousOperation.iml | 0 Java/Examples/continuous-operation/pom.xml | 12 ++ .../src/main/java/gov/nasa/xpc/ex}/Main.java | 2 +- Java/Examples/discovery/.classpath | 27 +++ Java/Examples/discovery/.gitignore | 1 + Java/Examples/discovery/.project | 23 +++ .../org.eclipse.core.resources.prefs | 3 + .../.settings/org.eclipse.jdt.core.prefs | 8 + .../.settings/org.eclipse.m2e.core.prefs | 4 + .../DiscoveryExample.iml | 0 Java/Examples/discovery/pom.xml | 12 ++ .../xpc/ex}/DiscoveryConnectionExample.java | 0 .../nasa/xpc/ex}/SimpleDiscoveryExample.java | 0 Java/Examples/pom.xml | 30 +++ Java/pom.xml | 173 ++++++++++++++++++ Java/xpc/.classpath | 27 +++ Java/xpc/.gitignore | 1 + Java/xpc/.project | 23 +++ .../org.eclipse.core.resources.prefs | 3 + Java/xpc/.settings/org.eclipse.jdt.core.prefs | 8 + Java/xpc/.settings/org.eclipse.m2e.core.prefs | 4 + Java/xpc/pom.xml | 18 ++ .../src/main/java/gov/nasa/xpc}/ViewType.java | 0 .../main/java/gov/nasa/xpc}/WaypointOp.java | 0 .../java/gov/nasa/xpc}/XPlaneConnect.java | 0 .../java/gov/nasa/xpc}/discovery/Beacon.java | 0 .../gov/nasa/xpc}/discovery/BeaconParser.java | 0 .../discovery/BeaconReceivedListener.java | 0 .../DiscoveryConnectionCallback.java | 0 .../discovery/XPlaneConnectDiscovery.java | 0 73 files changed, 650 insertions(+), 3 deletions(-) create mode 100644 Java/.project create mode 100644 Java/.settings/org.eclipse.core.resources.prefs create mode 100644 Java/.settings/org.eclipse.m2e.core.prefs create mode 100644 Java/Examples/.project create mode 100644 Java/Examples/.settings/org.eclipse.core.resources.prefs create mode 100644 Java/Examples/.settings/org.eclipse.m2e.core.prefs delete mode 100644 Java/Examples/ContinuousOperation/libs/XPlaneConnect.jar create mode 100644 Java/Examples/Playback/.classpath create mode 100644 Java/Examples/Playback/.gitignore create mode 100644 Java/Examples/Playback/.project create mode 100644 Java/Examples/Playback/.settings/org.eclipse.core.resources.prefs create mode 100644 Java/Examples/Playback/.settings/org.eclipse.jdt.core.prefs create mode 100644 Java/Examples/Playback/.settings/org.eclipse.m2e.core.prefs create mode 100644 Java/Examples/Playback/pom.xml rename Java/Examples/Playback/src/{gov/nasa/xpc => main/java/gov/nasa/xpc/ex}/Main.java (96%) create mode 100644 Java/Examples/basic-operation/.classpath create mode 100644 Java/Examples/basic-operation/.gitignore rename Java/Examples/{BasicOperation => basic-operation}/.idea/compiler.xml (100%) rename Java/Examples/{BasicOperation => basic-operation}/.idea/copyright/profiles_settings.xml (100%) rename Java/Examples/{BasicOperation => basic-operation}/.idea/libraries/Java.xml (100%) rename Java/Examples/{BasicOperation => basic-operation}/.idea/misc.xml (100%) rename Java/Examples/{BasicOperation => basic-operation}/.idea/modules.xml (100%) rename Java/Examples/{BasicOperation => basic-operation}/.idea/vcs.xml (100%) create mode 100644 Java/Examples/basic-operation/.project create mode 100644 Java/Examples/basic-operation/.settings/org.eclipse.core.resources.prefs create mode 100644 Java/Examples/basic-operation/.settings/org.eclipse.jdt.core.prefs create mode 100644 Java/Examples/basic-operation/.settings/org.eclipse.m2e.core.prefs rename Java/Examples/{BasicOperation => basic-operation}/BasicOperation.iml (100%) create mode 100644 Java/Examples/basic-operation/pom.xml rename Java/Examples/{BasicOperation/src => basic-operation/src/main/java/gov/nasa/xpc/ex}/Main.java (100%) create mode 100644 Java/Examples/continuous-operation/.classpath create mode 100644 Java/Examples/continuous-operation/.gitignore rename Java/Examples/{ContinuousOperation => continuous-operation}/.idea/.name (100%) rename Java/Examples/{ContinuousOperation => continuous-operation}/.idea/compiler.xml (100%) rename Java/Examples/{ContinuousOperation => continuous-operation}/.idea/copyright/profiles_settings.xml (100%) rename Java/Examples/{ContinuousOperation => continuous-operation}/.idea/libraries/XPlaneConnect.xml (100%) rename Java/Examples/{ContinuousOperation => continuous-operation}/.idea/misc.xml (100%) rename Java/Examples/{ContinuousOperation => continuous-operation}/.idea/modules.xml (100%) rename Java/Examples/{ContinuousOperation => continuous-operation}/.idea/vcs.xml (100%) create mode 100644 Java/Examples/continuous-operation/.project create mode 100644 Java/Examples/continuous-operation/.settings/org.eclipse.core.resources.prefs create mode 100644 Java/Examples/continuous-operation/.settings/org.eclipse.jdt.core.prefs create mode 100644 Java/Examples/continuous-operation/.settings/org.eclipse.m2e.core.prefs rename Java/Examples/{ContinuousOperation => continuous-operation}/ContinuousOperation.iml (100%) create mode 100644 Java/Examples/continuous-operation/pom.xml rename Java/Examples/{ContinuousOperation/src => continuous-operation/src/main/java/gov/nasa/xpc/ex}/Main.java (92%) create mode 100644 Java/Examples/discovery/.classpath create mode 100644 Java/Examples/discovery/.gitignore create mode 100644 Java/Examples/discovery/.project create mode 100644 Java/Examples/discovery/.settings/org.eclipse.core.resources.prefs create mode 100644 Java/Examples/discovery/.settings/org.eclipse.jdt.core.prefs create mode 100644 Java/Examples/discovery/.settings/org.eclipse.m2e.core.prefs rename Java/Examples/{DiscoveryExample => discovery}/DiscoveryExample.iml (100%) create mode 100644 Java/Examples/discovery/pom.xml rename Java/Examples/{DiscoveryExample/src => discovery/src/main/java/gov/nasa/xpc/ex}/DiscoveryConnectionExample.java (100%) rename Java/Examples/{DiscoveryExample/src => discovery/src/main/java/gov/nasa/xpc/ex}/SimpleDiscoveryExample.java (100%) create mode 100644 Java/Examples/pom.xml create mode 100644 Java/pom.xml create mode 100644 Java/xpc/.classpath create mode 100644 Java/xpc/.gitignore create mode 100644 Java/xpc/.project create mode 100644 Java/xpc/.settings/org.eclipse.core.resources.prefs create mode 100644 Java/xpc/.settings/org.eclipse.jdt.core.prefs create mode 100644 Java/xpc/.settings/org.eclipse.m2e.core.prefs create mode 100644 Java/xpc/pom.xml rename Java/{src => xpc/src/main/java/gov/nasa/xpc}/ViewType.java (100%) rename Java/{src => xpc/src/main/java/gov/nasa/xpc}/WaypointOp.java (100%) rename Java/{src => xpc/src/main/java/gov/nasa/xpc}/XPlaneConnect.java (100%) rename Java/{src => xpc/src/main/java/gov/nasa/xpc}/discovery/Beacon.java (100%) rename Java/{src => xpc/src/main/java/gov/nasa/xpc}/discovery/BeaconParser.java (100%) rename Java/{src => xpc/src/main/java/gov/nasa/xpc}/discovery/BeaconReceivedListener.java (100%) rename Java/{src => xpc/src/main/java/gov/nasa/xpc}/discovery/DiscoveryConnectionCallback.java (100%) rename Java/{src => xpc/src/main/java/gov/nasa/xpc}/discovery/XPlaneConnectDiscovery.java (100%) diff --git a/Java/.project b/Java/.project new file mode 100644 index 00000000..e18da484 --- /dev/null +++ b/Java/.project @@ -0,0 +1,17 @@ + + + xpc-parent + + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + + diff --git a/Java/.settings/org.eclipse.core.resources.prefs b/Java/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/Java/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/Java/.settings/org.eclipse.m2e.core.prefs b/Java/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000..f897a7f1 --- /dev/null +++ b/Java/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/Java/Examples/.project b/Java/Examples/.project new file mode 100644 index 00000000..589dd0ab --- /dev/null +++ b/Java/Examples/.project @@ -0,0 +1,17 @@ + + + xpc-examples + + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + + diff --git a/Java/Examples/.settings/org.eclipse.core.resources.prefs b/Java/Examples/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/Java/Examples/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/Java/Examples/.settings/org.eclipse.m2e.core.prefs b/Java/Examples/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000..f897a7f1 --- /dev/null +++ b/Java/Examples/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/Java/Examples/ContinuousOperation/libs/XPlaneConnect.jar b/Java/Examples/ContinuousOperation/libs/XPlaneConnect.jar deleted file mode 100644 index eba5283b15fa5c42fbefe5574182eeb93a54c183..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8657 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 diff --git a/Java/Examples/Playback/.classpath b/Java/Examples/Playback/.classpath new file mode 100644 index 00000000..5e8a55fe --- /dev/null +++ b/Java/Examples/Playback/.classpath @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Java/Examples/Playback/.gitignore b/Java/Examples/Playback/.gitignore new file mode 100644 index 00000000..b83d2226 --- /dev/null +++ b/Java/Examples/Playback/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/Java/Examples/Playback/.project b/Java/Examples/Playback/.project new file mode 100644 index 00000000..1f830e84 --- /dev/null +++ b/Java/Examples/Playback/.project @@ -0,0 +1,23 @@ + + + playback-example + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/Java/Examples/Playback/.settings/org.eclipse.core.resources.prefs b/Java/Examples/Playback/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..e9441bb1 --- /dev/null +++ b/Java/Examples/Playback/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding/=UTF-8 diff --git a/Java/Examples/Playback/.settings/org.eclipse.jdt.core.prefs b/Java/Examples/Playback/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..2f5cc74c --- /dev/null +++ b/Java/Examples/Playback/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/Java/Examples/Playback/.settings/org.eclipse.m2e.core.prefs b/Java/Examples/Playback/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000..f897a7f1 --- /dev/null +++ b/Java/Examples/Playback/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/Java/Examples/Playback/pom.xml b/Java/Examples/Playback/pom.xml new file mode 100644 index 00000000..4e252402 --- /dev/null +++ b/Java/Examples/Playback/pom.xml @@ -0,0 +1,12 @@ + + 4.0.0 + + + gov.nasa + xpc-examples + 1.4.0-SNAPSHOT + + + playback-example + XPC Example Playback + diff --git a/Java/Examples/Playback/src/gov/nasa/xpc/Main.java b/Java/Examples/Playback/src/main/java/gov/nasa/xpc/ex/Main.java similarity index 96% rename from Java/Examples/Playback/src/gov/nasa/xpc/Main.java rename to Java/Examples/Playback/src/main/java/gov/nasa/xpc/ex/Main.java index 3b5925b1..d1bfb20b 100644 --- a/Java/Examples/Playback/src/gov/nasa/xpc/Main.java +++ b/Java/Examples/Playback/src/main/java/gov/nasa/xpc/ex/Main.java @@ -1,7 +1,9 @@ -package gov.nasa.xpc; +package gov.nasa.xpc.ex; import com.sun.javafx.scene.EnteredExitedHandler; +import gov.nasa.xpc.XPlaneConnect; + import java.io.*; import java.util.Scanner; @@ -99,7 +101,7 @@ public static void record(String path, int interval, int duration) throws IOExce { for (int i = 0; i < count; ++i) { - float[] posi = xpc.getPOSI(0); // FIXME: change this to 64-bit double + double[] posi = xpc.getPOSI(0); // FIXME: change this to 64-bit double writer.write(String.format("%1$f, %2$f, %3$f, %4$f, %5$f, %6$f, %7$f\n", posi[0], posi[1], posi[2], posi[3], posi[4], posi[5], posi[6])); try diff --git a/Java/Examples/basic-operation/.classpath b/Java/Examples/basic-operation/.classpath new file mode 100644 index 00000000..5e8a55fe --- /dev/null +++ b/Java/Examples/basic-operation/.classpath @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Java/Examples/basic-operation/.gitignore b/Java/Examples/basic-operation/.gitignore new file mode 100644 index 00000000..b83d2226 --- /dev/null +++ b/Java/Examples/basic-operation/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/Java/Examples/BasicOperation/.idea/compiler.xml b/Java/Examples/basic-operation/.idea/compiler.xml similarity index 100% rename from Java/Examples/BasicOperation/.idea/compiler.xml rename to Java/Examples/basic-operation/.idea/compiler.xml diff --git a/Java/Examples/BasicOperation/.idea/copyright/profiles_settings.xml b/Java/Examples/basic-operation/.idea/copyright/profiles_settings.xml similarity index 100% rename from Java/Examples/BasicOperation/.idea/copyright/profiles_settings.xml rename to Java/Examples/basic-operation/.idea/copyright/profiles_settings.xml diff --git a/Java/Examples/BasicOperation/.idea/libraries/Java.xml b/Java/Examples/basic-operation/.idea/libraries/Java.xml similarity index 100% rename from Java/Examples/BasicOperation/.idea/libraries/Java.xml rename to Java/Examples/basic-operation/.idea/libraries/Java.xml diff --git a/Java/Examples/BasicOperation/.idea/misc.xml b/Java/Examples/basic-operation/.idea/misc.xml similarity index 100% rename from Java/Examples/BasicOperation/.idea/misc.xml rename to Java/Examples/basic-operation/.idea/misc.xml diff --git a/Java/Examples/BasicOperation/.idea/modules.xml b/Java/Examples/basic-operation/.idea/modules.xml similarity index 100% rename from Java/Examples/BasicOperation/.idea/modules.xml rename to Java/Examples/basic-operation/.idea/modules.xml diff --git a/Java/Examples/BasicOperation/.idea/vcs.xml b/Java/Examples/basic-operation/.idea/vcs.xml similarity index 100% rename from Java/Examples/BasicOperation/.idea/vcs.xml rename to Java/Examples/basic-operation/.idea/vcs.xml diff --git a/Java/Examples/basic-operation/.project b/Java/Examples/basic-operation/.project new file mode 100644 index 00000000..ac3ce072 --- /dev/null +++ b/Java/Examples/basic-operation/.project @@ -0,0 +1,23 @@ + + + basic-operation + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/Java/Examples/basic-operation/.settings/org.eclipse.core.resources.prefs b/Java/Examples/basic-operation/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..e9441bb1 --- /dev/null +++ b/Java/Examples/basic-operation/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding/=UTF-8 diff --git a/Java/Examples/basic-operation/.settings/org.eclipse.jdt.core.prefs b/Java/Examples/basic-operation/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..2f5cc74c --- /dev/null +++ b/Java/Examples/basic-operation/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/Java/Examples/basic-operation/.settings/org.eclipse.m2e.core.prefs b/Java/Examples/basic-operation/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000..f897a7f1 --- /dev/null +++ b/Java/Examples/basic-operation/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/Java/Examples/BasicOperation/BasicOperation.iml b/Java/Examples/basic-operation/BasicOperation.iml similarity index 100% rename from Java/Examples/BasicOperation/BasicOperation.iml rename to Java/Examples/basic-operation/BasicOperation.iml diff --git a/Java/Examples/basic-operation/pom.xml b/Java/Examples/basic-operation/pom.xml new file mode 100644 index 00000000..fbd35118 --- /dev/null +++ b/Java/Examples/basic-operation/pom.xml @@ -0,0 +1,12 @@ + + 4.0.0 + + + gov.nasa + xpc-examples + 1.4.0-SNAPSHOT + + + basic-operation + XPC Example Basic Operation + diff --git a/Java/Examples/BasicOperation/src/Main.java b/Java/Examples/basic-operation/src/main/java/gov/nasa/xpc/ex/Main.java similarity index 100% rename from Java/Examples/BasicOperation/src/Main.java rename to Java/Examples/basic-operation/src/main/java/gov/nasa/xpc/ex/Main.java diff --git a/Java/Examples/continuous-operation/.classpath b/Java/Examples/continuous-operation/.classpath new file mode 100644 index 00000000..5e8a55fe --- /dev/null +++ b/Java/Examples/continuous-operation/.classpath @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Java/Examples/continuous-operation/.gitignore b/Java/Examples/continuous-operation/.gitignore new file mode 100644 index 00000000..b83d2226 --- /dev/null +++ b/Java/Examples/continuous-operation/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/Java/Examples/ContinuousOperation/.idea/.name b/Java/Examples/continuous-operation/.idea/.name similarity index 100% rename from Java/Examples/ContinuousOperation/.idea/.name rename to Java/Examples/continuous-operation/.idea/.name diff --git a/Java/Examples/ContinuousOperation/.idea/compiler.xml b/Java/Examples/continuous-operation/.idea/compiler.xml similarity index 100% rename from Java/Examples/ContinuousOperation/.idea/compiler.xml rename to Java/Examples/continuous-operation/.idea/compiler.xml diff --git a/Java/Examples/ContinuousOperation/.idea/copyright/profiles_settings.xml b/Java/Examples/continuous-operation/.idea/copyright/profiles_settings.xml similarity index 100% rename from Java/Examples/ContinuousOperation/.idea/copyright/profiles_settings.xml rename to Java/Examples/continuous-operation/.idea/copyright/profiles_settings.xml diff --git a/Java/Examples/ContinuousOperation/.idea/libraries/XPlaneConnect.xml b/Java/Examples/continuous-operation/.idea/libraries/XPlaneConnect.xml similarity index 100% rename from Java/Examples/ContinuousOperation/.idea/libraries/XPlaneConnect.xml rename to Java/Examples/continuous-operation/.idea/libraries/XPlaneConnect.xml diff --git a/Java/Examples/ContinuousOperation/.idea/misc.xml b/Java/Examples/continuous-operation/.idea/misc.xml similarity index 100% rename from Java/Examples/ContinuousOperation/.idea/misc.xml rename to Java/Examples/continuous-operation/.idea/misc.xml diff --git a/Java/Examples/ContinuousOperation/.idea/modules.xml b/Java/Examples/continuous-operation/.idea/modules.xml similarity index 100% rename from Java/Examples/ContinuousOperation/.idea/modules.xml rename to Java/Examples/continuous-operation/.idea/modules.xml diff --git a/Java/Examples/ContinuousOperation/.idea/vcs.xml b/Java/Examples/continuous-operation/.idea/vcs.xml similarity index 100% rename from Java/Examples/ContinuousOperation/.idea/vcs.xml rename to Java/Examples/continuous-operation/.idea/vcs.xml diff --git a/Java/Examples/continuous-operation/.project b/Java/Examples/continuous-operation/.project new file mode 100644 index 00000000..b74f80f5 --- /dev/null +++ b/Java/Examples/continuous-operation/.project @@ -0,0 +1,23 @@ + + + continuous-operation + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/Java/Examples/continuous-operation/.settings/org.eclipse.core.resources.prefs b/Java/Examples/continuous-operation/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..e9441bb1 --- /dev/null +++ b/Java/Examples/continuous-operation/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding/=UTF-8 diff --git a/Java/Examples/continuous-operation/.settings/org.eclipse.jdt.core.prefs b/Java/Examples/continuous-operation/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..2f5cc74c --- /dev/null +++ b/Java/Examples/continuous-operation/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/Java/Examples/continuous-operation/.settings/org.eclipse.m2e.core.prefs b/Java/Examples/continuous-operation/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000..f897a7f1 --- /dev/null +++ b/Java/Examples/continuous-operation/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/Java/Examples/ContinuousOperation/ContinuousOperation.iml b/Java/Examples/continuous-operation/ContinuousOperation.iml similarity index 100% rename from Java/Examples/ContinuousOperation/ContinuousOperation.iml rename to Java/Examples/continuous-operation/ContinuousOperation.iml diff --git a/Java/Examples/continuous-operation/pom.xml b/Java/Examples/continuous-operation/pom.xml new file mode 100644 index 00000000..803c4719 --- /dev/null +++ b/Java/Examples/continuous-operation/pom.xml @@ -0,0 +1,12 @@ + + 4.0.0 + + + gov.nasa + xpc-examples + 1.4.0-SNAPSHOT + + + continuous-operation + XPC Example Continuous Operation + diff --git a/Java/Examples/ContinuousOperation/src/Main.java b/Java/Examples/continuous-operation/src/main/java/gov/nasa/xpc/ex/Main.java similarity index 92% rename from Java/Examples/ContinuousOperation/src/Main.java rename to Java/Examples/continuous-operation/src/main/java/gov/nasa/xpc/ex/Main.java index 801a3695..486d46f6 100644 --- a/Java/Examples/ContinuousOperation/src/Main.java +++ b/Java/Examples/continuous-operation/src/main/java/gov/nasa/xpc/ex/Main.java @@ -20,7 +20,7 @@ public static void main(String[] args) int aircraft = 0; while(true) { - float[] posi = xpc.getPOSI(aircraft); // FIXME: change this to 64-bit double + double[] posi = xpc.getPOSI(aircraft); // FIXME: change this to 64-bit double float[] ctrl = xpc.getCTRL(aircraft); System.out.format("Loc: (%4f, %4f, %4f) Aileron:%2f Elevator:%2f Rudder:%2f\n", diff --git a/Java/Examples/discovery/.classpath b/Java/Examples/discovery/.classpath new file mode 100644 index 00000000..5e8a55fe --- /dev/null +++ b/Java/Examples/discovery/.classpath @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Java/Examples/discovery/.gitignore b/Java/Examples/discovery/.gitignore new file mode 100644 index 00000000..b83d2226 --- /dev/null +++ b/Java/Examples/discovery/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/Java/Examples/discovery/.project b/Java/Examples/discovery/.project new file mode 100644 index 00000000..fb76ee0d --- /dev/null +++ b/Java/Examples/discovery/.project @@ -0,0 +1,23 @@ + + + discovery-example + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/Java/Examples/discovery/.settings/org.eclipse.core.resources.prefs b/Java/Examples/discovery/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..e9441bb1 --- /dev/null +++ b/Java/Examples/discovery/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding/=UTF-8 diff --git a/Java/Examples/discovery/.settings/org.eclipse.jdt.core.prefs b/Java/Examples/discovery/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..2f5cc74c --- /dev/null +++ b/Java/Examples/discovery/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/Java/Examples/discovery/.settings/org.eclipse.m2e.core.prefs b/Java/Examples/discovery/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000..f897a7f1 --- /dev/null +++ b/Java/Examples/discovery/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/Java/Examples/DiscoveryExample/DiscoveryExample.iml b/Java/Examples/discovery/DiscoveryExample.iml similarity index 100% rename from Java/Examples/DiscoveryExample/DiscoveryExample.iml rename to Java/Examples/discovery/DiscoveryExample.iml diff --git a/Java/Examples/discovery/pom.xml b/Java/Examples/discovery/pom.xml new file mode 100644 index 00000000..8902bae4 --- /dev/null +++ b/Java/Examples/discovery/pom.xml @@ -0,0 +1,12 @@ + + 4.0.0 + + + gov.nasa + xpc-examples + 1.4.0-SNAPSHOT + + + discovery-example + XPC Discovery Example + diff --git a/Java/Examples/DiscoveryExample/src/DiscoveryConnectionExample.java b/Java/Examples/discovery/src/main/java/gov/nasa/xpc/ex/DiscoveryConnectionExample.java similarity index 100% rename from Java/Examples/DiscoveryExample/src/DiscoveryConnectionExample.java rename to Java/Examples/discovery/src/main/java/gov/nasa/xpc/ex/DiscoveryConnectionExample.java diff --git a/Java/Examples/DiscoveryExample/src/SimpleDiscoveryExample.java b/Java/Examples/discovery/src/main/java/gov/nasa/xpc/ex/SimpleDiscoveryExample.java similarity index 100% rename from Java/Examples/DiscoveryExample/src/SimpleDiscoveryExample.java rename to Java/Examples/discovery/src/main/java/gov/nasa/xpc/ex/SimpleDiscoveryExample.java diff --git a/Java/Examples/pom.xml b/Java/Examples/pom.xml new file mode 100644 index 00000000..3b99c0f2 --- /dev/null +++ b/Java/Examples/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + + gov.nasa + xpc-parent + 1.4.0-SNAPSHOT + + + xpc-examples + pom + xpc-examples + + + basic-operation + continuous-operation + discovery + playback + + + + + gov.nasa + xpc + 1.4.0-SNAPSHOT + + + + \ No newline at end of file diff --git a/Java/pom.xml b/Java/pom.xml new file mode 100644 index 00000000..7830e2e2 --- /dev/null +++ b/Java/pom.xml @@ -0,0 +1,173 @@ + + + + 4.0.0 + + + org.sonatype.oss + oss-parent + 7 + + + gov.nasa + xpc-parent + 1.4.0-SNAPSHOT + pom + + X-Plane Connect Parent + X-Plane Connect + https://github.com/nasa/XPlaneConnect + + + xpc + examples + + + + UTF-8 + 1.8 + + + + https://github.com/nasa/XPlaneConnect + scm:git:https://github.com/nasa/XPlaneConnect.git + scm:git:git@github.com:nasa/XPlaneConnect.git + HEAD + + + + GitHub Issues + https://github.com/google/gson/issues + + + + + NASA Open Source Agreement Version 1.3 + https://github.com/nasa/XPlaneConnect/blob/master/license.pdf + + + + + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Java/xpc/.classpath b/Java/xpc/.classpath new file mode 100644 index 00000000..5e8a55fe --- /dev/null +++ b/Java/xpc/.classpath @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Java/xpc/.gitignore b/Java/xpc/.gitignore new file mode 100644 index 00000000..b83d2226 --- /dev/null +++ b/Java/xpc/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/Java/xpc/.project b/Java/xpc/.project new file mode 100644 index 00000000..d5eced5f --- /dev/null +++ b/Java/xpc/.project @@ -0,0 +1,23 @@ + + + xpc + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/Java/xpc/.settings/org.eclipse.core.resources.prefs b/Java/xpc/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..e9441bb1 --- /dev/null +++ b/Java/xpc/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding/=UTF-8 diff --git a/Java/xpc/.settings/org.eclipse.jdt.core.prefs b/Java/xpc/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..2f5cc74c --- /dev/null +++ b/Java/xpc/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/Java/xpc/.settings/org.eclipse.m2e.core.prefs b/Java/xpc/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000..f897a7f1 --- /dev/null +++ b/Java/xpc/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/Java/xpc/pom.xml b/Java/xpc/pom.xml new file mode 100644 index 00000000..d977dc4d --- /dev/null +++ b/Java/xpc/pom.xml @@ -0,0 +1,18 @@ + + + 4.0.0 + + + gov.nasa + xpc-parent + 1.4.0-SNAPSHOT + + + xpc + + + xpc + + + + \ No newline at end of file diff --git a/Java/src/ViewType.java b/Java/xpc/src/main/java/gov/nasa/xpc/ViewType.java similarity index 100% rename from Java/src/ViewType.java rename to Java/xpc/src/main/java/gov/nasa/xpc/ViewType.java diff --git a/Java/src/WaypointOp.java b/Java/xpc/src/main/java/gov/nasa/xpc/WaypointOp.java similarity index 100% rename from Java/src/WaypointOp.java rename to Java/xpc/src/main/java/gov/nasa/xpc/WaypointOp.java diff --git a/Java/src/XPlaneConnect.java b/Java/xpc/src/main/java/gov/nasa/xpc/XPlaneConnect.java similarity index 100% rename from Java/src/XPlaneConnect.java rename to Java/xpc/src/main/java/gov/nasa/xpc/XPlaneConnect.java diff --git a/Java/src/discovery/Beacon.java b/Java/xpc/src/main/java/gov/nasa/xpc/discovery/Beacon.java similarity index 100% rename from Java/src/discovery/Beacon.java rename to Java/xpc/src/main/java/gov/nasa/xpc/discovery/Beacon.java diff --git a/Java/src/discovery/BeaconParser.java b/Java/xpc/src/main/java/gov/nasa/xpc/discovery/BeaconParser.java similarity index 100% rename from Java/src/discovery/BeaconParser.java rename to Java/xpc/src/main/java/gov/nasa/xpc/discovery/BeaconParser.java diff --git a/Java/src/discovery/BeaconReceivedListener.java b/Java/xpc/src/main/java/gov/nasa/xpc/discovery/BeaconReceivedListener.java similarity index 100% rename from Java/src/discovery/BeaconReceivedListener.java rename to Java/xpc/src/main/java/gov/nasa/xpc/discovery/BeaconReceivedListener.java diff --git a/Java/src/discovery/DiscoveryConnectionCallback.java b/Java/xpc/src/main/java/gov/nasa/xpc/discovery/DiscoveryConnectionCallback.java similarity index 100% rename from Java/src/discovery/DiscoveryConnectionCallback.java rename to Java/xpc/src/main/java/gov/nasa/xpc/discovery/DiscoveryConnectionCallback.java diff --git a/Java/src/discovery/XPlaneConnectDiscovery.java b/Java/xpc/src/main/java/gov/nasa/xpc/discovery/XPlaneConnectDiscovery.java similarity index 100% rename from Java/src/discovery/XPlaneConnectDiscovery.java rename to Java/xpc/src/main/java/gov/nasa/xpc/discovery/XPlaneConnectDiscovery.java From ebe489c771dc7e98a72afe65e38c028de271c3bd Mon Sep 17 00:00:00 2001 From: Mike Frizzell <> Date: Sun, 19 Jul 2020 16:23:26 -0500 Subject: [PATCH 03/13] update issues repo --- Java/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Java/pom.xml b/Java/pom.xml index 7830e2e2..c1516944 100644 --- a/Java/pom.xml +++ b/Java/pom.xml @@ -37,7 +37,7 @@ GitHub Issues - https://github.com/google/gson/issues + https://github.com/nasa/XPlaneConnect/issues From 7904ce622fcdf9f5daaa64aca3038379c6db80a7 Mon Sep 17 00:00:00 2001 From: Alex Fefer Date: Mon, 5 Oct 2020 11:34:08 -0700 Subject: [PATCH 04/13] Added BCOM and ECOM command support --- xpcPlugin/DataManager.cpp | 47 ++++++++++++++++++++++++++++-- xpcPlugin/DataManager.h | 22 ++++++++++++-- xpcPlugin/MessageHandlers.cpp | 54 ++++++++++++++++++++++++++++++++++- xpcPlugin/MessageHandlers.h | 2 ++ 4 files changed, 118 insertions(+), 7 deletions(-) diff --git a/xpcPlugin/DataManager.cpp b/xpcPlugin/DataManager.cpp index 33d87f69..61ad2180 100644 --- a/xpcPlugin/DataManager.cpp +++ b/xpcPlugin/DataManager.cpp @@ -34,6 +34,7 @@ namespace XPC static map drefs; static map mdrefs[PLANE_COUNT]; static map sdrefs; + static map commandStarted; DREF XPData[134][8] = { DREF_None }; @@ -792,21 +793,61 @@ namespace XPC Set(DREF_FlapActual, value); } - void DataManager::Execute(const std::string& comm) + void DataManager::MomentaryCommand(const std::string& comm) { - Log::FormatLine(LOG_INFO, "DMAN", "Executing command (value:%s)", comm.c_str()); + Log::FormatLine(LOG_INFO, "DMAN", "Executing momentary command (value:%s)", comm.c_str()); XPLMCommandRef xcref = XPLMFindCommand(comm.c_str()); if (!xcref) { // COMM does not exist - Log::FormatLine(LOG_ERROR, "DMAN", "ERROR: invalid COMM %s", comm.c_str()); + Log::FormatLine(LOG_ERROR, "DMAN", "ERROR: invalid command %s", comm.c_str()); return; } XPLMCommandOnce(xcref); } + void DataManager::BeginCommand(const std::string& comm) + { + Log::FormatLine(LOG_INFO, "DMAN", "Starting command (value:%s)", comm.c_str()); + + XPLMCommandRef xcref = XPLMFindCommand(comm.c_str()); + if (!xcref) + { + // Command does not exist + Log::FormatLine(LOG_ERROR, "DMAN", "ERROR: invalid command %s", comm.c_str()); + return; + } + + // Flag the command as having been explicitly started by the plugin + commandStarted[xcref] = true; + XPLMCommandBegin(xcref); + } + + void DataManager::EndCommand(const std::string& comm) + { + Log::FormatLine(LOG_INFO, "DMAN", "Ending command (value:%s)", comm.c_str()); + + XPLMCommandRef xcref = XPLMFindCommand(comm.c_str()); + if (!xcref) + { + // Command does not exist + Log::FormatLine(LOG_ERROR, "DMAN", "ERROR: invalid command %s", comm.c_str()); + return; + } + + // If the command had not been explicitly started by the plugin, do not send a command to X-Plane to end it - + // this is not allowed per the X-Plane SDK documentation + if (commandStarted.find(xcref) == commandStarted.end() || commandStarted[xcref] == false) + { + Log::FormatLine(LOG_ERROR, "DMAN", "ERROR: Attempted to end command %s that had not been explicitly started.", comm.c_str()); + } + + commandStarted[xcref] = false; + XPLMCommandEnd(xcref); + } + float DataManager::GetDefaultValue() { return -998.0F; diff --git a/xpcPlugin/DataManager.h b/xpcPlugin/DataManager.h index 27e3a40e..dc8a4e1a 100644 --- a/xpcPlugin/DataManager.h +++ b/xpcPlugin/DataManager.h @@ -410,10 +410,26 @@ namespace XPC /// \param value The flaps settings. Should be between 0.0 (no flaps) and 1.0 (full flaps). static void SetFlaps(float value); - /// Executes a command + /// Executes a momentary command (begins and ends immediately). /// - /// \param comm The name of the command to execute. - static void Execute(const std::string& comm); + /// \param comm The name of the command to momentarily execute. + /// + /// \remarks This is the equivalent of calling BeginCommand() and EndCommand() back to back. + static void MomentaryCommand(const std::string& comm); + + /// Starts the execution of a command. The command is "held down" until it is explicitly ended by EndCommand(). + /// + /// \param comm The name of the command to begin. + /// + /// \remarks Each BeginCommand call must be balanced with an associated EndCommand call. + static void BeginCommand(const std::string& comm); + + /// Ends the execution of a command started with BeginCommand(). + /// + /// \param comm The name of the command to end. + /// + /// \remarks The EndCommand call must not be issued for a command that was not explicitly begun. + static void EndCommand(const std::string& comm); /// Gets a default value that indicates that a dataref should not be changed. static float GetDefaultValue(); diff --git a/xpcPlugin/MessageHandlers.cpp b/xpcPlugin/MessageHandlers.cpp index 5b1d79de..3a361311 100644 --- a/xpcPlugin/MessageHandlers.cpp +++ b/xpcPlugin/MessageHandlers.cpp @@ -72,6 +72,8 @@ namespace XPC handlers.insert(std::make_pair("GETP", MessageHandlers::HandleGetP)); handlers.insert(std::make_pair("COMM", MessageHandlers::HandleComm)); handlers.insert(std::make_pair("GETT", MessageHandlers::HandleGetT)); + handlers.insert(std::make_pair("BCOM", MessageHandlers::HandleBCom)); + handlers.insert(std::make_pair("ECOM", MessageHandlers::HandleECom)); // X-Plane data messages handlers.insert(std::make_pair("DSEL", MessageHandlers::HandleXPlaneData)); handlers.insert(std::make_pair("USEL", MessageHandlers::HandleXPlaneData)); @@ -933,7 +935,7 @@ namespace XPC std::string comm = std::string((char*)buffer + pos, len); pos += len; - DataManager::Execute(comm); + DataManager::MomentaryCommand(comm); Log::FormatLine(LOG_DEBUG, "COMM", "Execute command %s", comm.c_str()); } if (pos != size) @@ -942,6 +944,56 @@ namespace XPC } } + void MessageHandlers::HandleBCom(const Message& msg) + { + Log::FormatLine(LOG_TRACE, "BCOM", "Request to execute BCOM command received (Conn %i)", connection.id); + const unsigned char* buffer = msg.GetBuffer(); + std::size_t size = msg.GetSize(); + std::size_t pos = 5; + while (pos < size) + { + unsigned char len = buffer[pos++]; + if (pos + len > size) + { + break; + } + std::string comm = std::string((char*)buffer + pos, len); + pos += len; + + DataManager::BeginCommand(comm); + Log::FormatLine(LOG_DEBUG, "COMM", "Execute command %s", comm.c_str()); + } + if (pos != size) + { + Log::WriteLine(LOG_ERROR, "COMM", "ERROR: Command did not terminate at the expected position."); + } + } + + void MessageHandlers::HandleECom(const Message& msg) + { + Log::FormatLine(LOG_TRACE, "ECOM", "Request to execute ECOM command received (Conn %i)", connection.id); + const unsigned char* buffer = msg.GetBuffer(); + std::size_t size = msg.GetSize(); + std::size_t pos = 5; + while (pos < size) + { + unsigned char len = buffer[pos++]; + if (pos + len > size) + { + break; + } + std::string comm = std::string((char*)buffer + pos, len); + pos += len; + + DataManager::EndCommand(comm); + Log::FormatLine(LOG_DEBUG, "COMM", "Execute command %s", comm.c_str()); + } + if (pos != size) + { + Log::WriteLine(LOG_ERROR, "COMM", "ERROR: Command did not terminate at the expected position."); + } + } + void MessageHandlers::HandleWypt(const Message& msg) { // Update Log diff --git a/xpcPlugin/MessageHandlers.h b/xpcPlugin/MessageHandlers.h index 15379c43..8f5e9596 100644 --- a/xpcPlugin/MessageHandlers.h +++ b/xpcPlugin/MessageHandlers.h @@ -78,6 +78,8 @@ namespace XPC static void HandleWypt(const Message& msg); static void HandleView(const Message& msg); static void HandleComm(const Message& msg); + static void HandleBCom(const Message& msg); + static void HandleECom(const Message& msg); static void HandleXPlaneData(const Message& msg); static void HandleUnknown(const Message& msg); From 50686e9e03440dd4db211d2e1e61aa6a487cb1bd Mon Sep 17 00:00:00 2001 From: Alex Fefer Date: Mon, 5 Oct 2020 11:39:42 -0700 Subject: [PATCH 05/13] Updated BCOM/ECOM error messages --- xpcPlugin/MessageHandlers.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/xpcPlugin/MessageHandlers.cpp b/xpcPlugin/MessageHandlers.cpp index 3a361311..8fb45fd2 100644 --- a/xpcPlugin/MessageHandlers.cpp +++ b/xpcPlugin/MessageHandlers.cpp @@ -936,7 +936,7 @@ namespace XPC pos += len; DataManager::MomentaryCommand(comm); - Log::FormatLine(LOG_DEBUG, "COMM", "Execute command %s", comm.c_str()); + Log::FormatLine(LOG_DEBUG, "COMM", "Execute momentary command %s", comm.c_str()); } if (pos != size) { @@ -961,11 +961,11 @@ namespace XPC pos += len; DataManager::BeginCommand(comm); - Log::FormatLine(LOG_DEBUG, "COMM", "Execute command %s", comm.c_str()); + Log::FormatLine(LOG_DEBUG, "BCOM", "Begin command %s", comm.c_str()); } if (pos != size) { - Log::WriteLine(LOG_ERROR, "COMM", "ERROR: Command did not terminate at the expected position."); + Log::WriteLine(LOG_ERROR, "BCOM", "ERROR: Command did not terminate at the expected position."); } } @@ -986,11 +986,11 @@ namespace XPC pos += len; DataManager::EndCommand(comm); - Log::FormatLine(LOG_DEBUG, "COMM", "Execute command %s", comm.c_str()); + Log::FormatLine(LOG_DEBUG, "ECOM", "End command %s", comm.c_str()); } if (pos != size) { - Log::WriteLine(LOG_ERROR, "COMM", "ERROR: Command did not terminate at the expected position."); + Log::WriteLine(LOG_ERROR, "ECOM", "ERROR: Command did not terminate at the expected position."); } } From a36e943a71e4b50732348dbfaba07db17e5f73c3 Mon Sep 17 00:00:00 2001 From: Alex Fefer Date: Thu, 25 Feb 2021 13:14:33 -0800 Subject: [PATCH 06/13] Changed structure to std::set; renamed execute --- xpcPlugin/DataManager.cpp | 11 ++++++----- xpcPlugin/DataManager.h | 2 +- xpcPlugin/MessageHandlers.cpp | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/xpcPlugin/DataManager.cpp b/xpcPlugin/DataManager.cpp index 61ad2180..cd6607c4 100644 --- a/xpcPlugin/DataManager.cpp +++ b/xpcPlugin/DataManager.cpp @@ -25,6 +25,7 @@ #include #include #include +#include namespace XPC { @@ -34,7 +35,7 @@ namespace XPC static map drefs; static map mdrefs[PLANE_COUNT]; static map sdrefs; - static map commandStarted; + static set commandStarted; DREF XPData[134][8] = { DREF_None }; @@ -793,7 +794,7 @@ namespace XPC Set(DREF_FlapActual, value); } - void DataManager::MomentaryCommand(const std::string& comm) + void DataManager::ExecuteMomentaryCommand(const std::string& comm) { Log::FormatLine(LOG_INFO, "DMAN", "Executing momentary command (value:%s)", comm.c_str()); @@ -821,7 +822,7 @@ namespace XPC } // Flag the command as having been explicitly started by the plugin - commandStarted[xcref] = true; + commandStarted.insert(xcref); XPLMCommandBegin(xcref); } @@ -839,12 +840,12 @@ namespace XPC // If the command had not been explicitly started by the plugin, do not send a command to X-Plane to end it - // this is not allowed per the X-Plane SDK documentation - if (commandStarted.find(xcref) == commandStarted.end() || commandStarted[xcref] == false) + if (commandStarted.find(xcref) == commandStarted.end()) { Log::FormatLine(LOG_ERROR, "DMAN", "ERROR: Attempted to end command %s that had not been explicitly started.", comm.c_str()); } - commandStarted[xcref] = false; + commandStarted.erase(xcref); XPLMCommandEnd(xcref); } diff --git a/xpcPlugin/DataManager.h b/xpcPlugin/DataManager.h index dc8a4e1a..a1091dac 100644 --- a/xpcPlugin/DataManager.h +++ b/xpcPlugin/DataManager.h @@ -415,7 +415,7 @@ namespace XPC /// \param comm The name of the command to momentarily execute. /// /// \remarks This is the equivalent of calling BeginCommand() and EndCommand() back to back. - static void MomentaryCommand(const std::string& comm); + static void ExecuteMomentaryCommand(const std::string& comm); /// Starts the execution of a command. The command is "held down" until it is explicitly ended by EndCommand(). /// diff --git a/xpcPlugin/MessageHandlers.cpp b/xpcPlugin/MessageHandlers.cpp index 8fb45fd2..efde597e 100644 --- a/xpcPlugin/MessageHandlers.cpp +++ b/xpcPlugin/MessageHandlers.cpp @@ -935,7 +935,7 @@ namespace XPC std::string comm = std::string((char*)buffer + pos, len); pos += len; - DataManager::MomentaryCommand(comm); + DataManager::ExecuteMomentaryCommand(comm); Log::FormatLine(LOG_DEBUG, "COMM", "Execute momentary command %s", comm.c_str()); } if (pos != size) From 467506b32b85af0149dd1ca305c4f365a428825b Mon Sep 17 00:00:00 2001 From: Carlos Perez Date: Tue, 9 Aug 2022 12:00:55 +0200 Subject: [PATCH 07/13] Fix two bugs found in the XPlaneConnect java class (getPOSI and getDREFs methods) - getPOSI: The data returned has changed from XPlane v10 to XPlane v11. In v10, latitude, longitude and elevation were float type (4 bytes) and in v11 they are double (8 bytes). Updated getPOSI function to take it into consideration. - getDREFs: Data size (position 6 of the RESP msg) is an integer type, but read as an uint, so when data size is greater than 128, the direct read results into negative size and throws NegativeArraySize exception. Fixed it. --- Java/src/XPlaneConnect.java | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/Java/src/XPlaneConnect.java b/Java/src/XPlaneConnect.java index df32cffb..df47a272 100644 --- a/Java/src/XPlaneConnect.java +++ b/Java/src/XPlaneConnect.java @@ -323,7 +323,9 @@ public float[][] getDREFs(String[] drefs) throws IOException int cur = 6; for(int j = 0; j < result.length; ++j) { - result[j] = new float[data[cur++]]; + int data_size = (data[cur] > 0) ? data[cur] : 256 + data[cur]; + result[j] = new float[data_size]; + 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); @@ -588,9 +590,26 @@ public double[] getPOSI(int ac) throws IOException double[] result = new double[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); + + if (bb.capacity() == 34) { //In XPlane v10 --> latitude/longitude/elevation are floats + for(int i = 0; i < 7; ++i) + { + result[i] = bb.getFloat(6 + 4 * i); + } + }else if (bb.capacity() == 46) { //In XPlane v11 --> latitude/longitude/elevation are double + for(int i = 0; i < 7; ++i) + { + if(i<3) + { + result[i] = bb.getDouble(6 + 8 * i); + }else + { + result[i] = bb.getFloat(30 + 4 * (i-3)); + } + + } + }else { + throw new IOException("Unexpected POSI message length received"); } return result; } From c0ae25a85ec1f7eccdfdfb7e6a2b90ca873e030a Mon Sep 17 00:00:00 2001 From: Carlos Perez Date: Tue, 9 Aug 2022 12:17:47 +0200 Subject: [PATCH 08/13] Update compiled jar file used by Matlab after the changes in the Java classes --- MATLAB/+XPlaneConnect/XPlaneConnect.jar | Bin 8709 -> 13418 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/MATLAB/+XPlaneConnect/XPlaneConnect.jar b/MATLAB/+XPlaneConnect/XPlaneConnect.jar index a182eb3cde4bc8ec78a39ffe5deb735a57f0fd1d..1996e8e15f37b4f39ab57968aa9bcfb167bc1f30 100644 GIT binary patch literal 13418 zcmaib1C*r65^meJXS#dZwr$(CZQGvKw2f)o)3$BfHs8$Md++YfdwXBhsdKWb0-5n= zWJP9vAu9n4f&u^m0ReDl1*rt^7lH%;0gw_>2ZYK#S5@TU!-pYLD2fC2#c z*|WXhh5+*OR}&j&nt$ei{5OZSo`c^1V1xZDo2#wC|6oP`oz>9H!NA7Z$lmQ=LVx)B z_l^?&vkK?08^jni>Sq498sW)G5#TgH0M8r_|36FcW2@jsvr7;$$a8>{V-fV~Jje_iCzb z&_<5*NNCrgO}2>x6fLa@Ln!m=LD~dXC30~^6^SWUzKj^UrkiGa<(YWloZimuT{A>* z^PFN#_JD=!eA6Y<62-||%g7L!>r2=;3!$0%X>tM8^K{a6JR&?!U0X{m%)}g)oTFpw zr&Cp`Q;GpL{lGHyWx8<11Q|GI@|+lup|k?~V_Kg)S{VT&C)4DBD`PzaUP2YMWsxsQ zFccJ06h;ZqW=(kSt5V%4+G0&XbdWpWVr{VjA>+Rx#KvA?)y^I}8g2#J z>paxBc$O4O067z#;*)Jg1vZM(!8A6s%FWwj*7G{NixR384!*dO=mm!ujUe%V+d&zd z!7WxTcZeIk_~F-6)m+xubti>Ti$w71&S{~T+aj-+d+_AQn1?z8CiI9>@6G@&tml;> z+%u`5BOhRDZaqS(5m83kT+;GBUG#1M2}|E2NbT_D#fusWKi zw_x|CB(vE&VQk?H?+!nH=Nrz)2NTtt%!f%QAod1JhNb6TVL^GC^YklP=b_pvew&2O zN-xLIvjDnoPBXb>PBr;yjxB2RWOg3Z0ZWU~w|%T82oF*bnwCkCB5#<^2s!@#2kjWl z&m)83ITuxPo6pOkoAgik{LMLdm8BW^&UNB%fnC9lnd-Zz#VWS1{;q~3=m#dBS|TMJ zi>UGITVxQX8BSw|-V21-g9s4J z@QS+*aO=he(myqf6B?RhSV?t4N2gM>e!%})UT9yq9yfljFIAv_1orqB|MI=h&qgxH>^82J)~r zE2XI6Hh_<}`hxQMRd+p##+t7(=pYa!0DJstVh&#-u#fKAQb)8OpFT<*SNWwC_s?;e zR`$-+im{Yl8hqD99Rt+W=||Z21{GnsR#rFW%l#X)2%}7o)Y)x2kZ$%pq@>0UxVrlDwlUU1=k@n2<4Dk-<

Hah-R{@J>AkYRq9*fm3vhJI{?_c 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 oU!(l%Agk#lZ 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 From bd8171c3a391de70b0d2f384027a542c9da43d97 Mon Sep 17 00:00:00 2001 From: Carlos Perez Date: Fri, 21 Oct 2022 17:45:22 +0200 Subject: [PATCH 09/13] Fix bug related with the getDREFs method --> DataRef data size is 2 byte length instead of 1 --- Java/src/XPlaneConnect.java | 4 ++-- MATLAB/+XPlaneConnect/XPlaneConnect.jar | Bin 13418 -> 13053 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Java/src/XPlaneConnect.java b/Java/src/XPlaneConnect.java index df47a272..eb56f125 100644 --- a/Java/src/XPlaneConnect.java +++ b/Java/src/XPlaneConnect.java @@ -323,9 +323,9 @@ public float[][] getDREFs(String[] drefs) throws IOException int cur = 6; for(int j = 0; j < result.length; ++j) { - int data_size = (data[cur] > 0) ? data[cur] : 256 + data[cur]; + int data_size = ((data[cur+1] & 0xff) << 8) | (data[cur] & 0xff); result[j] = new float[data_size]; - cur++; + cur += 2; 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); diff --git a/MATLAB/+XPlaneConnect/XPlaneConnect.jar b/MATLAB/+XPlaneConnect/XPlaneConnect.jar index 1996e8e15f37b4f39ab57968aa9bcfb167bc1f30..6ee73c157b640ca4a520284d5d158dbfbf6c80ed 100644 GIT binary patch delta 6401 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 S3;@9Y^^pHsq6E+HzyAZ9!X_mE From 2b0317195f99ccd5b6e32ee92db9944c9b1f3829 Mon Sep 17 00:00:00 2001 From: Caleb AM Date: Wed, 16 Nov 2022 20:47:36 +0000 Subject: [PATCH 10/13] Add a call of WSACleanup() to closeUDP() --- C/src/xplaneConnect.c | 1 + 1 file changed, 1 insertion(+) diff --git a/C/src/xplaneConnect.c b/C/src/xplaneConnect.c index f1da9673..97830f2e 100755 --- a/C/src/xplaneConnect.c +++ b/C/src/xplaneConnect.c @@ -139,6 +139,7 @@ void closeUDP(XPCSocket sock) { #ifdef _WIN32 int result = closesocket(sock.sock); + WSACleanup(); #else int result = close(sock.sock); #endif From fee6b3f83263cde9dff39573cc1636f834b0cd8c Mon Sep 17 00:00:00 2001 From: Caleb AM Date: Thu, 17 Nov 2022 01:10:12 +0000 Subject: [PATCH 11/13] Call WSACleanup in the destructor of UDPSocket --- xpcPlugin/UDPSocket.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/xpcPlugin/UDPSocket.cpp b/xpcPlugin/UDPSocket.cpp index 5925ebe3..8f63dc6d 100644 --- a/xpcPlugin/UDPSocket.cpp +++ b/xpcPlugin/UDPSocket.cpp @@ -82,6 +82,7 @@ namespace XPC Log::FormatLine(LOG_TRACE, tag, "Closing socket (%d)", this->sock); #ifdef _WIN32 closesocket(this->sock); + WSACleanup(); #elif (__APPLE__ || __linux) close(this->sock); #endif From ef59922e232a9357d8989a8d916311dee739bf5c Mon Sep 17 00:00:00 2001 From: Carlos Perez Date: Wed, 8 Feb 2023 12:21:18 +0100 Subject: [PATCH 12/13] Fix bug in the getDREFs function for the long array data --- Java/src/produce_jar.cmd | 5 ++ .../main/java/gov/nasa/xpc/XPlaneConnect.java | 75 +++++++++++++++++- MATLAB/+XPlaneConnect/XPlaneConnect.jar | Bin 13053 -> 13055 bytes 3 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 Java/src/produce_jar.cmd diff --git a/Java/src/produce_jar.cmd b/Java/src/produce_jar.cmd new file mode 100644 index 00000000..b77151ee --- /dev/null +++ b/Java/src/produce_jar.cmd @@ -0,0 +1,5 @@ +@echo off +mkdir build +javac -d build\ discovery\*.java *.java +cd build +jar cfe XPlaneConnect.jar gob.nasa.xpc.XPlaneConnect gov\nasa\xpc\*.class gov\nasa\xpc\discovery\*.class \ No newline at end of file diff --git a/Java/xpc/src/main/java/gov/nasa/xpc/XPlaneConnect.java b/Java/xpc/src/main/java/gov/nasa/xpc/XPlaneConnect.java index eb56f125..86daf6a7 100644 --- a/Java/xpc/src/main/java/gov/nasa/xpc/XPlaneConnect.java +++ b/Java/xpc/src/main/java/gov/nasa/xpc/XPlaneConnect.java @@ -323,10 +323,10 @@ public float[][] getDREFs(String[] drefs) throws IOException int cur = 6; for(int j = 0; j < result.length; ++j) { - int data_size = ((data[cur+1] & 0xff) << 8) | (data[cur] & 0xff); + int data_size = (data[cur] > 0) ? data[cur] : 256 + data[cur]; + cur++; result[j] = new float[data_size]; - cur += 2; - for(int k = 0; k < result[j].length; ++k) //TODO: There must be a better way to do this + for(int k = 0; k < result[j].length; ++k) { result[j][k] = bb.getFloat(cur); cur += 4; @@ -415,6 +415,75 @@ public void sendDREFs(String[] drefs, float[][] values) throws IOException sendUDP(os.toByteArray()); } + /** + * Sends a command to X-Plane that request a periodic broadcast of the given DataRefs. + * + * @param freq The frequency at which the data is requested. + * @param drefs The names of the X-Plane datarefs to request. + * @param dref_idx An array of index whose length must match the number of requested datarefs. + * @throws IOException If the command cannot be sent. + */ + public void sendRREFs(int freq, String[] drefs, int[] dref_idx) throws IOException + { + //Preconditions + if(freq == 0 ) + { + throw new IllegalArgumentException(("request frequency cannot be zero.")); + } + if(drefs == null || drefs.length == 0) + { + throw new IllegalArgumentException(("drefs must be non-empty.")); + } + if(dref_idx.length != drefs.length) + { + throw new IllegalArgumentException("index must be of the same size as drefs."); + } + + ByteArrayOutputStream os = new ByteArrayOutputStream(); + os.write("RREF".getBytes(StandardCharsets.UTF_8)); + os.write(0xFF); //Placeholder for message length + ByteBuffer freq_bb = ByteBuffer.allocate(4).putInt(freq); + freq_bb.order(ByteOrder.LITTLE_ENDIAN); + os.write(freq_bb); + for(int i = 0; i < drefs.length; ++i) + { + String dref = drefs[i]; + int idx = dref_idx[i]; + + if (dref == null) + { + throw new IllegalArgumentException("dref must be a valid string."); + } + + + + //Convert drefs to bytes. + byte[] drefBytes = dref.getBytes(StandardCharsets.UTF_8); + if (drefBytes.length == 0) + { + throw new IllegalArgumentException("DREF is an empty string!"); + } + if (drefBytes.length > 255) + { + throw new IllegalArgumentException("dref must be less than 255 bytes in UTF-8. Are you sure this is a valid dref?"); + } + + //Values + ByteBuffer bb = ByteBuffer.allocate(4 * value.length); + bb.order(ByteOrder.LITTLE_ENDIAN); + for (int j = 0; j < value.length; ++j) + { + bb.putFloat(j * 4, value[j]); + } + + //Build and send message + os.write(drefBytes, 0, drefBytes.length); + os.write(value.length); + os.write(bb.array()); + } + sendUDP(os.toByteArray()); + } + /** * Gets the control surface information for the specified airplane. * diff --git a/MATLAB/+XPlaneConnect/XPlaneConnect.jar b/MATLAB/+XPlaneConnect/XPlaneConnect.jar index 6ee73c157b640ca4a520284d5d158dbfbf6c80ed..c234d9841bd66fa7042431768fc9df4dd4f61272 100644 GIT binary patch delta 6210 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≫0n{`M> zf$IM02VUs`UQ@{3J>*W5f}KU@&yC#e;oPvvg{^igX3A2prg*$ZQvh_T5jNFWe=pch zqB^1NQKV=z;%k^|-a?pl>`Qd<99DCx)DS>OQPDZ`=}olHqqAY1YIy*9Yo(aATsQ7g zg_uop2X?0NL25UB= zgKk1xC7%@N?;WZC0%cS^*+IKu$evfEtxon#l^x0OqqVwGW11cHD4GVuu+l%1v-V0n zK72vgk;Et6e0^V%gkFq29_;CJBz2oe%em*)E@i+Hf_y5=dXO#4Diq@-spq}2=q-{w zSSSb20PhAeUs=~UXkil#K)o(~BIex~i$Vg2dYM$Xest{q zs`-PdtBH+c^E6I!j{=1Rg_Z{e<-dV>QzjkXzm$BGF$Ci;C0Av;{tL}tuw$YA&&b*2 z%3*~4_dUih@mJ6VO`;O?v(Me-lt>p}PX|41YHQ4=?V%qM@MFW1^ri zqx^Tp(m}x>Drg@a0ragP!QU%>g0yJujQ?)W8A*wBHBr&XQT`9=L#O|7CD{IT-PvgW yzbgQuMdgQTgH-=bMZ5VB$$*W5a!Z7QBJ|&(C}JG{UU220g&u*3vEclF-TwezL)b_F From 73b5777a784c77f456ae4b125bbbf09dafc7e133 Mon Sep 17 00:00:00 2001 From: Carlos Perez Date: Wed, 8 Feb 2023 12:21:32 +0100 Subject: [PATCH 13/13] Add new example for the Python API --- Python3/src/XPlaneUdpExample.py | 248 ++++++++++++++++++++++++++++++++ 1 file changed, 248 insertions(+) create mode 100644 Python3/src/XPlaneUdpExample.py diff --git a/Python3/src/XPlaneUdpExample.py b/Python3/src/XPlaneUdpExample.py new file mode 100644 index 00000000..1c918e7d --- /dev/null +++ b/Python3/src/XPlaneUdpExample.py @@ -0,0 +1,248 @@ +# Class to get dataref values from XPlane Flight Simulator via network. +# License: GPLv3 + +import socket +import struct +import binascii +from time import sleep +import platform + +class XPlaneIpNotFound(Exception): + args="Could not find any running XPlane instance in network." + +class XPlaneTimeout(Exception): + args="XPlane timeout." + +class XPlaneVersionNotSupported(Exception): + args="XPlane version not supported." + +class XPlaneUdp: + + ''' + Get data from XPlane via network. + Use a class to implement RAI Pattern for the UDP socket. + ''' + + #constants + MCAST_GRP = "239.255.1.1" + MCAST_PORT = 49707 # (MCAST_PORT was 49000 for XPlane10) + + def __init__(self): + # Open a UDP Socket to receive on Port 49000 + self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + self.socket.settimeout(3.0) + # list of requested datarefs with index number + self.datarefidx = 0 + self.datarefs = {} # key = idx, value = dataref + # values from xplane + self.BeaconData = {} + self.xplaneValues = {} + self.defaultFreq = 1 + + def __del__(self): + for i in range(len(self.datarefs)): + self.AddDataRef(next(iter(self.datarefs.values())), freq=0) + self.socket.close() + def WriteDataRef(self,dataref,value,vtype='float'): + ''' + Write Dataref to XPlane + DREF0+(4byte byte value)+dref_path+0+spaces to complete the whole message to 509 bytes + DREF0+(4byte byte value of 1)+ sim/cockpit/switches/anti_ice_surf_heat_left+0+spaces to complete to 509 bytes + ''' + cmd = b"DREF\x00" + dataref =dataref+'\x00' + string = dataref.ljust(500).encode() + message = "".encode() + if vtype == "float": + message = struct.pack("<5sf500s", cmd,value,string) + elif vtype == "int": + message = struct.pack("<5si500s", cmd, value, string) + elif vtype == "bool": + message = struct.pack("<5sI500s", cmd, int(value), string) + + assert(len(message)==509) + self.socket.sendto(message, (self.BeaconData["IP"], self.UDP_PORT)) + + def AddDataRef(self, dataref, freq = None): + + ''' + Configure XPlane to send the dataref with a certain frequency. + You can disable a dataref by setting freq to 0. + ''' + + idx = -9999 + + if freq == None: + freq = self.defaultFreq + + if dataref in self.datarefs.values(): + idx = list(self.datarefs.keys())[list(self.datarefs.values()).index(dataref)] + if freq == 0: + if dataref in self.xplaneValues.keys(): + del self.xplaneValues[dataref] + del self.datarefs[idx] + else: + idx = self.datarefidx + self.datarefs[self.datarefidx] = dataref + self.datarefidx += 1 + + cmd = b"RREF\x00" + string = dataref.encode() + message = struct.pack("<5sii400s", cmd, freq, idx, string) + assert(len(message)==413) + self.socket.sendto(message, (self.BeaconData["IP"], self.BeaconData["Port"])) + if (self.datarefidx%100 == 0): + sleep(0.2) + + def GetValues(self): + try: + # Receive packet + data, addr = self.socket.recvfrom(1472) # maximum bytes of an RREF answer X-Plane will send (Ethernet MTU - IP hdr - UDP hdr) + # Decode Packet + retvalues = {} + # * Read the Header "RREFO". + header=data[0:5] + if(header!=b"RREF,"): # (was b"RREFO" for XPlane10) + print("Unknown packet: ", binascii.hexlify(data)) + else: + # * We get 8 bytes for every dataref sent: + # An integer for idx and the float value. + values =data[5:] + lenvalue = 8 + numvalues = int(len(values)/lenvalue) + for i in range(0,numvalues): + singledata = data[(5+lenvalue*i):(5+lenvalue*(i+1))] + (idx,value) = struct.unpack(" -0.001 : + value = 0.0 + retvalues[self.datarefs[idx]] = value + self.xplaneValues.update(retvalues) + except: + raise XPlaneTimeout + return self.xplaneValues + + def FindIp(self): + + ''' + Find the IP of XPlane Host in Network. + It takes the first one it can find. + ''' + + self.BeaconData = {} + + # open socket for multicast group. + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + if platform.system() == "Windows": + sock.bind(('', self.MCAST_PORT)) + else: + sock.bind((self.MCAST_GRP, self.MCAST_PORT)) + mreq = struct.pack("=4sl", socket.inet_aton(self.MCAST_GRP), socket.INADDR_ANY) + sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) + sock.settimeout(3.0) + + # receive data + try: + packet, sender = sock.recvfrom(1472) + print("XPlane Beacon: ", packet.hex()) + + # decode data + # * Header + header = packet[0:5] + if header != b"BECN\x00": + print("Unknown packet from "+sender[0]) + print(str(len(packet)) + " bytes") + print(packet) + print(binascii.hexlify(packet)) + + else: + # * Data + data = packet[5:21] + # struct becn_struct + # { + # uchar beacon_major_version; // 1 at the time of X-Plane 10.40 + # uchar beacon_minor_version; // 1 at the time of X-Plane 10.40 + # xint application_host_id; // 1 for X-Plane, 2 for PlaneMaker + # xint version_number; // 104014 for X-Plane 10.40b14 + # uint role; // 1 for master, 2 for extern visual, 3 for IOS + # ushort port; // port number X-Plane is listening on + # xchr computer_name[strDIM]; // the hostname of the computer + # }; + beacon_major_version = 0 + beacon_minor_version = 0 + application_host_id = 0 + xplane_version_number = 0 + role = 0 + port = 0 + ( + beacon_major_version, # 1 at the time of X-Plane 10.40 + beacon_minor_version, # 1 at the time of X-Plane 10.40 + application_host_id, # 1 for X-Plane, 2 for PlaneMaker + xplane_version_number, # 104014 for X-Plane 10.40b14 + role, # 1 for master, 2 for extern visual, 3 for IOS + port, # port number X-Plane is listening on + ) = struct.unpack("