FakeTracker.cs 2.14 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
using System;
using System.Drawing;
using System.Threading.Tasks;
using System.Timers;
using System.Windows.Forms;

namespace TrackerBridge
{
    public class FakeTracker : IBridgeTracker
    {
11 12
        public event ConnectionEventHandler ConnectionEvent;
        public event ConnectionEventHandler ConnectionTimeout;
13 14
        public event GazeDataHandler GazeDataAvailable {
            add {
15
                gazeDataProcessor.GazeDataProcessed += value;
16 17
            }
            remove {
18
                gazeDataProcessor.GazeDataProcessed -= value;
19 20 21
            }
        }

22 23
        private readonly GazeDataProcessor gazeDataProcessor;
        private Task timerTask;
24 25
        private Single trackerFrequency;

26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
        public Single OutputFrequency {
            get => gazeDataProcessor.OutputFrequency;
            set => gazeDataProcessor.OutputFrequency = value;
        }
        public String SerialNumber => "Fake";
        public Single TrackingFrequency {
            get {
                return trackerFrequency;
            }
            set {
                //timerTask.Dispose(); //TODO: Proper cancellation
                //TODO: Fix memory leak
                timerTask = Task.Run(() => SimulateGazeDataHz(value));
            }
        }
41 42 43 44

        public FakeTracker(Single frequency)
        {
            trackerFrequency = frequency;
45
            gazeDataProcessor = new GazeDataProcessor();
46 47
        }

48 49 50 51 52
        public void Connect()
        {
            timerTask = Task.Run(() => SimulateGazeDataHz(trackerFrequency));
            ConnectionEvent?.Invoke(this);
        }
53 54 55 56 57 58 59
        private void SimulateGazeDataHz(Single frequency)
        {
            System.Timers.Timer timer = new System.Timers.Timer(1000.0 / frequency); //TODO: Implement Dispose
            timer.Elapsed += (Object sender, ElapsedEventArgs e) =>
            {
                Point mousePosition = Control.MousePosition;
                GazeData data = new GazeData(mousePosition.X, mousePosition.Y, mousePosition.X, mousePosition.Y, 0, 0);
60
                gazeDataProcessor.Process(this, data);
61 62 63 64 65 66
            };
            timer.AutoReset = true;
            timer.Start();
        }
    }
}