GazeDataProcessor.cs 3.17 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 15 16 17 18 19 20 21 22 23 24 25 26 27
        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)
28
        {
29
            tracker.TrackingFrequencyChanged += OnTrackingFrequencyChanged;
30 31
            screenHeight = Convert.ToSingle(SystemParameters.PrimaryScreenHeight);
            screenWidth = Convert.ToSingle(SystemParameters.PrimaryScreenWidth);
32
            gazeFilters = new IGazeFilter[1];
33
            gazeFilters[0] = new GazeDecimator(60); //TODO: Refactor frequency passthrough
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

            //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;
56
        }
57

58 59 60 61 62 63
        public void Initialize()
        {
            foreach (IGazeFilter filter in gazeFilters)
            {
                filter.Reset();
            }
64
        }
65 66
        
        public void Process(Object sender, GazeDataEventArgs e)
67
        {
68 69 70 71
            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,
72 73
                                         e.DeviceTimeStamp,
                                         e.SystemTimeStamp);
74 75

            gazeFilters[0].Input(data);
76 77 78 79
        }
        public void Process(Object sender, GazeData input)
        {
            gazeFilters[0].Input(input);
80 81 82 83 84
        }
        private void OnTrackingFrequencyChanged(Object sender, Single frequency)
        {
            foreach(IGazeFilter filter in gazeFilters)
            {
85
                if(filter.GetType() == typeof(GazeDecimator))
86
                {
87
                    GazeDecimator decimator = (GazeDecimator)filter;
88
                    throw new NotImplementedException();
89 90
                }
            }
91 92 93
        }
    }
}