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(); }
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); }
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)); }
internal HeadPositioning(IEyeTrackerDriver tracker) { _tracker = tracker; }
void Tracker_GazeDataReceived(IEyeTrackerDriver sender, GazeData data) { Data?.Invoke(this, data); }
private void DetachEventHandlers(IEyeTrackerDriver tracker) { tracker.ConnectionError -= Tracker_ConnectionError; tracker.TrackBoxChanged -= Tracker_TrackBoxChanged; tracker.DisplayAreaChanged -= Tracker_DisplayAreaChanged; }