private IEnumerable <View> GetViews(StreamWriter logWriter, StreamWriter anslog) { RandomizedQueue <StudyTestPair> usedPairs = new RandomizedQueue <StudyTestPair>(); var stimulusPairs = new RandomizedQueue <StudyTestPair>(); stimulusPairs.AddRange(this.stp); while (stimulusPairs.Count > 0) { StudyTestPair currstp = stimulusPairs.RemoveRandom(); usedPairs.Add(currstp); foreach (var view in RunTrial(currstp.test, currstp.answer, currstp.index, logWriter, anslog)) { yield return(view); } } stimulusPairs.AddRange(usedPairs); }
private IEnumerable <View> GetViews(ISynchronizeInvoke invoker, StreamWriter anslog, StreamWriter logWriter, StreamWriter dataWriter, int round, RandomizedQueue <string> pres) { var currentTrialEntries = new List <EEGDataEntry>(); //To do: Save the date/time earlier and use it for both this and the dataWriter. Put it in GetEnumerator and pass to GetViews using (var artifactListener = new EEGDataListener(invoker, null, data => { foreach (var entry in data) { if (entry.HasStimulusMarker()) { lock (currentTrialEntries) { currentTrialEntries.Add(entry); } } } }, null)) { this.dataSource.AddListener(artifactListener); //DIFFERENCE: Instead of getting blocks, we want to go through the entire set once for each test phase, but we //want items within that set to be random RandomizedQueue <StudyTestPair> usedPairs = new RandomizedQueue <StudyTestPair>(); var stimulusPairs = new RandomizedQueue <StudyTestPair>(); stimulusPairs.AddRange(this.stp); while (stimulusPairs.Count > 0) { StudyTestPair currstp = stimulusPairs.RemoveRandom(); usedPairs.Add(currstp); //logWriter.WriteLine("Question: " + currstp.index); foreach (var view in RunTrial(round, currstp.test, currstp.answer, currstp.index, dataWriter, logWriter, anslog, currentTrialEntries, pres)) { yield return(view); } } stimulusPairs.AddRange(usedPairs); } }
/// <summary> /// The enumerator implementation /// </summary> public override IEnumerator <View> GetEnumerator() { IViewResult result; RandomizedQueue <string> pres = new RandomizedQueue <string>(); pres.AddRange(presentation); using (var logWriter = new StreamWriter(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "test_log_" + settings.SubjectName + "_" + DateTime.Now.ToString("MM dd yyyy H mm ss") + ".txt"))) using (var anslog = new StreamWriter(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "test_anslog_" + settings.SubjectName + "_" + DateTime.Now.ToString("MM dd yyyy H mm ss") + ".txt"))) { //Click to Start yield return(new ChoiceView(new string[] { "Start Test" }, out result) { Text = "Click When Ready" }); foreach (var view in this.GetViews(logWriter, anslog)) { yield return(view); } } }
/// <summary> /// The enumerator implementation /// </summary> public override IEnumerator <View> GetEnumerator() { IViewResult result; Random numgen = new Random(); int a, b; RandomizedQueue <string> pres = new RandomizedQueue <string>(); RandomizedQueue <string> usedPres = new RandomizedQueue <string>(); pres.AddRange(presentation); using (var logWriter = new StreamWriter(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "krmon_log_" + settings.SubjectName + "_" + DateTime.Now.ToString("MM dd yyyy H mm ss") + ".txt"))) using (var anslog = new StreamWriter(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "krmon_anslog_" + settings.SubjectName + "_" + DateTime.Now.ToString("MM dd yyyy H mm ss") + ".txt"))) using (var dataWriter = new StreamWriter(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "krmon_data_" + settings.SubjectName + "_" + DateTime.Now.ToString("MM dd yyyy H mm ss") + ".csv"))) { //Alternating Study and Test Phases for (int i = 0; i < settings.NumRounds; i++) { yield return(new ChoiceView(new string[] { "Start Study Phase" }, out result) { Text = "Click When Ready" }); while (pres.Count > 0) { var stimulus = pres.RemoveRandom(); yield return(new TextView(stimulus, this.settings.PresentationTime, GUIUtils.Constants.DISPLAY_FONT_LARGE)); yield return(new RestView(this.settings.RestTime)); usedPres.Add(stimulus); } pres.AddRange(usedPres); usedPres.Clear(); a = numgen.Next(4, 13); b = numgen.Next(4, 13); yield return(new VocabView(string.Format("{0} x {1} = {2}", a, b, a * b), "Verify", settings.DisplayTime, settings.DelayTime, true, anslog, out result)); yield return(new ChoiceView(new string[] { "Start Test Phase" }, out result) { Text = "Click When Ready" }); var connected = true; // assume it's connected using (var invoker = new SingleThreadedInvoker()) using (var connectionListener = new EEGDataListener(invoker, s => connected = true, null, s => connected = false)) { // listen for a broken connection this.dataSource.AddListener(connectionListener); foreach (var view in this.GetViews(invoker, anslog, logWriter, dataWriter, i, pres)) { if (connected) { yield return(view); } else { GUIUtils.Alert("Lost connection to headset!"); break; } } this.dataSource.RemoveListener(connectionListener); } } } }
/// <summary> /// The enumerator implementation /// </summary> public override IEnumerator <View> GetEnumerator() { IViewResult result; yield return(new ChoiceView(new string[] { "Start Training Phase" }, out result) { Text = "Click When Ready" }); for (int j = 0; j < comp.Count; j++) { yield return(new TextView(comp[j], settings.PresentationTime, GUIUtils.Constants.DISPLAY_FONT_LARGE)); yield return(new RestView(settings.RestTime)); } yield return(new ChoiceView(new string[] { "Begin Testing" }, out result) { Text = "Click When Ready" }); //Display each block of stimuli for (int j = 0; j < (settings.NumBlocks * 2); j++) { int limit = blocks[j].Count; for (int k = 0; k < limit; k++) { //Rest yield return(new RestView(this.settings.BlinkTime)); //Fixate yield return(new FixationView(this.settings.FixationTime)); var stimulus = blocks[j].RemoveRandom(); //Generate stimulus view yield return(new TextView(stimulus, settings.PresentationTime, GUIUtils.Constants.DISPLAY_FONT_LARGE)); yield return(new TextView(stimulus + "*", settings.PresentationTime / 2, GUIUtils.Constants.DISPLAY_FONT_LARGE)); } yield return(new ChoiceView(new string[] { "Ready for next block" }, out result)); } RandomizedQueue <string> pres = new RandomizedQueue <string>(); RandomizedQueue <string> usedPres = new RandomizedQueue <string>(); RandomizedQueue <StudyTestPair> studySoon = new RandomizedQueue <StudyTestPair>(); RandomizedQueue <StudyTestPair> testSoon = new RandomizedQueue <StudyTestPair>(); RandomizedQueue <StudyTestPair> testLate = new RandomizedQueue <StudyTestPair>(); pres.AddRange(presentation); testSoon.AddRange(stp); yield return(new ChoiceView(new string[] { "Start Initial Study Phase" }, out result) { Text = "Click When Ready" }); while (pres.Count > 0) { var stimulus = pres.RemoveRandom(); yield return(new TextView(stimulus, this.settings.PresentationTime, GUIUtils.Constants.DISPLAY_FONT_LARGE)); yield return(new RestView(this.settings.RestTime)); usedPres.Add(stimulus); } pres.AddRange(usedPres); using (var logWriterV = new StreamWriter(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "userctrl_logv_" + settings.SubjectName + "_" + DateTime.Now.ToString("MM dd yyyy H mm ss") + ".txt"))) using (var logWriter = new StreamWriter(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "userctrl_log_" + settings.SubjectName + "_" + DateTime.Now.ToString("MM dd yyyy H mm ss") + ".csv"))) { yield return(new ChoiceView(new string[] { "Start Practice Phase" }, out result) { Text = "Click When Ready" }); using (var invoker = new SingleThreadedInvoker()) { foreach (var view in this.GetViews(invoker, logWriterV, logWriter, studySoon, testSoon, testLate)) { yield return(view); } } } }