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
     }
 }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
                }
            };
        }
Exemple #6
0
        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);
        }