Ejemplo n.º 1
0
        internal EyeTrackerCalibrator(EyeTrackerDevice device, IEyeTrackerDriver tracker)
        {
            _tracker        = tracker;
            State           = CalibratorState.None;
            Target          = device;
            DeviceInfo      = device.DeviceInfo;
            HeadPositioning = new HeadPositioning(tracker);
            Calibrations    = new ReadOnlyCollection <CalibrationResult>(_calibrations);

            _states = CreateStateMachine();
        }
Ejemplo n.º 2
0
        public bool ConnectToDevice()
        {
            try
            {
                Log?.Invoke(this, new Core.LogMessage(Core.LogLevel.Info, LogTags.Connection, "Searching for an eye tracker..."));

                using (CancellationTokenSource cts = new CancellationTokenSource(TimeSpan.FromSeconds(10)))
                {
                    var tracker = _browser.SearchAsync(cts.Token)
                                  .ConfigureAwait(false)
                                  .GetAwaiter()
                                  .GetResult();

                    if (tracker != null)
                    {
                        string name       = tracker.Name ?? String.Empty;
                        string productId  = tracker.ProductId ?? String.Empty;
                        string familyName = tracker.FamilyName ?? String.Empty;

                        Log?.Invoke(this, new Core.LogMessage(Core.LogLevel.Info, LogTags.Connection, $"Eye tracker found: {familyName} - {name} ({productId}). Connecting..."));

                        AttachEventHandlers(tracker);

                        tracker.Connect();

                        DeviceInfo.Name       = name;
                        DeviceInfo.FamilyName = familyName;
                        DeviceInfo.ProductId  = productId;

                        _connectedTracker = tracker;

                        Log?.Invoke(this, new Core.LogMessage(Core.LogLevel.Info, LogTags.Connection, "Connection successful"));
                        OnCanCalibrateChanged();

                        return(true);
                    }
                }
                Log?.Invoke(this, new Core.LogMessage(Core.LogLevel.Error, LogTags.Connection, "No eye tracker found."));
            }
            catch (OperationCanceledException)
            {
                Log?.Invoke(this, new Core.LogMessage(Core.LogLevel.Error, LogTags.Connection, "Failed to find an eye tracker within the time limit."));
            }
            catch (Exception ex)
            {
                Log?.Invoke(this, new Core.LogMessage(Core.LogLevel.Error, LogTags.Connection, "Failed to connect to an eye tracker.", ex));
                ConnectionError?.Invoke(this, new ConnectionException("Failed to connect to an eye tracker, see inner exception for details.", ex));
            }

            return(false);
        }
Ejemplo n.º 3
0
        private void tracker_GazeDataReceived(IEyeTrackerDriver sender, GazeData gaze)
        {
            double?distance = gaze.GetEyeDistance();

            double?relativeEyeDistance = gaze.GetRelativeEyeDistance();
            var    recommendation      = GetRecommendation(relativeEyeDistance);

            // Point (0,0,0) of the TrackBox Coordinate System is in the top right corner nearest to the eye tracker from the user's
            // point of view (see Figure 3, Tobii Analytics SDK Developers Guide, p. 15), not the top left corner like the screen is,
            // so we swap the X coordinate. Y coordinate is still in the right direction.
            var leftEyePosition  = new Point2(1 - gaze.LeftEye.EyePosition3DRelative.X, gaze.LeftEye.EyePosition3DRelative.Y);
            var rightEyePosition = new Point2(1 - gaze.RightEye.EyePosition3DRelative.X, gaze.RightEye.EyePosition3DRelative.Y);

            PositionChanged?.Invoke(this, new EyesPosition(leftEyePosition, gaze.Validity.HasLeftEye(),
                                                           rightEyePosition, gaze.Validity.HasRightEye(),
                                                           distance, relativeEyeDistance, recommendation));
        }
Ejemplo n.º 4
0
 internal HeadPositioning(IEyeTrackerDriver tracker)
 {
     _tracker = tracker;
 }
Ejemplo n.º 5
0
 void Tracker_GazeDataReceived(IEyeTrackerDriver sender, GazeData data)
 {
     Data?.Invoke(this, data);
 }
Ejemplo n.º 6
0
 private void DetachEventHandlers(IEyeTrackerDriver tracker)
 {
     tracker.ConnectionError    -= Tracker_ConnectionError;
     tracker.TrackBoxChanged    -= Tracker_TrackBoxChanged;
     tracker.DisplayAreaChanged -= Tracker_DisplayAreaChanged;
 }