summaryrefslogtreecommitdiffhomepage
path: root/ftnoir_protocol_ft
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2013-12-31 15:52:50 +0100
committerStanislaw Halik <sthalik@misaki.pl>2013-12-31 15:52:50 +0100
commit4abd0ca3b5090018a7db05e8c2e0f478d861d978 (patch)
tree197e8497e4662acb2d7adb214f3d942b4dbd636e /ftnoir_protocol_ft
parent4b5bd9d5e8f2b239da4979e33f42a4ca5f5498db (diff)
ft: use settings framework
Diffstat (limited to 'ftnoir_protocol_ft')
-rw-r--r--ftnoir_protocol_ft/ftnoir_protocol_ft.cpp102
-rw-r--r--ftnoir_protocol_ft/ftnoir_protocol_ft.h100
-rw-r--r--ftnoir_protocol_ft/ftnoir_protocol_ft_dialog.cpp194
-rw-r--r--ftnoir_protocol_ft/ftnoir_protocol_ft_dll.cpp18
4 files changed, 124 insertions, 290 deletions
diff --git a/ftnoir_protocol_ft/ftnoir_protocol_ft.cpp b/ftnoir_protocol_ft/ftnoir_protocol_ft.cpp
index 84d1d20b..5c086c10 100644
--- a/ftnoir_protocol_ft/ftnoir_protocol_ft.cpp
+++ b/ftnoir_protocol_ft/ftnoir_protocol_ft.cpp
@@ -24,78 +24,30 @@
* FTServer FTServer is the Class, that communicates headpose-data *
* to games, using the FreeTrackClient.dll. *
********************************************************************************/
-#include <algorithm>
#include "ftnoir_protocol_ft.h"
#include "ftnoir_csv/csv.h"
-/** constructor **/
FTNoIR_Protocol::FTNoIR_Protocol() :
shm(FT_MM_DATA, FREETRACK_MUTEX, sizeof(FTMemMap))
{
pMemData = (FTMemMap*) shm.mem;
- useTIRViews = false;
- useDummyExe = false;
- intUsedInterface = 0;
-
- loadSettings();
-
- ProgramName = "";
- intGameID = 0;
-
- viewsStart = 0;
- viewsStop = 0;
+ ProgramName = "";
+ intGameID = 0;
+ viewsStart = 0;
+ viewsStop = 0;
}
-/** destructor **/
FTNoIR_Protocol::~FTNoIR_Protocol()
{
-
- qDebug()<< "~FTNoIR_Protocol: Destructor started.";
-
- //
- // Stop if started
- //
- if (viewsStop != NULL) {
- qDebug()<< "~FTNoIR_Protocol: Stopping TIRViews.";
- viewsStop();
- FTIRViewsLib.unload();
- }
- dummyTrackIR.terminate();
+ if (viewsStop != NULL) {
+ viewsStop();
+ FTIRViewsLib.unload();
+ }
+ dummyTrackIR.terminate();
dummyTrackIR.kill();
dummyTrackIR.waitForFinished(50);
-
}
-//
-// Read the game-data from CSV
-//
-
-
-//
-// Load the current Settings from the currently 'active' INI-file.
-//
-void FTNoIR_Protocol::loadSettings() {
- QSettings settings("opentrack"); // 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", 0 ).toBool();
- iniFile.endGroup ();
-}
-
-//
-// Update Headpose in Game.
-//
void FTNoIR_Protocol::sendHeadposeToGame(const double* headpose) {
float virtPosX;
float virtPosY;
@@ -112,7 +64,7 @@ void FTNoIR_Protocol::sendHeadposeToGame(const double* headpose) {
float headRotX;
float headRotY;
float headRotZ;
- headRotX = virtRotX = getRadsFromDegrees(headpose[Pitch]) * (useDummyExe ? 2.0 : 1.0);
+ headRotX = virtRotX = getRadsFromDegrees(headpose[Pitch]) * (s.useDummyExe ? 2.0 : 1.0);
headRotY = virtRotY = getRadsFromDegrees(headpose[Yaw]);
headRotZ = virtRotZ = getRadsFromDegrees(headpose[Roll]);
headPosX = virtPosX = headpose[TX] * 10;
@@ -149,13 +101,6 @@ void FTNoIR_Protocol::sendHeadposeToGame(const double* headpose) {
pMemData->data.Y3 = 0;
pMemData->data.Y4 = 0;
- //
- // 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!
- //
- //
- // The game-ID was changed?
- //
if (intGameID != pMemData->GameID)
{
QString gamename;
@@ -167,8 +112,7 @@ void FTNoIR_Protocol::sendHeadposeToGame(const double* headpose) {
}
pMemData->data.DataID += 1;
-
- shm.unlock();
+ shm.unlock();
}
void FTNoIR_Protocol::start_tirviews() {
@@ -212,6 +156,10 @@ bool FTNoIR_Protocol::checkServerInstallationOK()
QSettings settingsTIR("NaturalPoint", "NATURALPOINT\\NPClient Location"); // Registry settings (in HK_USER)
QString aLocation; // Location of Client DLL
+
+ if (!shm.success())
+ return false;
+
qDebug() << "checkServerInstallationOK says: Starting Function";
//
@@ -219,8 +167,8 @@ bool FTNoIR_Protocol::checkServerInstallationOK()
//
aLocation = QCoreApplication::applicationDirPath() + "/";
- qDebug() << "checkServerInstallationOK says: used interface = " << intUsedInterface;
- switch (intUsedInterface) {
+ qDebug() << "checkServerInstallationOK says: used interface = " << s.intUsedInterface;
+ switch (s.intUsedInterface) {
case 0: // Use both interfaces
settings.setValue( "Path" , aLocation );
settingsTIR.setValue( "Path" , aLocation );
@@ -241,20 +189,17 @@ bool FTNoIR_Protocol::checkServerInstallationOK()
//
// TIRViews must be started first, or the NPClient DLL will never be loaded.
//
- if (useTIRViews) {
+ if (s.useTIRViews) {
start_tirviews();
}
//
// Check if TIRViews or dummy TrackIR.exe is required for this game
//
- if (useDummyExe) {
+ if (s.useDummyExe) {
start_dummy();
}
- if (!shm.success())
- return false;
-
pMemData->data.DataID = 1;
pMemData->data.CamWidth = 100;
pMemData->data.CamHeight = 250;
@@ -264,15 +209,6 @@ bool FTNoIR_Protocol::checkServerInstallationOK()
return true;
}
-////////////////////////////////////////////////////////////////////////////////
-// 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")
-
extern "C" FTNOIR_PROTOCOL_BASE_EXPORT IProtocol* CALLING_CONVENTION GetConstructor()
{
return new FTNoIR_Protocol;
diff --git a/ftnoir_protocol_ft/ftnoir_protocol_ft.h b/ftnoir_protocol_ft/ftnoir_protocol_ft.h
index 56316ec4..8f27b071 100644
--- a/ftnoir_protocol_ft/ftnoir_protocol_ft.h
+++ b/ftnoir_protocol_ft/ftnoir_protocol_ft.h
@@ -25,9 +25,6 @@
* to games, using the FreeTrackClient.dll. *
********************************************************************************/
#pragma once
-#ifndef INCLUDED_FTSERVER_H
-#define INCLUDED_FTSERVER_H
-
#include "ftnoir_protocol_base/ftnoir_protocol_base.h"
#include "ui_ftnoir_ftcontrols.h"
#include "facetracknoir/global-settings.h"
@@ -43,7 +40,20 @@
#include <QMutex>
#include <QMutexLocker>
#include "compat/compat.h"
-//#include "math.h"
+#include "facetracknoir/options.h"
+using namespace options;
+
+struct settings {
+ pbundle b;
+ value<int> intUsedInterface;
+ value<bool> useTIRViews, useDummyExe;
+ settings() :
+ b(bundle("proto-freetrack")),
+ intUsedInterface(b, "used-interfaces", 0),
+ useTIRViews(b, "use-memory-hacks", false),
+ useDummyExe(b, "ezca-mode", false)
+ {}
+};
//typedef char *(WINAPI *importProvider)(void);
typedef void (WINAPI *importTIRViewsStart)(void);
@@ -52,87 +62,59 @@ typedef void (WINAPI *importTIRViewsStop)(void);
class FTNoIR_Protocol : public IProtocol
{
public:
- FTNoIR_Protocol();
+ FTNoIR_Protocol();
virtual ~FTNoIR_Protocol();
- bool checkServerInstallationOK( );
+ bool checkServerInstallationOK( );
void sendHeadposeToGame( const double *headpose );
QString getGameName() {
QMutexLocker foo(&game_name_mutex);
return connected_game;
}
-
private:
- importTIRViewsStart viewsStart; // Functions inside TIRViews.dll
- importTIRViewsStop viewsStop;
+ importTIRViewsStart viewsStart; // Functions inside TIRViews.dll
+ importTIRViewsStop viewsStop;
- FTMemMap *pMemData;
+ FTMemMap *pMemData;
QString game_name;
PortableLockedShm shm;
- // Private properties
- QString ProgramName;
- 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); }
- void loadSettings();
+ // Private properties
+ QString ProgramName;
+ QLibrary FTIRViewsLib;
+ QProcess dummyTrackIR;
+ static inline double getRadsFromDegrees ( double degrees )
+ {
+ return degrees * 0.017453;
+ }
+ int intGameID;
void start_tirviews();
void start_dummy();
-
QString connected_game;
QMutex game_name_mutex;
+ settings s;
};
-// Widget that has controls for FTNoIR protocol client-settings.
class FTControls: public QWidget, public IProtocolDialog
{
Q_OBJECT
public:
-
- explicit FTControls();
- void registerProtocol(IProtocol *protocol) {
- theProtocol = (FTNoIR_Protocol *) protocol; // Accept the pointer to the Protocol
- }
- void unRegisterProtocol() {
- theProtocol = NULL; // Reset the pointer
- }
-
+ explicit FTControls();
+ void registerProtocol(IProtocol *protocol) {}
+ void unRegisterProtocol() {}
private:
- Ui::UICFTControls ui;
- void loadSettings();
- void save();
-
- /** helper **/
- bool settingsDirty;
- FTNoIR_Protocol *theProtocol;
-
+ Ui::UICFTControls ui;
+ settings s;
private slots:
- void selectDLL();
- void doOK();
- void doCancel();
- void settingChanged() { settingsDirty = true; }
- void settingChanged(int) { settingsDirty = true; }
+ void selectDLL();
+ void doOK();
+ void doCancel();
};
-//*******************************************************************************************************
-// FaceTrackNoIR Protocol DLL. Functions used to get general info on the Protocol
-//*******************************************************************************************************
class FTNoIR_ProtocolDll : public Metadata
{
public:
- FTNoIR_ProtocolDll();
- ~FTNoIR_ProtocolDll();
-
- 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 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"); }
};
-
-
-#endif//INCLUDED_FTSERVER_H
-//END
diff --git a/ftnoir_protocol_ft/ftnoir_protocol_ft_dialog.cpp b/ftnoir_protocol_ft/ftnoir_protocol_ft_dialog.cpp
index 0b29db6e..b414561d 100644
--- a/ftnoir_protocol_ft/ftnoir_protocol_ft_dialog.cpp
+++ b/ftnoir_protocol_ft/ftnoir_protocol_ft_dialog.cpp
@@ -34,155 +34,87 @@
// Constructor for server-settings-dialog
//
FTControls::FTControls() :
-QWidget()
+ QWidget()
{
- QString aFileName; // File Path and Name
+ QString aFileName; // File Path and Name
- ui.setupUi( this );
+ ui.setupUi( this );
- // Connect Qt signals to member-functions
+ // Connect Qt signals to member-functions
connect(ui.buttonBox, SIGNAL(accepted()), this, SLOT(doOK()));
connect(ui.buttonBox, SIGNAL(rejected()), this, SLOT(doCancel()));
- connect(ui.bntLocateNPClient, SIGNAL(clicked()), this, SLOT(selectDLL()));
- connect(ui.chkTIRViews, SIGNAL(stateChanged(int)), this, SLOT(settingChanged()));
- connect(ui.chkStartDummy, SIGNAL(stateChanged(int)), this, SLOT(settingChanged()));
- connect(ui.cbxSelectInterface, SIGNAL(currentIndexChanged(int)), this, SLOT(settingChanged( int )));
-
- ui.cbxSelectInterface->addItem("Enable both");
- ui.cbxSelectInterface->addItem("Use FreeTrack, hide TrackIR");
- ui.cbxSelectInterface->addItem("Use TrackIR, hide FreeTrack");
-
- theProtocol = NULL;
-
- // Load the settings from the current .INI-file
- loadSettings();
-
-
- aFileName = QCoreApplication::applicationDirPath() + "/TIRViews.dll";
- if ( !QFile::exists( aFileName ) ) {
- ui.chkTIRViews->setChecked( false );
- ui.chkTIRViews->setEnabled ( false );
-
- //
- // Best do this save() last, or it will continually reset the settings... :-(
- //
- save();
- }
- else {
- ui.chkTIRViews->setEnabled ( true );
- }
-
-
+ connect(ui.bntLocateNPClient, SIGNAL(clicked()), this, SLOT(selectDLL()));
+
+ tie_setting(s.intUsedInterface, ui.cbxSelectInterface);
+ tie_setting(s.useDummyExe, ui.chkStartDummy);
+ tie_setting(s.useTIRViews, ui.chkTIRViews);
+
+ ui.cbxSelectInterface->addItem("Enable both");
+ ui.cbxSelectInterface->addItem("Use FreeTrack, hide TrackIR");
+ ui.cbxSelectInterface->addItem("Use TrackIR, hide FreeTrack");
+
+ aFileName = QCoreApplication::applicationDirPath() + "/TIRViews.dll";
+ if ( !QFile::exists( aFileName ) ) {
+ ui.chkTIRViews->setChecked( false );
+ ui.chkTIRViews->setEnabled ( false );
+ }
+ else {
+ ui.chkTIRViews->setEnabled ( true );
+ }
}
void FTControls::doOK() {
- save();
- this->close();
+ s.b->save();
+ this->close();
}
void FTControls::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 FTControls::loadSettings() {
- qDebug() << "loadSettings says: Starting ";
- QSettings settings("opentrack"); // 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 ( "FT" );
- ui.cbxSelectInterface->setCurrentIndex( iniFile.value ( "UsedInterface", 0 ).toInt() );
- iniFile.endGroup ();
-
- iniFile.beginGroup ( "FTIR" );
- ui.chkTIRViews->setChecked (iniFile.value ( "useTIRViews", 0 ).toBool());
- ui.chkStartDummy->setChecked (iniFile.value ( "useDummyExe", 0 ).toBool());
- iniFile.endGroup ();
-
- settingsDirty = false;
-}
-
-//
-// Save the current Settings to the currently 'active' INI-file.
-//
-void FTControls::save() {
- QSettings settings("opentrack"); // 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" );
- iniFile.setValue ( "UsedInterface", ui.cbxSelectInterface->currentIndex());
- iniFile.endGroup ();
-
- iniFile.beginGroup ( "FTIR" );
- iniFile.setValue ( "useTIRViews", ui.chkTIRViews->isChecked() );
- iniFile.setValue ( "useDummyExe", ui.chkStartDummy->isChecked() );
- iniFile.endGroup ();
-
- settingsDirty = false;
+ //
+ // Ask if changed Settings should be saved
+ //
+ if (s.b->modifiedp()) {
+ int ret = QMessageBox::question ( this, "Settings have changed", "Do you want to save the settings?", QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
+
+ qDebug() << "doCancel says: answer =" << ret;
+
+ switch (ret) {
+ case QMessageBox::Save:
+ s.b->save();
+ this->close();
+ break;
+ case QMessageBox::Discard:
+ s.b->revert();
+ this->close();
+ break;
+ case QMessageBox::Cancel:
+ // Cancel was clicked
+ break;
+ default:
+ // should never be reached
+ break;
+ }
+ }
+ else {
+ this->close();
+ }
}
-//
-// Select a NPClient.dll file, to repair the Location in the Registry.
-// Several program distribute their own version of this file.
-//
void FTControls::selectDLL() {
QString fileName = QFileDialog::getOpenFileName( this, tr("Select the desired NPClient DLL"), QCoreApplication::applicationDirPath() + "/NPClient.dll", tr("Dll file (*.dll);;All Files (*)"));
- //
- // Write the location of the file in the required Registry-key.
- //
- if (! fileName.isEmpty() ) {
- if (fileName.endsWith("NPClient.dll", Qt::CaseInsensitive) ) {
- QSettings settingsTIR("NaturalPoint", "NATURALPOINT\\NPClient Location"); // Registry settings (in HK_USER)
- QString aLocation = fileName.left(fileName.length() - 12); // Location of Client DLL
-
- settingsTIR.setValue( "Path" , aLocation );
- }
- }
+ //
+ // Write the location of the file in the required Registry-key.
+ //
+ if (! fileName.isEmpty() ) {
+ if (fileName.endsWith("NPClient.dll", Qt::CaseInsensitive) ) {
+ QSettings settingsTIR("NaturalPoint", "NATURALPOINT\\NPClient Location"); // Registry settings (in HK_USER)
+ QString aLocation = fileName.left(fileName.length() - 12); // Location of Client DLL
+
+ settingsTIR.setValue( "Path" , aLocation );
+ }
+ }
}
-
-////////////////////////////////////////////////////////////////////////////////
-// 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.
extern "C" FTNOIR_PROTOCOL_BASE_EXPORT IProtocolDialog* CALLING_CONVENTION GetDialog( )
{
return new FTControls;
diff --git a/ftnoir_protocol_ft/ftnoir_protocol_ft_dll.cpp b/ftnoir_protocol_ft/ftnoir_protocol_ft_dll.cpp
index f4e4a40e..38f11211 100644
--- a/ftnoir_protocol_ft/ftnoir_protocol_ft_dll.cpp
+++ b/ftnoir_protocol_ft/ftnoir_protocol_ft_dll.cpp
@@ -23,24 +23,8 @@
* *
********************************************************************************/
#include "ftnoir_protocol_ft.h"
-#include <QDebug>
-FTNoIR_ProtocolDll::FTNoIR_ProtocolDll() {
-}
-
-FTNoIR_ProtocolDll::~FTNoIR_ProtocolDll()
-{
-
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Factory function that creates instances if the Protocol object.
-
-// Export both decorated and undecorated names.
-// GetProtocolDll - Undecorated name, which can be easily used with GetProcAddress
-// Win32 API function.
-// _GetProtocolDll@0 - Common name decoration for __stdcall functions in C language.
extern "C" FTNOIR_PROTOCOL_BASE_EXPORT Metadata* CALLING_CONVENTION GetMetadata()
{
return new FTNoIR_ProtocolDll;
-} \ No newline at end of file
+}