using System; using System.Threading.Tasks; using System.Threading; using WebSocketSharp; using WebSocketSharp.Server; using Tobii.Research; using TrackerBridge; using System.Windows.Forms; using System.Drawing; namespace GazeWebSocketServer { public class Program { private static GazeServer gazeServer; public static void Main(string[] args) { ConfigurationData.InitializeUnexistingWithDefaults(); ConfigurationData config = ConfigurationData.ParseToObject(); if (args.Length > 0 && args[0] == "-d") { Task.Run(() => SimulateGazeData(300)); } else { TobiiEyeTracker tobiiEyeTracker = new TobiiEyeTracker(config.TrackerSerialNumber); tobiiEyeTracker.ConnectionEvent += OnConnectionEstablished; tobiiEyeTracker.ConnectionTimeout += OnConnectionTimeout; tobiiEyeTracker.GazeDataAvailable += OnGazeDataAvailable; tobiiEyeTracker.Connect(); } gazeServer = new GazeServer(config.WebSocketPort, config.WebSocketEndpoint); gazeServer.Start(); Console.ReadLine(); } private static void SimulateGazeData(UInt16 frequencyHz) { TimeSpan period = new TimeSpan(Convert.ToInt64((1.0 / frequencyHz) * 10e7)); while (true) { DateTime start = DateTime.Now; Point mousePosition = Control.MousePosition; GazeData data = new GazeData(mousePosition.X, mousePosition.Y, mousePosition.X, mousePosition.Y, 0, 0); if (gazeServer != null && gazeServer.isRunning) { gazeServer.Publish(data); } TimeSpan delay = period - (DateTime.Now - start); Thread.Sleep(delay.Ticks >= 0 ? delay.Milliseconds : 0); } } private static void OnGazeDataAvailable(TobiiEyeTracker sender, GazeData data) { if (gazeServer != null && gazeServer.isRunning) { gazeServer.Publish(data); } } private static void OnConnectionTimeout(TobiiEyeTracker sender) { Console.WriteLine("Timeout while searching for trackers."); } private static void OnConnectionEstablished(TobiiEyeTracker sender) { Console.WriteLine($"Tracker {sender.SerialNumber} connected."); ConfigurationData config = ConfigurationData.ParseToObject(); sender.SetTrackingFrequency(config.TrackerFrequency); } } }