annotate ExperimentController.java @ 52:76e99859bdb4 tip

Add class files for previous changes.
author Marcus Pearce <marcus.pearce@eecs.qmul.ac.uk>
date Wed, 25 Feb 2015 10:11:04 +0000
parents f3261bd3dd49
children
rev   line source
m@0 1 /*=============================================================================
m@0 2 * File: ExperimentController.java
m@0 3 * Author: Marcus Pearce <m.pearce@gold.ac.uk>
m@0 4 * Created: <2007-12-14 12:06:10 marcusp>
m@12 5 * Time-stamp: <2011-11-10 19:08:45 marcusp>
m@0 6 *=============================================================================
m@0 7 */
m@0 8
m@0 9 import java.awt.*;
m@0 10 import java.awt.event.*;
m@0 11 import javax.swing.*;
c@48 12 import java.io.IOException;
c@48 13 import java.io.File;
m@0 14
m@0 15 public class ExperimentController implements ActionListener, KeyListener {
m@0 16
m@0 17 /* variables */
m@0 18 ExperimentGui gui;
m@0 19
m@0 20 Experiment exp;
m@0 21 SubjectResults results;
m@0 22
m@0 23 InstructionsPanel ip;
c@45 24 StimulusPanel sp;
m@0 25 SubjectDataPanel sdp;
m@0 26 InterBlockPanel ibp;
c@47 27 EndTestPanel etp;
m@0 28
c@48 29 boolean runPostScript;
c@48 30
m@0 31 /* constructor */
m@0 32 public ExperimentController(ExperimentGui eg) {
m@0 33 gui = eg;
m@0 34 exp = gui.getExperiment();
c@48 35 results = exp.getSubjectResults();
c@48 36 runPostScript = exp.getRunPostScript();
m@0 37
m@0 38 ip = gui.getInstructionsPanel();
m@0 39 ibp = gui.getInterBlockPanel();
m@0 40 sp = gui.getStimulusPanel();
c@47 41 sdp = gui.getSubjectDataPanel();
c@47 42 etp = gui.getEndTestPanel();
m@0 43
m@0 44 ip.addNextButtonListener(this);
m@0 45 sp.addAllListeners(this);
m@0 46 sdp.addFinishButtonListener(this);
c@47 47 ibp.addContinueButtonListener(this);
c@47 48 etp.addContinueButtonListener(this);
m@0 49
m@0 50 sp.setFocusable(true);
m@0 51 sp.addKeyListener(this);
m@0 52 sp.addAllKeyListeners(this);
m@0 53 gui.setFocusable(true);
m@0 54 gui.addKeyListener(this);
m@0 55 }
m@0 56
m@0 57 /* report erroneous input */
m@0 58 protected void reportError (String msg) {
c@42 59 //JOptionPane.showMessageDialog (gui, msg);
c@42 60 sp.setMessagePrompt(msg);
c@42 61 }
c@42 62
c@42 63 protected void showDefaultMessagePrompt() {
c@42 64 sp.showDefaultMessagePrompt();
m@0 65 }
m@0 66
m@0 67 /* actionPerformed */
m@0 68 public void actionPerformed(ActionEvent e) {
c@42 69 showDefaultMessagePrompt();
c@42 70
m@0 71 long time = System.nanoTime();
m@0 72 Object source = e.getSource();
m@0 73
m@0 74 ip = gui.getInstructionsPanel();
m@0 75 ibp = gui.getInterBlockPanel();
m@0 76 sp = gui.getStimulusPanel();
m@0 77 sdp = gui.getSubjectDataPanel();
m@0 78
c@42 79 Block block = exp.getCurrentBlock();
m@0 80
m@0 81 // InstructionsPanel
m@0 82 if (source == ip.getNextButton()) {
jeremy@37 83 String subjID = ip.getSubjectID();
jeremy@37 84 if (subjID.equals(ip.INVALID_SUBJECT_ID))
jeremy@37 85 reportError("The participant ID should contain only letters and numbers.");
m@0 86 // TODO: check that subjID doesn't already exist
m@0 87 else {
m@0 88 exp.setSubjectID(subjID);
m@0 89 gui.showCard("stimulus");
m@0 90 exp.runExperiment();
m@0 91 }
m@0 92 }
m@0 93
m@0 94 // InterBlockPanel
m@0 95 else if (source == ibp.getContinueButton()) {
m@0 96 block.initialiseBlock();
m@0 97 sp.setSongNumberText();
m@0 98 sp.defaultAnswers();
m@0 99 gui.setAcceptingResponses(false);
m@0 100 gui.showCard("stimulus");
m@0 101 exp.runExperiment();
m@0 102 }
c@47 103
c@47 104 else if (source == etp.getContinueButton()) {
c@48 105 if (runPostScript){
c@48 106 String dir = System.getProperty("user.dir") + System.getProperty("file.separator", "/");
c@48 107 String script = dir + exp.POST_SCRIPT;
c@48 108 String[] cmd = new String[4];
c@48 109 if(script.toLowerCase().endsWith(".bat")){
c@48 110 cmd[0] = "cmd.exe";
c@48 111 cmd[1] = "/c";
c@48 112 cmd[2] = "start";
c@48 113 cmd[3] = script;
c@48 114 }
c@48 115 else{
c@48 116 cmd[0] = script;
c@48 117 cmd[1] = " ";
c@48 118 cmd[2] = " ";
c@48 119 cmd[3] = " ";
c@48 120 }
c@48 121 Runtime runtime = Runtime.getRuntime();
c@48 122 try{
c@48 123 Process proc = runtime.exec(cmd);
c@48 124 runPostScript = false;
c@48 125 } catch (IOException exception){
c@48 126 System.out.println("Error: Script has not excecuted.");
c@48 127 exception.printStackTrace();
c@48 128 }
c@48 129 }
c@47 130 System.exit(0);
c@47 131 }
m@0 132
m@0 133 // SubjectDataPanel
m@0 134 else if (e.getSource() == sdp.getFinishButton()) {
m@8 135 if (exp.getFinalQuestionnaire()) {
m@8 136 if (sdp.allDataEntered()) {
m@8 137 sdp.storeData();
m@8 138 results.writeSubjectData();
c@47 139 gui.showCard("endTest");
m@8 140 } else
m@8 141 reportError("You have not filled in all the information.");
m@8 142 } else
c@47 143 gui.showCard("endTest");
m@0 144 }
m@0 145
m@0 146 // StimulusPanel
m@0 147 else if (source == sp.getPlayButton()) {
m@0 148 // if (!exp.isRunning() && !exp.hasRun())
m@0 149 // exp.runExperiment();
m@0 150 // else
m@0 151 // reportError("You have already played the melody.");
c@45 152 } else if (source == sp.getNextButton()) {
c@42 153 nextStimuli(block);
m@0 154 } else {
jeremy@26 155 if (exp.getDebug())
jeremy@26 156 System.out.println("Button response, getAcceptingResponses: " + gui.getAcceptingResponses() + " " + e.getActionCommand());
jeremy@26 157
m@0 158 JButton[] rButtons = sp.getResponseButtons();
m@0 159 for (int i = 0; i < rButtons.length; i++) {
m@0 160 if (source == rButtons[i] && (exp.isRunning() || exp.hasRun()) && gui.getAcceptingResponses()) {
jeremy@26 161 ratingResponse(i, time);
jeremy@26 162 /*
JShulver@23 163 block.addResponse(i+1, time);
m@0 164 gui.setAcceptingResponses(false);
JShulver@23 165 rButtons[i].setBackground(Color.red);
jeremy@26 166 rButtons[i].setOpaque(true);
jeremy@26 167 */
m@0 168 }
m@0 169 }
m@0 170 }
m@0 171 }
jeremy@26 172
m@0 173
m@0 174 public void keyPressed(KeyEvent e) {
c@45 175 showDefaultMessagePrompt();
c@45 176
jeremy@26 177 if (exp.getDebug())
jeremy@26 178 System.out.println("Key pressed: " + e.getKeyChar());
m@0 179 long time = System.nanoTime();
m@0 180
m@0 181 Block block = exp.getCurrentBlock();
m@0 182 sp = gui.getStimulusPanel();
m@0 183 JButton[] rButtons = sp.getResponseButtons();
c@42 184
c@43 185 if (e.getKeyCode() == KeyEvent.VK_SPACE){
c@42 186 nextStimuli(exp.getCurrentBlock());
c@42 187 }
c@42 188 else if ((exp.isRunning() || exp.hasRun()) && gui.getAcceptingResponses()) {
m@5 189 if (exp.getScaleLength() == 2) {
m@5 190 char key = e.getKeyChar();
m@5 191 switch(key) {
m@5 192 case 'q': block.addResponse(1, time); break;
m@5 193 case 'p': block.addResponse(2, time); break;
m@5 194 default: System.out.println("No Response at " + time); break;
m@0 195 }
m@5 196 } else {
m@5 197 for (int i = 0; i < rButtons.length; i++) {
m@5 198 //System.out.println("Char = " + Character.forDigit(i+1, 10));
m@5 199 if (e.getKeyChar() == Character.forDigit(i+1, 10)) {
jeremy@26 200 ratingResponse(i, time);
jeremy@26 201 /*
m@10 202 if (exp.getDebug())
m@10 203 System.out.println("Got rating: " + (i + 1));
m@5 204 block.addResponse(i+1, time);
m@5 205 gui.setAcceptingResponses(false);
jeremy@26 206 */
m@5 207 }
m@5 208 //else
m@5 209 // block.addResponse(0, time);
m@5 210 }
m@0 211 }
m@0 212 }
m@0 213 }
m@0 214
m@0 215 public void keyReleased(KeyEvent e) {
m@0 216 // System.out.println("Key released: " + e.getKeyChar());
m@0 217 }
m@0 218 public void keyTyped(KeyEvent e) {
m@0 219 //System.out.println("Key typed: " + e.getKeyChar());
m@0 220 }
c@42 221
jeremy@26 222 protected void ratingResponse(int buttonIndex, long time) {
jeremy@26 223
jeremy@26 224 int rating = buttonIndex + 1;
jeremy@26 225
jeremy@26 226 if (exp.getDebug())
jeremy@26 227 System.out.println("Rating: " + rating);
jeremy@26 228 exp.getCurrentBlock().addResponse(rating, time);
jeremy@26 229 sp.highlightResponse(buttonIndex);
jeremy@26 230 gui.setAcceptingResponses(false);
jeremy@26 231 }
c@42 232
c@42 233 protected void nextStimuli(Block block){
c@42 234 if (!exp.hasRun() || exp.isRunning()) {
c@42 235 //System.out.println(!exp.hasRun());
c@42 236 //System.out.println(exp.isRunning());
c@42 237 //System.out.println(exp.getCurrentBlock().getMidiPlayer().getSequencer().isRunning());
c@42 238 reportError("You haven't finished playing the melody yet.");
c@42 239
c@42 240 } else if (exp.getCurrentBlock().getMelodyResults().countResponses() == 0) {
c@42 241 reportError("Please select a number.");
c@42 242
c@42 243 } else if (sp.unansweredQuestions())
c@42 244 reportError("There are unanswered questions.");
c@45 245
c@42 246 else {
c@45 247 showDefaultMessagePrompt();
c@42 248 // store results (and write to file)
c@42 249 if (exp.getAskFamiliarity()) {
c@42 250 String answer1 = (String)(sp.getQ1Box().getSelectedItem());
c@42 251 block.addMelodyQA("known", answer1);
c@42 252 } else
c@42 253 block.addMelodyQA("known", "-1");
c@42 254 if (exp.getAskLiking()) {
c@42 255 String answer2 = (String)(sp.getQ2Box().getSelectedItem());
c@42 256 block.addMelodyQA("liked", answer2);
c@42 257 } else
c@42 258 block.addMelodyQA("liked", "-1");
c@42 259 block.storeMelodyResult();
c@42 260 results.writeResults();
c@42 261 // close the midi player
c@42 262 block.getMidiPlayer().stop();
c@42 263 // proceed to ...
c@42 264
c@42 265 String nextFile = block.nextFile();
c@42 266 if (nextFile == null) {
c@42 267 boolean nb = exp.nextBlock();
c@42 268 if (nb) {
c@42 269 // ... next block of trials
c@42 270 gui.getInterBlockPanel().setText();
c@42 271 gui.getInterBlockPanel().updateMessageDisplay();
c@42 272 gui.showCard("interblock");
c@42 273 sp.resetButtonBackgrounds();
c@42 274 } else {
c@42 275 // ... write results and subject questionnaire
c@42 276 results.writeResults();
c@42 277 gui.showCard("subject");
c@42 278 }
c@42 279 } else {
c@42 280 // ... next melody within block
c@42 281 sp.resetButtonBackgrounds();
c@42 282 sp.setSongNumberText();
c@42 283 sp.defaultAnswers();
c@42 284 gui.setAcceptingResponses(false);
c@42 285 block.initialiseBlock();
c@42 286 exp.runExperiment();
c@42 287 }
c@42 288 }
c@42 289 }
m@0 290 }