GazeDataProcessor.cs 2.76 KB
Newer Older
1 2 3 4 5 6 7
using System;
using System.Windows;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tobii.Research;
8
using TrackerBridge.DSP;
9

10
namespace TrackerBridge
11
{
12
    public class GazeDataProcessor
13
    {
14
        public event EventHandler<GazeData> ProcessedGazeDataAvailable;
15

16 17 18 19 20 21 22 23 24 25 26 27 28
        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();
            }
        }

29

30
        public GazeDataProcessor(IBridgeTracker tracker)
31
        {
32
            tracker.TrackingFrequencyChanged += OnTrackingFrequencyChanged;
33 34
            screenHeight = Convert.ToSingle(SystemParameters.PrimaryScreenHeight);
            screenWidth = Convert.ToSingle(SystemParameters.PrimaryScreenWidth);
35
            gazeFilters = new IGazeFilter[1];
36
            gazeFilters[0] = new GazeDecimatorFixedLength(outputFrequency, tracker.GetTrackingFrequency());
37 38 39 40 41 42 43
        }
        public void Initialize()
        {
            foreach (IGazeFilter filter in gazeFilters)
            {
                filter.Reset();
            }
44 45
        }

46
        public GazeData? Process(GazeDataEventArgs e)
47
        {
48 49 50 51
            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,
52 53
                                         e.DeviceTimeStamp,
                                         e.SystemTimeStamp);
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

            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)
            {
70
                if(filter.GetType() == typeof(GazeDecimatorFixedLength))
71
                {
72
                    GazeDecimatorFixedLength decimator = (GazeDecimatorFixedLength)filter;
73 74 75
                    decimator.InputFrequency = frequency;
                }
            }
76 77 78
        }
    }
}