diff options
| author | Stanislaw Halik <sthalik@misaki.pl> | 2013-04-02 18:59:43 +0200 | 
|---|---|---|
| committer | Stanislaw Halik <sthalik@misaki.pl> | 2013-04-02 18:59:43 +0200 | 
| commit | 2719be277dd4a1288c8b99b1ed2cfc94de333763 (patch) | |
| tree | 93394f1086709e98f9616daea2a6106cb104f1b9 | |
| parent | 48687373a2ba586878a4fa08cd6d7f5112f48d81 (diff) | |
Add Wim's version, it's better
| -rw-r--r-- | ftnoir_protocol_ft/ftnoir_ftcontrols.ui | 302 | ||||
| -rw-r--r-- | ftnoir_protocol_ft/ftnoir_protocol_ft.cpp | 321 | ||||
| -rw-r--r-- | ftnoir_protocol_ft/ftnoir_protocol_ft.h | 42 | ||||
| -rw-r--r-- | ftnoir_protocol_ft/fttypes.h | 33 | 
4 files changed, 591 insertions, 107 deletions
| diff --git a/ftnoir_protocol_ft/ftnoir_ftcontrols.ui b/ftnoir_protocol_ft/ftnoir_ftcontrols.ui index 34873c76..fc5abbcf 100644 --- a/ftnoir_protocol_ft/ftnoir_ftcontrols.ui +++ b/ftnoir_protocol_ft/ftnoir_ftcontrols.ui @@ -6,16 +6,22 @@     <rect>
      <x>0</x>
      <y>0</y>
 -    <width>411</width>
 -    <height>112</height>
 +    <width>645</width>
 +    <height>416</height>
     </rect>
    </property>
 +  <property name="minimumSize">
 +   <size>
 +    <width>645</width>
 +    <height>0</height>
 +   </size>
 +  </property>
    <property name="windowTitle">
 -   <string>FreeTrack settings FaceTrackNoIR</string>
 +   <string>FreeTrack 2.0 settings FaceTrackNoIR</string>
    </property>
    <property name="windowIcon">
     <iconset>
 -    <normaloff>images/freetrack.png</normaloff>images/freetrack.png</iconset>
 +    <normaloff>images/FaceTrackNoIR.ico</normaloff>images/FaceTrackNoIR.ico</iconset>
    </property>
    <property name="layoutDirection">
     <enum>Qt::LeftToRight</enum>
 @@ -25,7 +31,282 @@    </property>
    <layout class="QVBoxLayout" name="_vertical_layout">
     <item>
 -    <layout class="QHBoxLayout">
 +    <layout class="QVBoxLayout" name="verticalLayout_2">
 +     <item>
 +      <widget class="QGroupBox" name="groupBox">
 +       <property name="minimumSize">
 +        <size>
 +         <width>0</width>
 +         <height>70</height>
 +        </size>
 +       </property>
 +       <property name="title">
 +        <string>TIRViews</string>
 +       </property>
 +       <widget class="QCheckBox" name="chkTIRViews">
 +        <property name="geometry">
 +         <rect>
 +          <x>80</x>
 +          <y>30</y>
 +          <width>88</width>
 +          <height>17</height>
 +         </rect>
 +        </property>
 +        <property name="layoutDirection">
 +         <enum>Qt::RightToLeft</enum>
 +        </property>
 +        <property name="text">
 +         <string>Use TIRViews</string>
 +        </property>
 +       </widget>
 +       <widget class="QLabel" name="label_4">
 +        <property name="geometry">
 +         <rect>
 +          <x>189</x>
 +          <y>10</y>
 +          <width>421</width>
 +          <height>16</height>
 +         </rect>
 +        </property>
 +        <property name="text">
 +         <string>TIRViews is only required for some older games (like CFS3). For it to work, TIRViews.dll</string>
 +        </property>
 +       </widget>
 +       <widget class="QLabel" name="label_5">
 +        <property name="geometry">
 +         <rect>
 +          <x>189</x>
 +          <y>30</y>
 +          <width>421</width>
 +          <height>16</height>
 +         </rect>
 +        </property>
 +        <property name="text">
 +         <string>must be placed in the FaceTrackNoIR program folder. If the checkbox is disabled, the</string>
 +        </property>
 +        <property name="wordWrap">
 +         <bool>true</bool>
 +        </property>
 +       </widget>
 +       <widget class="QLabel" name="label_6">
 +        <property name="geometry">
 +         <rect>
 +          <x>189</x>
 +          <y>50</y>
 +          <width>411</width>
 +          <height>16</height>
 +         </rect>
 +        </property>
 +        <property name="text">
 +         <string>the DLL was not found. You can get it from NaturalPoint.</string>
 +        </property>
 +       </widget>
 +      </widget>
 +     </item>
 +     <item>
 +      <widget class="QGroupBox" name="groupBox_2">
 +       <property name="minimumSize">
 +        <size>
 +         <width>0</width>
 +         <height>70</height>
 +        </size>
 +       </property>
 +       <property name="title">
 +        <string>TrackIR.exe</string>
 +       </property>
 +       <widget class="QCheckBox" name="chkStartDummy">
 +        <property name="geometry">
 +         <rect>
 +          <x>20</x>
 +          <y>30</y>
 +          <width>145</width>
 +          <height>17</height>
 +         </rect>
 +        </property>
 +        <property name="layoutDirection">
 +         <enum>Qt::RightToLeft</enum>
 +        </property>
 +        <property name="text">
 +         <string>Start dummy TrackIR.exe</string>
 +        </property>
 +       </widget>
 +       <widget class="QLabel" name="label_3">
 +        <property name="geometry">
 +         <rect>
 +          <x>189</x>
 +          <y>10</y>
 +          <width>351</width>
 +          <height>16</height>
 +         </rect>
 +        </property>
 +        <property name="text">
 +         <string>Some programs check, to see if a process called TrackIR.exe is running,</string>
 +        </property>
 +       </widget>
 +       <widget class="QLabel" name="label">
 +        <property name="geometry">
 +         <rect>
 +          <x>189</x>
 +          <y>30</y>
 +          <width>261</width>
 +          <height>16</height>
 +         </rect>
 +        </property>
 +        <property name="text">
 +         <string>before enabling head-tracking (EZCA is one of them).</string>
 +        </property>
 +        <property name="wordWrap">
 +         <bool>true</bool>
 +        </property>
 +       </widget>
 +       <widget class="QLabel" name="label_7">
 +        <property name="geometry">
 +         <rect>
 +          <x>189</x>
 +          <y>50</y>
 +          <width>231</width>
 +          <height>16</height>
 +         </rect>
 +        </property>
 +        <property name="text">
 +         <string>Check the checkbox, to overcome this problem.</string>
 +        </property>
 +       </widget>
 +      </widget>
 +     </item>
 +     <item>
 +      <widget class="QGroupBox" name="groupBox_3">
 +       <property name="minimumSize">
 +        <size>
 +         <width>0</width>
 +         <height>70</height>
 +        </size>
 +       </property>
 +       <property name="title">
 +        <string>Select interface</string>
 +       </property>
 +       <widget class="QLabel" name="label_8">
 +        <property name="geometry">
 +         <rect>
 +          <x>189</x>
 +          <y>10</y>
 +          <width>351</width>
 +          <height>16</height>
 +         </rect>
 +        </property>
 +        <property name="text">
 +         <string>Some games support both FreeTrack and TrackIR and may get confused,</string>
 +        </property>
 +       </widget>
 +       <widget class="QLabel" name="label_2">
 +        <property name="geometry">
 +         <rect>
 +          <x>189</x>
 +          <y>30</y>
 +          <width>261</width>
 +          <height>16</height>
 +         </rect>
 +        </property>
 +        <property name="text">
 +         <string>when both interfaces are visible.</string>
 +        </property>
 +        <property name="wordWrap">
 +         <bool>true</bool>
 +        </property>
 +       </widget>
 +       <widget class="QLabel" name="label_9">
 +        <property name="geometry">
 +         <rect>
 +          <x>189</x>
 +          <y>50</y>
 +          <width>381</width>
 +          <height>16</height>
 +         </rect>
 +        </property>
 +        <property name="text">
 +         <string>Try to disable one interface, if you experience problems.</string>
 +        </property>
 +       </widget>
 +       <widget class="QComboBox" name="cbxSelectInterface">
 +        <property name="geometry">
 +         <rect>
 +          <x>6</x>
 +          <y>30</y>
 +          <width>168</width>
 +          <height>22</height>
 +         </rect>
 +        </property>
 +       </widget>
 +      </widget>
 +     </item>
 +     <item>
 +      <widget class="QGroupBox" name="groupBox_4">
 +       <property name="minimumSize">
 +        <size>
 +         <width>0</width>
 +         <height>70</height>
 +        </size>
 +       </property>
 +       <property name="title">
 +        <string>Repair NPClient location</string>
 +       </property>
 +       <widget class="QLabel" name="label_10">
 +        <property name="geometry">
 +         <rect>
 +          <x>188</x>
 +          <y>10</y>
 +          <width>381</width>
 +          <height>20</height>
 +         </rect>
 +        </property>
 +        <property name="text">
 +         <string>Users who use other software with an NPClient DLL (like TrackIR, FreeTrack or </string>
 +        </property>
 +       </widget>
 +       <widget class="QLabel" name="label_11">
 +        <property name="geometry">
 +         <rect>
 +          <x>184</x>
 +          <y>30</y>
 +          <width>411</width>
 +          <height>20</height>
 +         </rect>
 +        </property>
 +        <property name="text">
 +         <string> GlovePIE) may need to repair the location of the DLL, after running FaceTrackNoIR.</string>
 +        </property>
 +        <property name="wordWrap">
 +         <bool>true</bool>
 +        </property>
 +       </widget>
 +       <widget class="QLabel" name="label_12">
 +        <property name="geometry">
 +         <rect>
 +          <x>187</x>
 +          <y>50</y>
 +          <width>391</width>
 +          <height>20</height>
 +         </rect>
 +        </property>
 +        <property name="text">
 +         <string>Use this button to locate the desired NPClient DLL.</string>
 +        </property>
 +       </widget>
 +       <widget class="QPushButton" name="bntLocateNPClient">
 +        <property name="geometry">
 +         <rect>
 +          <x>4</x>
 +          <y>30</y>
 +          <width>171</width>
 +          <height>23</height>
 +         </rect>
 +        </property>
 +        <property name="text">
 +         <string>Locate DLL</string>
 +        </property>
 +       </widget>
 +      </widget>
 +     </item>
       <item>
        <spacer name="horizontalSpacer_3">
         <property name="orientation">
 @@ -55,17 +336,6 @@      </spacer>
     </item>
     <item>
 -    <layout class="QVBoxLayout" name="verticalLayout">
 -     <item>
 -      <widget class="QLabel" name="label_2">
 -       <property name="text">
 -        <string>There are no settings necessary for the FreeTrack protocol.</string>
 -       </property>
 -      </widget>
 -     </item>
 -    </layout>
 -   </item>
 -   <item>
      <layout class="QHBoxLayout" name="horizontalLayout">
       <item>
        <spacer name="horizontalSpacer_2">
 diff --git a/ftnoir_protocol_ft/ftnoir_protocol_ft.cpp b/ftnoir_protocol_ft/ftnoir_protocol_ft.cpp index 1482d76c..b8461993 100644 --- a/ftnoir_protocol_ft/ftnoir_protocol_ft.cpp +++ b/ftnoir_protocol_ft/ftnoir_protocol_ft.cpp @@ -3,7 +3,7 @@  *					gamers from Holland, who don't like to pay much for			*
  *					head-tracking.												*
  *																				*
 -* Copyright (C) 2010	Wim Vriend (Developing)									*
 +* Copyright (C) 2013	Wim Vriend (Developing)									*
  *						Ron Hendriks (Researching and Testing)					*
  *																				*
  * Homepage																		*
 @@ -26,6 +26,10 @@  ********************************************************************************/
  /*
  	Modifications (last one on top):
 +	20130209 - WVR: Some games support both interfaces and cause trouble. Added ComboBox to fix this (hide one interface 
 +					by clearing the appropriate Registry-setting).
 +	20130203 - WVR: Added Tirviews and dummy checkboxes to the Settings dialog. This is necessary for CFS3 etc.
 +	20130125 - WVR: Upgraded to FT2.0: now the FreeTrack protocol supports all TIR-enabled games.
  	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
 @@ -35,48 +39,154 @@  					Now it works direcly in shared memory!
  */
  #include "ftnoir_protocol_ft.h"
 -#include "facetracknoir/global-settings.h"
 +#include "csv.h"
  /** constructor **/
  FTNoIR_Protocol::FTNoIR_Protocol()
  {
  	comhandle = 0;
 +	useTIRViews	= false;
 +	useDummyExe	= false;
 +	intUsedInterface = 0;
 +
 +	//
 +	// Load the INI-settings.
 +	//
  	loadSettings();
 +
  	ProgramName = "";
 +	intGameID = 0;
 +
 +	dummyTrackIR = 0;
 +	viewsStart = 0;
 +	viewsStop = 0;
 +
  }
  /** destructor **/
  FTNoIR_Protocol::~FTNoIR_Protocol()
  {
 +
 +	qDebug()<< "~FTNoIR_Protocol: Destructor started.";
 +
  	//
 -	// Destroy the File-mapping
 +	// Stop if started
  	//
 -	FTDestroyMapping();
 +	if (viewsStop != NULL) {
 +		qDebug()<< "~FTNoIR_Protocol: Stopping TIRViews.";
 +		viewsStop();
 +		FTIRViewsLib.unload();
 +	}
  	//
 -	// Free the DLL's
 +	// Kill the dummy TrackIR process.
  	//
 -	//////FTClientLib.unload();
 -}
 +	qDebug() << "~FTNoIR_Protocol() about to kill TrackIR.exe process";
 +	try {
 +		if (dummyTrackIR) {
 +			qDebug() << "FTServer::~FTServer() about to kill TrackIR.exe process";
 +//			dummyTrackIR->close();
 +			dummyTrackIR->kill();
 +		}
 +	} 
 +	catch (...)
 +    {
 +		qDebug() << "~FTServer says: some error occurred";
 +	}
 -/** helper to Auto-destruct **/
 -void FTNoIR_Protocol::Release()
 -{
 -    delete this;
 +	//
 +	// Destroy the File-mapping
 +	//
 +	FTDestroyMapping();
  }
  void FTNoIR_Protocol::Initialize()
  {
 -	QSettings settings("NaturalPoint", "NATURALPOINT\\NPClient Location"); 
 -	QString aLocation =  QCoreApplication::applicationDirPath() + "/";
 -	if (QFile::exists( aLocation + "/npclient.dll" ))
 -		settings.setValue( "Path" , aLocation );
 +	return;
 +}
 +
 +//
 +// Read the game-data from CSV
 +//
 +bool FTNoIR_Protocol::getGameData( QString gameID ){
 +QStringList gameLine;
 +
 +	qDebug() << "getGameData, ID = " << gameID;
 +
 +	//
 +	// Open the supported games list, to get the Name.
 +	//
 +	QFile file(QCoreApplication::applicationDirPath() + "/Settings/FaceTrackNoIR Supported Games.csv");
 +	if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){
 +		QString strError( "Cannot load file: FaceTrackNoIR Supported Games.csv" );
 +		sprintf_s(pMemData->ProgramName, 99, strError.toAscii());
 +		sprintf_s(pMemData->FTNVERSION, 9, "V160");
 +
 +		//
 +		// Return true anyway, because maybe it's V160 compatible.
 +		//
 +		return true;
 +	}
 +	CSV csv(&file);
 +	gameLine = csv.parseLine();
 +	
 +	while (gameLine.count() > 2) {
 +		//qDebug() << "Column 0: " << gameLine.at(0);		// No.
 +		//qDebug() << "Column 1: " << gameLine.at(1);		// Game Name
 +		//qDebug() << "Column 2: " << gameLine.at(2);		// Game Protocol
 +		//qDebug() << "Column 3: " << gameLine.at(3);		// Supported since version
 +		//qDebug() << "Column 4: " << gameLine.at(4);		// Verified
 +		//qDebug() << "Column 5: " << gameLine.at(5);		// By
 +		//qDebug() << "Column 6: " << gameLine.at(6);		// International ID
 +		//qDebug() << "Column 7: " << gameLine.at(7);		// FaceTrackNoIR ID
 +		
 +		//
 +		// If the gameID was found, fill the shared memory
 +		//
 +		if (gameLine.count() > 6) {
 +			if (gameLine.at(6).compare( gameID, Qt::CaseInsensitive ) == 0) {
 +				if (pMemData != NULL) {		
 +					sprintf_s(pMemData->ProgramName, 99, gameLine.at(1).toAscii());
 +					sprintf_s(pMemData->FTNVERSION, 9, gameLine.at(3).toAscii());
 +					sprintf_s(pMemData->FTNID, 24, gameLine.at(7).toAscii());
 +				}
 +				file.close();
 +				return true;
 +			}
 +		}
 +
 +		gameLine = csv.parseLine();
 +	}
 +
 +	//
 +	// If the gameID was NOT found, fill only the name "Unknown game connected"
 +	//
 +	QString strUnknown("Unknown game connected (ID = " + gameID + ")");
 +	sprintf_s(pMemData->ProgramName, 99, strUnknown.toAscii());
 +	file.close();
 +	return true;
  }
  //
  // Load the current Settings from the currently 'active' INI-file.
  //
  void FTNoIR_Protocol::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 ( "FT" );
 +	intUsedInterface = iniFile.value ( "UsedInterface", 0 ).toInt();
 +	iniFile.endGroup ();
 +
 +	//
 +	// Use the settings-section from the deprecated fake-TIR protocol, as they are most likely to be found there.
 +	//
 +	iniFile.beginGroup ( "FTIR" );
 +	useTIRViews	= iniFile.value ( "useTIRViews", 0 ).toBool();
 +	useDummyExe	= iniFile.value ( "useDummyExe", 1 ).toBool();
 +	iniFile.endGroup ();
  }
  //
 @@ -99,7 +209,10 @@ float headRotX;  float headRotY;
  float headRotZ;
 -    //
 +PDWORD_PTR MsgResult = 0;
 +
 +
 +	//
  	// Scale the Raw measurements to the client measurements.
  	//
  	headRotX = getRadsFromDegrees(headpose->pitch);
 @@ -152,82 +265,145 @@ float headRotZ;  		pMemData->data.Y3 = 0;
  		pMemData->data.Y4 = 0;
 -		//qDebug() << "FTServer says: pMemData.DataID =" << pMemData->data.DataID;
 -		//qDebug() << "FTServer says: ProgramName =" << pMemData->ProgramName;
 +		//
 +		// Check if the handle that was sent to the Game, was changed (on x64, this will be done by the ED-API)
 +		// If the "Report Program Name" command arrives (which is a '1', for now), raise the event from here!
 +		//
 +		if (hMainWindow != pMemData->handle) {			// Handle in memory-mapping was changed!
 +			comhandle = (__int32) pMemData->handle;		// Get the command from the Game.
 +			if (comhandle == 1) {						// "Report Program Name"
 +				SendMessageTimeout( (HWND) hMainWindow, RegisterWindowMessageA(FT_PROGRAMID), 0, 0, 0, 2000, MsgResult);
 +				pMemData->handle = 0;					// Reset the command, to enable future commands...
 +			}
 +		}
  		//
 +		// The game-ID was changed?
 +		//
 +		QString gameID = QString(pMemData->GameID);
 +	//QString gameID = QString("9999");
 +
 +//		qDebug() << "sendHeadposeToGame: gameID = " << gameID;
 +		if (gameID.length() > 0) {
 +			if ( gameID.toInt() != intGameID ) {
 +				if (getGameData( gameID ) ) {
 +					SendMessageTimeout( (HWND) hMainWindow, RegisterWindowMessageA(FT_PROGRAMID), 0, 0, 0, 2000, MsgResult);
 +				}
 +				intGameID = gameID.toInt();
 +			}
 +		}
 +		else {
 +			intGameID = 0;
 +			pMemData->ProgramName[0] = NULL;
 +			pMemData->FTNID[0] = NULL;
 +			pMemData->FTNVERSION[0] = NULL;
 +		}
 +
  		ReleaseMutex(hFTMutex);
  	}
 -    if (pMemData)
 -        pMemData->data.DataID += 1;
 +	pMemData->data.DataID += 1;
  }
  //
 -// Check if the Client DLL exists and load it (to test it), if so.
 +// Set the Path variables and load the memory-mapping.
 +// Simplified function: No need to check if the DLL's actually exist. The are installed by the installer.
 +// If they are absent, something went terribly wrong anyway...
 +//
  // Returns 'true' if all seems OK.
  //
 -bool FTNoIR_Protocol::checkServerInstallationOK()
 +//
 +bool FTNoIR_Protocol::checkServerInstallationOK( HANDLE handle )
  {   
 -	QSettings settings("Freetrack", "FreetrackClient");				// Registry settings (in HK_USER)
 -	QString aLocation;												// Location of Client DLL
 -	QString aFileName;												// File Path and Name
 +	QSettings settings("Freetrack", "FreetrackClient");							// Registry settings (in HK_USER)
 +	QSettings settingsTIR("NaturalPoint", "NATURALPOINT\\NPClient Location");	// Registry settings (in HK_USER)
 +	QString aLocation;															// Location of Client DLL
 -	qDebug() << "FTCheckClientDLL says: Starting Function";
 +	qDebug() << "checkServerInstallationOK says: Starting Function";
  	try {
  		//
 -		// Load the FreeTrackClient.dll from the current path of FaceTrackNoIR, because there is no
 -		// guarantee FreeTrack is also installed.
 -		//
 -		// Write this path in the registry (under FreeTrack/FreeTrackClient, for the game(s).
 +		// Write the path in the registry (for FreeTrack and FreeTrack20), for the game(s).
  		//
  		aLocation =  QCoreApplication::applicationDirPath() + "/";
 -		qDebug() << "FTCheckClientDLL says: Location of DLL =" << aLocation;
 +
 +		qDebug() << "checkServerInstallationOK says: used interface = " << intUsedInterface;
 +		switch (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:
 +				// should never be reached
 +			break;
 +		}
  		//
 -		// Append a '/' to the Path and then the name of the dll.
 +		// TIRViews must be started first, or the NPClient DLL will never be loaded.
  		//
 -		aFileName = aLocation;
 -		aFileName.append(FT_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.
 -			//
 -			////////FTClientLib.setFileName(aFileName);
 -			////////FTClientLib.load();
 -			////////provider = (importProvider) FTClientLib.resolve("FTProvider");
 -			////////if (provider) {
 -			////////	pProvider = provider();
 -			////////	qDebug() << "FTCheckClientDLL says: Provider =" << pProvider;
 -			////////}
 +		if (useTIRViews) {
 +
 +			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!";
 +				}
 +			}
  		}
 -		else {
 -			QMessageBox::information(0, "FaceTrackNoIR error", QString("Necessary file (FreeTrackClient.dll) was NOT found!\n"));
 -			return false;
 +
 +		//
 +		// Check if TIRViews or dummy TrackIR.exe is required for this game
 +		//
 +		if (useDummyExe) {
 +			QString program = QCoreApplication::applicationDirPath() + "/TrackIR.exe";
 +			dummyTrackIR = new QProcess();
 +			dummyTrackIR->start(program);
 +
 +			qDebug() << "FTServer::run() says: TrackIR.exe executed!";
  		}
 +
 +
  	} catch(...) {
  		settings.~QSettings();
  	}
 -    return FTCreateMapping();
 +	return FTCreateMapping( handle );
  }
  //
 -// Create a memory-mapping to the TrackIR data.
 +// Create a memory-mapping to the FreeTrack data.
  // It contains the tracking data, a handle to the main-window and the program-name of the Game!
  //
  //
 -bool FTNoIR_Protocol::FTCreateMapping()
 +bool FTNoIR_Protocol::FTCreateMapping( HANDLE handle )
  {
 +bool bFirst = false;
 +
  	qDebug() << "FTCreateMapping says: Starting Function";
  	//
 @@ -237,14 +413,18 @@ bool FTNoIR_Protocol::FTCreateMapping()  	// If one already exists: close it.
  	//
  	hFTMemMap = CreateFileMappingA( INVALID_HANDLE_VALUE , 00 , PAGE_READWRITE , 0 , 
 -		                           sizeof( TFreeTrackData ) + sizeof( HANDLE ) + 100, 
 +//		                           sizeof( TFreeTrackData ) + sizeof( HANDLE ) + 100, 
 +		                           sizeof( FTMemMap ), 
  								   (LPCSTR) FT_MM_DATA );
  	if ( hFTMemMap != 0 ) {
 +		bFirst = true;
  		qDebug() << "FTCreateMapping says: FileMapping Created!" << hFTMemMap;
  	}
  	if ( ( hFTMemMap != 0 ) && ( (long) GetLastError == ERROR_ALREADY_EXISTS ) ) {
 +		bFirst = false;
 +		qDebug() << "FTCreateMapping says: FileMapping already exists!" << hFTMemMap;
  		CloseHandle( hFTMemMap );
  		hFTMemMap = 0;
  	}
 @@ -255,7 +435,16 @@ bool FTNoIR_Protocol::FTCreateMapping()  	hFTMemMap = OpenFileMappingA( FILE_MAP_ALL_ACCESS , false , (LPCSTR) FT_MM_DATA );
  	if ( ( hFTMemMap != 0 ) ) {
  		qDebug() << "FTCreateMapping says: FileMapping Opened:" << hFTMemMap;
 -		pMemData = (FTMemMap *) MapViewOfFile(hFTMemMap, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(TFreeTrackData) + sizeof(hFTMemMap) + 100);
 +		pMemData = (FTMemMap *) MapViewOfFile(hFTMemMap, FILE_MAP_ALL_ACCESS, 0, 0, 
 +//					sizeof(TFreeTrackData) + sizeof(hFTMemMap) + 100);
 +					sizeof(FTMemMap));
 +		if (pMemData != NULL) {
 +			if (bFirst) {
 +				memset(pMemData, 0, sizeof(FTMemMap));			// Write zero's, if first...
 +			}
 +			pMemData->handle = handle;	// The game uses the handle, to send a message that the Program-Name was set!
 +			hMainWindow = handle;
 +		}
  	    hFTMutex = CreateMutexA(NULL, false, FREETRACK_MUTEX);
  	}
  	else {
 @@ -292,7 +481,7 @@ void FTNoIR_Protocol::FTDestroyMapping()  //
  void FTNoIR_Protocol::getNameFromGame( char *dest )
  {   
 -    sprintf(dest, "FreeTrack interface");
 +	sprintf_s(dest, 99, "FreeTrack interface");
  	qDebug() << "FTNoIR_Protocol::getNameFromGame says: Started, pMemData = " << pMemData << ", mutex = " << hFTMutex;
 @@ -302,7 +491,7 @@ void FTNoIR_Protocol::getNameFromGame( char *dest )  //	if ( (pMemData != NULL) && (WaitForSingleObject(hFTMutex, 100) == WAIT_OBJECT_0) ) {
  	if (pMemData != NULL) {
  		qDebug() << "FTNoIR_Protocol::getNameFromGame says: Inside MemData";
 -        sprintf(dest, "%s", pMemData->ProgramName);
 +		sprintf_s(dest, 99, "%s", pMemData->ProgramName);
  	}
  	return;
 @@ -316,9 +505,9 @@ void FTNoIR_Protocol::getNameFromGame( char *dest )  //   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")
 +#pragma comment(linker, "/export:GetProtocol=_GetProtocol@0")
 -extern "C" FTNOIR_PROTOCOL_BASE_EXPORT void* CALLING_CONVENTION GetConstructor()
 +FTNOIR_PROTOCOL_BASE_EXPORT IProtocolPtr __stdcall GetProtocol()
  {
 -    return (IProtocol*) new FTNoIR_Protocol;
 +	return new FTNoIR_Protocol;
  }
 diff --git a/ftnoir_protocol_ft/ftnoir_protocol_ft.h b/ftnoir_protocol_ft/ftnoir_protocol_ft.h index 690984a4..c82c3e79 100644 --- a/ftnoir_protocol_ft/ftnoir_protocol_ft.h +++ b/ftnoir_protocol_ft/ftnoir_protocol_ft.h @@ -28,21 +28,21 @@  #ifndef INCLUDED_FTSERVER_H
  #define INCLUDED_FTSERVER_H
 -#include "ftnoir_protocol_base/ftnoir_protocol_base.h"
 -#include "ui_ftnoir_ftcontrols.h"
 -#include "fttypes.h"
 +#include "..\ftnoir_protocol_base\ftnoir_protocol_base.h"
 +#include "ui_FTNoIR_FTcontrols.h"
 +#include "FTTypes.h"
  #include <QMessageBox>
  #include <QSettings>
  #include <QLibrary>
  #include <QProcess>
  #include <QDebug>
  #include <QFile>
 -#include <windows.h>
 -// todo wine glue
 +#include "Windows.h"
  //#include "math.h"
 -#include "facetracknoir/global-settings.h"
 -typedef char *(WINAPI *importProvider)(void);
 +//typedef char *(WINAPI *importProvider)(void);
 +typedef void (WINAPI *importTIRViewsStart)(void);
 +typedef void (WINAPI *importTIRViewsStop)(void);
  class FTNoIR_Protocol : public IProtocol
  {
 @@ -53,25 +53,35 @@ public:  	void Release();
      void Initialize();
 -    bool checkServerInstallationOK();
 +	bool checkServerInstallationOK( HANDLE handle );
  	void sendHeadposeToGame( THeadPoseData *headpose, THeadPoseData *rawheadpose );
  	void getNameFromGame( char *dest );					// Take care dest can handle up to 100 chars...
  private:
 -    bool FTCreateMapping();
 +	bool FTCreateMapping(HANDLE handle);
  	void FTDestroyMapping();
 +	importTIRViewsStart viewsStart;						// Functions inside TIRViews.dll
 +	importTIRViewsStop viewsStop;
 +
  	HANDLE hFTMemMap;
  	FTMemMap *pMemData;
  	HANDLE hFTMutex;
 +	HANDLE hMainWindow;									// Save the handle to FaceTrackNoIR main-window
  	__int32 comhandle;									// Handle on x32, command on x64
  	// Private properties
  	QString ProgramName;
 -	QLibrary FTClientLib;
 +	QLibrary FTIRViewsLib;
 +	QProcess *dummyTrackIR;
 +	int intGameID;
 +	int intUsedInterface;								// Determine which interface to use (or to hide from the game)
 +	bool useTIRViews;									// Needs to be in the Settings dialog
 +	bool useDummyExe;
  	float getRadsFromDegrees ( float degrees ) { return (degrees * 0.017453f); }
 +	bool getGameData( QString gameID );
  	void loadSettings();
  };
 @@ -105,25 +115,27 @@ private:  	FTNoIR_Protocol *theProtocol;
  private slots:
 +	void selectDLL();
  	void doOK();
  	void doCancel();
  	void settingChanged() { settingsDirty = true; };
 +	void settingChanged(int) { settingsDirty = true; };
  };
  //*******************************************************************************************************
  // FaceTrackNoIR Protocol DLL. Functions used to get general info on the Protocol
  //*******************************************************************************************************
 -class FTNoIR_ProtocolDll : public Metadata
 +class FTNoIR_ProtocolDll : public IProtocolDll
  {
  public:
  	FTNoIR_ProtocolDll();
  	~FTNoIR_ProtocolDll();
 -	void getFullName(QString *strToBeFilled) { *strToBeFilled = QString("FreeTrack"); };
 -	void getShortName(QString *strToBeFilled) { *strToBeFilled = QString("FreeTrack"); };
 -	void getDescription(QString *strToBeFilled) { *strToBeFilled = QString("FreeTrack protocol"); };
 +	void getFullName(QString *strToBeFilled) { *strToBeFilled = QString("FreeTrack 2.0"); };
 +	void getShortName(QString *strToBeFilled) { *strToBeFilled = QString("FreeTrack 2.0"); };
 +	void getDescription(QString *strToBeFilled) { *strToBeFilled = QString("Enhanced FreeTrack protocol"); };
 -    void getIcon(QIcon *icon) { *icon = QIcon(":/images/freetrack.png"); };
 +	void getIcon(QIcon *icon) { *icon = QIcon(":/images/Freetrack.ico"); };
  };
 diff --git a/ftnoir_protocol_ft/fttypes.h b/ftnoir_protocol_ft/fttypes.h index 3f411cfe..1f389711 100644 --- a/ftnoir_protocol_ft/fttypes.h +++ b/ftnoir_protocol_ft/fttypes.h @@ -4,7 +4,7 @@  *					It was loosely translated from FTTypes.pas					*
  *					which was created by the FreeTrack-team.					*
  *																				*
 -* Copyright (C) 2010	Wim Vriend (Developing)									*
 +* Copyright (C) 2013	Wim Vriend (Developing)									*
  *						Ron Hendriks (Testing and Research)						*
  *																				*
  * Homepage				<http://www.free-track.net>								*
 @@ -25,23 +25,26 @@  * We would like to extend our grattitude to the creators of SweetSpotter,		*
  * which has become the basis of this program: "Great work guys!"				*
  ********************************************************************************/
 +/*
 +	Modifications (last one on top):
 +	20130125 - WVR: Upgraded to FT2.0: now the FreeTrack protocol supports all TIR-enabled games. The memory-mapping was expanded for this purpose.
 +*/
  #pragma once
  #ifndef INCLUDED_FTTYPES_H
  #define INCLUDED_FTTYPES_H
 -#include <windows.h>
 +#include "Windows.h" 
  #include <tchar.h>
  #include <stdio.h>
  //#include "Registry.h"
  //  static const char* FT_CLIENT_LOCATION = "Software\\Freetrack\\FreetrackClient";
 -
 -#define FT_CLIENT_FILENAME "FreeTrackClient.Dll"
 -#define FT_MM_DATA "FT_SharedMem"
 -#define FREETRACK "Freetrack"
 -#define FREETRACK_MUTEX "FT_Mutext"
 -#define FT_PROGRAMID "FT_ProgramID"
 +  static const char* FT_CLIENT_FILENAME = "FreeTrackClient.Dll";
 +  static const char* FT_MM_DATA = "FT_SharedMem";
 +  static const char* FREETRACK = "Freetrack";
 +  static const char* FREETRACK_MUTEX = "FT_Mutext";
 +  static const char* FT_PROGRAMID = "FT_ProgramID";
  struct TFreeTrackData {
 @@ -82,10 +85,20 @@ struct FTMemMap {  #else
  	HANDLE handle;
  #endif
 -    char ProgramName[100];
 +    char ProgramName[100];		// The name of the game
 +	char GameID[10];			// The international game-ID
 +	char FTNID[30];				// The FaceTrackNoIR game-ID
 +	char FTNVERSION[10];		// The version of FaceTrackNoIR, in which the game was first supported
  };
  typedef FTMemMap * PFTMemMap;
 -extern bool (*FTGetData) (PFreetrackData data); 
 +//extern bool (*FTGetData) (PFreetrackData data); 
 +// DLL function signatures
 +// These match those given in FTTypes.pas
 +// WINAPI is macro for __stdcall defined somewhere in the depths of windows.h
 +typedef bool (WINAPI *importGetData)(TFreeTrackData * data);
 +typedef char *(WINAPI *importGetDllVersion)(void);
 +typedef void (WINAPI *importReportID)(int name);
 +typedef char *(WINAPI *importProvider)(void);
  #endif//INCLUDED_FTTYPES_H
 | 
