diff --git a/GazeWebSocketServer.sln b/GazeWebSocketServer.sln new file mode 100644 index 0000000..9b2d5ef --- /dev/null +++ b/GazeWebSocketServer.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29209.62 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GazeWebSocketServer", "GazeWebSocketServer\GazeWebSocketServer.csproj", "{F8F11E64-7946-4054-8C27-F0FCAF967F1A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F8F11E64-7946-4054-8C27-F0FCAF967F1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F8F11E64-7946-4054-8C27-F0FCAF967F1A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F8F11E64-7946-4054-8C27-F0FCAF967F1A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F8F11E64-7946-4054-8C27-F0FCAF967F1A}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {DF0A4C29-6D84-4CC7-9520-F2AFEF6A46B7} + EndGlobalSection +EndGlobal diff --git a/GazeWebSocketServer/App.config b/GazeWebSocketServer/App.config new file mode 100644 index 0000000..56efbc7 --- /dev/null +++ b/GazeWebSocketServer/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/GazeWebSocketServer/EyeTrackerClient.cs b/GazeWebSocketServer/EyeTrackerClient.cs new file mode 100644 index 0000000..61a6101 --- /dev/null +++ b/GazeWebSocketServer/EyeTrackerClient.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tobii.Research; + +namespace GazeWebSocketServer +{ + class EyeTrackerClient + { + private IEyeTracker eyeTracker; + private GazeDataProcessor gazeDataProcessor; + + public EyeTrackerClient() + { + while (eyeTracker == null) + { + EyeTrackerCollection eyeTrackers = EyeTrackingOperations.FindAllEyeTrackers(); + if (eyeTrackers.Count > 0) + { + eyeTracker = eyeTrackers[0]; + } + } + gazeDataProcessor = new GazeDataProcessor(); + eyeTracker.SetGazeOutputFrequency(120f); + } + + public void Start() + { + eyeTracker.GazeDataReceived += GazeDataReceivedHandler; + } + + public void Stop() + { + eyeTracker.GazeDataReceived -= GazeDataReceivedHandler; + } + + private void GazeDataReceivedHandler(object sender, GazeDataEventArgs e) + { + Console.WriteLine(gazeDataProcessor.Extract(e).ToString()); + } + } +} \ No newline at end of file diff --git a/GazeWebSocketServer/GazeCoordinateBehavior.cs b/GazeWebSocketServer/GazeCoordinateBehavior.cs new file mode 100644 index 0000000..23ae0dc --- /dev/null +++ b/GazeWebSocketServer/GazeCoordinateBehavior.cs @@ -0,0 +1,17 @@ +using System; +using WebSocketSharp; +using WebSocketSharp.Server; +using System.Collections.Generic; +using System.Text; + +namespace GazeWebSocketServer +{ + public class GazeCoordinateBehavior : WebSocketBehavior + { + protected override void OnOpen() + { + throw new NotImplementedException(); + //base.OnOpen(); + } + } +} diff --git a/GazeWebSocketServer/GazeData.cs b/GazeWebSocketServer/GazeData.cs new file mode 100644 index 0000000..a7ac3ea --- /dev/null +++ b/GazeWebSocketServer/GazeData.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace GazeWebSocketServer +{ + struct GazeData + { + public readonly float leftX; + public readonly float leftY; + public readonly float rightX; + public readonly float rightY; + + public GazeData(float leftX, float leftY, float rightX, float rightY) + { + this.leftX = leftX; + this.leftY = leftY; + this.rightX = rightX; + this.rightY = rightY; + } + + public override string ToString() + { + return $"\"{leftX}\", \"{leftY}\", \"{rightX}\", \"{rightY}\""; + } + } +} diff --git a/GazeWebSocketServer/GazeDataProcessor.cs b/GazeWebSocketServer/GazeDataProcessor.cs new file mode 100644 index 0000000..6f53b81 --- /dev/null +++ b/GazeWebSocketServer/GazeDataProcessor.cs @@ -0,0 +1,31 @@ +using System; +using System.Windows; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tobii.Research; + +namespace GazeWebSocketServer +{ + class GazeDataProcessor + { + readonly float screenHeight; + readonly float screenWidth; + + public GazeDataProcessor() + { + screenHeight = Convert.ToSingle(SystemParameters.PrimaryScreenHeight); + screenWidth = Convert.ToSingle(SystemParameters.PrimaryScreenWidth); + } + + public GazeData Extract(GazeDataEventArgs e) + { + GazeData data = new GazeData(e.LeftEye.GazePoint.PositionOnDisplayArea.X*screenWidth, + e.LeftEye.GazePoint.PositionOnDisplayArea.Y*screenHeight, + e.RightEye.GazePoint.PositionOnDisplayArea.X*screenWidth, + e.RightEye.GazePoint.PositionOnDisplayArea.Y*screenHeight); + return data; + } + } +} diff --git a/GazeWebSocketServer/GazeWebSocketServer.csproj b/GazeWebSocketServer/GazeWebSocketServer.csproj new file mode 100644 index 0000000..ae1f7cd --- /dev/null +++ b/GazeWebSocketServer/GazeWebSocketServer.csproj @@ -0,0 +1,74 @@ + + + + + Debug + AnyCPU + {F8F11E64-7946-4054-8C27-F0FCAF967F1A} + Exe + GazeWebSocketServer + GazeWebSocketServer + v4.7.2 + 512 + true + true + + + + + x64 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + ..\packages\Tobii.Research.x64.1.7.0.1070\lib\net452\Tobii.Research.dll + + + ..\packages\WebSocketSharp.1.0.3-rc11\lib\websocket-sharp.dll + + + + + + + + + + + + + + + + + + + Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}". + + + + \ No newline at end of file diff --git a/GazeWebSocketServer/Program.cs b/GazeWebSocketServer/Program.cs new file mode 100644 index 0000000..b758d53 --- /dev/null +++ b/GazeWebSocketServer/Program.cs @@ -0,0 +1,23 @@ +using System; +using WebSocketSharp; +using WebSocketSharp.Server; +using Tobii.Research; + +namespace GazeWebSocketServer +{ + public class Program + { + public static void Main(string[] args) + { + var wssv = new WebSocketServer("ws://localhost:8001"); + wssv.AddWebSocketService("/gaze"); + EyeTrackerClient eyeTrackerClient = new EyeTrackerClient(); + + eyeTrackerClient.Start(); + wssv.Start(); + Console.ReadKey(true); + wssv.Stop(); + eyeTrackerClient.Stop(); + } + } +} \ No newline at end of file diff --git a/GazeWebSocketServer/Properties/AssemblyInfo.cs b/GazeWebSocketServer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..9e1553c --- /dev/null +++ b/GazeWebSocketServer/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die einer Assembly zugeordnet sind. +[assembly: AssemblyTitle("GazeWebSocketServer")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("OTH Regensburg")] +[assembly: AssemblyProduct("GazeWebSocketServer")] +[assembly: AssemblyCopyright("Copyright © OTH Regensburg 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly +// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von +// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. +[assembly: ComVisible(false)] + +// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird +[assembly: Guid("f8f11e64-7946-4054-8c27-f0fcaf967f1a")] + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, +// indem Sie "*" wie unten gezeigt eingeben: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/GazeWebSocketServer/packages.config b/GazeWebSocketServer/packages.config new file mode 100644 index 0000000..cd7605b --- /dev/null +++ b/GazeWebSocketServer/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file