Exemplo n.º 1
0
        /// <summary>
        //This method has the Action that will be run once a fixation is confirmed passed in and stored in SelectedFicationAction. It also sets the state to RunningFixationDetection,
        //which sets logic in RunSelectedActionAtFixation to run on fixationPointDataStream.Next events.
        /// </summary>
        public void StartDetectingFixation()
        {
            customfixStream.ResetFixationDetectionState();

            pointSmootherWorker = new PointSmoother(pointSmootherBufferSize);

            Console.WriteLine("Start detection call");
            fixationState = EFixationState.DetectingFixation;
            timeOutTimer.Start();
        }
Exemplo n.º 2
0
        /// <summary>
        /// This method of is run on gaze events, checks if it is the beginning or end of a fixation and runs appropriate code.
        /// </summary>
        /// <param name="o"></param>
        /// <param name="fixationDataBucket"></param>
        private void detectFixation(object o, CustomFixationEventArgs fixationDataBucket)
        {
            //Check if FixationDetection needs to be monitoring CustomFixation data stream.
            if (fixationState == EFixationState.DetectingFixation)
            {
                GazePoint currentSmoothPoint;

                //If databucket state is the start of a fixation
                if (fixationDataBucket.Status == EFixationStreamEventType.Start)
                {
                    fixationTimer.Start();
                    //increment timeout interval so a fixation doesn't get cut off.
                    timeOutTimer.Interval += FixationDetectionTimeLength + FixationExtensionBuffer;;

                    Console.WriteLine(timeOutTimer.Interval);
                    fixationProgressStartTimeStamp = fixationDataBucket.TimeStamp;


                    //Instantiate new point smoother, this clears out and previous in the ring buffer.
                    pointSmootherWorker = new PointSmoother(pointSmootherBufferSize);

                    Console.WriteLine("Fixation Begin X" + fixationDataBucket.X + " Y" + fixationDataBucket.Y);
                }
                //if fixation data is in the middle of a fixation, use the data returned to highlight progress and draw users current gaze location to the screen.
                if (fixationDataBucket.Status == EFixationStreamEventType.Middle)
                {
                    //Check if point smoothing is required.
                    if (usePointSmoother)
                    {
                        //Data smoothing being done in CustomFixationDectection,
                        currentSmoothPoint = pointSmootherWorker.UpdateAndGetSmoothPoint(fixationDataBucket.X, fixationDataBucket.Y);
                        xPosFixation       = (int)Math.Floor(currentSmoothPoint.x);
                        yPosFixation       = (int)Math.Floor(currentSmoothPoint.y);
                    }
                    else
                    {
                        //Slightly smoothed data from the Customfixation data stream
                        xPosFixation = (int)Math.Floor(fixationDataBucket.X);
                        yPosFixation = (int)Math.Floor(fixationDataBucket.Y);
                    }

                    // calculateFixationProgressPercent(fixationDataBucket.TimeStamp);
                    onFixationProgressEvent(fixationDataBucket.TimeStamp, xPosFixation, yPosFixation);
                }
                //if the fixation ends before the fixation timer completes, reset the fixation timer.
                if (fixationDataBucket.Status == EFixationStreamEventType.End)
                {
                    fixationTimer.Stop();
                    //customfixStream.ResetFixationDetectionState();
                    //Debug
                    Console.WriteLine("Fixation Stopped due to end datatype");
                }
            }
        }