diff options
Diffstat (limited to 'x-plane-plugin/plugin.c')
| -rw-r--r-- | x-plane-plugin/plugin.c | 155 |
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(); |
