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; private event GazeDataHandler gazeDataAvailable; public event GazeDataHandler GazeDataAvailable { add { gazeDataAvailable += value; GazeDataProcessor.AddClient(value); } remove { gazeDataAvailable -= value; GazeDataProcessor.RemoveClient(value); } } public event EventHandler TrackingFrequencyChanged; private IEyeTracker eyeTracker = null; public GazeDataProcessor GazeDataProcessor { get; } public Boolean IsConnected { get; private set; } = false; public String SerialNumber { get; private set; } = null; public GazeDataHandler GazeDataAvailableMembers => gazeDataAvailable; 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(); } } public void SetTrackingFrequency(float value) { if (eyeTracker != null && eyeTracker.GetAllGazeOutputFrequencies().Contains(value)) { eyeTracker.SetGazeOutputFrequency(value); } } 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 += GazeDataProcessor.Process; eyeTracker.GazeOutputFrequencyChanged += OnGazeOutputFrequencyChanged; SerialNumber = eyeTracker.SerialNumber; SetTrackingFrequency(600f); ConnectionEvent?.Invoke(this); } private void OnGazeOutputFrequencyChanged(Object sender, GazeOutputFrequencyEventArgs e) { TrackingFrequencyChanged?.Invoke(this, e.GazeOutputFrequency); } } }