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@4
|
5 * Time-stamp: <2010-11-18 11:04:51 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@0
|
91 if (sdp.allDataEntered()) {
|
m@0
|
92 sdp.storeData();
|
m@0
|
93 results.writeSubjectData();
|
m@0
|
94 System.exit(0);
|
m@0
|
95 } else
|
m@0
|
96 reportError("You have not filled in all the information.");
|
m@0
|
97 }
|
m@0
|
98
|
m@0
|
99 // StimulusPanel
|
m@0
|
100 else if (source == sp.getPlayButton()) {
|
m@0
|
101 // if (!exp.isRunning() && !exp.hasRun())
|
m@0
|
102 // exp.runExperiment();
|
m@0
|
103 // else
|
m@0
|
104 // reportError("You have already played the melody.");
|
m@0
|
105 } else if (source == sp.getNextButton()) {
|
m@0
|
106 if (!exp.hasRun() || exp.isRunning())
|
m@0
|
107 reportError("You haven't finished playing the melody yet.");
|
m@0
|
108 else if (sp.unansweredQuestions())
|
m@0
|
109 reportError("There are unanswered questions.");
|
m@0
|
110 else {
|
m@2
|
111 // store results (and write to file)
|
m@0
|
112 String answer1 = (String)(sp.getQ1Box().getSelectedItem());
|
m@0
|
113 String answer2 = (String)(sp.getQ2Box().getSelectedItem());
|
m@0
|
114 block.addMelodyQA("known", answer1);
|
m@0
|
115 block.addMelodyQA("liked", answer2);
|
m@2
|
116 block.storeMelodyResult();
|
m@2
|
117 results.writeResults();
|
m@4
|
118 // close the midi player
|
m@4
|
119 block.getMidiPlayer().stop();
|
m@0
|
120 // proceed to ...
|
m@0
|
121 String nextFile = block.nextFile();
|
m@0
|
122 if (nextFile == null) {
|
m@0
|
123 boolean nb = exp.nextBlock();
|
m@0
|
124 if (nb) {
|
m@0
|
125 // ... next block of trials
|
m@0
|
126 gui.getInterBlockPanel().setText();
|
m@0
|
127 gui.getInterBlockPanel().updateMessageDisplay();
|
m@0
|
128 gui.showCard("interblock");
|
m@0
|
129 } else {
|
m@0
|
130 // ... write results and subject questionnaire
|
m@0
|
131 results.writeResults();
|
m@0
|
132 gui.showCard("subject");
|
m@0
|
133 }
|
m@0
|
134 } else {
|
m@0
|
135 // ... next melody within block
|
m@0
|
136 sp.setSongNumberText();
|
m@0
|
137 sp.defaultAnswers();
|
m@0
|
138 gui.setAcceptingResponses(false);
|
m@0
|
139 block.initialiseBlock();
|
m@0
|
140 exp.runExperiment();
|
m@0
|
141 }
|
m@0
|
142 }
|
m@0
|
143 } else {
|
m@0
|
144 JButton[] rButtons = sp.getResponseButtons();
|
m@0
|
145 for (int i = 0; i < rButtons.length; i++) {
|
m@0
|
146 if (source == rButtons[i] && (exp.isRunning() || exp.hasRun()) && gui.getAcceptingResponses()) {
|
m@0
|
147 block.addResponse(i+1, time);
|
m@0
|
148 gui.setAcceptingResponses(false);
|
m@0
|
149 }
|
m@0
|
150 }
|
m@0
|
151 }
|
m@0
|
152 }
|
m@0
|
153
|
m@0
|
154 public void keyPressed(KeyEvent e) {
|
m@0
|
155 //System.out.println("Key pressed: " + e.getKeyChar());
|
m@0
|
156 long time = System.nanoTime();
|
m@0
|
157
|
m@0
|
158 Block block = exp.getCurrentBlock();
|
m@0
|
159 sp = gui.getStimulusPanel();
|
m@0
|
160 JButton[] rButtons = sp.getResponseButtons();
|
m@0
|
161
|
m@0
|
162 for (int i = 0; i < rButtons.length; i++) {
|
m@0
|
163 if ((exp.isRunning() || exp.hasRun()) && gui.getAcceptingResponses()) {
|
m@0
|
164 //System.out.println("Char = " + Character.forDigit(i+1, 10));
|
m@0
|
165 if (e.getKeyChar() == Character.forDigit(i+1, 10)) {
|
m@0
|
166 //System.out.println("Got rating: " + (i + 1));
|
m@0
|
167 block.addResponse(i+1, time);
|
m@0
|
168 gui.setAcceptingResponses(false);
|
m@0
|
169 }
|
m@0
|
170 //else
|
m@0
|
171 // block.addResponse(0, time);
|
m@0
|
172 }
|
m@0
|
173 }
|
m@0
|
174 }
|
m@0
|
175
|
m@0
|
176 public void keyReleased(KeyEvent e) {
|
m@0
|
177 // System.out.println("Key released: " + e.getKeyChar());
|
m@0
|
178 }
|
m@0
|
179 public void keyTyped(KeyEvent e) {
|
m@0
|
180 //System.out.println("Key typed: " + e.getKeyChar());
|
m@0
|
181 }
|
m@0
|
182 }
|