/// <summary> /// Builds the application view /// </summary> public void BuildExperimenterView() { this.SuspendLayout(); this.Text = GUIUtils.Strings.APP_NAME; this.Size = new System.Drawing.Size(1500, 750); // experiment settings var experimentPanel = new ExperimentPanel() { Dock = DockStyle.Fill }; // classifier settings var classifierPanel = new ClassificationSchemePanel() { Dock = DockStyle.Fill }; // stimulus class settings var stimulusClassPanel = new StimulusClassPanel() { Dock = DockStyle.Fill }; // status checker var statusChecker = new EmotivStatusCheckerPanel() { Dock = DockStyle.Fill }; // start button var startButton = GUIUtils.CreateFlatButton("Start Experiment", b => { var experimentSettings = experimentPanel.ExperimentSettings; experimentSettings.ImageDisplaySettings = stimulusClassPanel.ImageDisplaySettings; experimentSettings.ArtifactDetectionSettings = classifierPanel.ArtifactDetectionSettings; // check stimulus classes if (stimulusClassPanel.StimulusClass1 == null || stimulusClassPanel.StimulusClass2 == null) { GUIUtils.Alert("Two stimulus classes must be selected", MessageBoxIcon.Error); return; } if (stimulusClassPanel.StimulusClass1.UsedStimuli(experimentSettings.QuestionMode).IsEmpty() || stimulusClassPanel.StimulusClass2.UsedStimuli(experimentSettings.QuestionMode).IsEmpty()) { GUIUtils.Alert("Each stimulus class must have at least one valid stimulus for the selected question mode", MessageBoxIcon.Error); return; } if (stimulusClassPanel.StimulusClass1.Settings.Marker == stimulusClassPanel.StimulusClass2.Settings.Marker) { GUIUtils.Alert("The two selected stimulus classes must have different marker values", MessageBoxIcon.Error); return; } // check classifiers var classifiers = classifierPanel.SelectedClassifiers; foreach (var classifier in classifiers) if (classifier.Settings.FeatureCount <= 0 && !GUIUtils.IsUserSure("Classifier " + classifier.Settings.Name + " has no features. Continue without this classifier?")) return; // check headset if (!statusChecker.HeadsetConnected && !GUIUtils.IsUserSure("The Emotiv headset is not connected: run experiment with mock headset (generates random data for testing purposes)?")) return; this.Animate(new ExperimentProvider(experimentSettings, stimulusClassPanel.StimulusClass1, stimulusClassPanel.StimulusClass2, classifiers.Where(c => c.Settings.FeatureCount > 0).ToIArray(), statusChecker.HeadsetConnected ? EmotivDataSource.Instance : this.mockDataSource ?? (this.mockDataSource = new MockEEGDataSource()))); }); // add all controls var rows = GUIUtils.CreateTable(new double[] { .5, .5 }, Direction.Vertical); // top row var topCols = GUIUtils.CreateTable(new double[] { .25, .75 }, Direction.Horizontal); topCols.Controls.Add(experimentPanel, 0, 0); topCols.Controls.Add(classifierPanel, 1, 0); rows.Controls.Add(topCols, 0, 0); // bottom row var bottomCols = GUIUtils.CreateTable(new double[] { .75, .25 }, Direction.Horizontal); bottomCols.Controls.Add(stimulusClassPanel, 0, 0); var bottomRightTable = GUIUtils.CreateTable(new double[] { .6, .4 }, Direction.Vertical); bottomRightTable.Controls.Add(statusChecker, 0, 0); bottomRightTable.Controls.Add(startButton, 0, 1); bottomCols.Controls.Add(bottomRightTable, 1, 0); rows.Controls.Add(bottomCols, 0, 1); this.Controls.Add(rows); this.ResumeLayout(false); }
/// <summary> /// Builds the application view /// </summary> public void BuildExperimenterView() { this.SuspendLayout(); this.Text = GUIUtils.Strings.APP_NAME; this.Size = new System.Drawing.Size(1500, 750); // experiment settings var experimentPanel = new ExperimentPanel() { Dock = DockStyle.Fill }; // classifier settings var classifierPanel = new ClassificationSchemePanel() { Dock = DockStyle.Fill }; // stimulus class settings var stimulusClassPanel = new StimulusClassPanel() { Dock = DockStyle.Fill }; // status checker var statusChecker = new EmotivStatusCheckerPanel() { Dock = DockStyle.Fill }; // start button var startButton = GUIUtils.CreateFlatButton("Start Experiment", b => { var experimentSettings = experimentPanel.ExperimentSettings; experimentSettings.ImageDisplaySettings = stimulusClassPanel.ImageDisplaySettings; experimentSettings.ArtifactDetectionSettings = classifierPanel.ArtifactDetectionSettings; // check stimulus classes if (stimulusClassPanel.StimulusClass1 == null || stimulusClassPanel.StimulusClass2 == null) { GUIUtils.Alert("Two stimulus classes must be selected", MessageBoxIcon.Error); return; } if (stimulusClassPanel.StimulusClass1.UsedStimuli(experimentSettings.QuestionMode).IsEmpty() || stimulusClassPanel.StimulusClass2.UsedStimuli(experimentSettings.QuestionMode).IsEmpty()) { GUIUtils.Alert("Each stimulus class must have at least one valid stimulus for the selected question mode", MessageBoxIcon.Error); return; } if (stimulusClassPanel.StimulusClass1.Settings.Marker == stimulusClassPanel.StimulusClass2.Settings.Marker) { GUIUtils.Alert("The two selected stimulus classes must have different marker values", MessageBoxIcon.Error); return; } // check classifiers var classifiers = classifierPanel.SelectedClassifiers; foreach (var classifier in classifiers) { if (classifier.Settings.FeatureCount <= 0 && !GUIUtils.IsUserSure("Classifier " + classifier.Settings.Name + " has no features. Continue without this classifier?")) { return; } } // check headset if (!statusChecker.HeadsetConnected && !GUIUtils.IsUserSure("The Emotiv headset is not connected: run experiment with mock headset (generates random data for testing purposes)?")) { return; } this.Animate(new ExperimentProvider(experimentSettings, stimulusClassPanel.StimulusClass1, stimulusClassPanel.StimulusClass2, classifiers.Where(c => c.Settings.FeatureCount > 0).ToIArray(), statusChecker.HeadsetConnected ? EmotivDataSource.Instance : this.mockDataSource ?? (this.mockDataSource = new MockEEGDataSource()))); }); // add all controls var rows = GUIUtils.CreateTable(new double[] { .5, .5 }, Direction.Vertical); // top row var topCols = GUIUtils.CreateTable(new double[] { .25, .75 }, Direction.Horizontal); topCols.Controls.Add(experimentPanel, 0, 0); topCols.Controls.Add(classifierPanel, 1, 0); rows.Controls.Add(topCols, 0, 0); // bottom row var bottomCols = GUIUtils.CreateTable(new double[] { .75, .25 }, Direction.Horizontal); bottomCols.Controls.Add(stimulusClassPanel, 0, 0); var bottomRightTable = GUIUtils.CreateTable(new double[] { .6, .4 }, Direction.Vertical); bottomRightTable.Controls.Add(statusChecker, 0, 0); bottomRightTable.Controls.Add(startButton, 0, 1); bottomCols.Controls.Add(bottomRightTable, 1, 0); rows.Controls.Add(bottomCols, 0, 1); this.Controls.Add(rows); this.ResumeLayout(false); }