summaryrefslogtreecommitdiffhomepage
path: root/x-plane-plugin/plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'x-plane-plugin/plugin.c')
-rw-r--r--x-plane-plugin/plugin.c155
1 files changed, 93 insertions, 62 deletions
diff --git a/x-plane-plugin/plugin.c b/x-plane-plugin/plugin.c
index 7897abe6..e43ee0ef 100644
--- a/x-plane-plugin/plugin.c
+++ b/x-plane-plugin/plugin.c
@@ -14,6 +14,7 @@
#include <sys/mman.h>
#include <limits.h>
#include <unistd.h>
+#include <math.h>
#include <XPLMPlugin.h>
#include <XPLMDataAccess.h>
@@ -30,18 +31,27 @@
#define WINE_SHM_NAME "facetracknoir-wine-shm"
#define WINE_MTX_NAME "facetracknoir-wine-mtx"
-#define BUILD_compat
-#include "compat/export.hpp"
+#include "compat/linkage-macros.hpp"
+
+#ifndef MAP_FAILED
+# define MAP_FAILED ((void*)-1)
+#endif
+
+#ifdef __GNUC__
+# pragma GCC diagnostic ignored "-Wimplicit-float-conversion"
+# pragma GCC diagnostic ignored "-Wdouble-promotion"
+# pragma GCC diagnostic ignored "-Wlanguage-extension-token"
+#endif
enum Axis {
- TX = 0, TY, TZ, Yaw, Pitch, Roll
+ TX = 0, TY, TZ, Yaw, Pitch, Roll
};
-typedef struct PortableLockedShm
+typedef struct shm_wrapper
{
void* mem;
int fd, size;
-} PortableLockedShm;
+} shm_wrapper;
typedef struct WineSHM
{
@@ -49,11 +59,11 @@ typedef struct WineSHM
int gameid, gameid2;
unsigned char table[8];
bool stop;
-} WineSHM;
+} volatile WineSHM;
-static PortableLockedShm* lck_posix = NULL;
+static shm_wrapper* lck_posix = NULL;
static WineSHM* shm_posix = NULL;
-static void *view_x, *view_y, *view_z, *view_heading, *view_pitch;
+static void *view_x, *view_y, *view_z, *view_heading, *view_pitch, *view_roll;
static float offset_x, offset_y, offset_z;
static XPLMCommandRef track_toggle = NULL, translation_disable_toggle = NULL;
static int track_disabled = 1;
@@ -65,18 +75,13 @@ static void reinit_offset() {
offset_z = XPLMGetDataf(view_z);
}
-#ifdef __GNUC__
-# define OT_UNUSED(varname) varname __attribute__((__unused__))
-#else
-# define OT_UNUSED(varname) varname
-#endif
-
-PortableLockedShm* PortableLockedShm_init(const char *shmName, const char *OT_UNUSED(mutexName), int mapSize)
+shm_wrapper* shm_wrapper_init(const char *shm_name, const char *mutex_name, int mapSize)
{
- PortableLockedShm* self = malloc(sizeof(PortableLockedShm));
+ (void)mutex_name;
+ shm_wrapper* self = malloc(sizeof(shm_wrapper));
char shm_filename[NAME_MAX];
shm_filename[0] = '/';
- strncpy(shm_filename+1, shmName, NAME_MAX-2);
+ strncpy(shm_filename+1, shm_name, NAME_MAX-2);
shm_filename[NAME_MAX-1] = '\0';
/* (void) shm_unlink(shm_filename); */
@@ -86,7 +91,7 @@ PortableLockedShm* PortableLockedShm_init(const char *shmName, const char *OT_UN
return self;
}
-void PortableLockedShm_free(PortableLockedShm* self)
+void shm_wrapper_free(shm_wrapper* self)
{
/*(void) shm_unlink(shm_filename);*/
(void) munmap(self->mem, self->size);
@@ -94,48 +99,50 @@ void PortableLockedShm_free(PortableLockedShm* self)
free(self);
}
-void PortableLockedShm_lock(PortableLockedShm* self)
+void shm_wrapper_lock(shm_wrapper* self)
{
flock(self->fd, LOCK_SH);
}
-void PortableLockedShm_unlock(PortableLockedShm* self)
+void shm_wrapper_unlock(shm_wrapper* self)
{
flock(self->fd, LOCK_UN);
}
-float write_head_position(
- float OT_UNUSED(inElapsedSinceLastCall),
- float OT_UNUSED(inElapsedTimeSinceLastFlightLoop),
- int OT_UNUSED(inCounter),
- void * OT_UNUSED(inRefcon) )
+float write_head_position(float inElapsedSinceLastCall,
+ float inElapsedTimeSinceLastFlightLoop,
+ int inCounter,
+ void* inRefcon)
{
if (lck_posix != NULL && shm_posix != NULL) {
- PortableLockedShm_lock(lck_posix);
+ shm_wrapper_lock(lck_posix);
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);
+ XPLMSetDataf(view_heading, shm_posix->data[Yaw] * 180 / M_PI);
+ XPLMSetDataf(view_pitch, shm_posix->data[Pitch] * 180 / M_PI);
+ XPLMSetDataf(view_roll, shm_posix->data[Roll] * 180 / M_PI);
+ shm_wrapper_unlock(lck_posix);
}
return -1.0;
}
-static int TrackToggleHandler( XPLMCommandRef inCommand,
- XPLMCommandPhase inPhase,
- void * inRefCon )
+static int TrackToggleHandler(XPLMCommandRef inCommand,
+ XPLMCommandPhase inPhase,
+ void* inRefCon)
{
- if ( track_disabled )
+ if (inPhase != xplm_CommandBegin) return 0;
+
+ if (track_disabled)
{
//Enable
- XPLMRegisterFlightLoopCallback(write_head_position, -1.0, NULL);
+ XPLMRegisterFlightLoopCallback(write_head_position, -1, NULL);
// Reinit the offsets when we re-enable the plugin
- if ( !translation_disabled )
+ if (!translation_disabled)
reinit_offset();
}
else
@@ -147,10 +154,12 @@ static int TrackToggleHandler( XPLMCommandRef inCommand,
return 0;
}
-static int TranslationToggleHandler( XPLMCommandRef inCommand,
- XPLMCommandPhase inPhase,
- void * inRefCon )
+static int TranslationToggleHandler(XPLMCommandRef inCommand,
+ XPLMCommandPhase inPhase,
+ void* inRefCon)
{
+ if (inPhase != xplm_CommandBegin) return 0;
+
translation_disabled = !translation_disabled;
if (!translation_disabled)
{
@@ -160,35 +169,53 @@ static int TranslationToggleHandler( XPLMCommandRef inCommand,
return 0;
}
-PLUGIN_API OPENTRACK_COMPAT_EXPORT int XPluginStart ( char * outName, char * outSignature, char * outDescription ) {
- view_x = XPLMFindDataRef("sim/aircraft/view/acf_peX");
- view_y = XPLMFindDataRef("sim/aircraft/view/acf_peY");
- view_z = XPLMFindDataRef("sim/aircraft/view/acf_peZ");
+static inline
+void volatile_explicit_bzero(void volatile* restrict ptr, size_t len)
+{
+ for (size_t i = 0; i < len; i++)
+ *((char volatile* restrict)ptr + i) = 0;
+
+ asm volatile("" ::: "memory");
+}
+
+PLUGIN_API OTR_GENERIC_EXPORT
+int XPluginStart (char* outName, char* outSignature, char* outDescription) {
+ // view_x = XPLMFindDataRef("sim/aircraft/view/acf_peX");
+ // view_y = XPLMFindDataRef("sim/aircraft/view/acf_peY");
+ // 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");
+ // view_roll = XPLMFindDataRef("sim/graphics/view/field_of_view_roll_deg");
+
+ view_x = XPLMFindDataRef("sim/graphics/view/pilots_head_x");
+ view_y = XPLMFindDataRef("sim/graphics/view/pilots_head_y");
+ view_z = XPLMFindDataRef("sim/graphics/view/pilots_head_z");
view_heading = XPLMFindDataRef("sim/graphics/view/pilots_head_psi");
view_pitch = XPLMFindDataRef("sim/graphics/view/pilots_head_the");
+ view_roll = XPLMFindDataRef("sim/graphics/view/pilots_head_phi");
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(track_toggle,
+ TrackToggleHandler,
+ 1,
+ NULL);
- XPLMRegisterCommandHandler( translation_disable_toggle,
- TranslationToggleHandler,
- 1,
- (void*)0);
+ XPLMRegisterCommandHandler(translation_disable_toggle,
+ TranslationToggleHandler,
+ 1,
+ NULL);
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) {
+ lck_posix = shm_wrapper_init(WINE_SHM_NAME, WINE_MTX_NAME, sizeof(WineSHM));
+ if (lck_posix->mem == MAP_FAILED) {
fprintf(stderr, "opentrack failed to init SHM!\n");
return 0;
}
- shm_posix = (WineSHM*) lck_posix->mem;
- memset(shm_posix, 0, sizeof(WineSHM));
+ shm_posix = lck_posix->mem;
+ volatile_explicit_bzero(shm_posix, sizeof(WineSHM));
strcpy(outName, "opentrack");
strcpy(outSignature, "opentrack - freetrack lives!");
strcpy(outDescription, "head tracking view control");
@@ -198,29 +225,33 @@ PLUGIN_API OPENTRACK_COMPAT_EXPORT int XPluginStart ( char * outName, char * out
return 0;
}
-PLUGIN_API OPENTRACK_COMPAT_EXPORT void XPluginStop ( void ) {
+PLUGIN_API OTR_GENERIC_EXPORT
+void XPluginStop (void) {
if (lck_posix)
{
- PortableLockedShm_free(lck_posix);
+ shm_wrapper_free(lck_posix);
lck_posix = NULL;
shm_posix = NULL;
}
}
-PLUGIN_API OPENTRACK_COMPAT_EXPORT void XPluginEnable ( void ) {
+PLUGIN_API OTR_GENERIC_EXPORT
+int XPluginEnable (void) {
XPLMRegisterFlightLoopCallback(write_head_position, -1.0, NULL);
track_disabled = 0;
+ return 1;
}
-PLUGIN_API OPENTRACK_COMPAT_EXPORT void XPluginDisable ( void ) {
+PLUGIN_API OTR_GENERIC_EXPORT
+void XPluginDisable (void) {
XPLMUnregisterFlightLoopCallback(write_head_position, NULL);
track_disabled = 1;
}
-PLUGIN_API OPENTRACK_COMPAT_EXPORT void XPluginReceiveMessage(
- XPLMPluginID OT_UNUSED(inFromWho),
- int OT_UNUSED(inMessage),
- void * OT_UNUSED(inParam))
+PLUGIN_API OTR_GENERIC_EXPORT
+void XPluginReceiveMessage(XPLMPluginID inFromWho,
+ int inMessage,
+ void * inParam)
{
if (inMessage == XPLM_MSG_AIRPORT_LOADED)
reinit_offset();