public async override void SubscribeToGazeDataAsync() { var gazePointDataStream = Host.Streams.CreateGazePointDataStream(); gazePointDataStream.GazePoint((x, y, ts) => handleGazeData(x, y, ts)); void handleGazeData(double x, double y, double ts) { // Converting Tobii Core GazeData to EyeX GazeData Format GazeData.GazeData gazeData = new GazeData.GazeData { Type = nameof(GazeDataTypes.GAZEPOINTS), Timestamp = (long)ts, X_Median = x / 3840, Y_Median = y / 2160 }; GazeDataProcessor.ProcessGazeData(gazeData); switch (Settings.Default.FixationAlgorithm) { // Use implemented IDT Algorithm case "IDT": GazeDataProcessor.ProcessFixationData(null, gazeData); break; // Use Tobii Core Default Fixation Alogrithm default: SubscribeToFixationDataAsync(); break; } } }
public static GazeData.GazeData Compute(GazeData.GazeData gazeData) { try { if (GazeDataList.Count < 2) { GazeDataList.Add(gazeData); return(gazeData); } else { GazeDataList.Add(gazeData); double x_sum = 0.0; double y_sum = 0.0; foreach (var fd in GazeDataList) { x_sum += fd.X_Median; y_sum += fd.Y_Median; } gazeData.X_Median = x_sum / 3.0; gazeData.Y_Median = y_sum / 3.0; GazeDataList.Remove(GazeDataList.First()); return(gazeData); } } catch (Exception ex) { GazeDataList = new List <GazeData.GazeData>(); return(gazeData); // pass Enumeration error } }
private static double GetDistance(GazeData.GazeData previousGazeData, GazeData.GazeData gazeData) { Vector3D origin = new Vector3D(previousGazeData.GazeOrigin_X_Median, previousGazeData.GazeOrigin_Y_Median, previousGazeData.GazeOrigin_Z_Median); Vector3D p1 = new Vector3D(previousGazeData.X_3D_Median, previousGazeData.Y_3D_Median, previousGazeData.Z_3D_Median); Vector3D p2 = new Vector3D(gazeData.X_3D_Median, gazeData.Y_3D_Median, gazeData.Z_3D_Median); Vector3D originToP1 = Vector3D.Subtract(p1, origin); Vector3D originToP2 = Vector3D.Subtract(p2, origin); return(Vector3D.AngleBetween(originToP1, originToP2) * 600); }
public static FixationData Classify(GazeData.GazeData gazeData) { FixationData fixationData = gazeData.ToFixationData(); if (XValueList.Count < Settings.Default.IDT_Window) { fixationData.Type = "SACCADES"; XValueList.Add(fixationData.X_Median); YValueList.Add(fixationData.Y_Median); } else { XValueList.RemoveAt(0); YValueList.RemoveAt(0); XValueList.Add(fixationData.X_Median); YValueList.Add(fixationData.Y_Median); double dispersion = GetDispersion(fixationData); if (dispersion > Settings.Default.IDT_Threshold) { if (PreviousFixationData.Type == "FIXATIONS") { fixationData.EventType = "END"; } fixationData.EventType = "SACCADES"; fixationData.Type = "SACCADES"; //Console.WriteLine("-------------XXX--------------------"); } else { //Console.WriteLine("--------------------FIXATION--------------------"); fixationData.Type = "FIXATIONS"; if (PreviousFixationData.Type == "SACCADES") { fixationData.EventType = "BEGIN"; counter += 1; } else { fixationData.EventType = "DATA"; } // For Fixations - compute centroid fixationData.X_Median = XValueList.Average(); fixationData.Y_Median = YValueList.Average(); } } //Console.WriteLine(counter); PreviousFixationData = fixationData; return(fixationData); }
/// <summary> /// Retrieves Tobii Pro Api Gaze Data and sends it further to the Data Processor /// </summary> /// <returns></returns> public async override void SubscribeToGazeDataAsync() { EyeTracker.GazeDataReceived += (sender, gazeDataEventArgs) => { // Converting Tobii Pro GazeData to EyeX GazeData Format GazeData.GazeData gazeData = new GazeData.GazeData { Type = nameof(GazeDataTypes.GAZEPOINTS), PupilDiameter_Left = gazeDataEventArgs.LeftEye.Pupil.PupilDiameter, PupilDiameter_Right = gazeDataEventArgs.RightEye.Pupil.PupilDiameter, Timestamp = gazeDataEventArgs.SystemTimeStamp, Y_Left = gazeDataEventArgs.LeftEye.GazePoint.PositionOnDisplayArea.Y, Y_Right = gazeDataEventArgs.RightEye.GazePoint.PositionOnDisplayArea.Y, X_Left = gazeDataEventArgs.LeftEye.GazePoint.PositionOnDisplayArea.X, X_Right = gazeDataEventArgs.RightEye.GazePoint.PositionOnDisplayArea.X, }; // Map 3D Eye Coordinates var originR = gazeDataEventArgs.RightEye.GazeOrigin.PositionInTrackBoxCoordinates; var originL = gazeDataEventArgs.LeftEye.GazeOrigin.PositionInTrackBoxCoordinates; gazeData.GazeOrigin_X_Median = (originR.X + originL.X) / 2.0; gazeData.GazeOrigin_Y_Median = (originR.Y + originL.Y) / 2.0; gazeData.GazeOrigin_Y_Median = (originR.Z + originL.Z) / 2.0; gazeData.X_3D_Median = gazeDataEventArgs.RightEye.GazePoint.PositionInUserCoordinates.X; gazeData.Y_3D_Median = gazeDataEventArgs.RightEye.GazePoint.PositionInUserCoordinates.Y; gazeData.Z_3D_Median = gazeDataEventArgs.RightEye.GazePoint.PositionInUserCoordinates.Z; // Map Validity Values gazeData.GazePointValidity_Left = gazeDataEventArgs.LeftEye.GazePoint.Validity == Validity.Valid ? true : false; gazeData.GazePointValidity_Right = gazeDataEventArgs.RightEye.GazePoint.Validity == Validity.Valid ? true : false; gazeData.PupilValidity_Left = gazeDataEventArgs.LeftEye.Pupil.Validity == Validity.Valid ? true : false; gazeData.PupilValidity_Right = gazeDataEventArgs.RightEye.Pupil.Validity == Validity.Valid ? true : false; // Compute Median Gaze Points gazeData.Y_Median = (gazeData.Y_Left + gazeData.Y_Right) / 2; gazeData.X_Median = (gazeData.X_Left + gazeData.X_Right) / 2; if (!double.IsNaN(gazeData.X_Median)) { GazeDataProcessor.ProcessGazeData(gazeData); GazeDataProcessor.ProcessFixationData(null, gazeData); } }; }
public static FixationData Classify(GazeData.GazeData gazeData, double threshold) { FixationData fixationData = gazeData.ToFixationData(); if (PreviousFixationData == null) { fixationData.Type = "SACCADES"; } else { double distance = GetDistance(PreviousFixationData, gazeData); if (distance > 600) { if (PreviousFixationData.Type == "FIXATIONS") { fixationData.EventType = "END"; } fixationData.Type = "SACCADES"; //Console.WriteLine("-------------XXX--------------------"); } else { //Console.WriteLine("--------------------FIXATION--------------------"); fixationData.Type = "FIXATIONS"; if (PreviousFixationData.Type == "SACCADES") { fixationData.EventType = "BEGIN"; } else { fixationData.EventType = "DATA"; } } } PreviousFixationData = fixationData; return(fixationData); }