using System; using System.Windows; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Tobii.Research; using TrackerBridge.DSP; namespace TrackerBridge { public class GazeDataProcessor { private readonly IGazeFilter[] gazeFilters; private readonly Single screenHeight; private readonly Single screenWidth; private Single outputFrequency; public Single OutputFrequency { get { return outputFrequency; } set { outputFrequency = value; Initialize(); } } public GazeDataProcessor(IBridgeTracker tracker) { tracker.TrackingFrequencyChanged += OnTrackingFrequencyChanged; screenHeight = Convert.ToSingle(SystemParameters.PrimaryScreenHeight); screenWidth = Convert.ToSingle(SystemParameters.PrimaryScreenWidth); gazeFilters = new IGazeFilter[1]; gazeFilters[0] = new GazeDecimator(60); //TODO: Refactor frequency passthrough //Chain filters for(Int32 index= 0; index < gazeFilters.Length; index++) { if(index == gazeFilters.Length - 1) { gazeFilters[index].OutputAvailable += tracker.GazeDataAvailableMembers; } else { gazeFilters[index].OutputAvailable += gazeFilters[index + 1].Input; } } } public void AddClient(GazeDataHandler gazeDataHandler) { gazeFilters[gazeFilters.Length - 1].OutputAvailable += gazeDataHandler; } public void RemoveClient(GazeDataHandler gazeDataHandler) { gazeFilters[gazeFilters.Length - 1].OutputAvailable -= gazeDataHandler; } public void Initialize() { foreach (IGazeFilter filter in gazeFilters) { filter.Reset(); } } public void Process(Object sender, GazeDataEventArgs e) { GazeData data = new GazeData(e.LeftEye.GazePoint.PositionOnDisplayArea.X * screenWidth, e.LeftEye.GazePoint.PositionOnDisplayArea.Y * screenHeight, e.RightEye.GazePoint.PositionOnDisplayArea.X * screenWidth, e.RightEye.GazePoint.PositionOnDisplayArea.Y * screenHeight, e.DeviceTimeStamp, e.SystemTimeStamp); gazeFilters[0].Input(data); } public void Process(Object sender, GazeData input) { gazeFilters[0].Input(input); } private void OnTrackingFrequencyChanged(Object sender, Single frequency) { foreach(IGazeFilter filter in gazeFilters) { if(filter.GetType() == typeof(GazeDecimator)) { GazeDecimator decimator = (GazeDecimator)filter; throw new NotImplementedException(); } } } } }