using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Tobii.Research; namespace TrackerBridge { public class TobiiEyeTracker : IBridgeTracker { public event ConnectionEventHandler ConnectionEvent; public event ConnectionEventHandler ConnectionTimeout; public event GazeDataHandler GazeDataAvailable { add { gazeDataProcessor.GazeDataProcessed += value; } remove { gazeDataProcessor.GazeDataProcessed -= value; } } private readonly GazeDataProcessor gazeDataProcessor; private IEyeTracker eyeTracker = null; public Boolean IsConnected { get; private set; } = false; public Single OutputFrequency { get => gazeDataProcessor.OutputFrequency; set => gazeDataProcessor.OutputFrequency = value; } public String SerialNumber { get; private set; } = null; public Single TrackingFrequency { get { if (eyeTracker != null) { return eyeTracker.GetGazeOutputFrequency(); } else { return 0f; } } set { if (eyeTracker != null && eyeTracker.GetAllGazeOutputFrequencies().Contains(value)) { eyeTracker.SetGazeOutputFrequency(value); } } } public TobiiEyeTracker() { gazeDataProcessor = new GazeDataProcessor(); } public TobiiEyeTracker(String serialNumber) : this() { SerialNumber = serialNumber; } public void Connect() { Task.Run(() => InitiateConnection()); } private void InitiateConnection() { DateTime time = DateTime.Now; while (eyeTracker == null) { EyeTrackerCollection eyeTrackers = EyeTrackingOperations.FindAllEyeTrackers(); Console.WriteLine("Searching for Tobii eye trackers"); if (eyeTrackers.Count > 0) { if (SerialNumber == null) { eyeTracker = eyeTrackers[0]; break; } else { foreach (IEyeTracker t in eyeTrackers) { if (SerialNumber == t.SerialNumber) { eyeTracker = t; break; } } } } if (eyeTracker != null) { break; } if ((DateTime.Now - time) > (new TimeSpan(0, 0, 30))) { ConnectionTimeout?.Invoke(this); } } eyeTracker.GazeDataReceived += gazeDataProcessor.Process; SerialNumber = eyeTracker.SerialNumber; TrackingFrequency = 600f; ConnectionEvent?.Invoke(this); } } }