GazeDataProcessor.cs 2.89 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
        public event GazeDataHandler GazeDataProcessed {
            add {
                gazeFilters[gazeFilters.Length - 1].OutputAvailable += value;
            }
            remove {
                gazeFilters[gazeFilters.Length - 1].OutputAvailable -= value;
            }
        }

23 24 25 26 27 28 29 30 31 32 33 34 35 36
        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)
37
        {
38
            tracker.TrackingFrequencyChanged += OnTrackingFrequencyChanged;
39 40
            screenHeight = Convert.ToSingle(SystemParameters.PrimaryScreenHeight);
            screenWidth = Convert.ToSingle(SystemParameters.PrimaryScreenWidth);
41
            gazeFilters = new IGazeFilter[1];
42
            gazeFilters[0] = new GazeDecimator(60); //TODO: Refactor frequency passthrough
43 44

            //Chain filters
45
            for(Int32 index= 0; index < gazeFilters.Length-1; index++)
46
            {
47
                gazeFilters[index].OutputAvailable += gazeFilters[index + 1].Input;
48 49 50
            }
        }

51 52 53 54 55 56
        public void Initialize()
        {
            foreach (IGazeFilter filter in gazeFilters)
            {
                filter.Reset();
            }
57
        }
58 59
        
        public void Process(Object sender, GazeDataEventArgs e)
60
        {
61 62 63 64
            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,
65 66
                                         e.DeviceTimeStamp,
                                         e.SystemTimeStamp);
67 68

            gazeFilters[0].Input(data);
69 70 71 72
        }
        public void Process(Object sender, GazeData input)
        {
            gazeFilters[0].Input(input);
73 74 75 76 77
        }
        private void OnTrackingFrequencyChanged(Object sender, Single frequency)
        {
            foreach(IGazeFilter filter in gazeFilters)
            {
78
                if(filter.GetType() == typeof(GazeDecimator))
79
                {
80
                    GazeDecimator decimator = (GazeDecimator)filter;
81
                    throw new NotImplementedException();
82 83
                }
            }
84 85 86
        }
    }
}