/******************************************************************************* * FaceTrackNoIR This program is a private project of the some enthusiastic * gamers from Holland, who don't like to pay much for * head-tracking. * * Copyright (C) 2013 Wim Vriend (Developing) * Ron Hendriks (Researching and Testing) * * Homepage * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 3 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, see . * * FTServer FTServer is the Class, that communicates headpose-data * to games, using the FreeTrackClient.dll. ********************************************************************************/ /* Copyright (c) 2013-2015 Stanislaw Halik * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. */ #include "ftnoir_protocol_ft.h" #include "csv/csv.h" FTNoIR_Protocol::FTNoIR_Protocol() : shm(FREETRACK_HEAP, FREETRACK_MUTEX, sizeof(FTHeap)), pMemData((FTHeap*) shm.ptr()), viewsStart(nullptr), viewsStop(nullptr), intGameID(0) { } FTNoIR_Protocol::~FTNoIR_Protocol() { if (viewsStop != NULL) { viewsStop(); FTIRViewsLib.unload(); } dummyTrackIR.terminate(); dummyTrackIR.kill(); dummyTrackIR.waitForFinished(50); } void FTNoIR_Protocol::pose(const double* headpose) { float yaw = -getRadsFromDegrees(headpose[Yaw]); float pitch = -getRadsFromDegrees(headpose[Pitch]); float roll = getRadsFromDegrees(headpose[Roll]); float tx = headpose[TX] * 10.f; float ty = headpose[TY] * 10.f; float tz = headpose[TZ] * 10.f; FTHeap* ft = pMemData; FTData* data = &ft->data; shm.lock(); data->RawX = 0; data->RawY = 0; data->RawZ = 0; data->RawPitch = 0; data->RawYaw = 0; data->RawRoll = 0; data->X = tx; data->Y = ty; data->Z = tz; data->Yaw = yaw; data->Pitch = pitch; data->Roll = roll; data->X1 = data->DataID; data->X2 = 0; data->X3 = 0; data->X4 = 0; data->Y1 = 0; data->Y2 = 0; data->Y3 = 0; data->Y4 = 0; int32_t id = ft->GameID; if (intGameID != id) { QString gamename; { unsigned char table[8]; for (int i = 0; i < 8; i++) table[i] = pMemData->table[i]; CSV::getGameData(id, table, gamename); for (int i = 0; i < 8; i++) pMemData->table[i] = table[i]; } ft->GameID2 = id; intGameID = id; QMutexLocker foo(&this->game_name_mutex); connected_game = gamename; } data->DataID += 1; shm.unlock(); } void FTNoIR_Protocol::start_tirviews() { QString aFileName = QCoreApplication::applicationDirPath() + "/TIRViews.dll"; if ( QFile::exists( aFileName )) { FTIRViewsLib.setFileName(aFileName); FTIRViewsLib.load(); viewsStart = (importTIRViewsStart) FTIRViewsLib.resolve("TIRViewsStart"); if (viewsStart == NULL) { qDebug() << "FTServer::run() says: TIRViewsStart function not found in DLL!"; } else { qDebug() << "FTServer::run() says: TIRViewsStart executed!"; viewsStart(); } // // Load the Stop function from TIRViews.dll. Call it when terminating the thread. // viewsStop = (importTIRViewsStop) FTIRViewsLib.resolve("TIRViewsStop"); if (viewsStop == NULL) { qDebug() << "FTServer::run() says: TIRViewsStop function not found in DLL!"; } } } void FTNoIR_Protocol::start_dummy() { QString program = QCoreApplication::applicationDirPath() + "/TrackIR.exe"; dummyTrackIR.setProgram("\"" + program + "\""); dummyTrackIR.start(); } bool FTNoIR_Protocol::correct() { QSettings settings("Freetrack", "FreetrackClient"); // Registry settings (in HK_USER) QSettings settingsTIR("NaturalPoint", "NATURALPOINT\\NPClient Location"); // Registry settings (in HK_USER) if (!shm.success()) return false; QString aLocation = QCoreApplication::applicationDirPath() + "/"; switch (s.intUsedInterface) { case 0: // Use both interfaces settings.setValue( "Path" , aLocation ); settingsTIR.setValue( "Path" , aLocation ); break; case 1: // Use FreeTrack, disable TrackIR settings.setValue( "Path" , aLocation ); settingsTIR.setValue( "Path" , "" ); break; case 2: // Use TrackIR, disable FreeTrack settings.setValue( "Path" , "" ); settingsTIR.setValue( "Path" , aLocation ); break; default: break; } if (s.useTIRViews) { start_tirviews(); } // more games need the dummy executable than previously thought start_dummy(); pMemData->data.DataID = 1; pMemData->data.CamWidth = 100; pMemData->data.CamHeight = 250; pMemData->GameID2 = 0; for (int i = 0; i < 8; i++) pMemData->table[i] = 0; return true; } OPENTRACK_DECLARE_PROTOCOL(FTNoIR_Protocol, FTControls, FTNoIR_ProtocolDll)