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@0
|
5 * Time-stamp: <2010-05-18 11:12:05 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@0
|
99 clock.showClock = true;
|
m@0
|
100 clock.showFullClock = false;
|
m@0
|
101 clock.repaint();
|
m@0
|
102 }
|
m@0
|
103
|
m@0
|
104 /* Show the Fixation Point */
|
m@0
|
105 public void showFixationPoint() {
|
m@0
|
106 clock.showClock = false;
|
m@0
|
107 clock.showFullClock = false;
|
m@0
|
108 clock.repaint();
|
m@0
|
109 }
|
m@0
|
110
|
m@0
|
111 /* Run clock for r revolutions at a rate of 1 minute (6 degrees)
|
m@0
|
112 * every n milliseconds.
|
m@0
|
113 */
|
m@0
|
114 public void runClock(int r, long n) {
|
m@0
|
115 clock.reset();
|
m@0
|
116 showClock();
|
m@0
|
117 for (int i = 0; i < (60 * r); i++) {
|
m@0
|
118 try { Thread.sleep (n); } catch (InterruptedException e) {}
|
m@0
|
119 clock.tick(1);
|
m@0
|
120 clock.repaint();
|
m@0
|
121 }
|
m@0
|
122 try { Thread.sleep (1000); } catch (InterruptedException e) {}
|
m@0
|
123 showFixationPoint();
|
m@0
|
124 }
|
m@0
|
125
|
m@0
|
126 /* Run method for this thread */
|
m@0
|
127 public void run() {
|
m@0
|
128
|
m@0
|
129 //showFixationPoint();
|
m@0
|
130 clock.reset();
|
m@0
|
131 showClock();
|
m@0
|
132
|
m@0
|
133 int clockUnits = exp.getClockUnits();
|
m@0
|
134 int numUnits = exp.getNumUnits();
|
m@0
|
135 long tatum = exp.getCurrentBlock().getTatum();
|
m@0
|
136 long tatumInMilliseconds = tatum / 1000;
|
m@0
|
137 int nMinutes = 60 / numUnits;
|
m@0
|
138
|
m@0
|
139 ArrayList onsets = exp.getCurrentBlock().getOnsets();
|
m@0
|
140 ArrayList probes = exp.getCurrentBlock().getProbePositions();
|
m@0
|
141 ArrayList clockStartTimes = exp.getCurrentBlock().getClockStartTimes();
|
m@0
|
142
|
m@0
|
143 Iterator oi = onsets.iterator();
|
m@0
|
144 Iterator pi = probes.iterator();
|
m@0
|
145 Iterator ci = clockStartTimes.iterator();
|
m@0
|
146
|
m@0
|
147 ProbeID probe = ProbeID.NOT_PROBE;
|
m@0
|
148
|
m@0
|
149 long currentOnset = 0;
|
m@0
|
150 long nextEventOnset = ((Long)(oi.next())).longValue();
|
m@0
|
151 long nextClockStartTime = ((Long)(ci.next())).longValue();
|
m@0
|
152
|
m@0
|
153 int clockUnit = 0;
|
m@0
|
154 boolean clockTicking = false;
|
m@0
|
155
|
m@0
|
156 while(oi.hasNext()) {
|
m@0
|
157 //System.out.println("Ticking = " + clockTicking +
|
m@0
|
158 // "; clockUnit = " + clockUnit);
|
m@0
|
159 if (clockTicking == true && clockUnit == 0)
|
m@0
|
160 tick(nMinutes);
|
m@0
|
161
|
m@0
|
162 if (currentOnset == nextClockStartTime) {
|
m@0
|
163 //new Thread(clock).start();
|
m@0
|
164 clock.reset();
|
m@0
|
165 showClock();
|
m@0
|
166 clockTicking = true;
|
m@0
|
167 if (ci.hasNext())
|
m@0
|
168 nextClockStartTime = ((Long)(ci.next())).longValue();
|
m@0
|
169 }
|
m@0
|
170
|
m@0
|
171 if (currentOnset == nextEventOnset) {
|
m@0
|
172 // Manipulate display depending on probe identifier
|
m@0
|
173 switch (probe) {
|
m@0
|
174 case NOT_PROBE:
|
m@0
|
175 // if (clock.showClock == true)
|
m@0
|
176 // tick(nMinutes);
|
m@0
|
177 break;
|
m@0
|
178 case START_CLOCK:
|
m@0
|
179 //clock.reset();
|
m@0
|
180 //showClock();
|
m@0
|
181 //tick(nMinutes);
|
m@0
|
182 break;
|
m@0
|
183 case BEFORE_PROBE:
|
m@0
|
184 //System.out.println("BEFORE_PROBE: acceptingResponses = " +
|
m@0
|
185 // acceptingResponses);
|
m@0
|
186 if (acceptingResponses == true)
|
m@0
|
187 exp.getCurrentBlock().addResponse(0, System.nanoTime());
|
m@0
|
188 else
|
m@0
|
189 acceptingResponses = true;
|
m@0
|
190 //tick(nMinutes);
|
m@0
|
191 clockTicking = false;
|
m@0
|
192 break;
|
m@0
|
193 case PROBE:
|
m@0
|
194 case PROBE_EX:
|
m@0
|
195 case PROBE_UNEX:
|
m@0
|
196 //System.out.println("PROBE_{UN,}EX: acceptingResponses = "
|
m@0
|
197 // + acceptingResponses);
|
m@0
|
198 clock.showFullClock = false;
|
m@0
|
199 clock.repaint();
|
m@0
|
200 break;
|
m@0
|
201 case AFTER_PROBE:
|
m@0
|
202 //clock.showFullClock = false;
|
m@0
|
203 //clock.repaint();
|
m@0
|
204 //showFixationPoint();
|
m@0
|
205 break;
|
m@0
|
206 default:
|
m@0
|
207 System.out.println("Unexpected probe id: " + probe);
|
m@0
|
208 break;
|
m@0
|
209 }
|
m@0
|
210 // Update probe identifier and onset
|
m@0
|
211 probe = (ProbeID)pi.next();
|
m@0
|
212 nextEventOnset =((Long)(oi.next())).longValue();
|
m@0
|
213 }
|
m@0
|
214 // sleep for a tatum
|
m@0
|
215 try { Thread.sleep(tatumInMilliseconds); }
|
m@0
|
216 catch (InterruptedException e) {}
|
m@0
|
217 currentOnset += tatum;
|
m@0
|
218 clockUnit = (clockUnit + 1) % clockUnits;
|
m@0
|
219 }
|
m@0
|
220 showFixationPoint();
|
m@0
|
221 }
|
m@0
|
222 }
|