Added Tactile fluids, fixed tactile buttons
authorThomas Pietrzak <thomas.pietrzak@gmail.com>
Wed, 23 Jan 2013 10:55:46 +0000 (10:55 +0000)
committerThomas Pietrzak <thomas.pietrzak@gmail.com>
Wed, 23 Jan 2013 10:55:46 +0000 (10:55 +0000)
git-svn-id: svn+ssh://thomaspietrzak.com/var/svn/rep@100 47cf9a05-e0a8-4ed5-9e9b-101a649bc004

16 files changed:
DwellCursor.sln [deleted file]
DwellCursor.suo [deleted file]
PushButtons/MainScene.cpp
PushButtons/PushButton.cpp
TactileButtons.sln
TactileButtons.suo
TactileFluids/KinectInput.cpp [new file with mode: 0644]
TactileFluids/KinectInput.h [new file with mode: 0644]
TactileFluids/OneEuroFilter.cpp [new file with mode: 0644]
TactileFluids/OneEuroFilter.h [new file with mode: 0644]
TactileFluids/TactileFluids.cpp [new file with mode: 0644]
TactileFluids/TactileFluids.h [new file with mode: 0644]
TactileFluids/TactileFluids.vcxproj [new file with mode: 0644]
TactileFluids/main.cpp [new file with mode: 0644]
TactileFluids/tactilefluids.qrc [new file with mode: 0644]
TactileFluids/tactilefluids.ui [new file with mode: 0644]

diff --git a/DwellCursor.sln b/DwellCursor.sln
deleted file mode 100644 (file)
index 588db48..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-\r
-Microsoft Visual Studio Solution File, Format Version 11.00\r
-# Visual Studio 2010\r
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DwellCursor", "DwellCursor\DwellCursor.vcxproj", "{2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}"\r
-EndProject\r
-Global\r
-       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
-               Debug|Win32 = Debug|Win32\r
-               Release|Win32 = Release|Win32\r
-       EndGlobalSection\r
-       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
-               {2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}.Debug|Win32.ActiveCfg = Debug|Win32\r
-               {2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}.Debug|Win32.Build.0 = Debug|Win32\r
-               {2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}.Release|Win32.ActiveCfg = Release|Win32\r
-               {2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}.Release|Win32.Build.0 = Release|Win32\r
-       EndGlobalSection\r
-       GlobalSection(SolutionProperties) = preSolution\r
-               HideSolutionNode = FALSE\r
-       EndGlobalSection\r
-EndGlobal\r
diff --git a/DwellCursor.suo b/DwellCursor.suo
deleted file mode 100644 (file)
index ed03066..0000000
Binary files a/DwellCursor.suo and /dev/null differ
index 08ecd6a52eae625fae73696b85ff411bba72f1d3..e60d433405ae287daedb998f2f891ff8342ff31d 100644 (file)
Binary files a/PushButtons/MainScene.cpp and b/PushButtons/MainScene.cpp differ
index 1dd7051116786880b2910c4bfa9cf591b68fdb53..38084af880bbd81f335513c9c855e1944a62acd9 100644 (file)
@@ -1,6 +1,7 @@
 #include "PushButton.h"\r
 \r
 #include <QBrush>\r
+#include <QDebug>\r
 \r
 QColor PushButton::_bgcolor = Qt::gray;\r
 QColor PushButton::_hovercolor = Qt::lightGray;\r
@@ -8,7 +9,7 @@ QColor PushButton::_validatedcolor = Qt::red;
 QColor PushButton::_targetcolor = Qt::green;\r
 QColor PushButton::_targethovercolor = Qt::yellow;\r
 \r
-const float PushButton::_pushdistance = 0.1;\r
+const float PushButton::_pushdistance = 0.05;\r
 \r
 \r
 PushButton::PushButton(QGraphicsItem *parent)\r
index c7b7611d3001b628aa6fdab1a605a2250f3ddb4d..b12eb95e5c92e496a30df74c7f46c3e50cd46d30 100644 (file)
@@ -5,6 +5,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PushButtons", "PushButtons\
 EndProject\r
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DwellCursor", "DwellCursor\DwellCursor.vcxproj", "{2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}"\r
 EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TactileFluids", "TactileFluids\TactileFluids.vcxproj", "{014A41B9-3E4D-48F0-B5D7-8C6FE42A142E}"\r
