void checkFileQueue() { if (fileQueue == null) { fileQueue = new RandomizedQueue <AudioFile>(); } }
public IEnumerable <View> RunTrial(int index, bool isStudy, StudyTestPair stp, StreamWriter logWriter, StreamWriter logWriterV, //List<EEGDataEntry> currentTrialEntries, RandomizedQueue <StudyTestPair> studySoon, RandomizedQueue <StudyTestPair> testSoon, RandomizedQueue <StudyTestPair> testLate) { //yield return new RestView(this.settings.BlinkTime); int trialnumber = index + 1; yield return(new TextView("Trial number: " + trialnumber, this.settings.BlinkTime, GUIUtils.Constants.DISPLAY_FONT_LARGE)); yield return(new FixationView(this.settings.FixationTime)); IViewResult result; View vocabView; if (isStudy) { vocabView = new TextView(stp.test + Environment.NewLine + stp.answer, settings.DisplayTime, GUIUtils.Constants.DISPLAY_FONT_LARGE); } else { vocabView = new VocabView(stp.test, stp.answer, settings.DisplayTime, settings.DelayTime, false, out result); } yield return(vocabView); //The user controls which group the stimulus goes into after the trial StudyTestPair toAdd = stp; //new StudyTestPair(stp.test, stp.answer, stp.number); if (!isStudy) { yield return(new TextView((bool)vocabView.Result.Value ? "Correct" : "Incorrect", settings.FeedbackTime, GUIUtils.Constants.DISPLAY_FONT_LARGE)); int toWrite = (bool)vocabView.Result.Value ? 1 : 0; logWriter.WriteLine(toAdd.number + ", " + toWrite); string[] options = { "Study Soon", "Test Soon", "Test Later" }; ChoiceView choice = new ChoiceView(options); yield return(choice); if ((string)choice.Result.Value == options[0]) { studySoon.Add(toAdd); } else if ((string)choice.Result.Value == options[1]) { testSoon.Add(toAdd); } else { testLate.Add(toAdd); } logWriterV.WriteLine("User Answer: " + vocabView.Result.Value); logWriterV.WriteLine("User Choice: " + choice.Result.Value); } else { testSoon.Add(toAdd); logWriterV.WriteLine("Study Trial"); } }
public UserCtrlProvider(IArrayView <string> presentation, IArrayView <string> comp, IArrayView <string> class1, IArrayView <string> class2, RandomizedQueue <StudyTestPair> stp, UserCtrlSettings settings)//, IEEGDataSource dataSource) { this.presentation = presentation; this.comp = comp; this.class1 = class1; this.class2 = class2; this.stp = stp; this.settings = settings; blocks = new RandomizedQueue <string> [settings.NumBlocks * 2]; int limit = 0; for (int i = 0; i < settings.NumBlocks * 2; i += 2) { blocks[i] = new RandomizedQueue <string>(); blocks[i + 1] = new RandomizedQueue <string>(); for (int j = 0 + limit * settings.BlockSize; j < (limit + 1) * settings.BlockSize; j++) { blocks[i].Add(this.class1[j]); blocks[i + 1].Add(this.class2[j]); } limit++; } }
void initCyclingAudio() { //TODO: Init Queue's with sound files once they're delivered _sweeteners = new RandomizedQueue <AudioFile>(); _swells = new RandomizedQueue <AudioFile>(); startTrackCycling(); }
public TestProvider(IArrayView <string> presentation, RandomizedQueue <StudyTestPair> stp, TestSettings settings) { this.presentation = presentation; this.stp = stp; this.settings = settings; }
public void RandomizedQueueTest() { for (var k = 0; k < 9; k++) { var q = new RandomizedQueue<string>(); var items = new List<string> { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }; foreach (var item in items) { q.Enqueue(item); } var array = new List<string>(); for (var i = 0; i < k; i++) { array.Add(q.Dequeue()); } Assert.AreEqual(k, array.Distinct().Count()); } }
public FalseAdaptProvider(RandomizedQueue <StudyTestTuple> presentation, IArrayView <string> comp, IArrayView <string> class1, IArrayView <string> class2, IArrayView <string> study, FalseAdaptSettings settings) { this.presentation = presentation; this.comp = comp; this.class1 = class1; this.class2 = class2; this.settings = settings; this.study = study; blocks = new RandomizedQueue <string> [settings.NumBlocks * 2]; int limit = 0; for (int i = 0; i < settings.NumBlocks * 2; i += 2) { blocks[i] = new RandomizedQueue <string>(); blocks[i + 1] = new RandomizedQueue <string>(); for (int j = 0 + limit * settings.BlockSize; j < (limit + 1) * settings.BlockSize; j++) { blocks[i].Add(this.class1[j]); blocks[i + 1].Add(this.class2[j]); } limit++; } }
//MATLAB REFERENCE. You must add the matlab reference via the project menu before this will work //MLApp.MLApp matlab; public AdaptiveProvider(RandomizedQueue <StudyTestPair> stp, IArrayView <string> presentation, IArrayView <string> class1, IArrayView <string> class2, AdaptiveSettings settings, IEEGDataSource dataSource, IArray <ClassificationScheme> classifiers) { this.pres = stp; this.settings = settings; this.dataSource = dataSource; this.presentation = presentation; this.class1 = class1; this.class2 = class2; this.classifiers = classifiers; //NOTE: It will always take the first classification scheme chosen //TODO: Make it so that only one classification scheme can be specified classifier = new ClassifierManager(classifiers[0]); //MATLAB REFERENCE //matlab = new MLApp.MLApp(); blocks = new RandomizedQueue <string> [settings.NumBlocks * 2]; int limit = 0; for (int i = 0; i < settings.NumBlocks * 2; i += 2) { blocks[i] = new RandomizedQueue <string>(); blocks[i + 1] = new RandomizedQueue <string>(); for (int j = 0 + limit * settings.BlockSize; j < (limit + 1) * settings.BlockSize; j++) { blocks[i].Add(this.class1[j]); blocks[i + 1].Add(this.class2[j]); } limit++; } }
// Coroutine that varies the frequency with which it plays audio files IEnumerator cycleTracksFrequenecyRange(RandomizedQueue <AudioFile> files, float minFrequency, float maxFrequency) { while (coroutinesActive) { Play(files.Cycle()); yield return(new WaitForSeconds(UnityEngine.Random.Range(minFrequency, maxFrequency))); } }
public KRMonitorProvider(IArrayView <string> presentation, RandomizedQueue <StudyTestPair> stp, KRMonitorSettings settings, IEEGDataSource dataSource) { this.presentation = presentation; this.stp = stp; this.settings = settings; this.dataSource = dataSource; }
// Plays audio files on a set frequenecy IEnumerator cycleTracksFrequenecy(RandomizedQueue <AudioFile> files, float frequenecy) { while (coroutinesActive) { Play(files.Cycle()); yield return(new WaitForSeconds(frequenecy)); } }
// Plays audio files back to back IEnumerator cycleTracksContinuous(RandomizedQueue <AudioFile> files) { while (coroutinesActive) { AudioFile nextTrack = files.Cycle(); Play(nextTrack); yield return(new WaitForSeconds(nextTrack.Clip.length)); } }
// Test randomized queue void randomizedQeueDemo () { string[] testList = new string[]{"one", "two", "three"}; RandomizedQueue<string> queue = new RandomizedQueue<string>(testList); // Cycle ensures that the randomized queue does not return the same value two times in a row // But it also re-adds the value for (int i = 0; i < 20; i++) { Debug.Log(queue.Cycle()); } }
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); } }
static void Main(string[] args) { var queue = new RandomizedQueue<string>(); queue.Enqueue("Item1"); queue.Enqueue("Item2"); queue.Enqueue("Item3"); queue.Enqueue("Item4"); queue.Enqueue("Item5"); queue.Enqueue("Item6"); queue.Enqueue("Item7"); foreach (var item in queue) { Console.WriteLine(item); } for (int i = 0; i < 7; i++) { Console.WriteLine(queue.Dequeue()); } }
public CompetitionExperimentProvider(IArrayView <string> presentation, IArrayView <string> class1, IArrayView <string> class2, CompetitionExperimentSettings settings, IEEGDataSource dataSource) { this.presentation = presentation; this.class1 = class1; this.class2 = class2; this.settings = settings; this.dataSource = dataSource; blocks = new RandomizedQueue <string> [settings.NumBlocks * 2]; int limit = 0; for (int i = 0; i < settings.NumBlocks * 2; i += 2) { blocks[i] = new RandomizedQueue <string>(); blocks[i + 1] = new RandomizedQueue <string>(); for (int j = 0 + limit * settings.BlockSize; j < (limit + 1) * settings.BlockSize; j++) { blocks[i].Add(this.class1[j]); blocks[i + 1].Add(this.class2[j]); } limit++; } }
/// <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); } } }
void initCyclingAudio () { _sweeteners = new RandomizedQueue<AudioFile>(); _swells = new RandomizedQueue<AudioFile>(); _GUIclicks = new RandomizedQueue<AudioFile>(); _matey = new RandomizedQueue<AudioFile>(); _ambienceMain = new RandomizedQueue<AudioFile>(); _ambienceTutorial = new RandomizedQueue<AudioFile>(); _swabbie = new RandomizedQueue<AudioFile>(); _firstMate = new RandomizedQueue<AudioFile>(); _swabbieSpeech = new RandomizedQueue<AudioFile>(); _quarterMaster = new RandomizedQueue<AudioFile>(); _rigger = new RandomizedQueue<AudioFile>(); _secondMate = new RandomizedQueue<AudioFile>(); _oj = new RandomizedQueue<AudioFile>(); _sadieAhoy = new RandomizedQueue<AudioFile>(); _sadieTalk = new RandomizedQueue<AudioFile>(); _shipmaster = new RandomizedQueue<AudioFile>(); // Init Queue's with sound files List<AudioFile> list = new List<AudioFile>(); // Get all deck music playEvents.TryGetValue ("onesoundtrackevery100to200seconds",out list); foreach (AudioFile track in list) { _swells.Enqueue (track); } playEvents.TryGetValue ("every8to20seconds",out list); foreach (AudioFile track in list) { _sweeteners.Enqueue (track); } // Get all GUI click sounds playEvents.TryGetValue ("GUI Click",out list); foreach (AudioFile track in list) { _GUIclicks.Enqueue (track); } // Get all matey sounds playEvents.TryGetValue ("MateyButton",out list); foreach (AudioFile track in list) { _matey.Enqueue (track); } // Get ambience playEvents.TryGetValue ("EnterTutorial",out list); foreach (AudioFile track in list) { _ambienceTutorial.Enqueue (track); } playEvents.TryGetValue ("enterscene",out list); foreach (AudioFile track in list) { _ambienceMain.Enqueue (track); } // Get swabbie mopping sound playEvents.TryGetValue ("MopOnFloor",out list); foreach (AudioFile track in list) { _swabbie.Enqueue (track); } // Speaking voice effects playEvents.TryGetValue ("FirstMateSpeech",out list); foreach (AudioFile track in list) { _firstMate.Enqueue (track); } playEvents.TryGetValue ("SwabbieTalk",out list); foreach (AudioFile track in list) { _swabbieSpeech.Enqueue (track); } playEvents.TryGetValue ("RiggerTalk",out list); foreach (AudioFile track in list) { _rigger.Enqueue (track); } playEvents.TryGetValue ("QuartermasterTalk",out list); foreach (AudioFile track in list) { _quarterMaster.Enqueue (track); } playEvents.TryGetValue ("SecondmateTalks",out list); foreach (AudioFile track in list) { _secondMate.Enqueue (track); } playEvents.TryGetValue ("OJTalk",out list); foreach (AudioFile track in list) { _oj.Enqueue (track); } playEvents.TryGetValue ("SadieAhoy",out list); foreach (AudioFile track in list) { _sadieAhoy.Enqueue (track); } playEvents.TryGetValue ("SadieTalk",out list); foreach (AudioFile track in list) { _sadieTalk.Enqueue (track); } playEvents.TryGetValue ("ShipmasterTalk",out list); foreach (AudioFile track in list) { _shipmaster.Enqueue (track); } }
/// <summary> /// Builds the application view for the User Control Vocabulary Application /// </summary> public void BuildUserCtrlView() { this.SuspendLayout(); this.Text = GUIUtils.Strings.APP_NAME; this.Size = new System.Drawing.Size(1500, 750); //Settings panel var config = ConfigurationPanel.Create <UserCtrlSettings>(); var stimulipanel = new UserCtrlSelectorPanel() { Dock = DockStyle.Fill }; // start button var startButton = GUIUtils.CreateFlatButton("Start Experiment", b => { var settings = (UserCtrlSettings)config.GetConfiguredObject(); var presentation = this.ReadUserStimuli(stimulipanel.PresentationFile); var test = this.ReadUserStimuli(stimulipanel.TestFile); var ans = this.ReadUserStimuli(stimulipanel.AnsFile); var comp = this.ReadCompetitionStimuli(stimulipanel.CompFile); var class1 = this.ReadCompetitionStimuli(stimulipanel.Class1File); var class2 = this.ReadCompetitionStimuli(stimulipanel.Class2File); //Make study-test pairs for the practice phase RandomizedQueue <MCAEmotiv.GUI.UserControlVocab.StudyTestPair> stp = new RandomizedQueue <MCAEmotiv.GUI.UserControlVocab.StudyTestPair>(); for (int i = 0; i < test.Count; i++) { stp.Add(new MCAEmotiv.GUI.UserControlVocab.StudyTestPair(test[i], ans[i], i)); } if (presentation == null) { return; } this.Animate(new UserCtrlProvider(presentation, comp, class1, class2, stp, settings)); }); //Dialog boxes for saving and loading experiment settings var saveDialog = new SaveFileDialog() { Title = "Save experiment settings", Filter = "Experiment settings files|*.usersettings", InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) }; var openDialog = new OpenFileDialog() { Title = "Select the saved experiment settings (.usersettings) file", Filter = "Experiment settings files|*.usersettings", InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), Multiselect = false }; // button table for saving and loading experiment settings var buttonTable = GUIUtils.CreateButtonTable(Direction.Horizontal, DockStyle.Fill, GUIUtils.CreateFlatButton("Save", b => { var settings = (UserCtrlSettings)config.GetConfiguredObject(); settings.PresentationFile = stimulipanel.PresentationFile; settings.TestFile = stimulipanel.TestFile; settings.AnsFile = stimulipanel.AnsFile; settings.CompFile = stimulipanel.CompFile; settings.Class1File = stimulipanel.Class1File; settings.Class2File = stimulipanel.Class2File; saveDialog.FileName = string.IsNullOrWhiteSpace(settings.ExperimentName) ? "my experiment" : settings.ExperimentName; if (saveDialog.ShowDialog() != DialogResult.OK) { return; } bool saved = settings.TrySerializeToFile(saveDialog.FileName); GUIUtils.Alert((saved ? "Saved" : "Failed to save") + " experiment info to " + saveDialog.FileName, (saved ? MessageBoxIcon.Information : MessageBoxIcon.Error)); string directory = Path.GetDirectoryName(saveDialog.FileName); if (Directory.Exists(directory)) { saveDialog.InitialDirectory = directory; } }, null, "Save experiment configuration information"), GUIUtils.CreateFlatButton("Load", b => { if (openDialog.ShowDialog() != DialogResult.OK) { return; } UserCtrlSettings settings; if (Utils.TryDeserializeFile(openDialog.FileName, out settings)) { config.SetConfiguredObject(settings); stimulipanel.PresentationFile = settings.PresentationFile; stimulipanel.TestFile = settings.TestFile; stimulipanel.AnsFile = settings.AnsFile; stimulipanel.CompFile = settings.CompFile; stimulipanel.Class1File = settings.Class1File; stimulipanel.Class2File = settings.Class2File; } else { GUIUtils.Alert("Failed to load experiment info from " + openDialog.FileName, MessageBoxIcon.Error); } }, null, "Load a previously saved experiment settings file")); //Put together the GUI var rows = GUIUtils.CreateTable(new[] { .5, .35, .15 }, Direction.Vertical); var col3 = GUIUtils.CreateTable(new[] { .5, .5 }, Direction.Horizontal); col3.Controls.Add(stimulipanel, 1, 0); col3.Controls.Add(buttonTable, 0, 0); rows.Controls.Add(col3, 0, 1); rows.Controls.Add(startButton, 0, 2); rows.Controls.Add(config, 0, 0); this.Controls.Add(rows); this.ResumeLayout(false); }
// Plays audio files back to back IEnumerator cycleTracksContinuous (RandomizedQueue<AudioFile> files) { while (_coroutinesActive) { AudioFile nextTrack = files.Cycle(); Play(nextTrack); yield return new WaitForSeconds(nextTrack.Clip.length); } }
// Coroutine that varies the frequency with which it plays audio files IEnumerator cycleTracksFrequenecyRange (RandomizedQueue<AudioFile> files, float minFrequency, float maxFrequency) { while (_coroutinesActive) { Play(files.Cycle()); yield return new WaitForSeconds( UnityEngine.Random.Range( minFrequency, maxFrequency ) ); } }
// Plays audio files on a set frequenecy IEnumerator cycleTracksFrequenecy (RandomizedQueue<AudioFile> files, float frequenecy) { while (_coroutinesActive) { Play(files.Cycle()); yield return new WaitForSeconds(frequenecy); } }
public IEnumerable <View> RunTrial(int index, string tst, string ans, int numstim, StreamWriter dataWriter, StreamWriter logWriter, StreamWriter anslog, List <EEGDataEntry> currentTrialEntries, RandomizedQueue <string> pres) { yield return(new RestView(this.settings.BlinkTime)); yield return(new FixationView(this.settings.FixationTime)); IViewResult result; var vocabView = new VocabView(tst, ans, settings.DisplayTime, settings.DelayTime, false, anslog, out result); vocabView.DoOnDeploy(c => this.dataSource.Marker = index + 1); bool noWrite = false; vocabView.DoOnFinishing(() => { this.dataSource.Marker = EEGDataEntry.MARKER_DEFAULT; lock (currentTrialEntries) { var trialsDuringDelay = currentTrialEntries.Where(e => e.RelativeTimeStamp <= settings.DelayTime); if (this.settings.ArtifactDetectionSettings.HasMotionArtifact(trialsDuringDelay)) { //logWriter.WriteLine("Motion Artifact Detected"); noWrite = true; } else { if (this.settings.SaveTrialData) { foreach (var entry in trialsDuringDelay) { dataWriter.WriteLine(entry + ", {0}", numstim); } } } currentTrialEntries.Clear(); } }); yield return(vocabView); //No feedback in original Karpicke and Roediger, but I'm leaving the option //yield return new TextView((bool)result.Value ? "Correct" : "Incorrect", settings.FeedbackTime, GUIUtils.Constants.DISPLAY_FONT); int towrite = 0; if ((bool)result.Value) { pres.Remove(tst + Environment.NewLine + ans); towrite = 1; } if (!noWrite) { logWriter.WriteLine(numstim + ", " + towrite + ", " + index + 1); } //if (needToRerun) //{ // foreach (var view in RunTrial(index, tst, ans, dataWriter, logWriter, currentTrialEntries, pres)) // { // yield return view; // } //} }
/// <summary> /// Builds the application view for the User Control Vocabulary Application /// </summary> public void BuildUserCtrlView() { this.SuspendLayout(); this.Text = GUIUtils.Strings.APP_NAME; this.Size = new System.Drawing.Size(1500, 750); //Settings panel var config = ConfigurationPanel.Create<UserCtrlSettings>(); var stimulipanel = new UserCtrlSelectorPanel() { Dock = DockStyle.Fill }; // start button var startButton = GUIUtils.CreateFlatButton("Start Experiment", b => { var settings = (UserCtrlSettings)config.GetConfiguredObject(); var presentation = this.ReadUserStimuli(stimulipanel.PresentationFile); var test = this.ReadUserStimuli(stimulipanel.TestFile); var ans = this.ReadUserStimuli(stimulipanel.AnsFile); var comp = this.ReadCompetitionStimuli(stimulipanel.CompFile); var class1 = this.ReadCompetitionStimuli(stimulipanel.Class1File); var class2 = this.ReadCompetitionStimuli(stimulipanel.Class2File); //Make study-test pairs for the practice phase RandomizedQueue<MCAEmotiv.GUI.UserControlVocab.StudyTestPair> stp = new RandomizedQueue<MCAEmotiv.GUI.UserControlVocab.StudyTestPair>(); for (int i = 0; i < test.Count; i++) { stp.Add(new MCAEmotiv.GUI.UserControlVocab.StudyTestPair(test[i], ans[i], i)); } if (presentation == null) return; this.Animate(new UserCtrlProvider(presentation, comp, class1, class2, stp, settings)); }); //Dialog boxes for saving and loading experiment settings var saveDialog = new SaveFileDialog() { Title = "Save experiment settings", Filter = "Experiment settings files|*.usersettings", InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) }; var openDialog = new OpenFileDialog() { Title = "Select the saved experiment settings (.usersettings) file", Filter = "Experiment settings files|*.usersettings", InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), Multiselect = false }; // button table for saving and loading experiment settings var buttonTable = GUIUtils.CreateButtonTable(Direction.Horizontal, DockStyle.Fill, GUIUtils.CreateFlatButton("Save", b => { var settings = (UserCtrlSettings)config.GetConfiguredObject(); settings.PresentationFile = stimulipanel.PresentationFile; settings.TestFile = stimulipanel.TestFile; settings.AnsFile = stimulipanel.AnsFile; settings.CompFile = stimulipanel.CompFile; settings.Class1File = stimulipanel.Class1File; settings.Class2File = stimulipanel.Class2File; saveDialog.FileName = string.IsNullOrWhiteSpace(settings.ExperimentName) ? "my experiment" : settings.ExperimentName; if (saveDialog.ShowDialog() != DialogResult.OK) return; bool saved = settings.TrySerializeToFile(saveDialog.FileName); GUIUtils.Alert((saved ? "Saved" : "Failed to save") + " experiment info to " + saveDialog.FileName, (saved ? MessageBoxIcon.Information : MessageBoxIcon.Error)); string directory = Path.GetDirectoryName(saveDialog.FileName); if (Directory.Exists(directory)) saveDialog.InitialDirectory = directory; }, null, "Save experiment configuration information"), GUIUtils.CreateFlatButton("Load", b => { if (openDialog.ShowDialog() != DialogResult.OK) return; UserCtrlSettings settings; if (Utils.TryDeserializeFile(openDialog.FileName, out settings)) { config.SetConfiguredObject(settings); stimulipanel.PresentationFile = settings.PresentationFile; stimulipanel.TestFile = settings.TestFile; stimulipanel.AnsFile = settings.AnsFile; stimulipanel.CompFile = settings.CompFile; stimulipanel.Class1File = settings.Class1File; stimulipanel.Class2File = settings.Class2File; } else GUIUtils.Alert("Failed to load experiment info from " + openDialog.FileName, MessageBoxIcon.Error); }, null, "Load a previously saved experiment settings file")); //Put together the GUI var rows = GUIUtils.CreateTable(new[] { .5, .35, .15 }, Direction.Vertical); var col3 = GUIUtils.CreateTable(new[] { .5, .5 }, Direction.Horizontal); col3.Controls.Add(stimulipanel, 1, 0); col3.Controls.Add(buttonTable, 0, 0); rows.Controls.Add(col3, 0, 1); rows.Controls.Add(startButton, 0, 2); rows.Controls.Add(config, 0, 0); this.Controls.Add(rows); this.ResumeLayout(false); }
/// <summary> /// Builds the application view for the False Adaptive Application /// </summary> public void BuildFAdaptView() { this.SuspendLayout(); this.Text = GUIUtils.Strings.APP_NAME; this.Size = new System.Drawing.Size(1500, 750); //Settings panels var config = ConfigurationPanel.Create<FalseAdaptSettings>(); var artifactConfig = ConfigurationPanel.Create<ArtifactDetectionSettings>(); var stimulipanel = new FalseAdaptSelectorPanel() { Dock = DockStyle.Fill }; //Headset Connected? EmotivStatusCheckerPanel statusChecker = new EmotivStatusCheckerPanel() { Dock = DockStyle.Fill }; // start button var startButton = GUIUtils.CreateFlatButton("Start Experiment", b => { var settings = (FalseAdaptSettings)config.GetConfiguredObject(); settings.ArtifactDetectionSettings = (ArtifactDetectionSettings)artifactConfig.GetConfiguredObject(); var presentation = this.ReadFAStimuli(stimulipanel.PresentationFile); var comp = this.ReadCompetitionStimuli(stimulipanel.CompFile); var class1 = this.ReadCompetitionStimuli(stimulipanel.Class1File); var class2 = this.ReadCompetitionStimuli(stimulipanel.Class2File); var study = this.ReadUserStimuli(stimulipanel.StudyFile); //Make study-test pairs for practice phase RandomizedQueue<StudyTestTuple> stt = new RandomizedQueue<StudyTestTuple>(); for (int i = 0; i < presentation.Count; i++) { if (presentation[i] == "5") stt.Add(new StudyTestTuple(presentation[i+1], presentation[i+1], true)); if (presentation[i] == "7") stt.Add(new StudyTestTuple(presentation[i + 1], presentation[i + 2], false)); } this.Animate(new FalseAdaptProvider(stt, comp, class1, class2, study, settings)); }); //Dialog boxes for saving and loading experiment settings var saveDialog = new SaveFileDialog() { Title = "Save experiment settings", Filter = "Experiment settings files|*.fasettings", InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) }; var openDialog = new OpenFileDialog() { Title = "Select the saved experiment settings (.fasettings) file", Filter = "Experiment settings files|*.fasettings", InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), Multiselect = false }; // button table for saving and loading experiment settings var buttonTable = GUIUtils.CreateButtonTable(Direction.Horizontal, DockStyle.Fill, GUIUtils.CreateFlatButton("Save", b => { var settings = (FalseAdaptSettings)config.GetConfiguredObject(); settings.PresentationFile = stimulipanel.PresentationFile; settings.StudyFile = stimulipanel.StudyFile; settings.CompFile = stimulipanel.CompFile; settings.Class1File = stimulipanel.Class1File; settings.Class2File = stimulipanel.Class2File; settings.ArtifactDetectionSettings = (ArtifactDetectionSettings)artifactConfig.GetConfiguredObject(); saveDialog.FileName = string.IsNullOrWhiteSpace(settings.ExperimentName) ? "my experiment" : settings.ExperimentName; if (saveDialog.ShowDialog() != DialogResult.OK) return; bool saved = settings.TrySerializeToFile(saveDialog.FileName); GUIUtils.Alert((saved ? "Saved" : "Failed to save") + " experiment info to " + saveDialog.FileName, (saved ? MessageBoxIcon.Information : MessageBoxIcon.Error)); string directory = Path.GetDirectoryName(saveDialog.FileName); if (Directory.Exists(directory)) saveDialog.InitialDirectory = directory; }, null, "Save experiment configuration information"), GUIUtils.CreateFlatButton("Load", b => { if (openDialog.ShowDialog() != DialogResult.OK) return; FalseAdaptSettings settings; if (Utils.TryDeserializeFile(openDialog.FileName, out settings)) { config.SetConfiguredObject(settings); stimulipanel.PresentationFile = settings.PresentationFile; stimulipanel.StudyFile = settings.StudyFile; stimulipanel.CompFile = settings.CompFile; stimulipanel.Class1File = settings.Class1File; stimulipanel.Class2File = settings.Class2File; artifactConfig.SetConfiguredObject(settings.ArtifactDetectionSettings); } else GUIUtils.Alert("Failed to load experiment info from " + openDialog.FileName, MessageBoxIcon.Error); }, null, "Load a previously saved experiment settings file")); //Put together the GUI var rows = GUIUtils.CreateTable(new[] { .5, .3, .2 }, Direction.Vertical); var col1 = GUIUtils.CreateTable(new[] { .5, .5 }, Direction.Horizontal); var col2 = GUIUtils.CreateTable(new[] { .5, .5 }, Direction.Horizontal); var col3 = GUIUtils.CreateTable(new[] { .5, .5 }, Direction.Horizontal); col2.Controls.Add(artifactConfig, 1, 0); col1.Controls.Add(startButton, 1, 0); col1.Controls.Add(statusChecker, 0, 0); col2.Controls.Add(config, 0, 0); col3.Controls.Add(stimulipanel, 1, 0); col3.Controls.Add(buttonTable, 0, 0); rows.Controls.Add(col3, 0, 1); rows.Controls.Add(col1, 0, 2); rows.Controls.Add(col2, 0, 0); this.Controls.Add(rows); this.ResumeLayout(false); }
/// <summary> /// Builds the application view for the False Adaptive Application /// </summary> public void BuildFAdaptView() { this.SuspendLayout(); this.Text = GUIUtils.Strings.APP_NAME; this.Size = new System.Drawing.Size(1500, 750); //Settings panels var config = ConfigurationPanel.Create <FalseAdaptSettings>(); var artifactConfig = ConfigurationPanel.Create <ArtifactDetectionSettings>(); var stimulipanel = new FalseAdaptSelectorPanel() { Dock = DockStyle.Fill }; //Headset Connected? EmotivStatusCheckerPanel statusChecker = new EmotivStatusCheckerPanel() { Dock = DockStyle.Fill }; // start button var startButton = GUIUtils.CreateFlatButton("Start Experiment", b => { var settings = (FalseAdaptSettings)config.GetConfiguredObject(); settings.ArtifactDetectionSettings = (ArtifactDetectionSettings)artifactConfig.GetConfiguredObject(); var presentation = this.ReadFAStimuli(stimulipanel.PresentationFile); var comp = this.ReadCompetitionStimuli(stimulipanel.CompFile); var class1 = this.ReadCompetitionStimuli(stimulipanel.Class1File); var class2 = this.ReadCompetitionStimuli(stimulipanel.Class2File); var study = this.ReadUserStimuli(stimulipanel.StudyFile); //Make study-test pairs for practice phase RandomizedQueue <StudyTestTuple> stt = new RandomizedQueue <StudyTestTuple>(); for (int i = 0; i < presentation.Count; i++) { if (presentation[i] == "5") { stt.Add(new StudyTestTuple(presentation[i + 1], presentation[i + 1], true)); } if (presentation[i] == "7") { stt.Add(new StudyTestTuple(presentation[i + 1], presentation[i + 2], false)); } } this.Animate(new FalseAdaptProvider(stt, comp, class1, class2, study, settings)); }); //Dialog boxes for saving and loading experiment settings var saveDialog = new SaveFileDialog() { Title = "Save experiment settings", Filter = "Experiment settings files|*.fasettings", InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) }; var openDialog = new OpenFileDialog() { Title = "Select the saved experiment settings (.fasettings) file", Filter = "Experiment settings files|*.fasettings", InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), Multiselect = false }; // button table for saving and loading experiment settings var buttonTable = GUIUtils.CreateButtonTable(Direction.Horizontal, DockStyle.Fill, GUIUtils.CreateFlatButton("Save", b => { var settings = (FalseAdaptSettings)config.GetConfiguredObject(); settings.PresentationFile = stimulipanel.PresentationFile; settings.StudyFile = stimulipanel.StudyFile; settings.CompFile = stimulipanel.CompFile; settings.Class1File = stimulipanel.Class1File; settings.Class2File = stimulipanel.Class2File; settings.ArtifactDetectionSettings = (ArtifactDetectionSettings)artifactConfig.GetConfiguredObject(); saveDialog.FileName = string.IsNullOrWhiteSpace(settings.ExperimentName) ? "my experiment" : settings.ExperimentName; if (saveDialog.ShowDialog() != DialogResult.OK) { return; } bool saved = settings.TrySerializeToFile(saveDialog.FileName); GUIUtils.Alert((saved ? "Saved" : "Failed to save") + " experiment info to " + saveDialog.FileName, (saved ? MessageBoxIcon.Information : MessageBoxIcon.Error)); string directory = Path.GetDirectoryName(saveDialog.FileName); if (Directory.Exists(directory)) { saveDialog.InitialDirectory = directory; } }, null, "Save experiment configuration information"), GUIUtils.CreateFlatButton("Load", b => { if (openDialog.ShowDialog() != DialogResult.OK) { return; } FalseAdaptSettings settings; if (Utils.TryDeserializeFile(openDialog.FileName, out settings)) { config.SetConfiguredObject(settings); stimulipanel.PresentationFile = settings.PresentationFile; stimulipanel.StudyFile = settings.StudyFile; stimulipanel.CompFile = settings.CompFile; stimulipanel.Class1File = settings.Class1File; stimulipanel.Class2File = settings.Class2File; artifactConfig.SetConfiguredObject(settings.ArtifactDetectionSettings); } else { GUIUtils.Alert("Failed to load experiment info from " + openDialog.FileName, MessageBoxIcon.Error); } }, null, "Load a previously saved experiment settings file")); //Put together the GUI var rows = GUIUtils.CreateTable(new[] { .5, .3, .2 }, Direction.Vertical); var col1 = GUIUtils.CreateTable(new[] { .5, .5 }, Direction.Horizontal); var col2 = GUIUtils.CreateTable(new[] { .5, .5 }, Direction.Horizontal); var col3 = GUIUtils.CreateTable(new[] { .5, .5 }, Direction.Horizontal); col2.Controls.Add(artifactConfig, 1, 0); col1.Controls.Add(startButton, 1, 0); col1.Controls.Add(statusChecker, 0, 0); col2.Controls.Add(config, 0, 0); col3.Controls.Add(stimulipanel, 1, 0); col3.Controls.Add(buttonTable, 0, 0); rows.Controls.Add(col3, 0, 1); rows.Controls.Add(col1, 0, 2); rows.Controls.Add(col2, 0, 0); this.Controls.Add(rows); this.ResumeLayout(false); }
/// <summary> /// The enumerator implementation /// </summary> public override IEnumerator <View> GetEnumerator() { IViewResult result; Random numgen = new Random(); RandomizedQueue <StudyTestPair> study = new RandomizedQueue <StudyTestPair>(); RandomizedQueue <StudyTestPair> quiz = new RandomizedQueue <StudyTestPair>(); RandomizedQueue <StudyTestPair> done = new RandomizedQueue <StudyTestPair>(); string filename = "adapt_data_" + settings.SubjectName + "_" + DateTime.Now.ToString("MM dd yyyy H mm ss") + ".csv"; using (var logWriter = new StreamWriter(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "adapt_log_" + settings.SubjectName + "_" + DateTime.Now.ToString("MM dd yyyy H mm ss") + ".txt"))) //If using MATLAB reference, the datawriter path must match the location of your MATLAB code using (var dataWriter = new StreamWriter(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), filename))) { yield return(new ChoiceView(new string[] { "Ready for Training Study Phase" }, out result)); //Present competition stimuli for study for (int j = 0; j < presentation.Count; j++) { yield return(new TextView(presentation[j], this.settings.PresentationTime, GUIUtils.Constants.DISPLAY_FONT_LARGE)); yield return(new RestView(this.settings.RestTime)); } //Begin the practice phase yield return(new ChoiceView(new string[] { "Start Training EEG Recording" }, out result) { Text = "Click When Ready" }); var compconnected = true; // assume it's connected using (var compinvoker = new SingleThreadedInvoker()) using (var compconnectionListener = new EEGDataListener(compinvoker, s => compconnected = true, null, s => compconnected = false)) { // listen for a broken connection this.dataSource.AddListener(compconnectionListener); foreach (var view in this.GetCompViews(compinvoker, logWriter, dataWriter)) { if (compconnected) { yield return(view); } else { GUIUtils.Alert("Lost connection to headset!"); break; } } this.dataSource.RemoveListener(compconnectionListener); } //Check that the person has sufficient training data if (numArt1 > 24 || numArt2 > 24) { yield return(new TextView("Error: Weeping Angel", settings.InstructionTime, GUIUtils.Constants.DISPLAY_FONT_LARGE)); } //MATLAB REFERENCE //matlab.Execute("cd c:\\Users\\Nicole\\Documents\\Matlab\\Thesis\\Adapt"); //matlab.Execute("classifier = wekacomptrain('"+ filename + "');"); 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.test + "\n" + stimulus.answer, this.settings.PresentationTime, GUIUtils.Constants.DISPLAY_FONT_LARGE)); yield return(new RestView(this.settings.RestTime)); quiz.Add(stimulus); } 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, logWriter, dataWriter, study, quiz, done, numgen)) { if (connected) { yield return(view); } else { GUIUtils.Alert("Lost connection to headset!"); break; } } this.dataSource.RemoveListener(connectionListener); } } }
public IEnumerable <View> RunTrial(int index, StudyTestPair stim, StreamWriter dataWriter, StreamWriter logWriter, List <EEGDataEntry> currentTrialEntries, RandomizedQueue <StudyTestPair> study, RandomizedQueue <StudyTestPair> quiz, RandomizedQueue <StudyTestPair> done) { yield return(new RestView(this.settings.BlinkTime)); yield return(new FixationView(this.settings.FixationTime)); IViewResult result; logWriter.WriteLine("Trial: " + index); stim.times++; var vocabView = new VocabView(stim.test, stim.answer, settings.DisplayTime, settings.DelayTime, false, out result); vocabView.DoOnDeploy(c => this.dataSource.Marker = index + 1); bool noWrite = false; //For MATLAB use. //double[] judge = {1}; //double[] zro = {0}; //double[] newcomplevel = {-1}; double confidence = 0; int judge = 1; //TODO: PUT THIS IN THE GUI double threshold = .4; vocabView.DoOnFinishing(() => { this.dataSource.Marker = EEGDataEntry.MARKER_DEFAULT; lock (currentTrialEntries) { var trialsDuringDelay = currentTrialEntries.Where(e => e.RelativeTimeStamp <= settings.DelayTime); if (this.settings.ArtifactDetectionSettings.HasMotionArtifact(trialsDuringDelay)) { noWrite = true; numArtifacts++; } else { int numentries = 0; foreach (var entry in trialsDuringDelay) { if (this.settings.SaveTrialData) { dataWriter.WriteLine(entry + ", {0}", stim.index); } numentries++; } //MATLAB REFERENCE //double[,] data2matlab = new double[numentries,15]; //double[,] zeros = new double[numentries,15]; //int i = 0; //MATLAB REFERENCE - converting the data to matlab format /*foreach (var entry in trialsDuringDelay) * { * //data2matlab[i, 0] = entry.RelativeTimeStamp; * //zeros[i, 0] = 0; * * //int j = 1; * //foreach (var set in entry.Data) * //{ * // data2matlab[i,j] = set; * // zeros[i,j] = 0.0; * // j++; * //} * //i++; * }*/ //MATLAB REFERENCE - perform prediction //matlab.PutFullMatrix("data", "base", data2matlab, zeros); //double[] complev = { stim.complevel }; //double[] zero = { 0 }; //matlab.PutFullMatrix("rating", "base", complev, zero); //matlab.Execute("cd c:\\Users\\Nicole\\Documents\\Matlab\\Thesis\\Adapt"); //might be unnecessary //matlab.Execute("[result rating] = adaptive(data, false, classifier, rating);"); //matlab.GetFullMatrix("result", "base", judge, zro); //matlab.GetFullMatrix("rating", "base", newcomplevel, zro); //The calculation of where to place the item is based on the difference between the 3rd presentation //and the fourth presentation. If an insufficient drop occurs, the competition level is saved as the //reference competition level until a drop does occur. The pre-drop competition level is saved //so that if the competition goes up in the future the correct judgement can be made. classifier.Predict(trialsDuringDelay.AsIArray(), out confidence); if (stim.times < 4) { stim.complevel = confidence; } else { if (stim.complevel - confidence > threshold) { judge = 1; } else { judge = 0; stim.complevel = confidence; } } } currentTrialEntries.Clear(); } }); yield return(vocabView); if (!noWrite) { if ((bool)result.Value) { if (judge == 0) { quiz.Add(stim); } else { done.Add(stim); } } else { study.Add(stim); } } else { if ((bool)result.Value) { quiz.Add(stim); } else { study.Add(stim); } } if (numArtifacts > 10) { numArtifacts = 0; yield return(new TextView("Please keep face movements to a minimum", settings.InstructionTime, GUIUtils.Constants.DISPLAY_FONT_LARGE)); } }
private IEnumerable <View> GetViews(ISynchronizeInvoke invoker, StreamWriter logWriter, StreamWriter dataWriter, RandomizedQueue <StudyTestPair> study, RandomizedQueue <StudyTestPair> quiz, RandomizedQueue <StudyTestPair> done, Random numgen) { var currentTrialEntries = new List <EEGDataEntry>(); 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); for (int index = 0; index < settings.NumRounds; index++) { double rand = numgen.NextDouble(); StudyTestPair stim; if (rand < .39) { if (!study.IsEmpty()) { stim = study.RemoveRandom(); quiz.Add(stim); logWriter.WriteLine("5"); logWriter.WriteLine(stim.test + "\\n" + stim.answer); yield return(new RestView(this.settings.BlinkTime)); yield return(new TextView(stim.test + "\n" + stim.answer, this.settings.PresentationTime, GUIUtils.Constants.DISPLAY_FONT_LARGE)); } else if (!quiz.IsEmpty()) { stim = quiz.RemoveRandom(); logWriter.WriteLine("7"); logWriter.WriteLine(stim.test); logWriter.WriteLine(stim.answer); foreach (var view in RunTrial(index, stim, dataWriter, logWriter, currentTrialEntries, study, quiz, done)) { yield return(view); } } else { stim = done.RemoveRandom(); logWriter.WriteLine("7"); logWriter.WriteLine(stim.test); logWriter.WriteLine(stim.answer); foreach (var view in RunTrial(index, stim, dataWriter, logWriter, currentTrialEntries, study, quiz, done)) { yield return(view); } } } else if (rand < .99) { if (!quiz.IsEmpty()) { stim = quiz.RemoveRandom(); logWriter.WriteLine("7"); logWriter.WriteLine(stim.test); logWriter.WriteLine(stim.answer); foreach (var view in RunTrial(index, stim, dataWriter, logWriter, currentTrialEntries, study, quiz, done)) { yield return(view); } } else if (!study.IsEmpty()) { stim = study.RemoveRandom(); quiz.Add(stim); logWriter.WriteLine("5"); logWriter.WriteLine(stim.test + "\\n" + stim.answer); yield return(new RestView(this.settings.BlinkTime)); yield return(new TextView(stim.test + "\n" + stim.answer, this.settings.PresentationTime, GUIUtils.Constants.DISPLAY_FONT_LARGE)); } else { stim = done.RemoveRandom(); logWriter.WriteLine("7"); logWriter.WriteLine(stim.test); logWriter.WriteLine(stim.answer); foreach (var view in RunTrial(index, stim, dataWriter, logWriter, currentTrialEntries, study, quiz, done)) { yield return(view); } } } else { if (!done.IsEmpty()) { stim = done.RemoveRandom(); logWriter.WriteLine("7"); logWriter.WriteLine(stim.test); logWriter.WriteLine(stim.answer); foreach (var view in RunTrial(index, stim, dataWriter, logWriter, currentTrialEntries, study, quiz, done)) { yield return(view); } } else if (!quiz.IsEmpty()) { stim = quiz.RemoveRandom(); logWriter.WriteLine("7"); logWriter.WriteLine(stim.test); logWriter.WriteLine(stim.answer); foreach (var view in RunTrial(index, stim, dataWriter, logWriter, currentTrialEntries, study, quiz, done)) { yield return(view); } } else { stim = study.RemoveRandom(); quiz.Add(stim); logWriter.WriteLine("5"); logWriter.WriteLine(stim.test + "\\n" + stim.answer); yield return(new RestView(this.settings.BlinkTime)); yield return(new TextView(stim.test + "\n" + stim.answer, this.settings.PresentationTime, GUIUtils.Constants.DISPLAY_FONT_LARGE)); } } } } }
void initCyclingAudio() { sweeteners = new RandomizedQueue <AudioFile>(); swells = new RandomizedQueue <AudioFile>(); startTrackCycling(); }
private IEnumerable <View> GetViews(ISynchronizeInvoke invoker, StreamWriter logWriterV, StreamWriter logWriter, RandomizedQueue <StudyTestPair> studySoon, RandomizedQueue <StudyTestPair> testSoon, RandomizedQueue <StudyTestPair> testLate) { //Presents stimuli from the three categories randomly with set probabilities Random numgen = new Random(); for (int index = 0; index < settings.NumTrials; index++) { double choice = numgen.NextDouble(); if (choice < 0.01) { if (!testLate.IsEmpty()) { StudyTestPair currstp = testLate.RemoveRandom(); logWriterV.WriteLine("Question: " + currstp.test); logWriterV.WriteLine("Correct Answer: " + currstp.answer); foreach (var view in RunTrial(index, false, currstp, logWriter, logWriterV, studySoon, testSoon, testLate)) { yield return(view); } } else if (!studySoon.IsEmpty()) { StudyTestPair study = studySoon.RemoveRandom(); logWriterV.WriteLine("Study Trial"); logWriterV.WriteLine(study.test); logWriterV.WriteLine(study.answer); foreach (var view in RunTrial(index, true, study, logWriter, logWriterV, studySoon, testSoon, testLate)) { yield return(view); } } else { StudyTestPair currstp = testSoon.RemoveRandom(); logWriterV.WriteLine("Question: " + currstp.test); logWriterV.WriteLine("Correct Answer: " + currstp.answer); foreach (var view in RunTrial(index, false, currstp, logWriter, logWriterV, studySoon, testSoon, testLate)) { yield return(view); } } } else if (choice < 0.4) { if (!studySoon.IsEmpty()) { StudyTestPair study = studySoon.RemoveRandom(); logWriterV.WriteLine("Study Trial"); logWriterV.WriteLine(study.test); logWriterV.WriteLine(study.answer); foreach (var view in RunTrial(index, true, study, logWriter, logWriterV, studySoon, testSoon, testLate)) { yield return(view); } } else if (!testSoon.IsEmpty()) { StudyTestPair currstp = testSoon.RemoveRandom(); logWriterV.WriteLine("Question: " + currstp.test); logWriterV.WriteLine("Correct Answer: " + currstp.answer); foreach (var view in RunTrial(index, false, currstp, logWriter, logWriterV, studySoon, testSoon, testLate)) { yield return(view); } } else { StudyTestPair currstp = testLate.RemoveRandom(); logWriterV.WriteLine("Question: " + currstp.test); logWriterV.WriteLine("Correct Answer: " + currstp.answer); foreach (var view in RunTrial(index, false, currstp, logWriter, logWriterV, studySoon, testSoon, testLate)) { yield return(view); } } } else { if (!testSoon.IsEmpty()) { StudyTestPair currstp = testSoon.RemoveRandom(); logWriterV.WriteLine("Question: " + currstp.test); logWriterV.WriteLine("Correct Answer: " + currstp.answer); foreach (var view in RunTrial(index, false, currstp, logWriter, logWriterV, studySoon, testSoon, testLate)) { yield return(view); } } else if (!studySoon.IsEmpty()) { StudyTestPair study = studySoon.RemoveRandom(); logWriterV.WriteLine("Study Trial"); logWriterV.WriteLine(study.test); logWriterV.WriteLine(study.answer); foreach (var view in RunTrial(index, true, study, logWriter, logWriterV, studySoon, testSoon, testLate)) { yield return(view); } } else { StudyTestPair currstp = testLate.RemoveRandom(); logWriterV.WriteLine("Question: " + currstp.test); logWriterV.WriteLine("Correct Answer: " + currstp.answer); foreach (var view in RunTrial(index, false, currstp, logWriter, logWriterV, studySoon, testSoon, testLate)) { yield return(view); } } } } }
/// <summary> /// Builds the application view for the Adaptive Application /// </summary> public void BuildAdaptiveView() { this.SuspendLayout(); this.Text = GUIUtils.Strings.APP_NAME; this.Size = new System.Drawing.Size(1500, 750); //Settings panels var config = ConfigurationPanel.Create<AdaptiveSettings>(); //var artifactConfig = ConfigurationPanel.Create<ArtifactDetectionSettings>(); var stimulipanel = new AdaptiveSelectorPanel() { Dock = DockStyle.Fill }; // classifier settings var classifierPanel = new ClassificationSchemePanel() { Dock = DockStyle.Fill }; //Headset Connected? EmotivStatusCheckerPanel statusChecker = new EmotivStatusCheckerPanel() { Dock = DockStyle.Fill }; // start button var startButton = GUIUtils.CreateFlatButton("Start Experiment", b => { var settings = (AdaptiveSettings)config.GetConfiguredObject(); //settings.ArtifactDetectionSettings = (ArtifactDetectionSettings)artifactConfig.GetConfiguredObject(); settings.ArtifactDetectionSettings = (ArtifactDetectionSettings)classifierPanel.ArtifactDetectionSettings; var test = this.ReadAdaptStimuli(stimulipanel.TestFile); var ans = this.ReadAdaptStimuli(stimulipanel.AnsFile); var presentation = this.ReadCompetitionStimuli(stimulipanel.PresentationFile); var class1 = this.ReadCompetitionStimuli(stimulipanel.Class1File); var class2 = this.ReadCompetitionStimuli(stimulipanel.Class2File); //Make study-test pairs for practice phase RandomizedQueue<MCAEmotiv.GUI.Adaptive.StudyTestPair> stp = new RandomizedQueue<MCAEmotiv.GUI.Adaptive.StudyTestPair>(); for (int i = 0; i < test.Count; i++) { stp.Add(new MCAEmotiv.GUI.Adaptive.StudyTestPair(test[i], ans[i], i)); } //To Do: Add a dialog box so that the user knows whether the headset is connected IEEGDataSource dataSource; if (statusChecker.HeadsetConnected) { dataSource = EmotivDataSource.Instance; } else dataSource = new MockEEGDataSource(); var classifiers = classifierPanel.SelectedClassifiers; this.Animate(new AdaptiveProvider(stp, presentation, class1, class2, settings, dataSource, classifiers.Where(c => c.Settings.FeatureCount > 0).ToIArray())); }); //Dialog boxes for saving and loading experiment settings var saveDialog = new SaveFileDialog() { Title = "Save experiment settings", Filter = "Experiment settings files|*.adaptsettings", InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) }; var openDialog = new OpenFileDialog() { Title = "Select the saved experiment settings (.adaptsettings) file", Filter = "Experiment settings files|*.adaptsettings", InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), Multiselect = false }; // button table for saving and loading experiment settings var buttonTable = GUIUtils.CreateButtonTable(Direction.Horizontal, DockStyle.Fill, GUIUtils.CreateFlatButton("Save", b => { var settings = (AdaptiveSettings)config.GetConfiguredObject(); settings.TestFile = stimulipanel.TestFile; settings.AnsFile = stimulipanel.AnsFile; settings.PresentationFile = stimulipanel.PresentationFile; settings.Class1File = stimulipanel.Class1File; settings.Class2File = stimulipanel.Class2File; //settings.ArtifactDetectionSettings = (ArtifactDetectionSettings)artifactConfig.GetConfiguredObject(); settings.ArtifactDetectionSettings = (ArtifactDetectionSettings)classifierPanel.ArtifactDetectionSettings; //ISSUE HERE //settings.ClassificationSettings = (ClassificationScheme) classifierPanel saveDialog.FileName = string.IsNullOrWhiteSpace(settings.ExperimentName) ? "my experiment" : settings.ExperimentName; if (saveDialog.ShowDialog() != DialogResult.OK) return; bool saved = settings.TrySerializeToFile(saveDialog.FileName); GUIUtils.Alert((saved ? "Saved" : "Failed to save") + " experiment info to " + saveDialog.FileName, (saved ? MessageBoxIcon.Information : MessageBoxIcon.Error)); string directory = Path.GetDirectoryName(saveDialog.FileName); if (Directory.Exists(directory)) saveDialog.InitialDirectory = directory; }, null, "Save experiment configuration information"), GUIUtils.CreateFlatButton("Load", b => { if (openDialog.ShowDialog() != DialogResult.OK) return; AdaptiveSettings settings; if (Utils.TryDeserializeFile(openDialog.FileName, out settings)) { config.SetConfiguredObject(settings); stimulipanel.TestFile = settings.TestFile; stimulipanel.AnsFile = settings.AnsFile; stimulipanel.PresentationFile = settings.PresentationFile; stimulipanel.Class1File = settings.Class1File; stimulipanel.Class2File = settings.Class2File; //NEED TO DO EACH CLASSIFIERPANEL PROPERTY ONE BY ONE :( //artifactConfig.SetConfiguredObject(settings.ArtifactDetectionSettings); //classifierPanel.SetConfiguredObject(settings.ArtifactDetectionSettings); } else GUIUtils.Alert("Failed to load experiment info from " + openDialog.FileName, MessageBoxIcon.Error); }, null, "Load a previously saved experiment settings file")); //Put together the GUI var rows = GUIUtils.CreateTable(new[] { .5, .35, .15 }, Direction.Vertical); var col1 = GUIUtils.CreateTable(new[] { .5, .5 }, Direction.Horizontal); var col2 = GUIUtils.CreateTable(new[] { .5, .5}, Direction.Horizontal); var col3 = GUIUtils.CreateTable(new[] { .5, .5 }, Direction.Horizontal); //col2.Controls.Add(artifactConfig, 1, 0); col1.Controls.Add(startButton, 1, 0); col1.Controls.Add(statusChecker, 0, 0); col2.Controls.Add(config, 0, 0); col2.Controls.Add(classifierPanel, 1, 0); col3.Controls.Add(stimulipanel, 1, 0); col3.Controls.Add(buttonTable, 0, 0); rows.Controls.Add(col3, 0, 1); rows.Controls.Add(col1, 0, 2); rows.Controls.Add(col2, 0, 0); this.Controls.Add(rows); this.ResumeLayout(false); }
/// <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> /// Builds the application view for the Adaptive Application /// </summary> public void BuildAdaptiveView() { this.SuspendLayout(); this.Text = GUIUtils.Strings.APP_NAME; this.Size = new System.Drawing.Size(1500, 750); //Settings panels var config = ConfigurationPanel.Create <AdaptiveSettings>(); //var artifactConfig = ConfigurationPanel.Create<ArtifactDetectionSettings>(); var stimulipanel = new AdaptiveSelectorPanel() { Dock = DockStyle.Fill }; // classifier settings var classifierPanel = new ClassificationSchemePanel() { Dock = DockStyle.Fill }; //Headset Connected? EmotivStatusCheckerPanel statusChecker = new EmotivStatusCheckerPanel() { Dock = DockStyle.Fill }; // start button var startButton = GUIUtils.CreateFlatButton("Start Experiment", b => { var settings = (AdaptiveSettings)config.GetConfiguredObject(); //settings.ArtifactDetectionSettings = (ArtifactDetectionSettings)artifactConfig.GetConfiguredObject(); settings.ArtifactDetectionSettings = (ArtifactDetectionSettings)classifierPanel.ArtifactDetectionSettings; var test = this.ReadAdaptStimuli(stimulipanel.TestFile); var ans = this.ReadAdaptStimuli(stimulipanel.AnsFile); var presentation = this.ReadCompetitionStimuli(stimulipanel.PresentationFile); var class1 = this.ReadCompetitionStimuli(stimulipanel.Class1File); var class2 = this.ReadCompetitionStimuli(stimulipanel.Class2File); //Make study-test pairs for practice phase RandomizedQueue <MCAEmotiv.GUI.Adaptive.StudyTestPair> stp = new RandomizedQueue <MCAEmotiv.GUI.Adaptive.StudyTestPair>(); for (int i = 0; i < test.Count; i++) { stp.Add(new MCAEmotiv.GUI.Adaptive.StudyTestPair(test[i], ans[i], i)); } //To Do: Add a dialog box so that the user knows whether the headset is connected IEEGDataSource dataSource; if (statusChecker.HeadsetConnected) { dataSource = EmotivDataSource.Instance; } else { dataSource = new MockEEGDataSource(); } var classifiers = classifierPanel.SelectedClassifiers; this.Animate(new AdaptiveProvider(stp, presentation, class1, class2, settings, dataSource, classifiers.Where(c => c.Settings.FeatureCount > 0).ToIArray())); }); //Dialog boxes for saving and loading experiment settings var saveDialog = new SaveFileDialog() { Title = "Save experiment settings", Filter = "Experiment settings files|*.adaptsettings", InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) }; var openDialog = new OpenFileDialog() { Title = "Select the saved experiment settings (.adaptsettings) file", Filter = "Experiment settings files|*.adaptsettings", InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), Multiselect = false }; // button table for saving and loading experiment settings var buttonTable = GUIUtils.CreateButtonTable(Direction.Horizontal, DockStyle.Fill, GUIUtils.CreateFlatButton("Save", b => { var settings = (AdaptiveSettings)config.GetConfiguredObject(); settings.TestFile = stimulipanel.TestFile; settings.AnsFile = stimulipanel.AnsFile; settings.PresentationFile = stimulipanel.PresentationFile; settings.Class1File = stimulipanel.Class1File; settings.Class2File = stimulipanel.Class2File; //settings.ArtifactDetectionSettings = (ArtifactDetectionSettings)artifactConfig.GetConfiguredObject(); settings.ArtifactDetectionSettings = (ArtifactDetectionSettings)classifierPanel.ArtifactDetectionSettings; //ISSUE HERE //settings.ClassificationSettings = (ClassificationScheme) classifierPanel saveDialog.FileName = string.IsNullOrWhiteSpace(settings.ExperimentName) ? "my experiment" : settings.ExperimentName; if (saveDialog.ShowDialog() != DialogResult.OK) { return; } bool saved = settings.TrySerializeToFile(saveDialog.FileName); GUIUtils.Alert((saved ? "Saved" : "Failed to save") + " experiment info to " + saveDialog.FileName, (saved ? MessageBoxIcon.Information : MessageBoxIcon.Error)); string directory = Path.GetDirectoryName(saveDialog.FileName); if (Directory.Exists(directory)) { saveDialog.InitialDirectory = directory; } }, null, "Save experiment configuration information"), GUIUtils.CreateFlatButton("Load", b => { if (openDialog.ShowDialog() != DialogResult.OK) { return; } AdaptiveSettings settings; if (Utils.TryDeserializeFile(openDialog.FileName, out settings)) { config.SetConfiguredObject(settings); stimulipanel.TestFile = settings.TestFile; stimulipanel.AnsFile = settings.AnsFile; stimulipanel.PresentationFile = settings.PresentationFile; stimulipanel.Class1File = settings.Class1File; stimulipanel.Class2File = settings.Class2File; //NEED TO DO EACH CLASSIFIERPANEL PROPERTY ONE BY ONE :( //artifactConfig.SetConfiguredObject(settings.ArtifactDetectionSettings); //classifierPanel.SetConfiguredObject(settings.ArtifactDetectionSettings); } else { GUIUtils.Alert("Failed to load experiment info from " + openDialog.FileName, MessageBoxIcon.Error); } }, null, "Load a previously saved experiment settings file")); //Put together the GUI var rows = GUIUtils.CreateTable(new[] { .5, .35, .15 }, Direction.Vertical); var col1 = GUIUtils.CreateTable(new[] { .5, .5 }, Direction.Horizontal); var col2 = GUIUtils.CreateTable(new[] { .5, .5 }, Direction.Horizontal); var col3 = GUIUtils.CreateTable(new[] { .5, .5 }, Direction.Horizontal); //col2.Controls.Add(artifactConfig, 1, 0); col1.Controls.Add(startButton, 1, 0); col1.Controls.Add(statusChecker, 0, 0); col2.Controls.Add(config, 0, 0); col2.Controls.Add(classifierPanel, 1, 0); col3.Controls.Add(stimulipanel, 1, 0); col3.Controls.Add(buttonTable, 0, 0); rows.Controls.Add(col3, 0, 1); rows.Controls.Add(col1, 0, 2); rows.Controls.Add(col2, 0, 0); this.Controls.Add(rows); this.ResumeLayout(false); }
/// <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); } } } }