private void ProcessAnswer(char c)
        {
            eyeTracker.StopTracking();
            eyeTracker.SaveTracking(localTrackingFile);
            eyeTracker.ClearTracking();

            foreach (Slide_Choice sc in slides[slideNum].Slide_Choice)
            {
                if (sc.shortcut.Contains(c))
                {
                    Slide_Answer sa = new Slide_Answer();
                    sa.Slide_Choice     = sc;
                    sa.Slide            = slides[slideNum];
                    sa.slide_start_time = slideStart;
                    sa.slide_end_time   = DateTime.Now;
                    sa.Test             = Test;
                    Test.Slide_Answer.Add(sa);
                    break;
                }
            }
            if (!NextSlide())
            {
                FinishExperiment();
            }
        }
예제 #2
0
        public int Read(String filePath, bool mergeReplace)
        {
            if (!File.Exists(filePath))
            {
                return((int)ReturnCodes.FileNotFound);
            }

            String fileExtension = Path.GetExtension(filePath);

            if (!fileExtension.ToUpper().Equals(".TXT") && !fileExtension.ToUpper().Equals(".IDF"))
            {
                return((int)ReturnCodes.WrongFileExtension);
            }

            String fileName = Path.GetFileNameWithoutExtension(filePath);

            String[] nameParts = fileName.Split('-');

            if (nameParts.Count() != 3)
            {
                return((int)ReturnCodes.MalformedFileName);
            }

            if (!nameParts[0].Equals(Test.Candidate.personal_code))
            {
                return((int)ReturnCodes.WrongCandidate);
            }

            int testId = int.Parse(nameParts[1]);

            if (Test == null)
            {
                Test = db.Tests.FirstOrDefault(t => t.id == testId);
            }

            if (Test.id != testId)
            {
                return((int)ReturnCodes.WrongTest);
            }

            int          slideNum    = int.Parse(nameParts[2]);
            Slide_Answer slideAnswer = Test.Slide_Answer.FirstOrDefault(sa => sa.Slide.num == slideNum);

            if (slideAnswer == null)
            {
                return((int)ReturnCodes.MalformedFileName);
            }

            if (db.Tracking.FirstOrDefault(t => t.test_id == Test.id && t.slide_id == slideAnswer.slide_id) != null)
            {
                if (mergeReplace)
                {
                    db.SaveChanges();
                    db.Database.ExecuteSqlCommand("delete from tracking where test_id = {0} and slide_id = {1}", Test.id, slideAnswer.slide_id);
                }
                else
                {
                    return((int)ReturnCodes.DataPresent);
                }
            }

            FileStream stream = new FileStream(filePath, FileMode.Open);

            if (filePath.ToUpper().EndsWith(".IDF"))
            {
                return(ReadIdf(stream, slideAnswer));
            }
            else if (filePath.ToUpper().EndsWith(".TXT"))
            {
                return(ReadTxt(stream, slideAnswer));
            }
            else
            {
                return((int)ReturnCodes.WrongFileExtension);
            }
        }
예제 #3
0
        public int ReadTxt(FileStream stream, Slide_Answer slideAnswer)
        {
            int numWritten = 0;

            StreamReader sr = new StreamReader(stream);
            String       line;
            long         timeOffset = -1;

            while (!sr.EndOfStream && (line = sr.ReadLine()).StartsWith("##"))
            {
                ;
            }

            NumberFormatInfo formatter = (NumberFormatInfo)NumberFormatInfo.CurrentInfo.Clone();

            formatter.NumberDecimalSeparator = ".";
            formatter.NumberGroupSeparator   = ",";

            while (!sr.EndOfStream)
            {
                line = sr.ReadLine();

                String[] lineParts = line.Split((char)9);

                if (lineParts.Count() != 13)
                {
                    continue;
                }

                long time = long.Parse(lineParts[0]);

                if (timeOffset < 0)
                {
                    timeOffset = time;
                    time       = 0;
                }
                else
                {
                    time -= timeOffset;
                }

                Tracking tracking = new Tracking();
                tracking.occurred = slideAnswer.slide_start_time.Value.AddSeconds(time / 1000000.0);
                tracking.x        = Decimal.Parse(lineParts[3], formatter);
                tracking.y        = Decimal.Parse(lineParts[4], formatter);
                tracking.dia_x    = Decimal.Parse(lineParts[5], formatter);
                tracking.dia_y    = Decimal.Parse(lineParts[6], formatter);
                tracking.cr_x     = Decimal.Parse(lineParts[7], formatter);
                tracking.cr_y     = Decimal.Parse(lineParts[8], formatter);
                tracking.por_x    = Decimal.Parse(lineParts[9], formatter);
                tracking.por_y    = Decimal.Parse(lineParts[10], formatter);
                tracking.timing   = int.Parse(lineParts[11]);
                tracking.trigger  = int.Parse(lineParts[12]);
                tracking.Slide    = slideAnswer.Slide;
                tracking.Test     = Test;
                Test.Tracking.Add(tracking);
                numWritten++;
            }
            db.Tracking.AddRange(Test.Tracking);
            db.SaveChanges();
            Test.Tracking.Clear();
            return(numWritten);
        }
