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()) {
|
m@0
|
68 int subjID = ip.getSubjectID();
|
m@0
|
69 if (subjID == ip.INVALID_SUBJECT_ID || subjID < 1)
|
m@0
|
70 reportError("The Participant ID should be a positive integer.");
|
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()) {
|
m@0
|
109 if (!exp.hasRun() || exp.isRunning())
|
m@0
|
110 reportError("You haven't finished playing the melody yet.");
|
m@0
|
111 else if (sp.unansweredQuestions())
|
m@0
|
112 reportError("There are unanswered questions.");
|
m@0
|
113 else {
|
m@2
|
114 // store results (and write to file)
|
m@8
|
115 if (exp.getAskFamiliarity()) {
|
m@8
|
116 String answer1 = (String)(sp.getQ1Box().getSelectedItem());
|
m@8
|
117 block.addMelodyQA("known", answer1);
|
m@8
|
118 } else
|
m@8
|
119 block.addMelodyQA("known", "-1");
|
m@8
|
120
|
m@8
|
121 if (exp.getAskLiking()) {
|
m@8
|
122 String answer2 = (String)(sp.getQ2Box().getSelectedItem());
|
m@8
|
123 block.addMelodyQA("liked", answer2);
|
m@8
|
124 } else
|
m@8
|
125 block.addMelodyQA("liked", "-1");
|
m@8
|
126
|
m@2
|
127 block.storeMelodyResult();
|
m@2
|
128 results.writeResults();
|
m@4
|
129 // close the midi player
|
m@4
|
130 block.getMidiPlayer().stop();
|
m@0
|
131 // proceed to ...
|
m@0
|
132 String nextFile = block.nextFile();
|
m@0
|
133 if (nextFile == null) {
|
m@0
|
134 boolean nb = exp.nextBlock();
|
m@0
|
135 if (nb) {
|
m@0
|
136 // ... next block of trials
|
m@0
|
137 gui.getInterBlockPanel().setText();
|
m@0
|
138 gui.getInterBlockPanel().updateMessageDisplay();
|
m@0
|
139 gui.showCard("interblock");
|
m@0
|
140 } else {
|
m@0
|
141 // ... write results and subject questionnaire
|
m@12
|
142 results.writeResults();
|
m@0
|
143 gui.showCard("subject");
|
m@0
|
144 }
|
m@0
|
145 } else {
|
m@0
|
146 // ... next melody within block
|
m@0
|
147 sp.setSongNumberText();
|
m@0
|
148 sp.defaultAnswers();
|
m@0
|
149 gui.setAcceptingResponses(false);
|
m@0
|
150 block.initialiseBlock();
|
m@0
|
151 exp.runExperiment();
|
m@0
|
152 }
|
m@0
|
153 }
|
m@0
|
154 } else {
|
m@0
|
155 JButton[] rButtons = sp.getResponseButtons();
|
m@0
|
156 for (int i = 0; i < rButtons.length; i++) {
|
m@0
|
157 if (source == rButtons[i] && (exp.isRunning() || exp.hasRun()) && gui.getAcceptingResponses()) {
|
m@0
|
158 block.addResponse(i+1, time);
|
m@0
|
159 gui.setAcceptingResponses(false);
|
m@0
|
160 }
|
m@0
|
161 }
|
m@0
|
162 }
|
m@0
|
163 }
|
m@0
|
164
|
m@0
|
165 public void keyPressed(KeyEvent e) {
|
m@0
|
166 //System.out.println("Key pressed: " + e.getKeyChar());
|
m@0
|
167 long time = System.nanoTime();
|
m@0
|
168
|
m@0
|
169 Block block = exp.getCurrentBlock();
|
m@0
|
170 sp = gui.getStimulusPanel();
|
m@0
|
171 JButton[] rButtons = sp.getResponseButtons();
|
m@0
|
172
|
m@5
|
173 if ((exp.isRunning() || exp.hasRun()) && gui.getAcceptingResponses()) {
|
m@5
|
174 if (exp.getScaleLength() == 2) {
|
m@5
|
175 char key = e.getKeyChar();
|
m@5
|
176 switch(key) {
|
m@5
|
177 case 'q': block.addResponse(1, time); break;
|
m@5
|
178 case 'p': block.addResponse(2, time); break;
|
m@5
|
179 default: System.out.println("No Response at " + time); break;
|
m@0
|
180 }
|
m@5
|
181 } else {
|
m@5
|
182 for (int i = 0; i < rButtons.length; i++) {
|
m@5
|
183 //System.out.println("Char = " + Character.forDigit(i+1, 10));
|
m@5
|
184 if (e.getKeyChar() == Character.forDigit(i+1, 10)) {
|
m@10
|
185 if (exp.getDebug())
|
m@10
|
186 System.out.println("Got rating: " + (i + 1));
|
m@5
|
187 block.addResponse(i+1, time);
|
m@5
|
188 gui.setAcceptingResponses(false);
|
m@5
|
189 }
|
m@5
|
190 //else
|
m@5
|
191 // block.addResponse(0, time);
|
m@5
|
192 }
|
m@0
|
193 }
|
m@0
|
194 }
|
m@0
|
195 }
|
m@0
|
196
|
m@0
|
197 public void keyReleased(KeyEvent e) {
|
m@0
|
198 // System.out.println("Key released: " + e.getKeyChar());
|
m@0
|
199 }
|
m@0
|
200 public void keyTyped(KeyEvent e) {
|
m@0
|
201 //System.out.println("Key typed: " + e.getKeyChar());
|
m@0
|
202 }
|
m@0
|
203 }
|