annotate ExperimentController.java @ 38:a36ca20cffd4

Document debug flag
author Jeremy Gow <jeremy.gow@gmail.com>
date Fri, 16 Nov 2012 10:39:57 +0000
parents 0e030f32a6e2
children d3977e825d91
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.*;
m@0 12
m@0 13 public class ExperimentController implements ActionListener, KeyListener {
m@0 14
m@0 15 /* variables */
m@0 16 ExperimentGui gui;
m@0 17
m@0 18 Experiment exp;
m@0 19 SubjectResults results;
m@0 20
m@0 21 InstructionsPanel ip;
m@0 22 StimulusPanel sp;
m@0 23 SubjectDataPanel sdp;
m@0 24 InterBlockPanel ibp;
m@0 25
m@0 26 /* constructor */
m@0 27 public ExperimentController(ExperimentGui eg) {
m@0 28 gui = eg;
m@0 29 exp = gui.getExperiment();
m@0 30 results = exp.getSubjectResults();
m@0 31
m@0 32 ip = gui.getInstructionsPanel();
m@0 33 ibp = gui.getInterBlockPanel();
m@0 34 sp = gui.getStimulusPanel();
m@0 35 sdp = gui.getSubjectDataPanel();
m@0 36
m@0 37 ip.addNextButtonListener(this);
m@0 38 sp.addAllListeners(this);
m@0 39 sdp.addFinishButtonListener(this);
m@0 40 ibp.addContinueButtonListener(this);
m@0 41
m@0 42 sp.setFocusable(true);
m@0 43 sp.addKeyListener(this);
m@0 44 sp.addAllKeyListeners(this);
m@0 45 gui.setFocusable(true);
m@0 46 gui.addKeyListener(this);
m@0 47 }
m@0 48
m@0 49 /* report erroneous input */
m@0 50 protected void reportError (String msg) {
m@0 51 JOptionPane.showMessageDialog (gui, msg);
m@0 52 }
m@0 53
m@0 54 /* actionPerformed */
m@0 55 public void actionPerformed(ActionEvent e) {
m@0 56 long time = System.nanoTime();
m@0 57 Object source = e.getSource();
m@0 58
m@0 59 ip = gui.getInstructionsPanel();
m@0 60 ibp = gui.getInterBlockPanel();
m@0 61 sp = gui.getStimulusPanel();
m@0 62 sdp = gui.getSubjectDataPanel();
m@0 63
m@0 64 Block block = exp.getCurrentBlock();
m@0 65
m@0 66 // InstructionsPanel
m@0 67 if (source == ip.getNextButton()) {
jeremy@37 68 String subjID = ip.getSubjectID();
jeremy@37 69 if (subjID.equals(ip.INVALID_SUBJECT_ID))
jeremy@37 70 reportError("The participant ID should contain only letters and numbers.");
m@0 71 // TODO: check that subjID doesn't already exist
m@0 72 else {
m@0 73 exp.setSubjectID(subjID);
m@0 74 gui.showCard("stimulus");
m@0 75 exp.runExperiment();
m@0 76 }
m@0 77 }
m@0 78
m@0 79 // InterBlockPanel
m@0 80 else if (source == ibp.getContinueButton()) {
m@0 81 block.initialiseBlock();
m@0 82 sp.setSongNumberText();
m@0 83 sp.defaultAnswers();
m@0 84 gui.setAcceptingResponses(false);
m@0 85 gui.showCard("stimulus");
m@0 86 exp.runExperiment();
m@0 87 }
m@0 88
m@0 89 // SubjectDataPanel
m@0 90 else if (e.getSource() == sdp.getFinishButton()) {
m@8 91 if (exp.getFinalQuestionnaire()) {
m@8 92 if (sdp.allDataEntered()) {
m@8 93 sdp.storeData();
m@8 94 results.writeSubjectData();
m@8 95 System.exit(0);
m@8 96 } else
m@8 97 reportError("You have not filled in all the information.");
m@8 98 } else
m@0 99 System.exit(0);
m@0 100 }
m@0 101
m@0 102 // StimulusPanel
m@0 103 else if (source == sp.getPlayButton()) {
m@0 104 // if (!exp.isRunning() && !exp.hasRun())
m@0 105 // exp.runExperiment();
m@0 106 // else
m@0 107 // reportError("You have already played the melody.");
m@0 108 } else if (source == sp.getNextButton()) {
jeremy@30 109 if (!exp.hasRun() || exp.isRunning()) {
jeremy@30 110 //System.out.println(!exp.hasRun());
jeremy@30 111 //System.out.println(exp.isRunning());
jeremy@30 112 //System.out.println(exp.getCurrentBlock().getMidiPlayer().getSequencer().isRunning());
m@0 113 reportError("You haven't finished playing the melody yet.");
jeremy@30 114
jeremy@30 115 } else if (exp.getCurrentBlock().getMelodyResults().countResponses() == 0) {
jeremy@30 116 reportError("Please select a number.");
jeremy@30 117
jeremy@30 118 } else if (sp.unansweredQuestions())
m@0 119 reportError("There are unanswered questions.");
m@0 120 else {
m@2 121 // store results (and write to file)
m@8 122 if (exp.getAskFamiliarity()) {
m@8 123 String answer1 = (String)(sp.getQ1Box().getSelectedItem());
m@8 124 block.addMelodyQA("known", answer1);
m@8 125 } else
m@8 126 block.addMelodyQA("known", "-1");
m@8 127 if (exp.getAskLiking()) {
m@8 128 String answer2 = (String)(sp.getQ2Box().getSelectedItem());
m@8 129 block.addMelodyQA("liked", answer2);
m@8 130 } else
m@8 131 block.addMelodyQA("liked", "-1");
m@2 132 block.storeMelodyResult();
m@2 133 results.writeResults();
m@4 134 // close the midi player
m@4 135 block.getMidiPlayer().stop();
m@0 136 // proceed to ...
JShulver@23 137
m@0 138 String nextFile = block.nextFile();
m@0 139 if (nextFile == null) {
m@0 140 boolean nb = exp.nextBlock();
m@0 141 if (nb) {
m@0 142 // ... next block of trials
m@0 143 gui.getInterBlockPanel().setText();
m@0 144 gui.getInterBlockPanel().updateMessageDisplay();
m@0 145 gui.showCard("interblock");
JShulver@23 146 sp.resetButtonBackgrounds();
m@0 147 } else {
m@0 148 // ... write results and subject questionnaire
m@12 149 results.writeResults();
m@0 150 gui.showCard("subject");
m@0 151 }
m@0 152 } else {
m@0 153 // ... next melody within block
JShulver@23 154 sp.resetButtonBackgrounds();
m@0 155 sp.setSongNumberText();
m@0 156 sp.defaultAnswers();
m@0 157 gui.setAcceptingResponses(false);
m@0 158 block.initialiseBlock();
m@0 159 exp.runExperiment();
JShulver@23 160
m@0 161 }
m@0 162 }
m@0 163 } else {
jeremy@26 164 if (exp.getDebug())
jeremy@26 165 System.out.println("Button response, getAcceptingResponses: " + gui.getAcceptingResponses() + " " + e.getActionCommand());
jeremy@26 166
m@0 167 JButton[] rButtons = sp.getResponseButtons();
m@0 168 for (int i = 0; i < rButtons.length; i++) {
m@0 169 if (source == rButtons[i] && (exp.isRunning() || exp.hasRun()) && gui.getAcceptingResponses()) {
jeremy@26 170 ratingResponse(i, time);
jeremy@26 171 /*
JShulver@23 172 block.addResponse(i+1, time);
m@0 173 gui.setAcceptingResponses(false);
JShulver@23 174 rButtons[i].setBackground(Color.red);
jeremy@26 175 rButtons[i].setOpaque(true);
jeremy@26 176 */
m@0 177 }
m@0 178 }
m@0 179 }
m@0 180 }
jeremy@26 181
m@0 182
m@0 183 public void keyPressed(KeyEvent e) {
jeremy@26 184 if (exp.getDebug())
jeremy@26 185 System.out.println("Key pressed: " + e.getKeyChar());
m@0 186 long time = System.nanoTime();
m@0 187
m@0 188 Block block = exp.getCurrentBlock();
m@0 189 sp = gui.getStimulusPanel();
m@0 190 JButton[] rButtons = sp.getResponseButtons();
m@0 191
m@5 192 if ((exp.isRunning() || exp.hasRun()) && gui.getAcceptingResponses()) {
m@5 193 if (exp.getScaleLength() == 2) {
m@5 194 char key = e.getKeyChar();
m@5 195 switch(key) {
m@5 196 case 'q': block.addResponse(1, time); break;
m@5 197 case 'p': block.addResponse(2, time); break;
m@5 198 default: System.out.println("No Response at " + time); break;
m@0 199 }
m@5 200 } else {
m@5 201 for (int i = 0; i < rButtons.length; i++) {
m@5 202 //System.out.println("Char = " + Character.forDigit(i+1, 10));
m@5 203 if (e.getKeyChar() == Character.forDigit(i+1, 10)) {
jeremy@26 204 ratingResponse(i, time);
jeremy@26 205 /*
m@10 206 if (exp.getDebug())
m@10 207 System.out.println("Got rating: " + (i + 1));
m@5 208 block.addResponse(i+1, time);
m@5 209 gui.setAcceptingResponses(false);
jeremy@26 210 */
m@5 211 }
m@5 212 //else
m@5 213 // block.addResponse(0, time);
m@5 214 }
m@0 215 }
m@0 216 }
m@0 217 }
m@0 218
m@0 219 public void keyReleased(KeyEvent e) {
m@0 220 // System.out.println("Key released: " + e.getKeyChar());
m@0 221 }
m@0 222 public void keyTyped(KeyEvent e) {
m@0 223 //System.out.println("Key typed: " + e.getKeyChar());
m@0 224 }
jeremy@26 225
jeremy@26 226 protected void ratingResponse(int buttonIndex, long time) {
jeremy@26 227
jeremy@26 228 int rating = buttonIndex + 1;
jeremy@26 229
jeremy@26 230 if (exp.getDebug())
jeremy@26 231 System.out.println("Rating: " + rating);
jeremy@26 232 exp.getCurrentBlock().addResponse(rating, time);
jeremy@26 233 sp.highlightResponse(buttonIndex);
jeremy@26 234 gui.setAcceptingResponses(false);
jeremy@26 235 }
m@0 236 }