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 { public event GazeDataHandler GazeDataProcessed { add { gazeFilters[gazeFilters.Length - 1].OutputAvailable += value; } remove { gazeFilters[gazeFilters.Length - 1].OutputAvailable -= value; } } 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() { outputFrequency = 60; //Default screenHeight = Convert.ToSingle(SystemParameters.PrimaryScreenHeight); screenWidth = Convert.ToSingle(SystemParameters.PrimaryScreenWidth); gazeFilters = new IGazeFilter[1]; gazeFilters[0] = new GazeDecimator(this); //TODO: Refactor frequency passthrough //Chain filters for(Int32 index= 0; index < gazeFilters.Length-1; index++) { gazeFilters[index].OutputAvailable += gazeFilters[index + 1].Input; } } public void Initialize() { foreach (IGazeFilter filter in gazeFilters) { filter.Update(this); 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); } } }