using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Tobii.Research; namespace TrackerBridge { public class TobiiEyeTracker { public delegate void ConnectionEventHandler(TobiiEyeTracker sender); public delegate void GazeDataHandler(TobiiEyeTracker sender, GazeData data); public event ConnectionEventHandler ConnectionEvent; public event ConnectionEventHandler ConnectionTimeout; public event GazeDataHandler GazeDataAvailable; public Boolean IsConnected { get; private set; } public String SerialNumber { get => serialNumber; } private IEyeTracker eyeTracker = null; private String serialNumber = null; private GazeDataProcessor gazeDataProcessor; public TobiiEyeTracker() { gazeDataProcessor = new GazeDataProcessor(); } public TobiiEyeTracker(String serialNumber) : this() { this.serialNumber = serialNumber; } public float GetTrackingFrequency() { if (eyeTracker != null) { return eyeTracker.GetGazeOutputFrequency(); } else { throw new NullReferenceException(); } } public void SetTrackingFrequency(float value) { if (eyeTracker != null) { eyeTracker.SetGazeOutputFrequency(value); } } public void Connect() { Task task = new Task(() => InitiateConnection()); task.Start(); } private void InitiateConnection() { DateTime time = DateTime.Now; while (eyeTracker == null) { EyeTrackerCollection eyeTrackers = EyeTrackingOperations.FindAllEyeTrackers(); 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 += OnGazeDataReceived; serialNumber = eyeTracker.SerialNumber; SetTrackingFrequency(600f); ConnectionEvent?.Invoke(this); } private void OnGazeDataReceived(object sender, GazeDataEventArgs e) { GazeData gazeData = gazeDataProcessor.Extract(e); GazeDataAvailable?.Invoke(this, gazeData); } } }