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 }
|