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