m@0
|
1 /*=============================================================================
|
m@0
|
2 * File: ExperimentGui.java
|
m@0
|
3 * Author: Marcus Pearce <m.pearce@gold.ac.uk>
|
m@0
|
4 * Created: <2007-02-14 16:42:31 marcusp>
|
m@4
|
5 * Time-stamp: <2010-11-18 11:46:46 marcusp>
|
m@0
|
6 *=============================================================================
|
m@0
|
7 */
|
m@0
|
8
|
m@0
|
9 import java.awt.*;
|
m@0
|
10 import javax.swing.*;
|
m@0
|
11 import java.util.ArrayList;
|
m@0
|
12 import java.util.Iterator;
|
m@0
|
13
|
m@0
|
14 public class ExperimentGui extends JFrame implements Runnable {
|
m@0
|
15
|
m@0
|
16 /* the Experiment */
|
m@0
|
17 private Experiment exp;
|
m@0
|
18
|
m@0
|
19 /* The visual display indicating probe positions */
|
m@0
|
20 private Clock clock;
|
m@0
|
21
|
m@0
|
22 /* The UI components */
|
m@0
|
23 private JPanel mainPanel;
|
m@0
|
24 private InstructionsPanel instructionsPanel;
|
m@0
|
25 private StimulusPanel stimulusPanel;
|
m@0
|
26 private SubjectDataPanel subjectDataPanel;
|
m@0
|
27 private InterBlockPanel interBlockPanel;
|
m@0
|
28
|
m@0
|
29 /* Whether we are accepting responses */
|
m@0
|
30 private Boolean acceptingResponses;
|
m@0
|
31
|
m@0
|
32 /* accessors */
|
m@0
|
33 public Boolean getAcceptingResponses() { return acceptingResponses; }
|
m@0
|
34 public void setAcceptingResponses(Boolean b) { acceptingResponses = b; }
|
m@0
|
35 public Experiment getExperiment() { return exp; }
|
m@0
|
36 public InstructionsPanel getInstructionsPanel() { return instructionsPanel; }
|
m@0
|
37 public StimulusPanel getStimulusPanel() { return stimulusPanel; }
|
m@0
|
38 public SubjectDataPanel getSubjectDataPanel() { return subjectDataPanel; }
|
m@0
|
39 public InterBlockPanel getInterBlockPanel() { return interBlockPanel; }
|
m@0
|
40
|
m@0
|
41 /* Constructor */
|
m@0
|
42 public ExperimentGui(Experiment experiment) {
|
m@0
|
43
|
m@0
|
44 // initialise experiment
|
m@0
|
45 exp = experiment;
|
m@0
|
46 acceptingResponses = false;
|
m@0
|
47
|
m@0
|
48 // set up the clock
|
m@0
|
49 clock = new Clock();
|
m@0
|
50
|
m@0
|
51 // construct the frame
|
m@0
|
52 JFrame.setDefaultLookAndFeelDecorated(true);
|
m@0
|
53 this.getContentPane().setBackground (Color.black);
|
m@0
|
54 this.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
|
m@0
|
55 this.setLayout (new BorderLayout());
|
m@0
|
56
|
m@0
|
57 // The different cards
|
m@0
|
58 instructionsPanel = new InstructionsPanel(this);
|
m@0
|
59 stimulusPanel = new StimulusPanel(this, clock);
|
m@0
|
60 interBlockPanel = new InterBlockPanel(exp);
|
m@0
|
61 subjectDataPanel = new SubjectDataPanel(this, exp.getSubjectResults());
|
m@0
|
62
|
m@0
|
63 // The Controller
|
m@0
|
64 ExperimentController ec = new ExperimentController(this);
|
m@0
|
65
|
m@0
|
66 // Show it all
|
m@0
|
67 CardLayout cl = new CardLayout();
|
m@0
|
68 mainPanel = new JPanel(cl);
|
m@0
|
69 mainPanel.add(instructionsPanel, "instructions");
|
m@0
|
70 mainPanel.add(interBlockPanel, "interblock");
|
m@0
|
71 mainPanel.add(stimulusPanel, "stimulus");
|
m@0
|
72 mainPanel.add(subjectDataPanel, "subject");
|
m@0
|
73
|
m@0
|
74 this.add(mainPanel, BorderLayout.CENTER);
|
m@0
|
75 }
|
m@0
|
76
|
m@0
|
77 /*
|
m@0
|
78 * Methods for changing displayed card
|
m@0
|
79 */
|
m@0
|
80
|
m@0
|
81 public void showCard(String card) {
|
m@0
|
82 CardLayout cl = (CardLayout)(mainPanel.getLayout());
|
m@0
|
83 cl.show(mainPanel, card);
|
m@0
|
84 }
|
m@0
|
85
|
m@0
|
86 public void nextCard() {
|
m@0
|
87 CardLayout cl = (CardLayout)(mainPanel.getLayout());
|
m@0
|
88 cl.next(mainPanel);
|
m@0
|
89 }
|
m@0
|
90
|
m@0
|
91 /* Advance clock by 1 minute and redisplay. */
|
m@0
|
92 public void tick(int n) {
|
m@0
|
93 clock.tick(n);
|
m@0
|
94 clock.repaint();
|
m@0
|
95 }
|
m@0
|
96
|
m@0
|
97 /* Show the Clock */
|
m@0
|
98 public void showClock() {
|
m@3
|
99 if (exp.showClock()) {
|
m@3
|
100 clock.showClock = true;
|
m@3
|
101 clock.showFullClock = false;
|
m@3
|
102 clock.repaint();
|
m@3
|
103 }
|
m@0
|
104 }
|
m@0
|
105
|
m@0
|
106 /* Show the Fixation Point */
|
m@0
|
107 public void showFixationPoint() {
|
m@4
|
108 //System.out.println("showFixationPoint");
|
m@0
|
109 clock.showClock = false;
|
m@0
|
110 clock.showFullClock = false;
|
m@0
|
111 clock.repaint();
|
m@0
|
112 }
|
m@0
|
113
|
m@0
|
114 /* Run clock for r revolutions at a rate of 1 minute (6 degrees)
|
m@0
|
115 * every n milliseconds.
|
m@0
|
116 */
|
m@0
|
117 public void runClock(int r, long n) {
|
m@0
|
118 clock.reset();
|
m@0
|
119 showClock();
|
m@0
|
120 for (int i = 0; i < (60 * r); i++) {
|
m@0
|
121 try { Thread.sleep (n); } catch (InterruptedException e) {}
|
m@0
|
122 clock.tick(1);
|
m@0
|
123 clock.repaint();
|
m@0
|
124 }
|
m@0
|
125 try { Thread.sleep (1000); } catch (InterruptedException e) {}
|
m@0
|
126 showFixationPoint();
|
m@0
|
127 }
|
m@0
|
128
|
m@0
|
129 /* Run method for this thread */
|
m@0
|
130 public void run() {
|
m@0
|
131
|
m@0
|
132 //showFixationPoint();
|
m@0
|
133 clock.reset();
|
m@0
|
134 showClock();
|
m@0
|
135
|
m@0
|
136 int clockUnits = exp.getClockUnits();
|
m@0
|
137 int numUnits = exp.getNumUnits();
|
m@0
|
138 long tatum = exp.getCurrentBlock().getTatum();
|
m@0
|
139 long tatumInMilliseconds = tatum / 1000;
|
m@0
|
140 int nMinutes = 60 / numUnits;
|
m@0
|
141
|
m@0
|
142 ArrayList onsets = exp.getCurrentBlock().getOnsets();
|
m@0
|
143 ArrayList probes = exp.getCurrentBlock().getProbePositions();
|
m@0
|
144 ArrayList clockStartTimes = exp.getCurrentBlock().getClockStartTimes();
|
m@0
|
145
|
m@0
|
146 Iterator oi = onsets.iterator();
|
m@0
|
147 Iterator pi = probes.iterator();
|
m@0
|
148 Iterator ci = clockStartTimes.iterator();
|
m@0
|
149
|
m@0
|
150 ProbeID probe = ProbeID.NOT_PROBE;
|
m@0
|
151
|
m@0
|
152 long currentOnset = 0;
|
m@0
|
153 long nextEventOnset = ((Long)(oi.next())).longValue();
|
m@0
|
154 long nextClockStartTime = ((Long)(ci.next())).longValue();
|
m@0
|
155
|
m@0
|
156 int clockUnit = 0;
|
m@0
|
157 boolean clockTicking = false;
|
m@0
|
158
|
m@0
|
159 while(oi.hasNext()) {
|
m@0
|
160 //System.out.println("Ticking = " + clockTicking +
|
m@0
|
161 // "; clockUnit = " + clockUnit);
|
m@0
|
162 if (clockTicking == true && clockUnit == 0)
|
m@0
|
163 tick(nMinutes);
|
m@0
|
164
|
m@0
|
165 if (currentOnset == nextClockStartTime) {
|
m@0
|
166 //new Thread(clock).start();
|
m@0
|
167 clock.reset();
|
m@0
|
168 showClock();
|
m@0
|
169 clockTicking = true;
|
m@0
|
170 if (ci.hasNext())
|
m@0
|
171 nextClockStartTime = ((Long)(ci.next())).longValue();
|
m@0
|
172 }
|
m@0
|
173
|
m@0
|
174 if (currentOnset == nextEventOnset) {
|
m@0
|
175 // Manipulate display depending on probe identifier
|
m@0
|
176 switch (probe) {
|
m@0
|
177 case NOT_PROBE:
|
m@0
|
178 // if (clock.showClock == true)
|
m@0
|
179 // tick(nMinutes);
|
m@0
|
180 break;
|
m@0
|
181 case START_CLOCK:
|
m@0
|
182 //clock.reset();
|
m@0
|
183 //showClock();
|
m@0
|
184 //tick(nMinutes);
|
m@0
|
185 break;
|
m@0
|
186 case BEFORE_PROBE:
|
m@0
|
187 //System.out.println("BEFORE_PROBE: acceptingResponses = " +
|
m@0
|
188 // acceptingResponses);
|
m@0
|
189 if (acceptingResponses == true)
|
m@0
|
190 exp.getCurrentBlock().addResponse(0, System.nanoTime());
|
m@0
|
191 else
|
m@0
|
192 acceptingResponses = true;
|
m@0
|
193 //tick(nMinutes);
|
m@0
|
194 clockTicking = false;
|
m@0
|
195 break;
|
m@0
|
196 case PROBE:
|
m@0
|
197 case PROBE_EX:
|
m@0
|
198 case PROBE_UNEX:
|
m@0
|
199 //System.out.println("PROBE_{UN,}EX: acceptingResponses = "
|
m@0
|
200 // + acceptingResponses);
|
m@0
|
201 clock.showFullClock = false;
|
m@0
|
202 clock.repaint();
|
m@0
|
203 break;
|
m@0
|
204 case AFTER_PROBE:
|
m@0
|
205 //clock.showFullClock = false;
|
m@0
|
206 //clock.repaint();
|
m@0
|
207 //showFixationPoint();
|
m@0
|
208 break;
|
m@0
|
209 default:
|
m@0
|
210 System.out.println("Unexpected probe id: " + probe);
|
m@0
|
211 break;
|
m@0
|
212 }
|
m@0
|
213 // Update probe identifier and onset
|
m@0
|
214 probe = (ProbeID)pi.next();
|
m@0
|
215 nextEventOnset =((Long)(oi.next())).longValue();
|
m@0
|
216 }
|
m@0
|
217 // sleep for a tatum
|
m@0
|
218 try { Thread.sleep(tatumInMilliseconds); }
|
m@0
|
219 catch (InterruptedException e) {}
|
m@0
|
220 currentOnset += tatum;
|
m@0
|
221 clockUnit = (clockUnit + 1) % clockUnits;
|
m@0
|
222 }
|
m@0
|
223 showFixationPoint();
|
m@0
|
224 }
|
m@0
|
225 }
|