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 EventHandler ProcessedGazeDataAvailable; 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 GazeDecimatorFixedLength(outputFrequency, tracker.GetTrackingFrequency()); } public void Initialize() { foreach (IGazeFilter filter in gazeFilters) { filter.Reset(); } } public GazeData? Process(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); for (Int32 index = 1; index < gazeFilters.Length; index++) { if (gazeFilters[index - 1].Output.HasValue) { gazeFilters[index].Input(gazeFilters[index - 1].Output.Value); } } //TODO: If output, invoke event return gazeFilters[gazeFilters.Length - 1].Output; } private void OnTrackingFrequencyChanged(Object sender, Single frequency) { foreach(IGazeFilter filter in gazeFilters) { if(filter.GetType() == typeof(GazeDecimatorFixedLength)) { GazeDecimatorFixedLength decimator = (GazeDecimatorFixedLength)filter; decimator.InputFrequency = frequency; } } } } }