public void EnterValidationMode()
        {
            if (State != ValidationState.Idle)
            {
                throw new InvalidOperationException("Validation mode already entered");
            }

            _dataMap      = new List <KeyValuePair <NormalizedPoint2D, Queue <GazeDataEventArgs> > >();
            _latestResult = new CalibrationValidationResult();
            State         = ValidationState.NotCollecting;
            _eyeTracker.GazeDataReceived += OnGazeDataReceived;
        }
        /// <summary>
        /// Create a calibration validation object for screen based eye trackers.
        /// </summary>
        /// <param name="eyeTracker">An <see cref="IEyeTracker"/> instance.</param>
        /// <param name="sampleCount">The number of samples to collect. Default 30, minimum 10, maximum 3000.</param>
        /// <param name="timeoutMS">Timeout in milliseconds. Default 1000, minimum 100, maximum 3000.</param>
        public ScreenBasedCalibrationValidation(IEyeTracker eyeTracker, int sampleCount = 30, int timeoutMS = 1000)
        {
            if (eyeTracker == null)
            {
                throw new ArgumentException("Eye tracker is null");
            }

            if (sampleCount < 10 || sampleCount > 3000)
            {
                throw new ArgumentException("Samples must be between 10 and 3000");
            }

            if (timeoutMS < 100 || timeoutMS > 3000)
            {
                throw new ArgumentException("Timout must be between 100 and 3000 ms");
            }

            _eyeTracker  = eyeTracker;
            _sampleCount = sampleCount;
            _timeKeeper  = new TimeKeeper(timeoutMS);
            _result      = new CalibrationValidationResult();
            State        = ValidationState.NotInValidationMode;
        }