summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2015-07-03 04:54:32 +0200
committerStanislaw Halik <sthalik@misaki.pl>2015-07-03 04:54:32 +0200
commit23c4bd03b66d8d49d1c7cf343dfe016506332b94 (patch)
treef11d8ae657faacbacdcc42efd519f9e4e7a140c7
parente94be88e28b41610bab983a1cbf8f31133a4ced8 (diff)
parent44d0136cb4b532c957d6c037ea6a862a1e371cd9 (diff)
Merge pull request #178 from sbabbi/unstable
Small improvements to the x-plane plugin
-rw-r--r--CMakeLists.txt4
-rw-r--r--opentrack/plugin-support.hpp4
-rw-r--r--x-plane-plugin/plugin.c84
3 files changed, 76 insertions, 16 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2ec6dc54..4fb6e8d2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -199,13 +199,13 @@ if(SDK_XPLANE)
SET_TARGET_PROPERTIES(opentrack-xplane-plugin
PROPERTIES LINK_FLAGS
"-Wl,--version-script=${CMAKE_SOURCE_DIR}/x-plane-plugin/version-script.txt -shared -rdynamic -nodefaultlibs -undefined_warning -fPIC"
- COMPILE_FLAGS "-Wall -O2 -pipe -fPIC -DLIN -DXPLM210"
+ COMPILE_FLAGS "-Wall -O2 -pipe -fPIC -DLIN -DXPLM200 -DXPLM210"
LIBRARY_OUTPUT_NAME "opentrack.xpl"
PREFIX "" SUFFIX "")
endif()
if(APPLE)
SET_TARGET_PROPERTIES(opentrack-xplane-plugin PROPERTIES
- COMPILE_FLAGS "-iframework ${SDK_XPLANE}/Libraries/Mac/ -DAPL -DXPLM210 -framework XPLM -framework XPWidgets"
+ COMPILE_FLAGS "-iframework ${SDK_XPLANE}/Libraries/Mac/ -DAPL -DXPLM200 -DXPLM210 -framework XPLM -framework XPWidgets"
LINK_FLAGS "-F${SDK_XPLANE}/Libraries/Mac/ -framework XPLM -framework XPWidgets")
endif()
if(UNIX AND NOT APPLE)
diff --git a/opentrack/plugin-support.hpp b/opentrack/plugin-support.hpp
index bc07c106..95b4b0a1 100644
--- a/opentrack/plugin-support.hpp
+++ b/opentrack/plugin-support.hpp
@@ -115,7 +115,8 @@ struct dylib {
{
fprintf(stderr, "Error, ignoring: %s\n", err);
fflush(stderr);
- dlclose(handle);
+ if (handle)
+ dlclose(handle);
handle = nullptr;
return true;
}
@@ -138,6 +139,7 @@ struct dylib {
return;
} else {
(void) _foo::err(handle);
+ return;
}
#endif
diff --git a/x-plane-plugin/plugin.c b/x-plane-plugin/plugin.c
index 3958c895..999f6e15 100644
--- a/x-plane-plugin/plugin.c
+++ b/x-plane-plugin/plugin.c
@@ -8,10 +8,9 @@
#include <unistd.h>
#include <XPLMPlugin.h>
-#include <XPLMDisplay.h>
#include <XPLMDataAccess.h>
-#include <XPLMCamera.h>
#include <XPLMProcessing.h>
+#include <XPLMUtilities.h>
#ifndef PLUGIN_API
#define PLUGIN_API
@@ -41,6 +40,9 @@ static PortableLockedShm* lck_posix = NULL;
static WineSHM* shm_posix = NULL;
static void *view_x, *view_y, *view_z, *view_heading, *view_pitch;
static float offset_x, offset_y, offset_z;
+static XPLMCommandRef track_toggle = NULL, translation_disable_toggle = NULL;
+static int track_disabled = 1;
+static int translation_disabled;
static void reinit_offset() {
offset_x = XPLMGetDataf(view_x);
@@ -87,21 +89,60 @@ void PortableLockedShm_unlock(PortableLockedShm* self)
flock(self->fd, LOCK_UN);
}
-int write_head_position(
- XPLMDrawingPhase OT_UNUSED(inPhase),
- int OT_UNUSED(inIsBefore),
- void * OT_UNUSED(inRefcon))
+float write_head_position(
+ float OT_UNUSED(inElapsedSinceLastCall),
+ float OT_UNUSED(inElapsedTimeSinceLastFlightLoop),
+ int OT_UNUSED(inCounter),
+ void * OT_UNUSED(inRefcon) )
{
if (lck_posix != NULL && shm_posix != NULL) {
PortableLockedShm_lock(lck_posix);
- XPLMSetDataf(view_x, shm_posix->data[TX] * 1e-3 + offset_x);
- XPLMSetDataf(view_y, shm_posix->data[TY] * 1e-3 + offset_y);
- XPLMSetDataf(view_z, shm_posix->data[TZ] * 1e-3 + offset_z);
+ if (!translation_disabled)
+ {
+ XPLMSetDataf(view_x, shm_posix->data[TX] * 1e-3 + offset_x);
+ XPLMSetDataf(view_y, shm_posix->data[TY] * 1e-3 + offset_y);
+ XPLMSetDataf(view_z, shm_posix->data[TZ] * 1e-3 + offset_z);
+ }
XPLMSetDataf(view_heading, shm_posix->data[Yaw] * 180 / 3.141592654);
XPLMSetDataf(view_pitch, shm_posix->data[Pitch] * 180 / 3.141592654);
PortableLockedShm_unlock(lck_posix);
}
- return 1;
+ return -1.0;
+}
+
+static int TrackToggleHandler( XPLMCommandRef inCommand,
+ XPLMCommandPhase inPhase,
+ void * inRefCon )
+{
+ if ( track_disabled )
+ {
+ //Enable
+ XPLMRegisterFlightLoopCallback(write_head_position, -1.0, NULL);
+
+ // Reinit the offsets when we re-enable the plugin
+ if ( !translation_disabled )
+ reinit_offset();
+ }
+ else
+ {
+ //Disable
+ XPLMUnregisterFlightLoopCallback(write_head_position, NULL);
+ }
+ track_disabled = !track_disabled;
+ return 0;
+}
+
+static int TranslationToggleHandler( XPLMCommandRef inCommand,
+ XPLMCommandPhase inPhase,
+ void * inRefCon )
+{
+ translation_disabled = !translation_disabled;
+ if (!translation_disabled)
+ {
+ // Reinit the offsets when we re-enable the translations so that we can "move around"
+ reinit_offset();
+ }
+ return 0;
}
PLUGIN_API int XPluginStart ( char * outName, char * outSignature, char * outDescription ) {
@@ -110,7 +151,22 @@ PLUGIN_API int XPluginStart ( char * outName, char * outSignature, char * outDes
view_z = XPLMFindDataRef("sim/aircraft/view/acf_peZ");
view_heading = XPLMFindDataRef("sim/graphics/view/pilots_head_psi");
view_pitch = XPLMFindDataRef("sim/graphics/view/pilots_head_the");
- if (view_x && view_y && view_z && view_heading && view_pitch) {
+
+ track_toggle = XPLMCreateCommand("opentrack/toggle", "Disable/Enable head tracking");
+ translation_disable_toggle = XPLMCreateCommand("opentrack/toggle_translation", "Disable/Enable input translation from opentrack");
+
+ XPLMRegisterCommandHandler( track_toggle,
+ TrackToggleHandler,
+ 1,
+ (void*)0);
+
+ XPLMRegisterCommandHandler( translation_disable_toggle,
+ TranslationToggleHandler,
+ 1,
+ (void*)0);
+
+
+ if (view_x && view_y && view_z && view_heading && view_pitch && track_toggle && translation_disable_toggle) {
lck_posix = PortableLockedShm_init(WINE_SHM_NAME, WINE_MTX_NAME, sizeof(WineSHM));
if (lck_posix->mem == (void*)-1) {
fprintf(stderr, "opentrack failed to init SHM!\n");
@@ -137,11 +193,13 @@ PLUGIN_API void XPluginStop ( void ) {
}
PLUGIN_API void XPluginEnable ( void ) {
- XPLMRegisterDrawCallback(write_head_position, xplm_Phase_LastScene, 1, NULL);
+ XPLMRegisterFlightLoopCallback(write_head_position, -1.0, NULL);
+ track_disabled = 0;
}
PLUGIN_API void XPluginDisable ( void ) {
- XPLMUnregisterDrawCallback(write_head_position, xplm_Phase_LastScene, 1, NULL);
+ XPLMUnregisterFlightLoopCallback(write_head_position, NULL);
+ track_disabled = 1;
}
PLUGIN_API void XPluginReceiveMessage(