+EndProject\r
 Global\r
        GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
                Debug|Win32 = Debug|Win32\r
@@ -19,6 +21,10 @@ Global
                {2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}.Debug|Win32.Build.0 = Debug|Win32\r
                {2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}.Release|Win32.ActiveCfg = Release|Win32\r
                {2928B2FC-98F8-427E-B0D2-2CEA2DA1FFC9}.Release|Win32.Build.0 = Release|Win32\r
+               {014A41B9-3E4D-48F0-B5D7-8C6FE42A142E}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {014A41B9-3E4D-48F0-B5D7-8C6FE42A142E}.Debug|Win32.Build.0 = Debug|Win32\r
+               {014A41B9-3E4D-48F0-B5D7-8C6FE42A142E}.Release|Win32.ActiveCfg = Release|Win32\r
+               {014A41B9-3E4D-48F0-B5D7-8C6FE42A142E}.Release|Win32.Build.0 = Release|Win32\r
        EndGlobalSection\r
        GlobalSection(SolutionProperties) = preSolution\r
                HideSolutionNode = FALSE\r
index a914ffb1936113823fa2d850d9923995e1b7d215..95b9ff68fbc8d38f0706f6ca0cdbbc6fcc708875 100644 (file)
Binary files a/TactileButtons.suo and b/TactileButtons.suo differ
diff --git a/TactileFluids/KinectInput.cpp b/TactileFluids/KinectInput.cpp
new file mode 100644 (file)
index 0000000..e908518
--- /dev/null
@@ -0,0 +1,99 @@
+#include "KinectInput.h"\r
+\r
+#include <QDebug>\r
+\r
+#define TIMEOUT 100\r
+\r
+KinectInput::KinectInput()\r
+:_running(false), _skeletonid(-1), _skeletonEvent(NULL)\r
+{\r
+       //creates the kinect sensor (id 0)\r
+       if(FAILED(NuiCreateSensorByIndex(0, &_kinect)))\r
+    {\r
+               qDebug() << "Cannot find a KINECT sensor" << endl;\r
+               //I should do something else, sucha as an exception\r
+        return;\r
+    }\r
+\r
+    if (_kinect->NuiInitialize(NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX | NUI_INITIALIZE_FLAG_USES_SKELETON) == E_NUI_SKELETAL_ENGINE_BUSY)\r
+    {\r
+               qDebug() << "Cannot initialize the KINECT sensor" << endl;\r
+        return;\r
+   }\r
+\r
+       //initialize the skeleton tracking\r
+       _skeletonEvent = CreateEvent(NULL, TRUE, FALSE, NULL);\r
+       if(!HasSkeletalEngine(_kinect) || FAILED(_kinect->NuiSkeletonTrackingEnable(_skeletonEvent, 0)))\r
+    {\r
+               qDebug() << "Cannot Initialize skeleton tracking" << endl;\r
+        return;\r
+    }\r
+}\r
+\r
+KinectInput::~KinectInput()\r
+{\r
+       NuiShutdown();\r
+       if( _skeletonEvent && ( _skeletonEvent != INVALID_HANDLE_VALUE ) )\r
+        CloseHandle( _skeletonEvent );\r
+}\r
+\r
+//thread that manages the kinect events\r
+void KinectInput::run()\r
+{\r
+       _running = true;\r
+       while(_running)\r
+       {\r
+               //wait for an event\r
+               if (WaitForSingleObject(_skeletonEvent, TIMEOUT) != 0)\r
+                       continue;\r
+\r
+               //get skeleton values\r
+               NUI_SKELETON_FRAME SkeletonFrame;\r
+               HRESULT hr = _kinect->NuiSkeletonGetNextFrame( 0, &SkeletonFrame );\r
+//             qDebug() << "Kinect frame " << SkeletonFrame.dwFrameNumber;\r
+\r
+               //if no skeleton already identified or not tracked anymore, search for one\r
+               if (_skeletonid < 0 || SkeletonFrame.SkeletonData[_skeletonid].eTrackingState != NUI_SKELETON_TRACKED)\r
+               {\r
+                       for( int i = 0 ; i < NUI_SKELETON_COUNT ; i++ )\r
+                       {\r
+                               if(SkeletonFrame.SkeletonData[i].eTrackingState == NUI_SKELETON_TRACKED)\r
+                               {\r
+                                       _skeletonid = i;\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               //no skeleton found\r
+               if (_skeletonid < 0)\r
+                       continue;\r
+\r
+               //retrieve information on the skeleton\r
+               NUI_SKELETON_DATA &data = SkeletonFrame.SkeletonData[_skeletonid];\r
+\r
+               //checking if we have a skeleton\r
+/*             if (data.eTrackingState != NUI_SKELETON_TRACKED)\r
+                       continue;*/\r
+\r
+               //smooth out the skeleton data\r
+               _kinect->NuiTransformSmooth(&SkeletonFrame, NULL);\r
+\r
+\r
+               if (data.eSkeletonPositionTrackingState[NUI_SKELETON_POSITION_HAND_RIGHT] == NUI_SKELETON_NOT_TRACKED)\r
+                       continue; //right hand not detected\r
+               else\r
+               {\r
+/*                     float posx, posy;\r
+                       NuiTransformSkeletonToDepthImageF(data.SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT], &posx, &posy);\r
+                       emit rightHandMove(posx, posy,0);*/\r
+                       Vector4 &skelpos = data.SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT];\r
+                       emit rightHandMove(skelpos.x, skelpos.y, skelpos.z);\r
+        }\r
+       }\r
+}\r
+\r
+void KinectInput::stop()\r
+{\r
+       _running = false;\r
+}\r
diff --git a/TactileFluids/KinectInput.h b/TactileFluids/KinectInput.h
new file mode 100644 (file)
index 0000000..b4bf077
--- /dev/null
@@ -0,0 +1,29 @@
+#ifndef __KINECTINPUT__\r
+#define __KINECTINPUT__\r
+\r
+#include <QObject>\r
+#include <QThread>\r
+#include <Windows.h>\r
+#include <NuiAPI.h>\r
+\r
+class KinectInput: public QThread\r
+{\r
+       Q_OBJECT\r
+       public:\r
+               KinectInput();\r
+               ~KinectInput();\r
+\r
+               void run();\r
+               void stop();\r
+\r
+       private:\r
+               INuiSensor* _kinect;\r
+               HANDLE _skeletonEvent;\r
+               bool _running;\r
+               int _skeletonid;\r
+\r
+       signals:\r
+               void rightHandMove(float x, float y, float z);\r
+};\r
+\r
+#endif\r
diff --git a/TactileFluids/OneEuroFilter.cpp b/TactileFluids/OneEuroFilter.cpp
new file mode 100644 (file)
index 0000000..02377c4
--- /dev/null
@@ -0,0 +1,113 @@
+#include "OneEuroFilter.h"\r
+\r
+#define _USE_MATH_DEFINES \r
+#include <cmath>\r
+#include <stdexcept>\r
+\r
+LowPassFilter::LowPassFilter(double alpha, double initval) \r
+:_y(initval), _s(initval), _initialized(false)\r
+{\r
+       setAlpha(alpha);\r
+}\r
+\r
+double LowPassFilter::filter(double value) \r
+{\r
+       double result;\r
+       if (_initialized)\r
+               result = _a * value + (1.0 - _a) * _s;\r
+       else \r
+       {\r
+               result = value;\r
+               _initialized = true;\r
+       }\r
+       _y = value;\r
+       _s = result;\r
+       return result;\r
+}\r
+\r
+double LowPassFilter::filterWithAlpha(double value, double alpha) \r
+{\r
+       setAlpha(alpha);\r
+       return filter(value);\r
+}\r
+\r
+bool LowPassFilter::hasLastRawValue(void) \r
+{\r
+       return _initialized;\r
+}\r
+\r
+double LowPassFilter::lastRawValue(void) \r
+{\r
+       return _y ;\r
+}\r
+\r
+void LowPassFilter::setAlpha(double alpha) \r
+{\r
+       if (alpha <= 0.0 || alpha > 1.0) \r
+               throw std::range_error("alpha should be in ]0.0., 1.0]");\r
+       _a = alpha;\r
+}\r
+\r
+\r
+OneEuroFilter::OneEuroFilter(double freq, double mincutoff, double beta, double dcutoff)\r
+:_x(new LowPassFilter(alpha(mincutoff))), _dx(new LowPassFilter(alpha(dcutoff))), _lasttime(UndefinedTime)\r
+{\r
+               setFrequency(freq);\r
+               setMinCutoff(mincutoff);\r
+               setBeta(beta);\r
+               setDerivateCutoff(dcutoff);\r
+}\r
+\r
+OneEuroFilter::~OneEuroFilter(void) \r
+{\r
+       delete _x;\r
+       delete _dx;\r
+}\r
+\r
+double OneEuroFilter::filter(double value, TimeStamp timestamp) \r
+{\r
+       // update the sampling frequency based on timestamps\r
+       if (_lasttime != UndefinedTime && timestamp != UndefinedTime)\r
+               _freq = 1.0 / (timestamp - _lasttime);\r
+       _lasttime = timestamp;\r
+       // estimate the current variation per second \r
+       double dvalue = _x->hasLastRawValue() ? (value - _x->lastRawValue()) * _freq : 0.0; // FIXME: 0.0 or value?\r
+       double edvalue = _dx->filterWithAlpha(dvalue, alpha(_dcutoff));\r
+       // use it to update the cutoff frequency\r
+       double cutoff = _mincutoff + _beta * fabs(edvalue);\r
+       // filter the given value\r
+       return _x->filterWithAlpha(value, alpha(cutoff));\r
+}\r
+\r
+double OneEuroFilter::alpha(double cutoff) \r
+{\r
+       double te = 1.0 / _freq;\r
+       double tau = 1.0 / (2 * M_PI * cutoff);\r
+       return 1.0 / (1.0 + tau/te);\r
+}\r
+\r
+void OneEuroFilter::setFrequency(double f) \r
+{\r
+       if (f <= 0) \r
+               throw std::range_error("freq should be >0");\r
+       _freq = f;\r
+}\r
+\r
+void OneEuroFilter::setMinCutoff(double mc) \r
+{\r
+       if (mc <= 0) \r
+               throw std::range_error("mincutoff should be >0");\r
+       _mincutoff = mc;\r
+}\r
+\r
+void OneEuroFilter::setBeta(double b) \r
+{\r
+       _beta = b;\r
+}\r
+\r
+void OneEuroFilter::setDerivateCutoff(double dc) \r
+{\r
+       if (dc <= 0) \r
+               throw std::range_error("dcutoff should be >0");\r
+       _dcutoff = dc;\r
+}\r
diff --git a/TactileFluids/OneEuroFilter.h b/TactileFluids/OneEuroFilter.h
new file mode 100644 (file)
index 0000000..100a5ae
--- /dev/null
@@ -0,0 +1,62 @@
+/*\r
+ * OneEuroFilter.h/.cpp -\r
+ *\r
+ * Author: Thomas Pietrzak (thomas.pietrzak@lifl.fr)\r
+ * based on code from\r
+ * Nicolas Roussel (nicolas.roussel@inria.fr)\r
+ *\r
+ */\r
+\r
+\r
+#ifndef __ONEEURO__\r
+#define __ONEEURO__\r
+\r
+\r
+typedef double TimeStamp ; // in seconds\r
+\r
+static const TimeStamp UndefinedTime = -1.0 ;\r
+\r
+\r
+class LowPassFilter \r
+{\r
+       public:\r
+               LowPassFilter(double alpha, double initval=0.0);\r
+\r
+               double filterWithAlpha(double value, double alpha);\r
+               inline bool hasLastRawValue(void);\r
+               inline double lastRawValue(void);\r
+\r
+       private:\r
+               double _y, _a, _s;\r
+               bool _initialized;\r
+\r
+               void setAlpha(double alpha);\r
+               double filter(double value);\r
+} ;\r
+\r
+class OneEuroFilter \r
+{\r
+       public:\r
+               OneEuroFilter(\r
+                       double freq, \r
+                       double mincutoff=1.0, \r
+                       double beta_=0.0, \r
+                       double dcutoff=1.0);\r
+       \r
+               ~OneEuroFilter();\r
+\r
+               double filter(double value, TimeStamp timestamp=UndefinedTime);\r
+\r
+       private:\r
+               double _freq, _mincutoff, _beta;, _dcutoff;\r
+               LowPassFilter *_x, *_dx;\r
+               TimeStamp _lasttime;\r
+\r
+               double alpha(double cutoff);\r
+               inline void setFrequency(double f);\r
+               inline void setMinCutoff(double mc);\r
+               inline void setBeta(double b);\r
+               inline void setDerivateCutoff(double dc);\r
+} ;\r
+\r
+#endif\r
diff --git a/TactileFluids/TactileFluids.cpp b/TactileFluids/TactileFluids.cpp
new file mode 100644 (file)
index 0000000..83ab8d3
--- /dev/null
@@ -0,0 +1,100 @@
+#include "TactileFluids.h"\r
+\r
+#include <QDebug>\r
+#include <QDateTime>\r
+\r
+TactileFluids::TactileFluids(QWidget *parent, Qt::WFlags flags)\r
+: QMainWindow(parent, flags), _filter(100.0, 1.0)\r
+{\r
+       try\r
+       {\r
+               _tactonplayer = new TactonPlayer("COM8");\r
+       }\r
+       catch (...)\r
+       {\r
+               _tactonplayer = NULL;\r
+               qDebug() << "No wristband found";\r
+       }\r
+\r
+       setupUi(this);\r
+\r
+       _pos.x = _pos.y = _pos.z = 0.0;\r
+\r
+       _tactonplayer->setFrequency(_frequency->value());\r
+\r
+       connect(_frequency, SIGNAL(valueChanged(int)), this, SLOT(updateFrequency(int)));\r
+\r
+       connect(&_kinectsensor, SIGNAL(rightHandMove(float,float,float)), \r
+               this, SLOT(updateHand(float,float,float)));\r
+\r
+       _kinectsensor.start();\r
+       _timer.start();\r
+\r
+       _tactonplayer->setFrequency(_frequency->value());\r
+}\r
+\r
+TactileFluids::~TactileFluids()\r
+{\r
+       _kinectsensor.stop();\r
+\r
+       if (_tactonplayer)\r
+       {\r
+               unsigned char amp[] = {0, 0, 0, 0};\r
+               _tactonplayer->setAmplitudes(4, amp);\r
+               delete _tactonplayer;\r
+       }\r
+}\r
+\r
+void TactileFluids::updateFrequency(int f)\r
+{\r
+       _tactonplayer->setFrequency(f);\r
+}\r
+\r
+void TactileFluids::updateHand(float x, float y, float z)\r
+{\r
+       float dx = x - _pos.x;\r
+       float dy = y - _pos.y;\r
+       float dz = z - _pos.z;\r
+       float speed = 100000 * sqrt(dx*dx + dy*dy + dz*dz) / _timer.elapsed();\r
+\r
+       //filter the speed value\r
+       try\r
+       {\r
+               speed = _filter.filter(speed, QDateTime::currentMSecsSinceEpoch());\r
+       }\r
+       catch(...)\r
+       {\r
+               qDebug() << "Filter went wrong speed=" << speed << " timestamp=" << QDateTime::currentMSecsSinceEpoch();\r
+       }\r
+\r
+       //cap values between 0 and 255\r
+       if (speed <= _minspeed->value())\r
+       {\r
+               unsigned char amp[] = {0, 0, 0, 0};\r
+               _tactonplayer->setAmplitudes(4, amp);\r
+       }\r
+       else if (speed >= _maxspeed->value())\r
+       {\r
+               unsigned char amp[] = {255, 255, 255, 255};\r
+               _tactonplayer->setAmplitudes(4, amp);\r
+       }\r
+       else\r
+       {\r
+               unsigned char amp[4];\r
+               memset(amp, unsigned char(255 * (speed - _minspeed->value()) / (_maxspeed->value() - _minspeed->value())), 4);\r
+               _tactonplayer->setAmplitudes(4, amp);\r
+       }\r
+\r
+       //qDebug() << "deltat = " << _timer.elapsed() << " dist = " << sqrt(dx*dx + dy*dy + dz*dz) << "\n";\r
+       _timer.restart();\r
+\r
+       _pos.x = x;\r
+       _pos.y = y;\r
+       _pos.z = z;\r
+\r
+       _x->setText("x=" + QString::number(_pos.x, 'f', 3));\r
+       _y->setText("y=" + QString::number(_pos.y, 'f', 3));\r
+       _z->setText("z=" + QString::number(_pos.z, 'f', 3));\r
+       _v->setText("v=" + QString::number(speed, 'f', 3));\r
+\r
+}\r
diff --git a/TactileFluids/TactileFluids.h b/TactileFluids/TactileFluids.h
new file mode 100644 (file)
index 0000000..c3b80c0
--- /dev/null
@@ -0,0 +1,33 @@
+#ifndef TACTILEFLUIDS_H\r
+#define TACTILEFLUIDS_H\r
+\r
+#include <QtGui/QMainWindow>\r
+#include "ui_tactilefluids.h"\r
+\r
+#include <QTime>\r
+#include <TactonPlayer\TactonPlayer.hpp>\r
+\r
+#include "KinectInput.h"\r
+#include "OneEuroFilter.h"\r
+\r
+class TactileFluids : public QMainWindow, public Ui::TactileFluidsClass\r
+{\r
+       Q_OBJECT\r
+\r
+       public:\r
+               TactileFluids(QWidget *parent = 0, Qt::WFlags flags = 0);\r
+               ~TactileFluids();\r
+\r
+       private:\r
+               KinectInput _kinectsensor;\r
+               TactonPlayer *_tactonplayer;\r
+               struct { float x, y, z; } _pos;\r
+               QTime _timer;\r
+               OneEuroFilter _filter;\r
+               \r
+       public slots:\r
+               void updateHand(float, float, float);\r
+               void updateFrequency(int);\r
+};\r
+\r
+#endif // TACTILEFLUIDS_H\r
diff --git a/TactileFluids/TactileFluids.vcxproj b/TactileFluids/TactileFluids.vcxproj
new file mode 100644 (file)
index 0000000..1ba5787
--- /dev/null
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{014A41B9-3E4D-48F0-B5D7-8C6FE42A142E}</ProjectGuid>\r
+    <Keyword>Qt4VSv1.0</Keyword>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <PreprocessorDefinitions>UNICODE;WIN32;QT_LARGEFILE_SUPPORT;QT_DLL;QT_CORE_LIB;QT_GUI_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <AdditionalIncludeDirectories>$(KINECTSDK10_DIR)\inc;.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <Optimization>Disabled</Optimization>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>\r
+    </ClCompile>\r
+    <Link>\r
+      <SubSystem>Windows</SubSystem>\r
+      <OutputFile>$(OutDir)\$(ProjectName).exe</OutputFile>\r
+      <AdditionalLibraryDirectories>$(KINECTSDK10_DIR)\lib\x86;;$(QTDIR)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <AdditionalDependencies>TactonPlayerd.lib;Kinect10.lib;qtmaind.lib;QtCored4.lib;QtGuid4.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <PreprocessorDefinitions>UNICODE;WIN32;QT_LARGEFILE_SUPPORT;QT_DLL;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <AdditionalIncludeDirectories>$(KINECTSDK10_DIR)\inc;.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <DebugInformationFormat>\r
+      </DebugInformationFormat>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>\r
+    </ClCompile>\r
+    <Link>\r
+      <SubSystem>Windows</SubSystem>\r
+      <OutputFile>$(OutDir)\$(ProjectName).exe</OutputFile>\r
+      <AdditionalLibraryDirectories>$(KINECTSDK10_DIR)\lib\x86;;$(QTDIR)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>false</GenerateDebugInformation>\r
+      <AdditionalDependencies>TactonPlayer.lib;Kinect10.lib;qtmain.lib;QtCore4.lib;QtGui4.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="GeneratedFiles\Debug\moc_KinectInput.cpp">\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="GeneratedFiles\Debug\moc_TactileFluids.cpp">\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="GeneratedFiles\qrc_tactilefluids.cpp">\r
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+      </PrecompiledHeader>\r
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+      </PrecompiledHeader>\r
+    </ClCompile>\r
+    <ClCompile Include="GeneratedFiles\Release\moc_KinectInput.cpp">\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="GeneratedFiles\Release\moc_TactileFluids.cpp">\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="KinectInput.cpp" />\r
+    <ClCompile Include="main.cpp" />\r
+    <ClCompile Include="OneEuroFilter.cpp" />\r
+    <ClCompile Include="TactileFluids.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <CustomBuild Include="TactileFluids.h">\r
+      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing TactileFluids.h...</Message>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB  "-I$(KINECTSDK10_DIR)\inc" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui"</Command>\r
+      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing TactileFluids.h...</Message>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB  "-I$(KINECTSDK10_DIR)\inc" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui"</Command>\r
+    </CustomBuild>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <CustomBuild Include="tactilefluids.ui">\r
+      <FileType>Document</FileType>\r
+      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\uic.exe;%(AdditionalInputs)</AdditionalInputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Uic%27ing %(Identity)...</Message>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\ui_%(Filename).h;%(Outputs)</Outputs>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"</Command>\r
+      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\uic.exe;%(AdditionalInputs)</AdditionalInputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Uic%27ing %(Identity)...</Message>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\ui_%(Filename).h;%(Outputs)</Outputs>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"</Command>\r
+    </CustomBuild>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="GeneratedFiles\ui_tactilefluids.h" />\r
+    <ClInclude Include="OneEuroFilter.h" />\r
+    <CustomBuild Include="KinectInput.h">\r
+      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing KinectInput.h...</Message>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB "-I$(KINECTSDK10_DIR)\inc" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui"</Command>\r
+      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing KinectInput.h...</Message>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB "-I$(KINECTSDK10_DIR)\inc" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui"</Command>\r
+    </CustomBuild>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <CustomBuild Include="tactilefluids.qrc">\r
+      <FileType>Document</FileType>\r
+      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(FullPath);%(AdditionalInputs)</AdditionalInputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Rcc%27ing %(Identity)...</Message>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\qrc_%(Filename).cpp;%(Outputs)</Outputs>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\rcc.exe" -name "%(Filename)" -no-compress "%(FullPath)" -o .\GeneratedFiles\qrc_%(Filename).cpp</Command>\r
+      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(FullPath);%(AdditionalInputs)</AdditionalInputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Rcc%27ing %(Identity)...</Message>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\qrc_%(Filename).cpp;%(Outputs)</Outputs>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\rcc.exe" -name "%(Filename)" -no-compress "%(FullPath)" -o .\GeneratedFiles\qrc_%(Filename).cpp</Command>\r
+    </CustomBuild>\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+  <ProjectExtensions>\r
+    <VisualStudio>\r
+      <UserProperties UicDir=".\GeneratedFiles" MocDir=".\GeneratedFiles\$(ConfigurationName)" MocOptions="" RccDir=".\GeneratedFiles" lupdateOnBuild="0" lupdateOptions="" lreleaseOptions="" QtVersion_x0020_Win32="4.8.2" />\r
+    </VisualStudio>\r
+  </ProjectExtensions>\r
+</Project>
\ No newline at end of file
diff --git a/TactileFluids/main.cpp b/TactileFluids/main.cpp
new file mode 100644 (file)
index 0000000..c42ab7b
--- /dev/null
@@ -0,0 +1,10 @@
+#include "TactileFluids.h"\r
+#include <QtGui/QApplication>\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+       QApplication a(argc, argv);\r
+       TactileFluids w;\r
+       w.show();\r
+       return a.exec();\r
+}\r
diff --git a/TactileFluids/tactilefluids.qrc b/TactileFluids/tactilefluids.qrc
new file mode 100644 (file)
index 0000000..486c8c8
--- /dev/null
@@ -0,0 +1,4 @@
+<RCC>\r
+    <qresource prefix="TactileFluids">\r
+    </qresource>\r
+</RCC>\r
diff --git a/TactileFluids/tactilefluids.ui b/TactileFluids/tactilefluids.ui
new file mode 100644 (file)
index 0000000..22abb01
--- /dev/null
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ui version="4.0">\r
+ <class>TactileFluidsClass</class>\r
+ <widget class="QMainWindow" name="TactileFluidsClass">\r
+  <property name="geometry">\r
+   <rect>\r
+    <x>0</x>\r
+    <y>0</y>\r
+    <width>322</width>\r
+    <height>164</height>\r
+   </rect>\r
+  </property>\r
+  <property name="windowTitle">\r
+   <string>TactileFluids</string>\r
+  </property>\r
+  <widget class="QWidget" name="centralWidget">\r
+   <layout class="QVBoxLayout" name="verticalLayout">\r
+    <item>\r
+     <layout class="QHBoxLayout" name="horizontalLayout">\r
+      <item>\r
+       <widget class="QLabel" name="label">\r
+        <property name="text">\r
+         <string>Min speed</string>\r
+        </property>\r
+       </widget>\r
+      </item>\r
+      <item>\r
+       <widget class="QSpinBox" name="_minspeed">\r
+        <property name="maximum">\r
+         <number>10000</number>\r
+        </property>\r
+        <property name="singleStep">\r
+         <number>10</number>\r
+        </property>\r
+        <property name="value">\r
+         <number>5</number>\r
+        </property>\r
+       </widget>\r
+      </item>\r
+      <item>\r
+       <widget class="QLabel" name="label_4">\r
+        <property name="text">\r
+         <string>cm/s</string>\r
+        </property>\r
+       </widget>\r
+      </item>\r
+     </layout>\r
+    </item>\r
+    <item>\r
+     <layout class="QHBoxLayout" name="horizontalLayout_2">\r
+      <item>\r
+       <widget class="QLabel" name="label_2">\r
+        <property name="text">\r
+         <string>Max speed</string>\r
+        </property>\r
+       </widget>\r
+      </item>\r
+      <item>\r
+       <widget class="QSpinBox" name="_maxspeed">\r
+        <property name="minimum">\r
+         <number>1</number>\r
+        </property>\r
+        <property name="maximum">\r
+         <number>10000</number>\r
+        </property>\r
+        <property name="singleStep">\r
+         <number>10</number>\r
+        </property>\r
+        <property name="value">\r
+         <number>100</number>\r
+        </property>\r
+       </widget>\r
+      </item>\r
+      <item>\r
+       <widget class="QLabel" name="label_5">\r
+        <property name="text">\r
+         <string>cm/s</string>\r
+        </property>\r
+       </widget>\r
+      </item>\r
+     </layout>\r
+    </item>\r
+    <item>\r
+     <layout class="QHBoxLayout" name="horizontalLayout_3">\r
+      <item>\r
+       <widget class="QLabel" name="label_3">\r
+        <property name="text">\r
+         <string>Frequency</string>\r
+        </property>\r
+       </widget>\r
+      </item>\r
+      <item>\r
+       <widget class="QSpinBox" name="_frequency">\r
+        <property name="minimum">\r
+         <number>1</number>\r
+        </property>\r
+        <property name="maximum">\r
+         <number>1000</number>\r
+        </property>\r
+        <property name="singleStep">\r
+         <number>10</number>\r
+        </property>\r
+        <property name="value">\r
+         <number>250</number>\r
+        </property>\r
+       </widget>\r
+      </item>\r
+      <item>\r
+       <widget class="QLabel" name="label_6">\r
+        <property name="text">\r
+         <string>Hz</string>\r
+        </property>\r
+       </widget>\r
+      </item>\r
+     </layout>\r
+    </item>\r
+    <item>\r
+     <layout class="QHBoxLayout" name="horizontalLayout_4">\r
+      <item>\r
+       <widget class="QLabel" name="_x">\r
+        <property name="text">\r
+         <string>x=</string>\r
+        </property>\r
+       </widget>\r
+      </item>\r
+      <item>\r
+       <widget class="QLabel" name="_y">\r
+        <property name="text">\r
+         <string>y=</string>\r
+        </property>\r
+       </widget>\r
+      </item>\r
+      <item>\r
+       <widget class="QLabel" name="_z">\r
+        <property name="text">\r
+         <string>z=</string>\r
+        </property>\r
+       </widget>\r
+      </item>\r
+      <item>\r
+       <widget class="QLabel" name="_v">\r
+        <property name="text">\r
+         <string>v=</string>\r
+        </property>\r
+       </widget>\r
+      </item>\r
+     </layout>\r
+    </item>\r
+   </layout>\r
+  </widget>\r
+ </widget>\r
+ <layoutdefault spacing="6" margin="11"/>\r
+ <resources>\r
+  <include location="tactilefluids.qrc"/>\r
+ </resources>\r
+ <connections/>\r
+</ui>\r