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 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 event EventHandler TrackingFrequencyChanged; private IEyeTracker eyeTracker = null; public GazeDataProcessor GazeDataProcessor { get; set; } public Boolean IsConnected { get; private set; } = false; public String SerialNumber { get; private set; } = null; public TobiiEyeTracker() { GazeDataProcessor = new GazeDataProcessor(this); } public TobiiEyeTracker(String serialNumber) : this() { SerialNumber = serialNumber; } public void Connect() { Task task = new Task(() => InitiateConnection()); task.Start(); } public Single GetTrackingFrequency() { if (eyeTracker != null) { return eyeTracker.GetGazeOutputFrequency(); } else { throw new NullReferenceException(); } } Single IBridgeTracker.GetTrackingFrequency() { throw new NotImplementedException(); } public void SetTrackingFrequency(float value) { if (eyeTracker != null && eyeTracker.GetAllGazeOutputFrequencies().Contains(value)) { eyeTracker.SetGazeOutputFrequency(value); } } void IBridgeTracker.SetTrackingFrequency(Single value) { throw new NotImplementedException(); } 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; eyeTracker.GazeOutputFrequencyChanged += OnGazeOutputFrequencyChanged; SerialNumber = eyeTracker.SerialNumber; SetTrackingFrequency(600f); ConnectionEvent?.Invoke(this); } private void OnGazeDataReceived(object sender, GazeDataEventArgs e) { GazeData? gazeData = GazeDataProcessor.Process(e); if (gazeData.HasValue) { GazeDataAvailable?.Invoke(this, gazeData.Value); } } private void OnGazeOutputFrequencyChanged(Object sender, GazeOutputFrequencyEventArgs e) { TrackingFrequencyChanged?.Invoke(this, e.GazeOutputFrequency); } } }