예제 #4
0
        public int ReadIdf(FileStream stream, Slide_Answer slideAnswer)
        {
            int     numWritten = 0;
            IdfFile idfFile    = new IdfFile(stream);
            int     result     = idfFile.readHeader();
            IdfData data       = new IdfData();

            long            time;
            long            timeOffset = -1;
            List <Tracking> trackings  = new List <Tracking>();
            Tracking        tracking   = null;

            for (int rec = 0; rec < idfFile.Count(); rec++)
            {
                result = idfFile.readData(rec, ref data);

                if (result < 0)
                {
                    Console.WriteLine("Record {0}; Non SMP marker encountered ", rec);
                }
                if (data.rPupX < 0.0 || data.rPupX > 300.0)
                {
                    Console.WriteLine("Record {0}: rPupX value {1} outside expected range", rec, data.rPupX);
                }
                if (data.rPupY < 0.0 || data.rPupX > 300.0)
                {
                    Console.WriteLine("Record {0}: rPupX value {1} outside expected range", rec, data.rPupX);
                }
                if (data.rPupDX < 0.0 || data.rPupDX > 15.0)
                {
                    Console.WriteLine("Record {0}: rPupDX value {1} outside expected range", rec, data.rPupX);
                }
                if (data.rPupDX < 0.0 || data.rPupDX > 15.0)
                {
                    Console.WriteLine("Record {0}: rPupDX value {1} outside expected range", rec, data.rPupX);
                }


                if (timeOffset < 0)
                {
                    timeOffset = data.time;
                }

                time = data.time - timeOffset;
                DateTime occurred = slideAnswer.slide_start_time.Value.AddSeconds(time / 1000000.0);
                if (tracking == null || !tracking.occurred.Equals(occurred))
                {
                    tracking          = new Tracking();
                    tracking.occurred = slideAnswer.slide_start_time.Value.AddSeconds(time / 1000000.0);
                    tracking.x        = (decimal)data.rPupX;
                    tracking.y        = (decimal)data.rPupY;
                    tracking.dia_x    = (decimal)data.rPupDX;
                    tracking.dia_y    = (decimal)data.rPupDY;
                    tracking.cr_x     = (decimal)data.rCr0X;
                    tracking.cr_y     = (decimal)data.rCr0Y;
                    tracking.por_x    = (decimal)data.rGX;
                    tracking.por_y    = (decimal)data.rGY;
                    tracking.timing   = 0;
                    tracking.trigger  = 0;
                    tracking.Slide    = slideAnswer.Slide;
                    tracking.Test     = slideAnswer.Test;
                    trackings.Add(tracking);
                    numWritten++;
                }
            }

            db.Tracking.AddRange(trackings);

            db.SaveChanges();

            return(numWritten);
        }
예제 #5
0
        private void ScanForMissingTracking(String path, List <LoadFilesArgument> args)
        {
            LoggingStatus.PostMessage(Severity.Info, String.Format("Scanning files in {0}...", path));
            try
            {
                foreach (String filePath in Directory.GetFiles(path))
                {
                    String fileName  = Path.GetFileNameWithoutExtension(filePath);
                    String extension = Path.GetExtension(filePath);

                    if (!extension.ToUpper().Equals(".TXT") && !extension.ToUpper().Equals(".IDF"))
                    {
                        continue;
                    }

                    String[] nameParts = fileName.Split('-');

                    if (nameParts.Count() != 3)
                    {
                        continue;
                    }

                    if (nameParts[0].Length != 10)
                    {
                        continue;
                    }

                    int slideNum = -1;
                    int testId   = -1;

                    if (!int.TryParse(nameParts[1], out testId) || !int.TryParse(nameParts[2], out slideNum))
                    {
                        continue;
                    }

                    Test test = db.Tests.FirstOrDefault(t => t.id == testId);
                    if (test == null)
                    {
                        LoggingStatus.PostMessage(Severity.Warning, String.Format("Encountered file {0} but could not find corresponding test.", fileName + extension));
                        continue;
                    }

                    Slide_Answer slideAnswer = test.Slide_Answer.FirstOrDefault(sa => sa.Slide.num == slideNum);
                    if (slideAnswer == null)
                    {
                        LoggingStatus.PostMessage(Severity.Warning, String.Format("Encountered file {0} but could not find corresponding answer for slide {1} in test.", fileName + extension, slideNum));
                        continue;
                    }
                    LoadFilesArgument arg = args.FirstOrDefault(a => a.test.id == test.id);
                    if (arg == null)
                    {
                        arg = new LoadFilesArgument()
                        {
                            test = test, mergeReplace = false
                        };
                        args.Add(arg);
                    }
                    arg.fileNames.Add(filePath);
                }
            }
            catch (System.UnauthorizedAccessException)
            { }

            try
            {
                foreach (String subDir in Directory.GetDirectories(path))
                {
                    ScanForMissingTracking(subDir, args);
                }
            }
            catch (System.UnauthorizedAccessException)
            { }
        }