summaryrefslogtreecommitdiffhomepage
path: root/proto-wine/ftnoir_protocol_wine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'proto-wine/ftnoir_protocol_wine.cpp')
-rw-r--r--proto-wine/ftnoir_protocol_wine.cpp59
1 files changed, 59 insertions, 0 deletions
diff --git a/proto-wine/ftnoir_protocol_wine.cpp b/proto-wine/ftnoir_protocol_wine.cpp
new file mode 100644
index 00000000..99ad30a2
--- /dev/null
+++ b/proto-wine/ftnoir_protocol_wine.cpp
@@ -0,0 +1,59 @@
+#include "ftnoir_protocol_wine.h"
+#include <string.h>
+#include <sys/mman.h>
+#include <sys/stat.h> /* For mode constants */
+#include <fcntl.h> /* For O_* constants */
+#include "csv/csv.h"
+
+FTNoIR_Protocol::FTNoIR_Protocol() : lck_shm(WINE_SHM_NAME, WINE_MTX_NAME, sizeof(WineSHM)), shm(NULL), gameid(0)
+{
+ if (lck_shm.success()) {
+ shm = (WineSHM*) lck_shm.ptr();
+ memset(shm, 0, sizeof(*shm));
+ }
+ wrapper.start("wine", QStringList() << (QCoreApplication::applicationDirPath() + "/opentrack-wrapper-wine.exe.so"));
+}
+
+FTNoIR_Protocol::~FTNoIR_Protocol()
+{
+ if (shm) {
+ shm->stop = true;
+ wrapper.waitForFinished(100);
+ }
+ wrapper.terminate();
+ if (!wrapper.waitForFinished(100))
+ {
+ wrapper.kill();
+ wrapper.waitForFinished(42);
+ }
+ //shm_unlink("/" WINE_SHM_NAME);
+}
+
+void FTNoIR_Protocol::pose( const double *headpose ) {
+ if (shm)
+ {
+ lck_shm.lock();
+ for (int i = 3; i < 6; i++)
+ shm->data[i] = headpose[i] / 57.295781;
+ for (int i = 0; i < 3; i++)
+ shm->data[i] = headpose[i] * 10;
+ if (shm->gameid != gameid)
+ {
+ QString gamename;
+ QMutexLocker foo(&game_name_mutex);
+ /* only EZCA for FSX requires dummy process, and FSX doesn't work on Linux */
+ /* memory-hacks DLL can't be loaded into a Linux process, either */
+ CSV::getGameData(shm->gameid, shm->table, gamename);
+ gameid = shm->gameid2 = shm->gameid;
+ connected_game = gamename;
+ }
+ lck_shm.unlock();
+ }
+}
+
+bool FTNoIR_Protocol::correct()
+{
+ return lck_shm.success();
+}
+
+OPENTRACK_DECLARE_PROTOCOL(FTNoIR_Protocol, FTControls, FTNoIR_ProtocolDll)