diff options
| author | Wim Vriend <facetracknoir@gmail.com> | 2011-02-12 16:13:30 +0000 | 
|---|---|---|
| committer | Wim Vriend <facetracknoir@gmail.com> | 2011-02-12 16:13:30 +0000 | 
| commit | 63ce1b5dc62e5c1a079f8a675c0a4371adb27d29 (patch) | |
| tree | 0a8ac58de927502c9f33d97a2c82966ae980e54a /FTNoIR_Tracker_UDP | |
| parent | a8a619f078f543b56e8ae785d92844b806444195 (diff) | |
Displaying headpose-data seemed to cause crashes.
Update is now done in FaceTrackNoIR.cpp, using a timer.
git-svn-id: svn+ssh://svn.code.sf.net/p/facetracknoir/code@51 19e81ba0-9b1a-49c3-bd6c-561e1906d5fb
Diffstat (limited to 'FTNoIR_Tracker_UDP')
| -rw-r--r-- | FTNoIR_Tracker_UDP/FTNoIR_FTNClientControls.ui | 199 | ||||
| -rw-r--r-- | FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.h | 80 | ||||
| -rw-r--r-- | FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.vcproj | 114 | ||||
| -rw-r--r-- | FTNoIR_Tracker_UDP/ftnoir_tracker_base.h | 26 | ||||
| -rw-r--r-- | FTNoIR_Tracker_UDP/ftnoir_tracker_udp.cpp | 261 | 
5 files changed, 614 insertions, 66 deletions
diff --git a/FTNoIR_Tracker_UDP/FTNoIR_FTNClientControls.ui b/FTNoIR_Tracker_UDP/FTNoIR_FTNClientControls.ui new file mode 100644 index 00000000..11e07cf3 --- /dev/null +++ b/FTNoIR_Tracker_UDP/FTNoIR_FTNClientControls.ui @@ -0,0 +1,199 @@ +<?xml version="1.0" encoding="UTF-8"?>
 +<ui version="4.0">
 + <class>UICFTNClientControls</class>
 + <widget class="QWidget" name="UICFTNClientControls">
 +  <property name="geometry">
 +   <rect>
 +    <x>0</x>
 +    <y>0</y>
 +    <width>411</width>
 +    <height>129</height>
 +   </rect>
 +  </property>
 +  <property name="windowTitle">
 +   <string>FTNoIR tracker settings FaceTrackNoIR</string>
 +  </property>
 +  <property name="windowIcon">
 +   <iconset>
 +    <normaloff>images/FaceTrackNoIR.ico</normaloff>images/FaceTrackNoIR.ico</iconset>
 +  </property>
 +  <property name="layoutDirection">
 +   <enum>Qt::LeftToRight</enum>
 +  </property>
 +  <property name="autoFillBackground">
 +   <bool>false</bool>
 +  </property>
 +  <layout class="QVBoxLayout" name="_vertical_layout">
 +   <item>
 +    <layout class="QGridLayout" name="gridLayout">
 +     <item row="1" column="0">
 +      <widget class="QLabel" name="label_5">
 +       <property name="text">
 +        <string>Port-number</string>
 +       </property>
 +      </widget>
 +     </item>
 +     <item row="1" column="1">
 +      <widget class="QSpinBox" name="spinPortNumber">
 +       <property name="minimum">
 +        <number>5550</number>
 +       </property>
 +       <property name="maximum">
 +        <number>10000</number>
 +       </property>
 +      </widget>
 +     </item>
 +     <item row="1" column="2">
 +      <spacer name="horizontalSpacer_3">
 +       <property name="orientation">
 +        <enum>Qt::Horizontal</enum>
 +       </property>
 +       <property name="sizeHint" stdset="0">
 +        <size>
 +         <width>40</width>
 +         <height>20</height>
 +        </size>
 +       </property>
 +      </spacer>
 +     </item>
 +    </layout>
 +   </item>
 +   <item>
 +    <spacer name="verticalSpacer">
 +     <property name="orientation">
 +      <enum>Qt::Vertical</enum>
 +     </property>
 +     <property name="sizeHint" stdset="0">
 +      <size>
 +       <width>20</width>
 +       <height>40</height>
 +      </size>
 +     </property>
 +    </spacer>
 +   </item>
 +   <item>
 +    <layout class="QVBoxLayout" name="verticalLayout">
 +     <item>
 +      <widget class="QLabel" name="label">
 +       <property name="text">
 +        <string>Enter the port-number for the remote PC.</string>
 +       </property>
 +       <property name="wordWrap">
 +        <bool>true</bool>
 +       </property>
 +      </widget>
 +     </item>
 +     <item>
 +      <widget class="QLabel" name="label_3">
 +       <property name="text">
 +        <string>Remember: you may have to change firewall-settings too!</string>
 +       </property>
 +      </widget>
 +     </item>
 +    </layout>
 +   </item>
 +   <item>
 +    <layout class="QHBoxLayout" name="horizontalLayout">
 +     <item>
 +      <spacer name="horizontalSpacer_2">
 +       <property name="orientation">
 +        <enum>Qt::Horizontal</enum>
 +       </property>
 +       <property name="sizeHint" stdset="0">
 +        <size>
 +         <width>40</width>
 +         <height>20</height>
 +        </size>
 +       </property>
 +      </spacer>
 +     </item>
 +     <item>
 +      <layout class="QHBoxLayout" name="horizontalLayout_2">
 +       <property name="sizeConstraint">
 +        <enum>QLayout::SetDefaultConstraint</enum>
 +       </property>
 +       <item>
 +        <widget class="QPushButton" name="btnOK">
 +         <property name="sizePolicy">
 +          <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
 +           <horstretch>0</horstretch>
 +           <verstretch>0</verstretch>
 +          </sizepolicy>
 +         </property>
 +         <property name="minimumSize">
 +          <size>
 +           <width>100</width>
 +           <height>0</height>
 +          </size>
 +         </property>
 +         <property name="maximumSize">
 +          <size>
 +           <width>100</width>
 +           <height>16777215</height>
 +          </size>
 +         </property>
 +         <property name="text">
 +          <string>OK</string>
 +         </property>
 +        </widget>
 +       </item>
 +       <item>
 +        <widget class="QPushButton" name="btnCancel">
 +         <property name="sizePolicy">
 +          <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
 +           <horstretch>0</horstretch>
 +           <verstretch>0</verstretch>
 +          </sizepolicy>
 +         </property>
 +         <property name="minimumSize">
 +          <size>
 +           <width>100</width>
 +           <height>0</height>
 +          </size>
 +         </property>
 +         <property name="maximumSize">
 +          <size>
 +           <width>100</width>
 +           <height>16777215</height>
 +          </size>
 +         </property>
 +         <property name="text">
 +          <string>Cancel</string>
 +         </property>
 +        </widget>
 +       </item>
 +      </layout>
 +     </item>
 +     <item>
 +      <spacer name="horizontalSpacer">
 +       <property name="orientation">
 +        <enum>Qt::Horizontal</enum>
 +       </property>
 +       <property name="sizeType">
 +        <enum>QSizePolicy::Fixed</enum>
 +       </property>
 +       <property name="sizeHint" stdset="0">
 +        <size>
 +         <width>10</width>
 +         <height>20</height>
 +        </size>
 +       </property>
 +      </spacer>
 +     </item>
 +    </layout>
 +   </item>
 +  </layout>
 + </widget>
 + <tabstops>
 +  <tabstop>spinPortNumber</tabstop>
 +  <tabstop>btnOK</tabstop>
 +  <tabstop>btnCancel</tabstop>
 + </tabstops>
 + <resources/>
 + <connections/>
 + <slots>
 +  <slot>startEngineClicked()</slot>
 +  <slot>stopEngineClicked()</slot>
 +  <slot>cameraSettingsClicked()</slot>
 + </slots>
 +</ui>
 diff --git a/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.h b/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.h new file mode 100644 index 00000000..b3467341 --- /dev/null +++ b/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.h @@ -0,0 +1,80 @@ +#include "ftnoir_tracker_base.h"
 +#include "ui_FTNoIR_FTNClientcontrols.h"
 +#include <QThread>
 +#include <QUdpSocket>
 +#include <QMessageBox>
 +#include <QSettings>
 +#include "Windows.h"
 +#include "math.h"
 +
 +class FTNoIR_Tracker_UDP : public ITracker, QThread
 +{
 +public:
 +	FTNoIR_Tracker_UDP();
 +	~FTNoIR_Tracker_UDP();
 +
 +	void Release();
 +    void Initialize();
 +    void StartTracker();
 +	void GiveHeadPoseData(THeadPoseData *data);
 +	void loadSettings();
 +
 +	bool setParameterValue(const int index, const float newvalue);
 +
 +protected:
 +	void run();												// qthread override run method
 +
 +private:
 +	// Handles to neatly terminate thread...
 +	HANDLE m_StopThread;
 +	HANDLE m_WaitThread;
 +
 +	// UDP socket-variables
 +	QUdpSocket *inSocket;									// Receive from ...
 +	QUdpSocket *outSocket;									// Send to ...
 +	QHostAddress destIP;									// Destination IP-address
 +	int destPort;											// Destination port-number
 +	QHostAddress srcIP;										// Source IP-address
 +	int srcPort;											// Source port-number
 +
 +	THeadPoseData newHeadPose;								// Structure with new headpose
 +
 +	//parameter list for the filter-function(s)
 +	enum
 +	{
 +		kPortAddress=0,										// Index in QList
 +		kNumFilterParameters								// Indicate number of parameters used
 +	};
 +	QList<std::pair<float,float>>	parameterRange;
 +	QList<float>					parameterValueAsFloat;
 +
 +};
 +
 +// Widget that has controls for FTNoIR protocol client-settings.
 +class FTNClientControls: public QWidget, Ui::UICFTNClientControls, public ITrackerDialog
 +{
 +    Q_OBJECT
 +public:
 +
 +	explicit FTNClientControls( QWidget *parent=0, Qt::WindowFlags f=0 );
 +    virtual ~FTNClientControls();
 +	void showEvent ( QShowEvent * event );
 +
 +	void Release();											// Member functions which are accessible from outside the DLL
 +    void Initialize(QWidget *parent);
 +
 +private:
 +	Ui::UICFTNClientControls ui;
 +	void loadSettings();
 +	void save();
 +
 +	/** helper **/
 +	bool settingsDirty;
 +
 +private slots:
 +	void doOK();
 +	void doCancel();
 +	void settingChanged() { settingsDirty = true; };
 +};
 +
 +
 diff --git a/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.vcproj b/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.vcproj index 55e6d66b..ae299ed2 100644 --- a/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.vcproj +++ b/FTNoIR_Tracker_UDP/FTNoIR_Tracker_UDP.vcproj @@ -180,17 +180,91 @@  			<File
  				RelativePath=".\ftnoir_tracker_base.h"
  				>
 +				<FileConfiguration
 +					Name="Release|Win32"
 +					>
 +					<Tool
 +						Name="VCCustomBuildTool"
 +						Description=""
 +						CommandLine=""
 +						AdditionalDependencies=""
 +						Outputs=""
 +					/>
 +				</FileConfiguration>
 +				<FileConfiguration
 +					Name="Debug|Win32"
 +					>
 +					<Tool
 +						Name="VCCustomBuildTool"
 +						Description=""
 +						CommandLine=""
 +						AdditionalDependencies=""
 +						Outputs=""
 +					/>
 +				</FileConfiguration>
  			</File>
  			<File
  				RelativePath=".\ftnoir_tracker_base_global.h"
  				>
  			</File>
 +			<File
 +				RelativePath=".\FTNoIR_Tracker_UDP.h"
 +				>
 +				<FileConfiguration
 +					Name="Release|Win32"
 +					>
 +					<Tool
 +						Name="VCCustomBuildTool"
 +						Description="Moc'ing $(InputFileName)..."
 +						CommandLine=""$(QTDIR)\bin\moc.exe"  "$(InputPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp" -D_WINDLL -DFTNOIR_TRACKER_BASE_LIB -DNDEBUG -DQT_CORE_LIB -DQT_LARGEFILE_SUPPORT -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -DUNICODE -DWIN32 -I"$(QTDIR)\include\." -I"$(QTDIR)\include\QtCore\." -I"$(QTDIR)\include\QtGui\." -I"$(QTDIR)\include\qtmain\." -I"$(QTDIR)\include\QtNetwork\." -I".\." -I".\GeneratedFiles\$(ConfigurationName)\." -I".\GeneratedFiles\."
"
 +						AdditionalDependencies=""$(QTDIR)\bin\moc.exe";$(InputPath)"
 +						Outputs="".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp""
 +					/>
 +				</FileConfiguration>
 +				<FileConfiguration
 +					Name="Debug|Win32"
 +					>
 +					<Tool
 +						Name="VCCustomBuildTool"
 +						Description="Moc'ing $(InputFileName)..."
 +						CommandLine=""$(QTDIR)\bin\moc.exe"  "$(InputPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp" -D_WINDLL -DFTNOIR_TRACKER_UDP_LIB -DQT_CORE_LIB -DQT_LARGEFILE_SUPPORT -DQT_THREAD_SUPPORT -DUNICODE -DWIN32 -I"$(QTDIR)\include\." -I"$(QTDIR)\include\QtCore\." -I"$(QTDIR)\include\qtmain\." -I".\." -I".\GeneratedFiles\$(ConfigurationName)\." -I".\GeneratedFiles\."
"
 +						AdditionalDependencies=""$(QTDIR)\bin\moc.exe";$(InputPath)"
 +						Outputs="".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp""
 +					/>
 +				</FileConfiguration>
 +			</File>
  		</Filter>
  		<Filter
  			Name="Form Files"
  			Filter="ui"
  			UniqueIdentifier="{99349809-55BA-4b9d-BF79-8FDBB0286EB3}"
  			>
 +			<File
 +				RelativePath=".\FTNoIR_FTNClientControls.ui"
 +				>
 +				<FileConfiguration
 +					Name="Release|Win32"
 +					>
 +					<Tool
 +						Name="VCCustomBuildTool"
 +						Description="Uic'ing $(InputFileName)..."
 +						CommandLine=""$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_$(InputName).h" "$(InputPath)"
"
 +						AdditionalDependencies="$(QTDIR)\bin\uic.exe"
 +						Outputs="".\GeneratedFiles\ui_$(InputName).h""
 +					/>
 +				</FileConfiguration>
 +				<FileConfiguration
 +					Name="Debug|Win32"
 +					>
 +					<Tool
 +						Name="VCCustomBuildTool"
 +						Description="Uic'ing $(InputFileName)..."
 +						CommandLine=""$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_$(InputName).h" "$(InputPath)"
"
 +						AdditionalDependencies="$(QTDIR)\bin\uic.exe"
 +						Outputs="".\GeneratedFiles\ui_$(InputName).h""
 +					/>
 +				</FileConfiguration>
 +			</File>
  		</Filter>
  		<Filter
  			Name="Resource Files"
 @@ -205,6 +279,46 @@  			UniqueIdentifier="{71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11}"
  			SourceControlFiles="false"
  			>
 +			<File
 +				RelativePath=".\GeneratedFiles\ui_FTNoIR_FTNClientControls.h"
 +				>
 +			</File>
 +			<Filter
 +				Name="Release"
 +				Filter="cpp;moc"
 +				SourceControlFiles="false"
 +				>
 +				<File
 +					RelativePath=".\GeneratedFiles\Release\moc_FTNoIR_Tracker_UDP.cpp"
 +					>
 +					<FileConfiguration
 +						Name="Debug|Win32"
 +						ExcludedFromBuild="true"
 +						>
 +						<Tool
 +							Name="VCCLCompilerTool"
 +						/>
 +					</FileConfiguration>
 +				</File>
 +			</Filter>
 +			<Filter
 +				Name="Debug"
 +				Filter="cpp;moc"
 +				SourceControlFiles="false"
 +				>
 +				<File
 +					RelativePath=".\GeneratedFiles\Debug\moc_FTNoIR_Tracker_UDP.cpp"
 +					>
 +					<FileConfiguration
 +						Name="Release|Win32"
 +						ExcludedFromBuild="true"
 +						>
 +						<Tool
 +							Name="VCCLCompilerTool"
 +						/>
 +					</FileConfiguration>
 +				</File>
 +			</Filter>
  		</Filter>
  	</Files>
  	<Globals>
 diff --git a/FTNoIR_Tracker_UDP/ftnoir_tracker_base.h b/FTNoIR_Tracker_UDP/ftnoir_tracker_base.h index 60f0caf3..f39a8b4d 100644 --- a/FTNoIR_Tracker_UDP/ftnoir_tracker_base.h +++ b/FTNoIR_Tracker_UDP/ftnoir_tracker_base.h @@ -2,6 +2,7 @@  #define FTNOIR_TRACKER_BASE_H
  #include "ftnoir_tracker_base_global.h"
 +#include <QtGui/QWidget>
  //
  // x,y,z position in centimetres, yaw, pitch and roll in degrees...
 @@ -19,7 +20,7 @@ struct THeadPoseData {  // Instances are obtained via factory function.
  struct ITracker
  {
 -    virtual void Release() = 0;
 +    virtual void Release() = 0;									// Member required to enable Auto-remove
  	virtual void Initialize() = 0;
  	virtual void StartTracker() = 0;
  	virtual void GiveHeadPoseData(THeadPoseData *data) = 0;
 @@ -44,4 +45,27 @@ __stdcall  GetTracker(
      void);
 +
 +// COM-Like abstract interface.
 +// This interface doesn't require __declspec(dllexport/dllimport) specifier.
 +// Method calls are dispatched via virtual table.
 +// Any C++ compiler can use it.
 +// Instances are obtained via factory function.
 +struct ITrackerDialog
 +{
 +    virtual void Release() = 0;									// Member required to enable Auto-remove
 +	virtual void Initialize(QWidget *parent) = 0;
 +};
 +
 +// Handle type. In C++ language the iterface type is used.
 +typedef ITrackerDialog* TRACKERDIALOGHANDLE;
 +
 +// Factory function that creates instances of the Tracker object.
 +EXTERN_C
 +FTNOIR_TRACKER_BASE_EXPORT
 +TRACKERDIALOGHANDLE
 +__stdcall
 +GetTrackerDialog(void);
 +
 +
  #endif // FTNOIR_TRACKER_BASE_H
 diff --git a/FTNoIR_Tracker_UDP/ftnoir_tracker_udp.cpp b/FTNoIR_Tracker_UDP/ftnoir_tracker_udp.cpp index 9dfb26a7..93ef60b6 100644 --- a/FTNoIR_Tracker_UDP/ftnoir_tracker_udp.cpp +++ b/FTNoIR_Tracker_UDP/ftnoir_tracker_udp.cpp @@ -1,51 +1,4 @@ -#include "ftnoir_tracker_base.h"
 -#include <QThread>
 -#include <QUdpSocket>
 -#include <QMessageBox>
 -#include "Windows.h"
 -#include "math.h"
 -
 -class FTNoIR_Tracker_UDP : public ITracker, QThread
 -{
 -public:
 -	FTNoIR_Tracker_UDP();
 -	~FTNoIR_Tracker_UDP();
 -
 -	void Release();
 -    void Initialize();
 -    void StartTracker();
 -	void GiveHeadPoseData(THeadPoseData *data);
 -
 -	bool setParameterValue(const int index, const float newvalue);
 -
 -protected:
 -	void run();												// qthread override run method
 -
 -private:
 -	// Handles to neatly terminate thread...
 -	HANDLE m_StopThread;
 -	HANDLE m_WaitThread;
 -
 -	// UDP socket-variables
 -	QUdpSocket *inSocket;									// Receive from ...
 -	QUdpSocket *outSocket;									// Send to ...
 -	QHostAddress destIP;									// Destination IP-address
 -	int destPort;											// Destination port-number
 -	QHostAddress srcIP;										// Source IP-address
 -	int srcPort;											// Source port-number
 -
 -	THeadPoseData newHeadPose;								// Structure with new headpose
 -
 -	//parameter list for the filter-function(s)
 -	enum
 -	{
 -		kPortAddress=0,										// Index in QList
 -		kNumFilterParameters								// Indicate number of parameters used
 -	};
 -	QList<std::pair<float,float>>	parameterRange;
 -	QList<float>					parameterValueAsFloat;
 -
 -};
 +#include "ftnoir_tracker_udp.h"
  FTNoIR_Tracker_UDP::FTNoIR_Tracker_UDP()
  {
 @@ -71,23 +24,6 @@ FTNoIR_Tracker_UDP::FTNoIR_Tracker_UDP()  	newHeadPose.yaw   = 0.0f;
  	newHeadPose.pitch = 0.0f;
  	newHeadPose.roll  = 0.0f;
 -
 -	//
 -	// Create UDP-sockets if they don't exist already.
 -	// They must be created here, because they must be in the new thread (FTNoIR_Tracker_UDP::run())
 -	//
 -	if (inSocket == 0) {
 -		qDebug() << "FTNoIR_Tracker_UDP::run() creating insocket";
 -		inSocket = new QUdpSocket();
 -		// Connect the inSocket to the port, to receive messages
 -		
 -		if (!inSocket->bind(QHostAddress::Any, (int) parameterValueAsFloat[kPortAddress], QUdpSocket::ShareAddress )) {
 -			QMessageBox::warning(0,"FaceTrackNoIR Error", "Unable to bind UDP-port",QMessageBox::Ok,QMessageBox::NoButton);
 -			delete inSocket;
 -			inSocket = 0;
 -		}
 -	}
 -
  }
  FTNoIR_Tracker_UDP::~FTNoIR_Tracker_UDP()
 @@ -163,6 +99,25 @@ void FTNoIR_Tracker_UDP::Release()  void FTNoIR_Tracker_UDP::Initialize()
  {
 +	qDebug() << "FTNoIR_Tracker_UDP::Initialize says: Starting ";
 +	loadSettings();
 +
 +	//
 +	// Create UDP-sockets if they don't exist already.
 +	// They must be created here, because they must be in the new thread (FTNoIR_Tracker_UDP::run())
 +	//
 +	if (inSocket == 0) {
 +		qDebug() << "FTNoIR_Tracker_UDP::Initialize() creating insocket";
 +		inSocket = new QUdpSocket();
 +		// Connect the inSocket to the port, to receive messages
 +		
 +		if (!inSocket->bind(QHostAddress::Any, (int) parameterValueAsFloat[kPortAddress], QUdpSocket::ShareAddress )) {
 +			QMessageBox::warning(0,"FaceTrackNoIR Error", "Unable to bind UDP-port",QMessageBox::Ok,QMessageBox::NoButton);
 +			delete inSocket;
 +			inSocket = 0;
 +		}
 +	}
 +
  	return;
  }
 @@ -211,6 +166,24 @@ bool FTNoIR_Tracker_UDP::setParameterValue(const int index, const float newvalue  	}
  };
 +//
 +// Load the current Settings from the currently 'active' INI-file.
 +//
 +void FTNoIR_Tracker_UDP::loadSettings() {
 +
 +	qDebug() << "FTNoIR_Tracker_UDP::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() << "FTNoIR_Tracker_UDP::loadSettings says: iniFile = " << currentFile;
 +
 +	iniFile.beginGroup ( "FTNClient" );
 +	setParameterValue(kPortAddress, (float) iniFile.value ( "PortNumber", 5550 ).toInt());
 +	iniFile.endGroup ();
 +}
 +
  ////////////////////////////////////////////////////////////////////////////////
  // Factory function that creates instances if the Tracker object.
 @@ -226,3 +199,161 @@ FTNOIR_TRACKER_BASE_EXPORT TRACKERHANDLE __stdcall GetTracker()  	return new FTNoIR_Tracker_UDP;
  }
 +//*******************************************************************************************************
 +// FaceTrackNoIR Client Settings-dialog.
 +//*******************************************************************************************************
 +
 +//
 +// Constructor for server-settings-dialog
 +//
 +FTNClientControls::FTNClientControls( QWidget *parent, Qt::WindowFlags f ) :
 +QWidget( parent , f)
 +{
 +	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()));
 +	//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
 +//
 +FTNClientControls::~FTNClientControls() {
 +	qDebug() << "~FTNClientControls() says: started";
 +}
 +
 +void FTNClientControls::Release()
 +{
 +    delete this;
 +}
 +
 +//
 +// Initialize tracker-client-dialog
 +//
 +void FTNClientControls::Initialize(QWidget *parent) {
 +
 +	QPoint offsetpos(100, 100);
 +	if (parent) {
 +		this->move(parent->pos() + offsetpos);
 +	}
 +	show();
 +}
 +
 +//
 +// OK clicked on server-dialog
 +//
 +void FTNClientControls::doOK() {
 +	save();
 +	this->close();
 +}
 +
 +// override show event
 +void FTNClientControls::showEvent ( QShowEvent * event ) {
 +	loadSettings();
 +}
 +
 +//
 +// Cancel clicked on server-dialog
 +//
 +void FTNClientControls::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 FTNClientControls::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 ( "FTNClient" );
 +	//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 ();
 +
 +	settingsDirty = false;
 +}
 +
 +//
 +// Save the current Settings to the currently 'active' INI-file.
 +//
 +void FTNClientControls::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 ( "FTNClient" );
 +	//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;
 +}
 +////////////////////////////////////////////////////////////////////////////////
 +// Factory function that creates instances if the Tracker-settings dialog object.
 +
 +// Export both decorated and undecorated names.
 +//   GetTrackerDialog     - Undecorated name, which can be easily used with GetProcAddress
 +//                          Win32 API function.
 +//   _GetTrackerDialog@0  - Common name decoration for __stdcall functions in C language.
 +#pragma comment(linker, "/export:GetTrackerDialog=_GetTrackerDialog@0")
 +
 +FTNOIR_TRACKER_BASE_EXPORT TRACKERDIALOGHANDLE __stdcall GetTrackerDialog( )
 +{
 +	return new FTNClientControls;
 +}
  | 
