From 2719be277dd4a1288c8b99b1ed2cfc94de333763 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Tue, 2 Apr 2013 18:59:43 +0200 Subject: Add Wim's version, it's better --- ftnoir_protocol_ft/ftnoir_ftcontrols.ui | 302 ++++++++++++++++++++++++++-- ftnoir_protocol_ft/ftnoir_protocol_ft.cpp | 321 ++++++++++++++++++++++++------ ftnoir_protocol_ft/ftnoir_protocol_ft.h | 42 ++-- ftnoir_protocol_ft/fttypes.h | 33 ++- 4 files changed, 591 insertions(+), 107 deletions(-) (limited to 'ftnoir_protocol_ft') 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 @@ 0 0 - 411 - 112 + 645 + 416 + + + 645 + 0 + + - FreeTrack settings FaceTrackNoIR + FreeTrack 2.0 settings FaceTrackNoIR - images/freetrack.pngimages/freetrack.png + images/FaceTrackNoIR.icoimages/FaceTrackNoIR.ico Qt::LeftToRight @@ -25,7 +31,282 @@ - + + + + + + 0 + 70 + + + + TIRViews + + + + + 80 + 30 + 88 + 17 + + + + Qt::RightToLeft + + + Use TIRViews + + + + + + 189 + 10 + 421 + 16 + + + + TIRViews is only required for some older games (like CFS3). For it to work, TIRViews.dll + + + + + + 189 + 30 + 421 + 16 + + + + must be placed in the FaceTrackNoIR program folder. If the checkbox is disabled, the + + + true + + + + + + 189 + 50 + 411 + 16 + + + + the DLL was not found. You can get it from NaturalPoint. + + + + + + + + + 0 + 70 + + + + TrackIR.exe + + + + + 20 + 30 + 145 + 17 + + + + Qt::RightToLeft + + + Start dummy TrackIR.exe + + + + + + 189 + 10 + 351 + 16 + + + + Some programs check, to see if a process called TrackIR.exe is running, + + + + + + 189 + 30 + 261 + 16 + + + + before enabling head-tracking (EZCA is one of them). + + + true + + + + + + 189 + 50 + 231 + 16 + + + + Check the checkbox, to overcome this problem. + + + + + + + + + 0 + 70 + + + + Select interface + + + + + 189 + 10 + 351 + 16 + + + + Some games support both FreeTrack and TrackIR and may get confused, + + + + + + 189 + 30 + 261 + 16 + + + + when both interfaces are visible. + + + true + + + + + + 189 + 50 + 381 + 16 + + + + Try to disable one interface, if you experience problems. + + + + + + 6 + 30 + 168 + 22 + + + + + + + + + + 0 + 70 + + + + Repair NPClient location + + + + + 188 + 10 + 381 + 20 + + + + Users who use other software with an NPClient DLL (like TrackIR, FreeTrack or + + + + + + 184 + 30 + 411 + 20 + + + + GlovePIE) may need to repair the location of the DLL, after running FaceTrackNoIR. + + + true + + + + + + 187 + 50 + 391 + 20 + + + + Use this button to locate the desired NPClient DLL. + + + + + + 4 + 30 + 171 + 23 + + + + Locate DLL + + + + @@ -54,17 +335,6 @@ - - - - - - There are no settings necessary for the FreeTrack protocol. - - - - - 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 #include #include #include #include #include -#include -// 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 * @@ -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 +#include "Windows.h" #include #include //#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 -- cgit v1.2.3