From d3456cb84b428b2f5070517d6e571f6b2724dd24 Mon Sep 17 00:00:00 2001 From: Wim Vriend Date: Mon, 4 Apr 2011 19:58:09 +0000 Subject: Move protocols to DLL: TrackIR git-svn-id: svn+ssh://svn.code.sf.net/p/facetracknoir/code@61 19e81ba0-9b1a-49c3-bd6c-561e1906d5fb --- FTNoIR_Protocol_FG/FGTypes.h | 28 ++ FTNoIR_Protocol_FG/FTNoIR_Protocol_FG.cpp | 32 +- FTNoIR_Protocol_FG/FTNoIR_Protocol_FG.h | 6 +- FTNoIR_Protocol_FG/FTNoIR_Protocol_FG.vcproj | 4 + FTNoIR_Protocol_FTIR/FTIRTypes.h | 183 ++++++++ FTNoIR_Protocol_FTIR/FTNoIR_FTIRcontrols.ui | 194 +++++++++ FTNoIR_Protocol_FTIR/FTNoIR_Protocol_FTIR.cpp | 507 +++++++++++++++++++++++ FTNoIR_Protocol_FTIR/FTNoIR_Protocol_FTIR.h | 113 +++++ FTNoIR_Protocol_FTIR/FTNoIR_Protocol_FTIR.vcproj | 332 +++++++++++++++ FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.h | 2 +- FTNoIR_Tracker_UDP/ftnoir_tracker_udp.cpp | 9 +- FaceTrackNoIR.sln | 6 + FaceTrackNoIR.suo | Bin 367104 -> 373248 bytes FaceTrackNoIR/FGServer.cpp | 336 --------------- FaceTrackNoIR/FGServer.h | 106 ----- FaceTrackNoIR/FGTypes.h | 28 -- FaceTrackNoIR/FTIRServer.cpp | 481 --------------------- FaceTrackNoIR/FTIRServer.h | 121 ------ FaceTrackNoIR/FTIRTypes.h | 183 -------- FaceTrackNoIR/FTNoIR_FGcontrols.ui | 279 ------------- FaceTrackNoIR/FTNoIR_FTIRcontrols.ui | 194 --------- FaceTrackNoIR/FaceApp.cpp | 2 +- FaceTrackNoIR/FaceTrackNoIR.cpp | 47 ++- FaceTrackNoIR/FaceTrackNoIR.h | 11 +- FaceTrackNoIR/FaceTrackNoIR.vcproj | 176 -------- FaceTrackNoIR/tracker.cpp | 25 +- FaceTrackNoIR/tracker.h | 4 +- bin/FaceTrackNoIR.exe | Bin 663552 -> 618496 bytes bin/Settings/Wings of Prey.ini | 2 +- 29 files changed, 1477 insertions(+), 1934 deletions(-) create mode 100644 FTNoIR_Protocol_FG/FGTypes.h create mode 100644 FTNoIR_Protocol_FTIR/FTIRTypes.h create mode 100644 FTNoIR_Protocol_FTIR/FTNoIR_FTIRcontrols.ui create mode 100644 FTNoIR_Protocol_FTIR/FTNoIR_Protocol_FTIR.cpp create mode 100644 FTNoIR_Protocol_FTIR/FTNoIR_Protocol_FTIR.h create mode 100644 FTNoIR_Protocol_FTIR/FTNoIR_Protocol_FTIR.vcproj delete mode 100644 FaceTrackNoIR/FGServer.cpp delete mode 100644 FaceTrackNoIR/FGServer.h delete mode 100644 FaceTrackNoIR/FGTypes.h delete mode 100644 FaceTrackNoIR/FTIRServer.cpp delete mode 100644 FaceTrackNoIR/FTIRServer.h delete mode 100644 FaceTrackNoIR/FTIRTypes.h delete mode 100644 FaceTrackNoIR/FTNoIR_FGcontrols.ui delete mode 100644 FaceTrackNoIR/FTNoIR_FTIRcontrols.ui diff --git a/FTNoIR_Protocol_FG/FGTypes.h b/FTNoIR_Protocol_FG/FGTypes.h new file mode 100644 index 00000000..949dc213 --- /dev/null +++ b/FTNoIR_Protocol_FG/FGTypes.h @@ -0,0 +1,28 @@ +/******************************************************************************** +* 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) 2010 Wim Vriend (Developing) * +* Ron Hendriks (Researching and Testing) * +* * +* Homepage * +* * +* Type definitions for the FlightGear server. * +********************************************************************************/ +#pragma once +#ifndef INCLUDED_FGTYPES_H +#define INCLUDED_FGTYPES_H + +#include "Windows.h" + +// +// x,y,z position in metres, heading, pitch and roll in degrees... +// +#pragma pack(2) +struct TFlightGearData { + double x, y, z, h, p, r; + int status; +}; + +#endif//INCLUDED_FGTYPES_H diff --git a/FTNoIR_Protocol_FG/FTNoIR_Protocol_FG.cpp b/FTNoIR_Protocol_FG/FTNoIR_Protocol_FG.cpp index cb03c70e..95c83958 100644 --- a/FTNoIR_Protocol_FG/FTNoIR_Protocol_FG.cpp +++ b/FTNoIR_Protocol_FG/FTNoIR_Protocol_FG.cpp @@ -33,6 +33,9 @@ */ #include "ftnoir_protocol_fg.h" +// For Todd +//#define SEND_ASCII_DATA + /** constructor **/ FTNoIR_Protocol_FG::FTNoIR_Protocol_FG() { @@ -97,6 +100,10 @@ int no_bytes; QHostAddress sender; quint16 senderPort; +#ifdef SEND_ASCII_DATA +char data[100]; +#endif + // // Copy the Raw measurements directly to the client. // @@ -112,6 +119,22 @@ quint16 senderPort; // Try to send an UDP-message to the FlightGear // +#ifdef SEND_ASCII_DATA + sprintf_s(data, "%.4f;%.4f;%.4f;%.2f;%.2f;%.2f\n\0", FlightData.x, FlightData.y, FlightData.z, FlightData.p, FlightData.h, FlightData.r); + + if (outSocket != 0) { + no_bytes = outSocket->writeDatagram((const char *) &data, strlen( data ), destIP, destPort); + if ( no_bytes > 0) { + qDebug() << "FGServer::writePendingDatagrams says: bytes send =" << data; + } + else { + qDebug() << "FGServer::writePendingDatagrams says: nothing sent!"; + } + } + +#endif + + #ifndef SEND_ASCII_DATA //! [1] // no_bytes = outSocket->writeDatagram((const char *) &FlightData, sizeof( FlightData ), QHostAddress::LocalHost, 5550); if (outSocket != 0) { @@ -123,6 +146,7 @@ quint16 senderPort; qDebug() << "FGServer::writePendingDatagrams says: nothing sent!"; } } + #endif // // FlightGear keeps sending data, so we must read that here. @@ -208,13 +232,15 @@ FTNOIR_PROTOCOL_BASE_EXPORT PROTOCOLHANDLE __stdcall GetProtocol() // // Constructor for server-settings-dialog // -FGControls::FGControls( QWidget *parent, Qt::WindowFlags f ) : -QWidget( parent , f) +FGControls::FGControls() : +QWidget() { ui.setupUi( this ); QPoint offsetpos(100, 100); - this->move(parent->pos() + offsetpos); + //if (parent) { + // this->move(parent->pos() + offsetpos); + //} // Connect Qt signals to member-functions connect(ui.btnOK, SIGNAL(clicked()), this, SLOT(doOK())); diff --git a/FTNoIR_Protocol_FG/FTNoIR_Protocol_FG.h b/FTNoIR_Protocol_FG/FTNoIR_Protocol_FG.h index 220dc60d..45188257 100644 --- a/FTNoIR_Protocol_FG/FTNoIR_Protocol_FG.h +++ b/FTNoIR_Protocol_FG/FTNoIR_Protocol_FG.h @@ -1,5 +1,5 @@ /******************************************************************************** -* FaceTrackNoIR This program is a private project of the some enthusiastic * +* FaceTrackNoIR This program is a private project of some enthusiastic * * gamers from Holland, who don't like to pay much for * * head-tracking. * * * @@ -31,7 +31,7 @@ #include "..\ftnoir_protocol_base\ftnoir_protocol_base.h" #include "ui_FTNoIR_FGcontrols.h" -#include "..\facetracknoir\FGTypes.h" +#include "FGTypes.h" #include #include #include @@ -70,7 +70,7 @@ class FGControls: public QWidget, Ui::UICFGControls, public IProtocolDialog Q_OBJECT public: - explicit FGControls( QWidget *parent=0, Qt::WindowFlags f=0 ); + explicit FGControls(); virtual ~FGControls(); void showEvent ( QShowEvent * event ); diff --git a/FTNoIR_Protocol_FG/FTNoIR_Protocol_FG.vcproj b/FTNoIR_Protocol_FG/FTNoIR_Protocol_FG.vcproj index eae8510a..2a84fa7a 100644 --- a/FTNoIR_Protocol_FG/FTNoIR_Protocol_FG.vcproj +++ b/FTNoIR_Protocol_FG/FTNoIR_Protocol_FG.vcproj @@ -177,6 +177,10 @@ Filter="h" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" > + + diff --git a/FTNoIR_Protocol_FTIR/FTIRTypes.h b/FTNoIR_Protocol_FTIR/FTIRTypes.h new file mode 100644 index 00000000..f238762c --- /dev/null +++ b/FTNoIR_Protocol_FTIR/FTIRTypes.h @@ -0,0 +1,183 @@ +/******************************************************************************** +* FTIRTypes FTIRTypes contains the specific type definitions for the * +* Fake TrackIR protocol. * +* It was modelled after FTTypes.cpp. * +* * +* Copyright (C) 2010 Wim Vriend (Developing) * +* Ron Hendriks (Testing and Research) * +* * +* 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 . * +* * +********************************************************************************/ +#pragma once +#ifndef INCLUDED_FTIRTYPES_H +#define INCLUDED_FTIRTYPES_H + +#include "Windows.h" +#include +#include + +// +// Versioning hasn't been worked out yet... +// +// The following is the previous spec definition of versioning info -- I can probably do +// something very similar to this -- will keep you posted. +// +// request version information using 2 messages, they cannot be expected to arrive in a specific order - so always parse using the High byte +// the messages have a NPCONTROL byte in the first parameter, and the second parameter has packed bytes. +// Message 1) (first parameter)NPCONTROL : (second parameter) (High Byte)NPVERSIONMAJOR (Low Byte) major version number data +// Message 2) (first parameter)NPCONTROL : (second parameter) (High Byte)NPVERSIONMINOR (Low Byte) minor version number data + +#define NPQUERYVERSION 1040 + +// CONTROL DATA SUBFIELDS +#define NPVERSIONMAJOR 1 +#define NPVERSIONMINOR 2 + +// DATA FIELDS +#define NPControl 8 // indicates a control data field + // the second parameter of a message bearing control data information contains a packed data format. + // The High byte indicates what the data is, and the Low byte contains the actual data +// roll, pitch, yaw +#define NPRoll 1 // +/- 16383 (representing +/- 180) [data = input - 16383] +#define NPPitch 2 // +/- 16383 (representing +/- 180) [data = input - 16383] +#define NPYaw 4 // +/- 16383 (representing +/- 180) [data = input - 16383] + +// x, y, z - remaining 6dof coordinates +#define NPX 16 // +/- 16383 [data = input - 16383] +#define NPY 32 // +/- 16383 [data = input - 16383] +#define NPZ 64 // +/- 16383 [data = input - 16383] + +#define NP_AXIS_MIN -16383 +#define NP_AXIS_MAX 16383 + +// raw object position from imager +#define NPRawX 128 // 0..25600 (actual value is multiplied x 100 to pass two decimal places of precision) [data = input / 100] +#define NPRawY 256 // 0..25600 (actual value is multiplied x 100 to pass two decimal places of precision) [data = input / 100] +#define NPRawZ 512 // 0..25600 (actual value is multiplied x 100 to pass two decimal places of precision) [data = input / 100] + +// x, y, z deltas from raw imager position +#define NPDeltaX 1024 // +/- 2560 (actual value is multiplied x 10 to pass two decimal places of precision) [data = (input / 10) - 256] +#define NPDeltaY 2048 // +/- 2560 (actual value is multiplied x 10 to pass two decimal places of precision) [data = (input / 10) - 256] +#define NPDeltaZ 4096 // +/- 2560 (actual value is multiplied x 10 to pass two decimal places of precision) [data = (input / 10) - 256] + +// raw object position from imager +#define NPSmoothX 8192 // 0..32766 (actual value is multiplied x 10 to pass one decimal place of precision) [data = input / 10] +#define NPSmoothY 16384 // 0..32766 (actual value is multiplied x 10 to pass one decimal place of precision) [data = input / 10] +#define NPSmoothZ 32768 // 0..32766 (actual value is multiplied x 10 to pass one decimal place of precision) [data = input / 10] + +// NPESULT values are returned from the Game Client API functions. +// +typedef enum tagNPResult +{ + NP_OK = 0, + NP_ERR_DEVICE_NOT_PRESENT, + NP_ERR_UNSUPPORTED_OS, + NP_ERR_INVALID_ARG, + NP_ERR_DLL_NOT_FOUND, + NP_ERR_NO_DATA, + NP_ERR_INTERNAL_DATA +} NPRESULT; + + static const char* FTIR_CLIENT_FILENAME = "NPClient.dll"; + static const char* FTIR_VIEWS_FILENAME = "TIRViews.dll"; + static const char* FTIR_MM_DATA = "{0F98177E-0E5C-4F86-8837-229D19B1701D}"; + static const char* FTIR_MUTEX = "FT_TIR_Mutex"; + static const char* FTIR_REGISTER_PROGRAMHANDLE = "FT_Register_Program_Handle"; + static const char* FTIR_UNREGISTER_PROGRAMHANDLE = "FT_UnRegister_Program_Handle"; + +typedef struct tagTrackIRData +{ + unsigned short wNPStatus; + unsigned short wPFrameSignature; + unsigned long dwNPIOData; + + float fNPRoll; + float fNPPitch; + float fNPYaw; + float fNPX; + float fNPY; + float fNPZ; + float fNPRawX; + float fNPRawY; + float fNPRawZ; + float fNPDeltaX; + float fNPDeltaY; + float fNPDeltaZ; + float fNPSmoothX; + float fNPSmoothY; + float fNPSmoothZ; +} TRACKIRDATA, *LPTRACKIRDATA; + +struct FTIRMemMap { + // Emulators can check this + int iRecordSize; + TRACKIRDATA data; + int Version; + // Emulators should read these + HANDLE RegisteredHandle; + bool Transmission, Cursor; + long int RequestFormat; + long int ProgramProfileID; + // Read/Write + int LastError; + int Param[16]; + unsigned short ClientNotify1, ClientNotify2; + char Signature[400]; +}; +typedef FTIRMemMap * PFTIRMemMap; + +// +// Typedef for pointer to the notify callback function that is implemented within +// the client -- this function receives head tester reports from the game client API +// +typedef NPRESULT (__stdcall *PF_NOTIFYCALLBACK)( unsigned short, unsigned short ); +// +//// Typedefs for game client API functions (useful for declaring pointers to these +//// functions within the client for use during GetProcAddress() ops) +//// +//typedef NPRESULT (__stdcall *PF_NP_REGISTERWINDOWHANDLE)( HWND ); +//typedef NPRESULT (__stdcall *PF_NP_UNREGISTERWINDOWHANDLE)( void ); +//typedef NPRESULT (__stdcall *PF_NP_REGISTERPROGRAMPROFILEID)( unsigned short ); +//typedef NPRESULT (__stdcall *PF_NP_QUERYVERSION)( unsigned short* ); +//typedef NPRESULT (__stdcall *PF_NP_REQUESTDATA)( unsigned short ); +//typedef NPRESULT (__stdcall *PF_NP_GETDATA)( LPTRACKIRDATA ); +//typedef NPRESULT (__stdcall *PF_NP_REGISTERNOTIFY)( PF_NOTIFYCALLBACK ); +//typedef NPRESULT (__stdcall *PF_NP_UNREGISTERNOTIFY)( void ); +//typedef NPRESULT (__stdcall *PF_NP_STARTCURSOR)( void ); +//typedef NPRESULT (__stdcall *PF_NP_STOPCURSOR)( void ); +//typedef NPRESULT (__stdcall *PF_NP_STARTDATATRANSMISSION)( void ); +//typedef NPRESULT (__stdcall *PF_NP_STOPDATATRANSMISSION)( void ); + +//// Function Prototypes /////////////////////////////////////////////// +// +// Functions exported from game client API DLL ( note __stdcall calling convention +// is used for ease of interface to clients of differing implementations including +// C, C++, Pascal (Delphi) and VB. ) +// +//NPRESULT __stdcall NP_RegisterWindowHandle( HWND hWnd ); +//NPRESULT __stdcall NP_RegisterWindowHandle( HWND ); +//NPRESULT __stdcall NP_UnregisterWindowHandle( void ); +//NPRESULT __stdcall NP_RegisterProgramProfileID( unsigned short wPPID ); +//NPRESULT __stdcall NP_QueryVersion( unsigned short* pwVersion ); +//NPRESULT __stdcall NP_RequestData( unsigned short wDataReq ); +//NPRESULT __stdcall NP_GetData( LPTRACKIRDATA pTID ); +//NPRESULT __stdcall NP_RegisterNotify( PF_NOTIFYCALLBACK pfNotify ); +//NPRESULT __stdcall NP_UnregisterNotify( void ); +//NPRESULT __stdcall NP_StartCursor( void ); +//NPRESULT __stdcall NP_StopCursor( void ); +//NPRESULT __stdcall NP_StartDataTransmission( void ); +//NPRESULT __stdcall NP_StopDataTransmission( void ); + +#endif//INCLUDED_FTIRTYPES_H diff --git a/FTNoIR_Protocol_FTIR/FTNoIR_FTIRcontrols.ui b/FTNoIR_Protocol_FTIR/FTNoIR_FTIRcontrols.ui new file mode 100644 index 00000000..a2d06d2a --- /dev/null +++ b/FTNoIR_Protocol_FTIR/FTNoIR_FTIRcontrols.ui @@ -0,0 +1,194 @@ + + + UICFTIRControls + + + + 0 + 0 + 411 + 157 + + + + FTIR settings FaceTrackNoIR + + + + images/FaceTrackNoIR.icoimages/FaceTrackNoIR.ico + + + Qt::LeftToRight + + + false + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::RightToLeft + + + Use TIRViews + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + TIRViews is only required for some older games (like CFS3). + + + + + + + For it to work, TIRViews.dll must be placed in the FaceTrackNoIR program folder. + + + true + + + + + + + If the checkbox is disabled, the DLL was not found. + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + QLayout::SetDefaultConstraint + + + + + + 0 + 0 + + + + + 100 + 0 + + + + + 100 + 16777215 + + + + OK + + + + + + + + 0 + 0 + + + + + 100 + 0 + + + + + 100 + 16777215 + + + + Cancel + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + + + + + startEngineClicked() + stopEngineClicked() + cameraSettingsClicked() + + diff --git a/FTNoIR_Protocol_FTIR/FTNoIR_Protocol_FTIR.cpp b/FTNoIR_Protocol_FTIR/FTNoIR_Protocol_FTIR.cpp new file mode 100644 index 00000000..59ea086b --- /dev/null +++ b/FTNoIR_Protocol_FTIR/FTNoIR_Protocol_FTIR.cpp @@ -0,0 +1,507 @@ +/******************************************************************************** +* 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) 2010 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 . * +* * +* FTIRServer FTIRServer is the Class, that communicates headpose-data * +* to games, using the NPClient.dll. * +********************************************************************************/ +/* + Modifications (last one on top): + 20110401 - WVR: Moved protocol to a DLL, convenient for installation etc. + 20101224 - WVR: Base class is no longer inheriting QThread. sendHeadposeToGame + is called from run() of Tracker.cpp +*/ +#include "ftnoir_protocol_ftir.h" + +/** constructor **/ +FTNoIR_Protocol_FTIR::FTNoIR_Protocol_FTIR() +{ + loadSettings(); + ProgramName = ""; + dummyTrackIR = 0; + viewsStart = 0; + viewsStop = 0; +} + +/** destructor **/ +FTNoIR_Protocol_FTIR::~FTNoIR_Protocol_FTIR() +{ + // + // Destroy the File-mapping + // + FTIRDestroyMapping(); + + // + // Free the DLL's + // + FTIRClientLib.unload(); + if (viewsStop != NULL) { + viewsStop(); + FTIRViewsLib.unload(); + } + + // + // Kill the dummy TrackIR process. + // + qDebug() << "FTIRServer::~FTIRServer() about to kill TrackIR.exe process"; + try { + if (dummyTrackIR) { + dummyTrackIR->kill(); + } + } + catch (...) + { + qDebug() << "~FTIRServer says: some error occurred"; + } +} + +/** helper to Auto-destruct **/ +void FTNoIR_Protocol_FTIR::Release() +{ + delete this; +} + +void FTNoIR_Protocol_FTIR::Initialize() +{ + return; +} + +// +// Scale the measured value to the Joystick values +// +float FTNoIR_Protocol_FTIR::scale2AnalogLimits( float x, float min_x, float max_x ) { +double y; +double local_x; + + local_x = x; + if (local_x > max_x) { + local_x = max_x; + } + if (local_x < min_x) { + local_x = min_x; + } + y = ( NP_AXIS_MAX * local_x ) / max_x; + + return (float) y; +} + +// +// Load the current Settings from the currently 'active' INI-file. +// +void FTNoIR_Protocol_FTIR::loadSettings() { + QSettings settings("Abbequerque Inc.", "FaceTrackNoIR"); // Registry settings (in HK_USER) + + QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/Settings/default.ini" ).toString(); + QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file) + + iniFile.beginGroup ( "FTIR" ); + useTIRViews = iniFile.value ( "useTIRViews", 0 ).toBool(); + iniFile.endGroup (); +} + +// +// Update Headpose in Game. +// +void FTNoIR_Protocol_FTIR::sendHeadposeToGame( T6DOF *headpose ) { +float virtPosX; +float virtPosY; +float virtPosZ; + +float virtRotX; +float virtRotY; +float virtRotZ; + + // + // Copy the Raw measurements directly to the client. + // + virtRotX = scale2AnalogLimits (headpose->position.pitch, -180.0f, 180.0f); + virtRotY = scale2AnalogLimits (headpose->position.yaw, -180.0f, 180.0f); + virtRotZ = scale2AnalogLimits (headpose->position.roll, -180.0f, 180.0f); + + virtPosX = scale2AnalogLimits (headpose->position.x * 10.0f, -500.0f, 500.0f); + virtPosY = scale2AnalogLimits (headpose->position.y * 10.0f, -500.0f, 500.0f); + virtPosZ = scale2AnalogLimits (headpose->position.z * 10.0f, -500.0f, 500.0f); + + // + // Check if the pointer is OK and wait for the Mutex. + // Use the setposition in the (special) DLL, to write the headpose-data. + // + if ( (pMemData != NULL) && (WaitForSingleObject(hFTIRMutex, 100) == WAIT_OBJECT_0) ) { + setposition (virtPosX, virtPosY, virtPosZ, virtRotZ, virtRotX, virtRotY ); + ReleaseMutex(hFTIRMutex); + } +} + +// +// Check if the Client DLL exists and load it (to test it), if so. +// Returns 'true' if all seems OK. +// +bool FTNoIR_Protocol_FTIR::checkServerInstallationOK( HANDLE handle ) +{ + QSettings settings("NaturalPoint", "NATURALPOINT\\NPClient Location"); // Registry settings (in HK_USER) + QString aLocation; // Location of Client DLL + QString aFileName; // File Path and Name + + //importProvider provider; + //char *pProvider; + + qDebug() << "FTCheckClientDLL says: Starting Function"; + + try { + + // + // Load the NPClient.dll from the current path of FaceTrackNoIR, because there is no + // guarantee TrackIR or GlovePIE is also installed. + // + // Write this path in the registry (under NaturalPoint/NATURALPOINT, for the game(s). + // + aLocation = QCoreApplication::applicationDirPath() + "/"; + qDebug() << "FTCheckClientDLL says: Location of DLL =" << aLocation; + + // + // Append a '/' to the Path and then the name of the dll. + // + aFileName = aLocation; + aFileName.append(FTIR_CLIENT_FILENAME); + qDebug() << "FTCheckClientDLL says: Full path of DLL =" << aFileName; + + if ( QFile::exists( aFileName ) ) { + qDebug() << "FTCheckClientDLL says: DLL exists!"; + // + // Write the path to the key in the Registry, so the game(s) can find it too... + // + settings.setValue( "Path" , aLocation ); + + // + // Load the DLL and map to the functions in it. + // + FTIRClientLib.setFileName(aFileName); + FTIRClientLib.load(); + } + else { + QMessageBox::information(0, "FaceTrackNoIR error", QString("Necessary file (NPClient.dll) was NOT found!\n")); + return false; + } + + // + // Also load TIRViews.dll, to support some older games + // + if (useTIRViews) { + aFileName = aLocation; + aFileName.append(FTIR_VIEWS_FILENAME); + FTIRViewsLib.setFileName(aFileName); + FTIRViewsLib.load(); + } + + // + // Start TrackIR.exe, also to support some older games and EZCA + // Some TrackIR clients check if a process called TrackIR.exe is running. + // This should do the trick + // + QString program = "TrackIR.exe"; + dummyTrackIR = new QProcess(); + dummyTrackIR->start(program); + + } catch(...) { + settings.~QSettings(); + } + + // + // Create the File-mapping for Inter Process Communication + // + if (!FTIRCreateMapping( handle )){ + return false; + } + + // + // Find the functions in the DLL's + // + // Get the setposition function from the DLL and use it! + // + setposition = (importSetPosition) FTIRClientLib.resolve("SetPosition"); + if (setposition == NULL) { + qDebug() << "FTIRServer::run() says: SetPosition function not found in DLL!"; + return false; + } + else { + setposition (7.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f); + } + + // + // Load the Start function from TIRViews.dll and call it, to start compatibility with older games + // + if (useTIRViews) { + viewsStart = (importTIRViewsStart) FTIRViewsLib.resolve("TIRViewsStart"); + if (viewsStart == NULL) { + qDebug() << "FTIRServer::run() says: TIRViewsStart function not found in DLL!"; + } + else { + qDebug() << "FTIRServer::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() << "FTIRServer::run() says: TIRViewsStop function not found in DLL!"; + } + } + return true; +} + +// +// Create a memory-mapping to the TrackIR data. +// It contains the tracking data, a handle to the main-window and the program-name of the Game! +// +// +bool FTNoIR_Protocol_FTIR::FTIRCreateMapping( HANDLE handle ) +{ + qDebug() << "FTIRCreateMapping says: Starting Function"; + + // + // A FileMapping is used to create 'shared memory' between the FTIRServer and the FTClient. + // + // Try to create a FileMapping to the Shared Memory. + // If one already exists: close it. + // + hFTIRMemMap = CreateFileMappingA( INVALID_HANDLE_VALUE , 00 , PAGE_READWRITE , 0 , + sizeof( TRACKIRDATA ) + sizeof( HANDLE ) + 100, + (LPCSTR) FTIR_MM_DATA ); + + if ( hFTIRMemMap != 0 ) { + qDebug() << "FTIRCreateMapping says: FileMapping Created!" << hFTIRMemMap; + } + + if ( ( hFTIRMemMap != 0 ) && ( (long) GetLastError == ERROR_ALREADY_EXISTS ) ) { + CloseHandle( hFTIRMemMap ); + hFTIRMemMap = 0; + } + + // + // Create a new FileMapping, Read/Write access + // + hFTIRMemMap = OpenFileMappingA( FILE_MAP_ALL_ACCESS , false , (LPCSTR) FTIR_MM_DATA ); + if ( ( hFTIRMemMap != 0 ) ) { + qDebug() << "FTIRCreateMapping says: FileMapping Created again:" << hFTIRMemMap; + pMemData = (FTIRMemMap *) MapViewOfFile(hFTIRMemMap, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(TRACKIRDATA) + sizeof(hFTIRMemMap) + 100); + if (pMemData != NULL) { + pMemData->RegisteredHandle = handle; // The game uses the handle, to send a message that the Program-Name was set! + } + hFTIRMutex = CreateMutexA(NULL, false, FTIR_MUTEX); + } + else { + QMessageBox::information(0, "FaceTrackNoIR error", QString("FTIRServer Error! \n")); + return false; + } + + return true; +} + +// +// Destory the FileMapping to the shared memory +// +void FTNoIR_Protocol_FTIR::FTIRDestroyMapping() +{ + if ( pMemData != NULL ) { + UnmapViewOfFile ( pMemData ); + } + + if (hFTIRMutex != 0) { + CloseHandle( hFTIRMutex ); + } + hFTIRMutex = 0; + + if (hFTIRMemMap != 0) { + CloseHandle( hFTIRMemMap ); + } + hFTIRMemMap = 0; + +} + + +//////////////////////////////////////////////////////////////////////////////// +// Factory function that creates instances if the Protocol object. + +// Export both decorated and undecorated names. +// GetProtocol - Undecorated name, which can be easily used with GetProcAddress +// Win32 API function. +// _GetProtocol@0 - Common name decoration for __stdcall functions in C language. +#pragma comment(linker, "/export:GetProtocol=_GetProtocol@0") + +FTNOIR_PROTOCOL_BASE_EXPORT PROTOCOLHANDLE __stdcall GetProtocol() +{ + return new FTNoIR_Protocol_FTIR; +} + +//******************************************************************************************************* +// FaceTrackNoIR Client Settings-dialog. +//******************************************************************************************************* + +// +// Constructor for server-settings-dialog +// +FTIRControls::FTIRControls() : +QWidget() +{ + QString aFileName; // File Path and Name + + ui.setupUi( this ); + + // Connect Qt signals to member-functions + connect(ui.btnOK, SIGNAL(clicked()), this, SLOT(doOK())); + connect(ui.btnCancel, SIGNAL(clicked()), this, SLOT(doCancel())); + connect(ui.chkTIRViews, SIGNAL(stateChanged(int)), this, SLOT(chkTIRViewsChanged())); + + aFileName = QCoreApplication::applicationDirPath() + "/"; + aFileName.append(FTIR_VIEWS_FILENAME); + if ( !QFile::exists( aFileName ) ) { + ui.chkTIRViews->setChecked( false ); + ui.chkTIRViews->setEnabled ( false ); + } + else { + ui.chkTIRViews->setEnabled ( true ); + } + + // Load the settings from the current .INI-file + loadSettings(); +} + +// +// Destructor for server-dialog +// +FTIRControls::~FTIRControls() { + qDebug() << "~FTIRControls() says: started"; +} + +void FTIRControls::Release() +{ + delete this; +} + +// +// Initialize tracker-client-dialog +// +void FTIRControls::Initialize(QWidget *parent) { + + QPoint offsetpos(100, 100); + if (parent) { + this->move(parent->pos() + offsetpos); + } + show(); +} + +// +// OK clicked on server-dialog +// +void FTIRControls::doOK() { + save(); + this->close(); +} + +// override show event +void FTIRControls::showEvent ( QShowEvent * event ) { + loadSettings(); +} + +// +// Cancel clicked on server-dialog +// +void FTIRControls::doCancel() { + // + // Ask if changed Settings should be saved + // + if (settingsDirty) { + int ret = QMessageBox::question ( this, "Settings have changed", "Do you want to save the settings?", QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Discard ); + + qDebug() << "doCancel says: answer =" << ret; + + switch (ret) { + case QMessageBox::Save: + save(); + this->close(); + break; + case QMessageBox::Discard: + this->close(); + break; + case QMessageBox::Cancel: + // Cancel was clicked + break; + default: + // should never be reached + break; + } + } + else { + this->close(); + } +} + +// +// Load the current Settings from the currently 'active' INI-file. +// +void FTIRControls::loadSettings() { + qDebug() << "loadSettings says: Starting "; + QSettings settings("Abbequerque Inc.", "FaceTrackNoIR"); // Registry settings (in HK_USER) + + QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/Settings/default.ini" ).toString(); + QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file) + + qDebug() << "loadSettings says: iniFile = " << currentFile; + + iniFile.beginGroup ( "FTIR" ); + ui.chkTIRViews->setChecked (iniFile.value ( "useTIRViews", 0 ).toBool()); + iniFile.endGroup (); + + settingsDirty = false; +} + +// +// Save the current Settings to the currently 'active' INI-file. +// +void FTIRControls::save() { + QSettings settings("Abbequerque Inc.", "FaceTrackNoIR"); // Registry settings (in HK_USER) + + QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/Settings/default.ini" ).toString(); + QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file) + + iniFile.beginGroup ( "FTIR" ); + iniFile.setValue ( "useTIRViews", ui.chkTIRViews->isChecked() ); + iniFile.endGroup (); + + settingsDirty = false; +} + +//////////////////////////////////////////////////////////////////////////////// +// Factory function that creates instances if the Protocol-settings dialog object. + +// Export both decorated and undecorated names. +// GetProtocolDialog - Undecorated name, which can be easily used with GetProcAddress +// Win32 API function. +// _GetProtocolDialog@0 - Common name decoration for __stdcall functions in C language. +#pragma comment(linker, "/export:GetProtocolDialog=_GetProtocolDialog@0") + +FTNOIR_PROTOCOL_BASE_EXPORT PROTOCOLDIALOGHANDLE __stdcall GetProtocolDialog( ) +{ + return new FTIRControls; +} diff --git a/FTNoIR_Protocol_FTIR/FTNoIR_Protocol_FTIR.h b/FTNoIR_Protocol_FTIR/FTNoIR_Protocol_FTIR.h new file mode 100644 index 00000000..f1d169f7 --- /dev/null +++ b/FTNoIR_Protocol_FTIR/FTNoIR_Protocol_FTIR.h @@ -0,0 +1,113 @@ +/******************************************************************************** +* FaceTrackNoIR This program is a private project of some enthusiastic * +* gamers from Holland, who don't like to pay much for * +* head-tracking. * +* * +* Copyright (C) 2010 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 . * +* * +* FTIRServer FTIRServer is the Class, that communicates headpose-data * +* to games, using the NPClient.dll. * +********************************************************************************/ +#pragma once +#ifndef INCLUDED_FTIRSERVER_H +#define INCLUDED_FTIRSERVER_H + +#include "..\ftnoir_protocol_base\ftnoir_protocol_base.h" +#include "ui_FTNoIR_FTIRcontrols.h" +#include "FTIRTypes.h" +#include +#include +#include +#include +#include +#include +#include "Windows.h" +//#include "math.h" + +typedef void (WINAPI *importSetPosition)(float x, float y, float z, float xRot, float yRot, float zRot); +typedef void (WINAPI *importTIRViewsStart)(void); +typedef void (WINAPI *importTIRViewsStop)(void); + + +class FTNoIR_Protocol_FTIR : public IProtocol +{ +public: + FTNoIR_Protocol_FTIR(); + ~FTNoIR_Protocol_FTIR(); + + void Release(); + void Initialize(); + + bool checkServerInstallationOK( HANDLE handle ); + void sendHeadposeToGame( T6DOF *headpose ); + +private: + bool FTIRCreateMapping(HANDLE handle); + void FTIRDestroyMapping(); + + importSetPosition setposition; // Function inside NPClient.dll + importTIRViewsStart viewsStart; // Functions inside TIRViews.dll + importTIRViewsStop viewsStop; + + HANDLE hFTIRMemMap; + FTIRMemMap *pMemData; + HANDLE hFTIRMutex; + + // Private properties + QString ProgramName; + QLibrary FTIRClientLib; + QLibrary FTIRViewsLib; + QProcess *dummyTrackIR; + bool useTIRViews; + + float scale2AnalogLimits( float x, float min_x, float max_x ); + void loadSettings(); + +}; + +// Widget that has controls for FTNoIR protocol client-settings. +class FTIRControls: public QWidget, Ui::UICFTIRControls, public IProtocolDialog +{ + Q_OBJECT +public: + + explicit FTIRControls(); + virtual ~FTIRControls(); + void showEvent ( QShowEvent * event ); + + void Release(); // Member functions which are accessible from outside the DLL + void Initialize(QWidget *parent); + +private: + Ui::UICFTIRControls ui; + void loadSettings(); + void save(); + + /** helper **/ + bool settingsDirty; + +private slots: + void doOK(); + void doCancel(); + void chkTIRViewsChanged() { settingsDirty = true; }; + void settingChanged() { settingsDirty = true; }; +}; + +#endif//INCLUDED_FTIRSERVER_H +//END diff --git a/FTNoIR_Protocol_FTIR/FTNoIR_Protocol_FTIR.vcproj b/FTNoIR_Protocol_FTIR/FTNoIR_Protocol_FTIR.vcproj new file mode 100644 index 00000000..ca3f797e --- /dev/null +++ b/FTNoIR_Protocol_FTIR/FTNoIR_Protocol_FTIR.vcproj @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.h b/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.h index b5d644fd..51c22027 100644 --- a/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.h +++ b/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.h @@ -57,7 +57,7 @@ class FTNClientControls: public QWidget, Ui::UICFTNClientControls, public ITrack Q_OBJECT public: - explicit FTNClientControls( QWidget *parent=0, Qt::WindowFlags f=0 ); + explicit FTNClientControls(); virtual ~FTNClientControls(); void showEvent ( QShowEvent * event ); diff --git a/FTNoIR_Tracker_UDP/ftnoir_tracker_udp.cpp b/FTNoIR_Tracker_UDP/ftnoir_tracker_udp.cpp index ba140cbb..8887deb0 100644 --- a/FTNoIR_Tracker_UDP/ftnoir_tracker_udp.cpp +++ b/FTNoIR_Tracker_UDP/ftnoir_tracker_udp.cpp @@ -215,16 +215,11 @@ FTNOIR_TRACKER_BASE_EXPORT TRACKERHANDLE __stdcall GetTracker() // // Constructor for server-settings-dialog // -FTNClientControls::FTNClientControls( QWidget *parent, Qt::WindowFlags f ) : -QWidget( parent , f) +FTNClientControls::FTNClientControls() : +QWidget() { ui.setupUi( this ); - QPoint offsetpos(100, 100); - if (parent) { - this->move(parent->pos() + offsetpos); - } - // Connect Qt signals to member-functions connect(ui.btnOK, SIGNAL(clicked()), this, SLOT(doOK())); connect(ui.btnCancel, SIGNAL(clicked()), this, SLOT(doCancel())); diff --git a/FaceTrackNoIR.sln b/FaceTrackNoIR.sln index 633d424d..8ad3d09b 100644 --- a/FaceTrackNoIR.sln +++ b/FaceTrackNoIR.sln @@ -17,6 +17,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FTNoIR_FaceAPI_EXE", "faceA EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FTNoIR_Protocol_FG", "FTNoIR_Protocol_FG\FTNoIR_Protocol_FG.vcproj", "{7C77C833-5687-4A35-B219-4CF4D3D8E626}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FTNoIR_Protocol_FTIR", "FTNoIR_Protocol_FTIR\FTNoIR_Protocol_FTIR.vcproj", "{BC5B8583-036A-4A9B-84AE-01158EE6F5A4}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -52,6 +54,10 @@ Global {7C77C833-5687-4A35-B219-4CF4D3D8E626}.Debug|Win32.Build.0 = Debug|Win32 {7C77C833-5687-4A35-B219-4CF4D3D8E626}.Release|Win32.ActiveCfg = Release|Win32 {7C77C833-5687-4A35-B219-4CF4D3D8E626}.Release|Win32.Build.0 = Release|Win32 + {BC5B8583-036A-4A9B-84AE-01158EE6F5A4}.Debug|Win32.ActiveCfg = Debug|Win32 + {BC5B8583-036A-4A9B-84AE-01158EE6F5A4}.Debug|Win32.Build.0 = Debug|Win32 + {BC5B8583-036A-4A9B-84AE-01158EE6F5A4}.Release|Win32.ActiveCfg = Release|Win32 + {BC5B8583-036A-4A9B-84AE-01158EE6F5A4}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/FaceTrackNoIR.suo b/FaceTrackNoIR.suo index 9f9c2c5c..73e03dea 100644 Binary files a/FaceTrackNoIR.suo and b/FaceTrackNoIR.suo differ diff --git a/FaceTrackNoIR/FGServer.cpp b/FaceTrackNoIR/FGServer.cpp deleted file mode 100644 index 66cc1d5d..00000000 --- a/FaceTrackNoIR/FGServer.cpp +++ /dev/null @@ -1,336 +0,0 @@ -/******************************************************************************** -* 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) 2010 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 . * -* * -* FGServer FGServer is the Class, that communicates headpose-data * -* to FlightGear, using UDP. * -* It is based on the (Linux) example made by Melchior FRANZ. * -********************************************************************************/ -/* - Modifications (last one on top): - 20101224 - WVR: Base class is no longer inheriting QThread. sendHeadposeToGame - is called from run() of Tracker.cpp -*/ -#include -#include -#include "FGServer.h" -#include "Tracker.h" -#include - -/** constructor **/ -FGServer::FGServer( Tracker *parent ) { - - // Save the parent - headTracker = parent; - loadSettings(); -} - -/** destructor **/ -FGServer::~FGServer() { - if (inSocket != 0) { - inSocket->close(); - delete inSocket; - } - - if (outSocket != 0) { - outSocket->close(); - delete outSocket; - } -} - -// -// Update Headpose in Game. -// -void FGServer::sendHeadposeToGame() { -int no_bytes; -QHostAddress sender; -quint16 senderPort; - - // - // Copy the Raw measurements directly to the client. - // - TestData.x = virtPosX; - TestData.y = virtPosY; - TestData.z = virtPosZ; - TestData.p = virtRotX; - TestData.h = virtRotY; - TestData.r = virtRotZ; - TestData.status = fg_cmd; - - // - // Try to send an UDP-message to the FlightGear - // - - //! [1] -// no_bytes = outSocket->writeDatagram((const char *) &TestData, sizeof( TestData ), QHostAddress::LocalHost, 5550); - if (outSocket != 0) { - no_bytes = outSocket->writeDatagram((const char *) &TestData, sizeof( TestData ), destIP, destPort); - if ( no_bytes > 0) { - // qDebug() << "FGServer::writePendingDatagrams says: bytes send =" << no_bytes << sizeof( double ); - } - else { - qDebug() << "FGServer::writePendingDatagrams says: nothing sent!"; - } - } - - // - // FlightGear keeps sending data, so we must read that here. - // - if (inSocket != 0) { - while (inSocket->hasPendingDatagrams()) { - - QByteArray datagram; - datagram.resize(inSocket->pendingDatagramSize()); - - inSocket->readDatagram( (char * ) &cmd, sizeof(cmd), &sender, &senderPort); - - fg_cmd = cmd; // Let's just accept that command for now... - if ( cmd > 0 ) { - qDebug() << "FGServer::sendHeadposeToGame hasPendingDatagrams, cmd = " << cmd; - headTracker->handleGameCommand ( cmd ); // Send it upstream, for the Tracker to handle - } - } - } -} - -// -// Check if the Client DLL exists and load it (to test it), if so. -// Returns 'true' if all seems OK. -// -bool FGServer::checkServerInstallationOK( HANDLE handle ) -{ - // Init. the data - TestData.x = 0.0f; - TestData.y = 0.0f; - TestData.z = 0.0f; - TestData.h = 0.0f; - TestData.p = 0.0f; - TestData.r = 0.0f; - TestData.status = 0; - fg_cmd = 1; - - inSocket = 0; - outSocket = 0; - - // - // Create UDP-sockets. - // - if (inSocket == 0) { - qDebug() << "FGServer::sendHeadposeToGame creating insocket"; - inSocket = new QUdpSocket(); - - // Connect the inSocket to the port, to receive messages - if (!inSocket->bind(QHostAddress::Any, destPort+1)) { - QMessageBox::warning(0,"FaceTrackNoIR Error", "Unable to bind UDP-port",QMessageBox::Ok,QMessageBox::NoButton); - delete inSocket; - inSocket = 0; - return false; - } - } - - if (outSocket == 0) { - outSocket = new QUdpSocket(); - } - - return true; -} - -// -// Load the current Settings from the currently 'active' INI-file. -// -void FGServer::loadSettings() { - - QSettings settings("Abbequerque Inc.", "FaceTrackNoIR"); // Registry settings (in HK_USER) - - QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/Settings/default.ini" ).toString(); - QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file) - - iniFile.beginGroup ( "FG" ); - - bool blnLocalPC = iniFile.value ( "LocalPCOnly", 1 ).toBool(); - if (blnLocalPC) { - destIP = QHostAddress::LocalHost; - } - else { - QString destAddr = iniFile.value ( "IP-1", 192 ).toString() + "." + iniFile.value ( "IP-2", 168 ).toString() + "." + iniFile.value ( "IP-3", 2 ).toString() + "." + iniFile.value ( "IP-4", 1 ).toString(); - destIP = QHostAddress( destAddr ); - } - destPort = iniFile.value ( "PortNumber", 5550 ).toInt(); - - iniFile.endGroup (); -} - -// -// Constructor for server-settings-dialog -// -FGControls::FGControls( QWidget *parent, Qt::WindowFlags f ) : -QWidget( parent , f) -{ - ui.setupUi( this ); - - QPoint offsetpos(100, 100); - this->move(parent->pos() + offsetpos); - - // Connect Qt signals to member-functions - connect(ui.btnOK, SIGNAL(clicked()), this, SLOT(doOK())); - connect(ui.btnCancel, SIGNAL(clicked()), this, SLOT(doCancel())); - connect(ui.chkLocalPC, SIGNAL(stateChanged(int)), this, SLOT(chkLocalPCOnlyChanged())); - connect(ui.spinIPFirstNibble, SIGNAL(valueChanged(int)), this, SLOT(settingChanged())); - connect(ui.spinIPSecondNibble, SIGNAL(valueChanged(int)), this, SLOT(settingChanged())); - connect(ui.spinIPThirdNibble, SIGNAL(valueChanged(int)), this, SLOT(settingChanged())); - connect(ui.spinIPFourthNibble, SIGNAL(valueChanged(int)), this, SLOT(settingChanged())); - connect(ui.spinPortNumber, SIGNAL(valueChanged(int)), this, SLOT(settingChanged())); - - // Load the settings from the current .INI-file - loadSettings(); -} - -// -// Destructor for server-dialog -// -FGControls::~FGControls() { - qDebug() << "~FGControls() says: started"; -} - -// -// OK clicked on server-dialog -// -void FGControls::doOK() { - save(); - this->close(); -} - -// override show event -void FGControls::showEvent ( QShowEvent * event ) { - loadSettings(); -} - -// -// Cancel clicked on server-dialog -// -void FGControls::doCancel() { - // - // Ask if changed Settings should be saved - // - if (settingsDirty) { - int ret = QMessageBox::question ( this, "Settings have changed", "Do you want to save the settings?", QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Discard ); - - qDebug() << "doCancel says: answer =" << ret; - - switch (ret) { - case QMessageBox::Save: - save(); - this->close(); - break; - case QMessageBox::Discard: - this->close(); - break; - case QMessageBox::Cancel: - // Cancel was clicked - break; - default: - // should never be reached - break; - } - } - else { - this->close(); - } -} - -// -// Load the current Settings from the currently 'active' INI-file. -// -void FGControls::loadSettings() { - -// qDebug() << "loadSettings says: Starting "; - QSettings settings("Abbequerque Inc.", "FaceTrackNoIR"); // Registry settings (in HK_USER) - - QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/Settings/default.ini" ).toString(); - QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file) - -// qDebug() << "loadSettings says: iniFile = " << currentFile; - - iniFile.beginGroup ( "FG" ); - ui.chkLocalPC->setChecked (iniFile.value ( "LocalPCOnly", 1 ).toBool()); - - ui.spinIPFirstNibble->setValue( iniFile.value ( "IP-1", 192 ).toInt() ); - ui.spinIPSecondNibble->setValue( iniFile.value ( "IP-2", 168 ).toInt() ); - ui.spinIPThirdNibble->setValue( iniFile.value ( "IP-3", 2 ).toInt() ); - ui.spinIPFourthNibble->setValue( iniFile.value ( "IP-4", 1 ).toInt() ); - - ui.spinPortNumber->setValue( iniFile.value ( "PortNumber", 5550 ).toInt() ); - iniFile.endGroup (); - - chkLocalPCOnlyChanged(); - settingsDirty = false; - -} - -// -// Save the current Settings to the currently 'active' INI-file. -// -void FGControls::save() { - - QSettings settings("Abbequerque Inc.", "FaceTrackNoIR"); // Registry settings (in HK_USER) - - QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/Settings/default.ini" ).toString(); - QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file) - - iniFile.beginGroup ( "FG" ); - iniFile.setValue ( "LocalPCOnly", ui.chkLocalPC->isChecked() ); - iniFile.setValue ( "IP-1", ui.spinIPFirstNibble->value() ); - iniFile.setValue ( "IP-2", ui.spinIPSecondNibble->value() ); - iniFile.setValue ( "IP-3", ui.spinIPThirdNibble->value() ); - iniFile.setValue ( "IP-4", ui.spinIPFourthNibble->value() ); - iniFile.setValue ( "PortNumber", ui.spinPortNumber->value() ); - iniFile.endGroup (); - - settingsDirty = false; -} - -// -// Handle change of the checkbox. -// -void FGControls::chkLocalPCOnlyChanged() { - - if ( ui.chkLocalPC->isChecked() ) { - ui.spinIPFirstNibble->setValue( 127 ); - ui.spinIPFirstNibble->setEnabled ( false ); - ui.spinIPSecondNibble->setValue( 0 ); - ui.spinIPSecondNibble->setEnabled ( false ); - ui.spinIPThirdNibble->setValue( 0 ); - ui.spinIPThirdNibble->setEnabled ( false ); - ui.spinIPFourthNibble->setValue( 1 ); - ui.spinIPFourthNibble->setEnabled ( false ); - } - else { - ui.spinIPFirstNibble->setEnabled ( true ); - ui.spinIPSecondNibble->setEnabled ( true ); - ui.spinIPThirdNibble->setEnabled ( true ); - ui.spinIPFourthNibble->setEnabled ( true ); - } - - settingsDirty = true; -} - -//END diff --git a/FaceTrackNoIR/FGServer.h b/FaceTrackNoIR/FGServer.h deleted file mode 100644 index 6efe2ba3..00000000 --- a/FaceTrackNoIR/FGServer.h +++ /dev/null @@ -1,106 +0,0 @@ -/******************************************************************************** -* 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) 2010 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 . * -* * -* FGServer FGServer is the Class, that communicates headpose-data * -* to FlightGear, using UDP. * -* It is based on the (Linux) example made by Melchior FRANZ. * -********************************************************************************/ -#pragma once -#ifndef INCLUDED_FGSERVER_H -#define INCLUDED_FGSERVER_H - -#include "FTNoIR_cxx_protocolserver.h" -#include "FGTypes.h" -#include -#include -#include -#include -#include -#include -//#include -#include -#include -#include - -using namespace std; -using namespace v4friend::ftnoir; - -#include "ui_FTNoIR_FGcontrols.h" - -class Tracker; // pre-define parent-class to avoid circular includes - -class FGServer : public ProtocolServerBase { - Q_OBJECT - -public: - - // public member methods - FGServer( Tracker *parent ); - ~FGServer(); - - // protected member methods -protected: - bool checkServerInstallationOK( HANDLE handle ); - void sendHeadposeToGame(); - -private: - Tracker *headTracker; // For upstream messages... - TFlightGearData TestData; - QUdpSocket *inSocket; // Receive from FligthGear - QUdpSocket *outSocket; // Send to FligthGear - qint32 cmd; - qint32 fg_cmd; // Command from FlightGear - QHostAddress destIP; // Destination IP-address - int destPort; // Destination port-number - void loadSettings(); -}; - -// Widget that has controls for FG server-settings. -class FGControls: public QWidget, public Ui::UICFGControls -{ - Q_OBJECT -public: - - explicit FGControls( QWidget *parent=0, Qt::WindowFlags f=0 ); - virtual ~FGControls(); - void showEvent ( QShowEvent * event ); - -private: - Ui::UICFGControls ui; - void loadSettings(); - void save(); - - /** helper **/ - bool settingsDirty; - -private slots: - void doOK(); - void doCancel(); - void chkLocalPCOnlyChanged(); - void settingChanged() { settingsDirty = true; }; -}; - - - -#endif//INCLUDED_FGSERVER_H -//END diff --git a/FaceTrackNoIR/FGTypes.h b/FaceTrackNoIR/FGTypes.h deleted file mode 100644 index 949dc213..00000000 --- a/FaceTrackNoIR/FGTypes.h +++ /dev/null @@ -1,28 +0,0 @@ -/******************************************************************************** -* 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) 2010 Wim Vriend (Developing) * -* Ron Hendriks (Researching and Testing) * -* * -* Homepage * -* * -* Type definitions for the FlightGear server. * -********************************************************************************/ -#pragma once -#ifndef INCLUDED_FGTYPES_H -#define INCLUDED_FGTYPES_H - -#include "Windows.h" - -// -// x,y,z position in metres, heading, pitch and roll in degrees... -// -#pragma pack(2) -struct TFlightGearData { - double x, y, z, h, p, r; - int status; -}; - -#endif//INCLUDED_FGTYPES_H diff --git a/FaceTrackNoIR/FTIRServer.cpp b/FaceTrackNoIR/FTIRServer.cpp deleted file mode 100644 index 7268d1dc..00000000 --- a/FaceTrackNoIR/FTIRServer.cpp +++ /dev/null @@ -1,481 +0,0 @@ -/******************************************************************************** -* FTIRServer FTIRServer is the Class, that communicates headpose-data * -* to games, using the NPClient.dll. * -* * -* Copyright (C) 2010 Wim Vriend (Developing) * -* Ron Hendriks (Testing and Research) * -* * -* 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 . * -* * -********************************************************************************/ -/* - Modifications (last one on top): - 20101224 - WVR: Base class is no longer inheriting QThread. sendHeadposeToGame - is called from run() of Tracker.cpp - 20101127 - WVR: Added TrackIR.exe process for EZCA etc... - 20101023 - WVR: Added TIRViews for FS2004, Combat FS3, etc... -*/ -#include "FTIRServer.h" - -/** constructor **/ -FTIRServer::FTIRServer() { - loadSettings(); - ProgramName = ""; - dummyTrackIR = 0; - viewsStart = 0; - viewsStop = 0; -} - -/** destructor **/ -FTIRServer::~FTIRServer() { - - // - // Destroy the File-mapping - // - FTIRDestroyMapping(); - - // - // Free the DLL's - // - FTIRClientLib.unload(); - if (viewsStop != NULL) { - viewsStop(); - FTIRViewsLib.unload(); - } - - // - // Kill the dummy TrackIR process. - // - qDebug() << "FTIRServer::~FTIRServer() about to kill TrackIR.exe process"; - try { - if (dummyTrackIR) { - dummyTrackIR->kill(); - } - } - catch (...) - { - qDebug() << "~FTIRServer says: some error occurred"; - } - -} - -/** destructor **/ -void FTIRServer::stopServer() { - - //// - //// Destroy the File-mapping - //// - //FTIRDestroyMapping(); - - //// - //// Free the DLL's - //// - //try { - // FTIRClientLib.unload(); - // if (useTIRViews && FTIRViewsLib.isLoaded()) { - // FTIRViewsLib.unload(); - // } - //} - //catch (...) - //{ - // qDebug() << "~FTIRServer says: some error occurred"; - //} - - //// - //// Kill the dummy TrackIR process. - //// - //qDebug() << "FTIRServer::~FTIRServer() about to kill TrackIR.exe process"; - //try { - // if (dummyTrackIR) { - // dummyTrackIR->kill(); - // } - //} - //catch (...) - // { - // qDebug() << "~FTIRServer says: some error occurred"; - //} - -} - -// -// Update Headpose in Game. -// -void FTIRServer::sendHeadposeToGame() { - - // - // Check if the pointer is OK and wait for the Mutex. - // Use the setposition in the (special) DLL, to write the headpose-data. - // - if ( (pMemData != NULL) && (WaitForSingleObject(hFTIRMutex, 100) == WAIT_OBJECT_0) ) { - setposition (virtPosX, virtPosY, virtPosZ, virtRotZ, virtRotX, virtRotY ); - ReleaseMutex(hFTIRMutex); - } -} - -// -// Create a memory-mapping to the TrackIR data. -// It contains the tracking data, a handle to the main-window and the program-name of the Game! -// -// -bool FTIRServer::FTIRCreateMapping( HANDLE handle ) -{ - qDebug() << "FTIRCreateMapping says: Starting Function"; - - // - // A FileMapping is used to create 'shared memory' between the FTIRServer and the FTClient. - // - // Try to create a FileMapping to the Shared Memory. - // If one already exists: close it. - // - hFTIRMemMap = CreateFileMappingA( INVALID_HANDLE_VALUE , 00 , PAGE_READWRITE , 0 , - sizeof( TRACKIRDATA ) + sizeof( HANDLE ) + 100, - (LPCSTR) FTIR_MM_DATA ); - - if ( hFTIRMemMap != 0 ) { - qDebug() << "FTIRCreateMapping says: FileMapping Created!" << hFTIRMemMap; - } - - if ( ( hFTIRMemMap != 0 ) && ( (long) GetLastError == ERROR_ALREADY_EXISTS ) ) { - CloseHandle( hFTIRMemMap ); - hFTIRMemMap = 0; - } - - // - // Create a new FileMapping, Read/Write access - // - hFTIRMemMap = OpenFileMappingA( FILE_MAP_ALL_ACCESS , false , (LPCSTR) FTIR_MM_DATA ); - if ( ( hFTIRMemMap != 0 ) ) { - qDebug() << "FTIRCreateMapping says: FileMapping Created again:" << hFTIRMemMap; - pMemData = (FTIRMemMap *) MapViewOfFile(hFTIRMemMap, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(TRACKIRDATA) + sizeof(hFTIRMemMap) + 100); - if (pMemData != NULL) { - pMemData->RegisteredHandle = handle; // The game uses the handle, to send a message that the Program-Name was set! - } - hFTIRMutex = CreateMutexA(NULL, false, FTIR_MUTEX); - } - else { - QMessageBox::information(0, "FaceTrackNoIR error", QString("FTIRServer Error! \n")); - return false; - } - - return true; -} - -// -// Destory the FileMapping to the shared memory -// -void FTIRServer::FTIRDestroyMapping() -{ - if ( pMemData != NULL ) { - UnmapViewOfFile ( pMemData ); - } - - if (hFTIRMutex != 0) { - CloseHandle( hFTIRMutex ); - } - hFTIRMutex = 0; - - if (hFTIRMemMap != 0) { - CloseHandle( hFTIRMemMap ); - } - hFTIRMemMap = 0; - -} - -// -// Get the program-name from the client (Game!). -// -QString FTIRServer::GetProgramName() { -QString *str; - - str = new QString("Test"); - return *str; -} - -// -// Check if the Client DLL exists and load it (to test it), if so. -// Returns 'true' if all seems OK. -// -bool FTIRServer::checkServerInstallationOK( HANDLE handle ) -{ - QSettings settings("NaturalPoint", "NATURALPOINT\\NPClient Location"); // Registry settings (in HK_USER) - QString aLocation; // Location of Client DLL - QString aFileName; // File Path and Name - - //importProvider provider; - //char *pProvider; - - qDebug() << "FTCheckClientDLL says: Starting Function"; - - try { - - // - // Load the NPClient.dll from the current path of FaceTrackNoIR, because there is no - // guarantee TrackIR or GlovePIE is also installed. - // - // Write this path in the registry (under NaturalPoint/NATURALPOINT, for the game(s). - // - aLocation = QCoreApplication::applicationDirPath() + "/"; - qDebug() << "FTCheckClientDLL says: Location of DLL =" << aLocation; - - // - // Append a '/' to the Path and then the name of the dll. - // - aFileName = aLocation; - aFileName.append(FTIR_CLIENT_FILENAME); - qDebug() << "FTCheckClientDLL says: Full path of DLL =" << aFileName; - - if ( QFile::exists( aFileName ) ) { - qDebug() << "FTCheckClientDLL says: DLL exists!"; - // - // Write the path to the key in the Registry, so the game(s) can find it too... - // - settings.setValue( "Path" , aLocation ); - - // - // Load the DLL and map to the functions in it. - // - FTIRClientLib.setFileName(aFileName); - FTIRClientLib.load(); - } - else { - QMessageBox::information(0, "FaceTrackNoIR error", QString("Necessary file (NPClient.dll) was NOT found!\n")); - return false; - } - - // - // Also load TIRViews.dll, to support some older games - // - if (useTIRViews) { - aFileName = aLocation; - aFileName.append(FTIR_VIEWS_FILENAME); - FTIRViewsLib.setFileName(aFileName); - FTIRViewsLib.load(); - } - - // - // Start TrackIR.exe, also to support some older games and EZCA - // Some TrackIR clients check if a process called TrackIR.exe is running. - // This should do the trick - // - QString program = "TrackIR.exe"; - dummyTrackIR = new QProcess(this); - dummyTrackIR->start(program); - - } catch(...) { - settings.~QSettings(); - } - - // - // Create the File-mapping for Inter Process Communication - // - if (!FTIRCreateMapping( handle )){ - return false; - } - - // - // Find the functions in the DLL's - // - // Get the setposition function from the DLL and use it! - // - setposition = (importSetPosition) FTIRClientLib.resolve("SetPosition"); - if (setposition == NULL) { - qDebug() << "FTIRServer::run() says: SetPosition function not found in DLL!"; - return false; - } - else { - setposition (7.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f); - } - - // - // Load the Start function from TIRViews.dll and call it, to start compatibility with older games - // - if (useTIRViews) { - viewsStart = (importTIRViewsStart) FTIRViewsLib.resolve("TIRViewsStart"); - if (viewsStart == NULL) { - qDebug() << "FTIRServer::run() says: TIRViewsStart function not found in DLL!"; - } - else { - qDebug() << "FTIRServer::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() << "FTIRServer::run() says: TIRViewsStop function not found in DLL!"; - } - } - return true; -} - -// -// Scale the measured value to the Joystick values -// -float FTIRServer::scale2AnalogLimits( float x, float min_x, float max_x ) { -double y; -double local_x; - - local_x = x; - if (local_x > max_x) { - local_x = max_x; - } - if (local_x < min_x) { - local_x = min_x; - } - y = ( NP_AXIS_MAX * local_x ) / max_x; - - return (float) y; -} - -// -// Load the current Settings from the currently 'active' INI-file. -// -void FTIRServer::loadSettings() { - - QSettings settings("Abbequerque Inc.", "FaceTrackNoIR"); // Registry settings (in HK_USER) - - QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/Settings/default.ini" ).toString(); - QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file) - - iniFile.beginGroup ( "FTIR" ); - useTIRViews = iniFile.value ( "useTIRViews", 0 ).toBool(); - iniFile.endGroup (); -} - -// -// Constructor for server-settings-dialog -// -FTIRControls::FTIRControls( QWidget *parent, Qt::WindowFlags f ) : -QWidget( parent , f) -{ - QString aFileName; // File Path and Name - - ui.setupUi( this ); - - QPoint offsetpos(100, 100); - this->move(parent->pos() + offsetpos); - - // Connect Qt signals to member-functions - connect(ui.btnOK, SIGNAL(clicked()), this, SLOT(doOK())); - connect(ui.btnCancel, SIGNAL(clicked()), this, SLOT(doCancel())); - connect(ui.chkTIRViews, SIGNAL(stateChanged(int)), this, SLOT(chkTIRViewsChanged())); - - aFileName = QCoreApplication::applicationDirPath() + "/"; - aFileName.append(FTIR_VIEWS_FILENAME); - if ( !QFile::exists( aFileName ) ) { - ui.chkTIRViews->setChecked( false ); - ui.chkTIRViews->setEnabled ( false ); - } - else { - ui.chkTIRViews->setEnabled ( true ); - } - - // Load the settings from the current .INI-file - loadSettings(); -} - -// -// Destructor for server-dialog -// -FTIRControls::~FTIRControls() { - qDebug() << "~FTIRControls() says: started"; -} - -// -// OK clicked on server-dialog -// -void FTIRControls::doOK() { - save(); - this->close(); -} - -// override show event -void FTIRControls::showEvent ( QShowEvent * event ) { - loadSettings(); -} - -// -// Cancel clicked on server-dialog -// -void FTIRControls::doCancel() { - // - // Ask if changed Settings should be saved - // - if (settingsDirty) { - int ret = QMessageBox::question ( this, "Settings have changed", "Do you want to save the settings?", QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Discard ); - - qDebug() << "doCancel says: answer =" << ret; - - switch (ret) { - case QMessageBox::Save: - save(); - this->close(); - break; - case QMessageBox::Discard: - this->close(); - break; - case QMessageBox::Cancel: - // Cancel was clicked - break; - default: - // should never be reached - break; - } - } - else { - this->close(); - } -} - -// -// Load the current Settings from the currently 'active' INI-file. -// -void FTIRControls::loadSettings() { - - qDebug() << "loadSettings says: Starting "; - QSettings settings("Abbequerque Inc.", "FaceTrackNoIR"); // Registry settings (in HK_USER) - - QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/Settings/default.ini" ).toString(); - QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file) - - qDebug() << "loadSettings says: iniFile = " << currentFile; - - iniFile.beginGroup ( "FTIR" ); - ui.chkTIRViews->setChecked (iniFile.value ( "useTIRViews", 0 ).toBool()); - iniFile.endGroup (); - - settingsDirty = false; - -} - -// -// Save the current Settings to the currently 'active' INI-file. -// -void FTIRControls::save() { - - QSettings settings("Abbequerque Inc.", "FaceTrackNoIR"); // Registry settings (in HK_USER) - - QString currentFile = settings.value ( "SettingsFile", QCoreApplication::applicationDirPath() + "/Settings/default.ini" ).toString(); - QSettings iniFile( currentFile, QSettings::IniFormat ); // Application settings (in INI-file) - - iniFile.beginGroup ( "FTIR" ); - iniFile.setValue ( "useTIRViews", ui.chkTIRViews->isChecked() ); - iniFile.endGroup (); - - settingsDirty = false; -} - -//END diff --git a/FaceTrackNoIR/FTIRServer.h b/FaceTrackNoIR/FTIRServer.h deleted file mode 100644 index 98bba55c..00000000 --- a/FaceTrackNoIR/FTIRServer.h +++ /dev/null @@ -1,121 +0,0 @@ -/******************************************************************************** -* FTIRServer FTIRServer is the Class, that communicates headpose-data * -* to games, using the NPClient.dll. * -* * -* Copyright (C) 2010 Wim Vriend (Developing) * -* Ron Hendriks (Testing and Research) * -* * -* 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 . * -* * -********************************************************************************/ -#pragma once -#ifndef INCLUDED_FTIRSERVER_H -#define INCLUDED_FTIRSERVER_H - -#include "FTNoIR_cxx_protocolserver.h" -#include "FTIRTypes.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef void (WINAPI *importSetPosition)(float x, float y, float z, float xRot, float yRot, float zRot); -typedef void (WINAPI *importTIRViewsStart)(void); -typedef void (WINAPI *importTIRViewsStop)(void); - -#include "ui_FTNoIR_FTIRcontrols.h" - -using namespace std; -using namespace v4friend::ftnoir; - -class FTIRServer : public ProtocolServerBase { - Q_OBJECT - -public: - - // public member methods - FTIRServer(); - ~FTIRServer(); - QString GetProgramName(); - - // protected member methods -protected: - bool checkServerInstallationOK( HANDLE handle ); - void sendHeadposeToGame(); - void stopServer(); - -private: - bool FTIRCreateMapping(HANDLE handle); - void FTIRDestroyMapping(); - - importSetPosition setposition; // Function inside NPClient.dll - importTIRViewsStart viewsStart; // Functions inside TIRViews.dll - importTIRViewsStop viewsStop; - - HANDLE hFTIRMemMap; - FTIRMemMap *pMemData; - HANDLE hFTIRMutex; - - // Private properties - QString ProgramName; - QLibrary FTIRClientLib; - QLibrary FTIRViewsLib; - QProcess *dummyTrackIR; - bool useTIRViews; - - float scale2AnalogLimits( float x, float min_x, float max_x ); - void loadSettings(); - -public: - void setVirtRotX(float rot) { virtRotX = scale2AnalogLimits (rot, -180.0f, 180.0f); } - void setVirtRotY(float rot) { virtRotY = scale2AnalogLimits (rot, -180.0f, 180.0f); } - void setVirtRotZ(float rot) { virtRotZ = scale2AnalogLimits (rot, -180.0f, 180.0f); } - - void setVirtPosX(float pos) { virtPosX = scale2AnalogLimits (pos * 10.0f, -500.0f, 500.0f); } - void setVirtPosY(float pos) { virtPosY = scale2AnalogLimits (pos * 10.0f, -500.0f, 500.0f); } - void setVirtPosZ(float pos) { virtPosZ = scale2AnalogLimits (pos * 10.0f, -500.0f, 500.0f); } -}; - -// Widget that has controls for FTIR server-settings. -class FTIRControls: public QWidget, public Ui::UICFTIRControls -{ - Q_OBJECT -public: - - explicit FTIRControls( QWidget *parent=0, Qt::WindowFlags f=0 ); - virtual ~FTIRControls(); - void showEvent ( QShowEvent * event ); - -private: - Ui::UICFTIRControls ui; - void loadSettings(); - void save(); - - /** helper **/ - bool settingsDirty; - -private slots: - void doOK(); - void doCancel(); - void chkTIRViewsChanged() { settingsDirty = true; }; -}; - - -#endif//INCLUDED_FTIRSERVER_H -//END diff --git a/FaceTrackNoIR/FTIRTypes.h b/FaceTrackNoIR/FTIRTypes.h deleted file mode 100644 index f238762c..00000000 --- a/FaceTrackNoIR/FTIRTypes.h +++ /dev/null @@ -1,183 +0,0 @@ -/******************************************************************************** -* FTIRTypes FTIRTypes contains the specific type definitions for the * -* Fake TrackIR protocol. * -* It was modelled after FTTypes.cpp. * -* * -* Copyright (C) 2010 Wim Vriend (Developing) * -* Ron Hendriks (Testing and Research) * -* * -* 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 . * -* * -********************************************************************************/ -#pragma once -#ifndef INCLUDED_FTIRTYPES_H -#define INCLUDED_FTIRTYPES_H - -#include "Windows.h" -#include -#include - -// -// Versioning hasn't been worked out yet... -// -// The following is the previous spec definition of versioning info -- I can probably do -// something very similar to this -- will keep you posted. -// -// request version information using 2 messages, they cannot be expected to arrive in a specific order - so always parse using the High byte -// the messages have a NPCONTROL byte in the first parameter, and the second parameter has packed bytes. -// Message 1) (first parameter)NPCONTROL : (second parameter) (High Byte)NPVERSIONMAJOR (Low Byte) major version number data -// Message 2) (first parameter)NPCONTROL : (second parameter) (High Byte)NPVERSIONMINOR (Low Byte) minor version number data - -#define NPQUERYVERSION 1040 - -// CONTROL DATA SUBFIELDS -#define NPVERSIONMAJOR 1 -#define NPVERSIONMINOR 2 - -// DATA FIELDS -#define NPControl 8 // indicates a control data field - // the second parameter of a message bearing control data information contains a packed data format. - // The High byte indicates what the data is, and the Low byte contains the actual data -// roll, pitch, yaw -#define NPRoll 1 // +/- 16383 (representing +/- 180) [data = input - 16383] -#define NPPitch 2 // +/- 16383 (representing +/- 180) [data = input - 16383] -#define NPYaw 4 // +/- 16383 (representing +/- 180) [data = input - 16383] - -// x, y, z - remaining 6dof coordinates -#define NPX 16 // +/- 16383 [data = input - 16383] -#define NPY 32 // +/- 16383 [data = input - 16383] -#define NPZ 64 // +/- 16383 [data = input - 16383] - -#define NP_AXIS_MIN -16383 -#define NP_AXIS_MAX 16383 - -// raw object position from imager -#define NPRawX 128 // 0..25600 (actual value is multiplied x 100 to pass two decimal places of precision) [data = input / 100] -#define NPRawY 256 // 0..25600 (actual value is multiplied x 100 to pass two decimal places of precision) [data = input / 100] -#define NPRawZ 512 // 0..25600 (actual value is multiplied x 100 to pass two decimal places of precision) [data = input / 100] - -// x, y, z deltas from raw imager position -#define NPDeltaX 1024 // +/- 2560 (actual value is multiplied x 10 to pass two decimal places of precision) [data = (input / 10) - 256] -#define NPDeltaY 2048 // +/- 2560 (actual value is multiplied x 10 to pass two decimal places of precision) [data = (input / 10) - 256] -#define NPDeltaZ 4096 // +/- 2560 (actual value is multiplied x 10 to pass two decimal places of precision) [data = (input / 10) - 256] - -// raw object position from imager -#define NPSmoothX 8192 // 0..32766 (actual value is multiplied x 10 to pass one decimal place of precision) [data = input / 10] -#define NPSmoothY 16384 // 0..32766 (actual value is multiplied x 10 to pass one decimal place of precision) [data = input / 10] -#define NPSmoothZ 32768 // 0..32766 (actual value is multiplied x 10 to pass one decimal place of precision) [data = input / 10] - -// NPESULT values are returned from the Game Client API functions. -// -typedef enum tagNPResult -{ - NP_OK = 0, - NP_ERR_DEVICE_NOT_PRESENT, - NP_ERR_UNSUPPORTED_OS, - NP_ERR_INVALID_ARG, - NP_ERR_DLL_NOT_FOUND, - NP_ERR_NO_DATA, - NP_ERR_INTERNAL_DATA -} NPRESULT; - - static const char* FTIR_CLIENT_FILENAME = "NPClient.dll"; - static const char* FTIR_VIEWS_FILENAME = "TIRViews.dll"; - static const char* FTIR_MM_DATA = "{0F98177E-0E5C-4F86-8837-229D19B1701D}"; - static const char* FTIR_MUTEX = "FT_TIR_Mutex"; - static const char* FTIR_REGISTER_PROGRAMHANDLE = "FT_Register_Program_Handle"; - static const char* FTIR_UNREGISTER_PROGRAMHANDLE = "FT_UnRegister_Program_Handle"; - -typedef struct tagTrackIRData -{ - unsigned short wNPStatus; - unsigned short wPFrameSignature; - unsigned long dwNPIOData; - - float fNPRoll; - float fNPPitch; - float fNPYaw; - float fNPX; - float fNPY; - float fNPZ; - float fNPRawX; - float fNPRawY; - float fNPRawZ; - float fNPDeltaX; - float fNPDeltaY; - float fNPDeltaZ; - float fNPSmoothX; - float fNPSmoothY; - float fNPSmoothZ; -} TRACKIRDATA, *LPTRACKIRDATA; - -struct FTIRMemMap { - // Emulators can check this - int iRecordSize; - TRACKIRDATA data; - int Version; - // Emulators should read these - HANDLE RegisteredHandle; - bool Transmission, Cursor; - long int RequestFormat; - long int ProgramProfileID; - // Read/Write - int LastError; - int Param[16]; - unsigned short ClientNotify1, ClientNotify2; - char Signature[400]; -}; -typedef FTIRMemMap * PFTIRMemMap; - -// -// Typedef for pointer to the notify callback function that is implemented within -// the client -- this function receives head tester reports from the game client API -// -typedef NPRESULT (__stdcall *PF_NOTIFYCALLBACK)( unsigned short, unsigned short ); -// -//// Typedefs for game client API functions (useful for declaring pointers to these -//// functions within the client for use during GetProcAddress() ops) -//// -//typedef NPRESULT (__stdcall *PF_NP_REGISTERWINDOWHANDLE)( HWND ); -//typedef NPRESULT (__stdcall *PF_NP_UNREGISTERWINDOWHANDLE)( void ); -//typedef NPRESULT (__stdcall *PF_NP_REGISTERPROGRAMPROFILEID)( unsigned short ); -//typedef NPRESULT (__stdcall *PF_NP_QUERYVERSION)( unsigned short* ); -//typedef NPRESULT (__stdcall *PF_NP_REQUESTDATA)( unsigned short ); -//typedef NPRESULT (__stdcall *PF_NP_GETDATA)( LPTRACKIRDATA ); -//typedef NPRESULT (__stdcall *PF_NP_REGISTERNOTIFY)( PF_NOTIFYCALLBACK ); -//typedef NPRESULT (__stdcall *PF_NP_UNREGISTERNOTIFY)( void ); -//typedef NPRESULT (__stdcall *PF_NP_STARTCURSOR)( void ); -//typedef NPRESULT (__stdcall *PF_NP_STOPCURSOR)( void ); -//typedef NPRESULT (__stdcall *PF_NP_STARTDATATRANSMISSION)( void ); -//typedef NPRESULT (__stdcall *PF_NP_STOPDATATRANSMISSION)( void ); - -//// Function Prototypes /////////////////////////////////////////////// -// -// Functions exported from game client API DLL ( note __stdcall calling convention -// is used for ease of interface to clients of differing implementations including -// C, C++, Pascal (Delphi) and VB. ) -// -//NPRESULT __stdcall NP_RegisterWindowHandle( HWND hWnd ); -//NPRESULT __stdcall NP_RegisterWindowHandle( HWND ); -//NPRESULT __stdcall NP_UnregisterWindowHandle( void ); -//NPRESULT __stdcall NP_RegisterProgramProfileID( unsigned short wPPID ); -//NPRESULT __stdcall NP_QueryVersion( unsigned short* pwVersion ); -//NPRESULT __stdcall NP_RequestData( unsigned short wDataReq ); -//NPRESULT __stdcall NP_GetData( LPTRACKIRDATA pTID ); -//NPRESULT __stdcall NP_RegisterNotify( PF_NOTIFYCALLBACK pfNotify ); -//NPRESULT __stdcall NP_UnregisterNotify( void ); -//NPRESULT __stdcall NP_StartCursor( void ); -//NPRESULT __stdcall NP_StopCursor( void ); -//NPRESULT __stdcall NP_StartDataTransmission( void ); -//NPRESULT __stdcall NP_StopDataTransmission( void ); - -#endif//INCLUDED_FTIRTYPES_H diff --git a/FaceTrackNoIR/FTNoIR_FGcontrols.ui b/FaceTrackNoIR/FTNoIR_FGcontrols.ui deleted file mode 100644 index c5f81c29..00000000 --- a/FaceTrackNoIR/FTNoIR_FGcontrols.ui +++ /dev/null @@ -1,279 +0,0 @@ - - - UICFGControls - - - - 0 - 0 - 411 - 194 - - - - FlightGear settings FaceTrackNoIR - - - - images/FaceTrackNoIR.icoimages/FaceTrackNoIR.ico - - - Qt::LeftToRight - - - false - - - - - - - - - 60 - 16777215 - - - - 255 - - - 1 - - - - - - - - 60 - 16777215 - - - - 255 - - - 1 - - - - - - - - 60 - 16777215 - - - - 255 - - - 1 - - - - - - - - 60 - 16777215 - - - - 255 - - - 1 - - - - - - - IP-address remote PC - - - - - - - Qt::RightToLeft - - - Local PC only - - - - - - - Port-number - - - - - - - 5550 - - - 10000 - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - If FlightGear is on the same PC as FaceTrackNoIR, tick the 'Local PC only' box. - - - - - - - Otherwise: enter IP-address and port-number for the remote PC. - - - true - - - - - - - Remember: you may have to change firewall-settings too! - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - QLayout::SetDefaultConstraint - - - - - - 0 - 0 - - - - - 100 - 0 - - - - - 100 - 16777215 - - - - OK - - - - - - - - 0 - 0 - - - - - 100 - 0 - - - - - 100 - 16777215 - - - - Cancel - - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - - - spinIPFirstNibble - spinIPSecondNibble - spinIPThirdNibble - spinIPFourthNibble - spinPortNumber - btnOK - btnCancel - chkLocalPC - - - - - startEngineClicked() - stopEngineClicked() - cameraSettingsClicked() - - diff --git a/FaceTrackNoIR/FTNoIR_FTIRcontrols.ui b/FaceTrackNoIR/FTNoIR_FTIRcontrols.ui deleted file mode 100644 index a2d06d2a..00000000 --- a/FaceTrackNoIR/FTNoIR_FTIRcontrols.ui +++ /dev/null @@ -1,194 +0,0 @@ - - - UICFTIRControls - - - - 0 - 0 - 411 - 157 - - - - FTIR settings FaceTrackNoIR - - - - images/FaceTrackNoIR.icoimages/FaceTrackNoIR.ico - - - Qt::LeftToRight - - - false - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::RightToLeft - - - Use TIRViews - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - TIRViews is only required for some older games (like CFS3). - - - - - - - For it to work, TIRViews.dll must be placed in the FaceTrackNoIR program folder. - - - true - - - - - - - If the checkbox is disabled, the DLL was not found. - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - QLayout::SetDefaultConstraint - - - - - - 0 - 0 - - - - - 100 - 0 - - - - - 100 - 16777215 - - - - OK - - - - - - - - 0 - 0 - - - - - 100 - 0 - - - - - 100 - 16777215 - - - - Cancel - - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - - - - - startEngineClicked() - stopEngineClicked() - cameraSettingsClicked() - - diff --git a/FaceTrackNoIR/FaceApp.cpp b/FaceTrackNoIR/FaceApp.cpp index 231a07c9..5998ebcf 100644 --- a/FaceTrackNoIR/FaceApp.cpp +++ b/FaceTrackNoIR/FaceApp.cpp @@ -1,7 +1,7 @@ #include "FaceApp.h" #include "windows.h" #include "FTTypes.h" -#include "FTIRTypes.h" +#include "..\FTNoIR_Protocol_FTIR\FTIRTypes.h" #include // diff --git a/FaceTrackNoIR/FaceTrackNoIR.cpp b/FaceTrackNoIR/FaceTrackNoIR.cpp index d2373824..03f819de 100644 --- a/FaceTrackNoIR/FaceTrackNoIR.cpp +++ b/FaceTrackNoIR/FaceTrackNoIR.cpp @@ -23,6 +23,7 @@ *********************************************************************************/ /* Modifications (last one on top): + 20110404 - WVR: Migrated the FlightGear protocol to a separate DLL. The rest must follow... 20110401 - WVR: The about-dialog was shown 'misplaced'. It was corrected. 20110328 - WVR: Added the display for output-pose. 20110207 - WVR: RadioButtons for 'Stop engine' added. It is now possible to choose Stop or Keep tracking. @@ -32,8 +33,8 @@ #include "tracker.h" #include "PPJoyServer.h" #include "FSUIPCServer.h" -#include "FTIRServer.h" -#include "FGServer.h" +//#include "FTIRServer.h" +//#include "FGServer.h" #include "FTNServer.h" @@ -813,6 +814,8 @@ QLibrary *trackerLib; /** toggles Server Controls Dialog **/ void FaceTrackNoIR::showServerControls() { +importGetProtocolDialog getIT; +QLibrary *protocolLib; // @@ -839,11 +842,47 @@ void FaceTrackNoIR::showServerControls() { _server_controls = new FSUIPCControls( this, Qt::Dialog ); break; case TRACKIR: - _server_controls = new FTIRControls( this, Qt::Dialog ); + protocolLib = new QLibrary("FTNoIR_Protocol_FTIR.dll"); + + getIT = (importGetProtocolDialog) protocolLib->resolve("GetProtocolDialog"); + if (getIT) { + IProtocolDialogPtr ptrXyz(getIT()); + if (ptrXyz) + { + pProtocolDialog = ptrXyz; + pProtocolDialog->Initialize( this ); + qDebug() << "FaceTrackNoIR::showServerControls GetProtocolDialog Function Resolved!"; + } + else { + qDebug() << "FaceTrackNoIR::showServerControls Function NOT Resolved!"; + } + } + else { + QMessageBox::warning(0,"FaceTrackNoIR Error", "DLL not loaded",QMessageBox::Ok,QMessageBox::NoButton); + } break; + case FLIGHTGEAR: - _server_controls = new FGControls( this, Qt::Dialog ); + protocolLib = new QLibrary("FTNoIR_Protocol_FG.dll"); + + getIT = (importGetProtocolDialog) protocolLib->resolve("GetProtocolDialog"); + if (getIT) { + IProtocolDialogPtr ptrXyz(getIT()); + if (ptrXyz) + { + pProtocolDialog = ptrXyz; + pProtocolDialog->Initialize( this ); + qDebug() << "FaceTrackNoIR::showServerControls GetProtocolDialog Function Resolved!"; + } + else { + qDebug() << "FaceTrackNoIR::showServerControls Function NOT Resolved!"; + } + } + else { + QMessageBox::warning(0,"FaceTrackNoIR Error", "DLL not loaded",QMessageBox::Ok,QMessageBox::NoButton); + } break; + case FTNOIR: _server_controls = new FTNServerControls( this, Qt::Dialog ); break; diff --git a/FaceTrackNoIR/FaceTrackNoIR.h b/FaceTrackNoIR/FaceTrackNoIR.h index 68c9a744..cd9c925b 100644 --- a/FaceTrackNoIR/FaceTrackNoIR.h +++ b/FaceTrackNoIR/FaceTrackNoIR.h @@ -42,7 +42,9 @@ #include "ui_FTNoIR_Preferences.h" #include "ui_FTNoIR_Curves.h" -#include "FTNoIR_Tracker_UDP.h" +// +#include "..\ftnoir_protocol_base\FTNoIR_Protocol_base.h" +#include "..\ftnoir_tracker_base\FTNoIR_Tracker_base.h" #include "AutoClosePtr.h" // 1a. COM-Like usage with smart pointer. @@ -50,14 +52,12 @@ // be released automatically in destructor of the smart pointer. typedef AutoClosePtr ITrackerDialogPtr; typedef ITrackerDialog *(WINAPI *importGetTrackerDialog)(void); +typedef AutoClosePtr IProtocolDialogPtr; +typedef IProtocolDialog *(WINAPI *importGetProtocolDialog)(void); -//#include #include -//using namespace sm::faceapi; -//using namespace sm::faceapi::qt; - class Tracker; // pre-define class to avoid circular includes void getCurvePoints(QSettings *iniFile, QString prefix, QPointF *one, QPointF *two, QPointF *three, QPointF *four, @@ -84,6 +84,7 @@ private: QStringList iniFileList; // List of INI-files, that are present in the Settings folder ITrackerDialogPtr pTrackerDialog; // Pointer to Tracker dialog instance (in DLL) + IProtocolDialogPtr pProtocolDialog; // Pointer to Protocol dialog instance (in DLL) /** Widget variables **/ QVBoxLayout *l; diff --git a/FaceTrackNoIR/FaceTrackNoIR.vcproj b/FaceTrackNoIR/FaceTrackNoIR.vcproj index 10d2f8c7..c16635b9 100644 --- a/FaceTrackNoIR/FaceTrackNoIR.vcproj +++ b/FaceTrackNoIR/FaceTrackNoIR.vcproj @@ -211,18 +211,10 @@ RelativePath=".\FaceTrackNoIR.cpp" > - - - - @@ -335,36 +327,6 @@ /> - - - - - - - - - - @@ -391,36 +353,6 @@ /> - - - - - - - - - - @@ -673,32 +605,6 @@ /> - - - - - - - - @@ -725,32 +631,6 @@ /> - - - - - - - - @@ -930,18 +810,10 @@ RelativePath=".\GeneratedFiles\ui_FTNoIR_Curves.h" > - - - - @@ -999,18 +871,6 @@ /> - - - - - @@ -1023,18 +883,6 @@ /> - - - - - @@ -1172,18 +1020,6 @@ /> - - - - - @@ -1207,18 +1043,6 @@ /> - - - - - diff --git a/FaceTrackNoIR/tracker.cpp b/FaceTrackNoIR/tracker.cpp index cb881201..46b26237 100644 --- a/FaceTrackNoIR/tracker.cpp +++ b/FaceTrackNoIR/tracker.cpp @@ -188,8 +188,7 @@ QFrame *video_frame; case FLIGHTGEAR: server_Game = QSharedPointer(new FTServer ( )); // Create Free-track protocol-server -// server_Game = QSharedPointer(new FGServer ( this )); // Create FlightGear protocol-server -// server_Game = NULL; + // // Load the DLL with the protocol-logic and retrieve a pointer to the Protocol-class. // @@ -220,7 +219,27 @@ QFrame *video_frame; break; case TRACKIR: - server_Game = QSharedPointer(new FTIRServer ( )); // Create Fake-TIR protocol-server + server_Game = QSharedPointer(new FTServer ( )); // Create Free-track protocol-server + + // + // Load the DLL with the protocol-logic and retrieve a pointer to the Protocol-class. + // + protocolLib = new QLibrary("FTNoIR_Protocol_FTIR.dll"); + + getProtocol = (importGetProtocol) protocolLib->resolve("GetProtocol"); + if (getProtocol) { + IProtocolPtr ptrXyz(getProtocol()); + if (ptrXyz) + { + pProtocol = ptrXyz; + pProtocol->Initialize(); + qDebug() << "Protocol::setup Function Resolved!"; + } + } + else { + QMessageBox::warning(0,"FaceTrackNoIR Error", "Protocol-DLL not loaded",QMessageBox::Ok,QMessageBox::NoButton); + return; + } break; case SIMCONNECT: diff --git a/FaceTrackNoIR/tracker.h b/FaceTrackNoIR/tracker.h index 1ffed69c..c5921e85 100644 --- a/FaceTrackNoIR/tracker.h +++ b/FaceTrackNoIR/tracker.h @@ -36,9 +36,9 @@ #include #include "FTServer.h" // Freetrack-server -#include "FGServer.h" // FlightGear-server +//#include "FGServer.h" // FlightGear-server #include "PPJoyServer.h" // Virtual Joystick -#include "FTIRServer.h" // FakeTIR-server +//#include "FTIRServer.h" // FakeTIR-server #include "SCServer.h" // SimConnect-server (for MS Flight Simulator X) #include "FSUIPCServer.h" // FSUIPC-server (for MS Flight Simulator 2004) #include "ExcelServer.h" // Excel-server (for analysing purposes) diff --git a/bin/FaceTrackNoIR.exe b/bin/FaceTrackNoIR.exe index 60dbfc51..c897bb93 100644 Binary files a/bin/FaceTrackNoIR.exe and b/bin/FaceTrackNoIR.exe differ diff --git a/bin/Settings/Wings of Prey.ini b/bin/Settings/Wings of Prey.ini index 57b16b37..ea06bfa8 100644 --- a/bin/Settings/Wings of Prey.ini +++ b/bin/Settings/Wings of Prey.ini @@ -76,7 +76,7 @@ Z_point3=@Variant(\0\0\0\x1a@L\x80\0\0\0\0\0@A\0\0\0\0\0\0) Z_point4=@Variant(\0\0\0\x1a@V\0\0\0\0\0\0@I\0\0\0\0\0\0) [FTIR] -useTIRViews=false +useTIRViews=true [TrackerSource] Selection=0 -- cgit v1.2.3