root / trunk / code / projects / diagnostic_station / server / ServerGUI.java @ 1606
History | View | Annotate | Download (11.7 KB)
1 | 1606 | erhart | import java.awt.BorderLayout; |
---|---|---|---|
2 | import java.awt.Color; |
||
3 | import java.awt.Component; |
||
4 | import java.awt.Dimension; |
||
5 | import java.awt.GridLayout; |
||
6 | import java.awt.LayoutManager; |
||
7 | import java.awt.event.ActionEvent; |
||
8 | import java.awt.event.ActionListener; |
||
9 | import java.util.ArrayList; |
||
10 | import java.util.Enumeration; |
||
11 | |||
12 | import javax.swing.AbstractButton; |
||
13 | import javax.swing.BorderFactory; |
||
14 | import javax.swing.Box; |
||
15 | import javax.swing.BoxLayout; |
||
16 | import javax.swing.ButtonGroup; |
||
17 | import javax.swing.JButton; |
||
18 | import javax.swing.JFrame; |
||
19 | import javax.swing.JLabel; |
||
20 | import javax.swing.JPanel; |
||
21 | import javax.swing.JRadioButton; |
||
22 | import javax.swing.JScrollPane; |
||
23 | import javax.swing.JTextArea; |
||
24 | import javax.swing.SwingUtilities; |
||
25 | import javax.swing.border.Border; |
||
26 | |||
27 | import org.jfree.chart.ChartFactory; |
||
28 | import org.jfree.chart.ChartPanel; |
||
29 | import org.jfree.chart.JFreeChart; |
||
30 | import org.jfree.chart.plot.PlotOrientation; |
||
31 | import org.jfree.data.xy.XYSeries; |
||
32 | import org.jfree.data.xy.XYSeriesCollection; |
||
33 | |||
34 | public class ServerGUI implements ActionListener{ |
||
35 | |||
36 | private static final long serialVersionUID = 1L; |
||
37 | |||
38 | // whether or not to use the console
|
||
39 | private static final boolean USE_CONSOLE = true; |
||
40 | |||
41 | private int currentTest = -1; |
||
42 | private int testNum = -1; |
||
43 | |||
44 | // the area that shows messages
|
||
45 | private JTextArea console; |
||
46 | // the DiagnosticsServer that does all the processing
|
||
47 | private DiagnosticsServer server;
|
||
48 | |||
49 | // a list of buttons
|
||
50 | private JButton[] buttons = new JButton[DiagnosticsServer.NUM_TESTS]; |
||
51 | // the stop button
|
||
52 | JButton stop;
|
||
53 | ButtonGroup numSelectGroup;
|
||
54 | private JRadioButton[] radios; |
||
55 | private JFrame numSelectWindow, frame; |
||
56 | private JPanel graphPanel, top; |
||
57 | private LayoutManager layout; |
||
58 | |||
59 | // Constructor - sets up the GUI
|
||
60 | public ServerGUI(DiagnosticsServer server){
|
||
61 | frame = new JFrame("Diagnostic Station Control Panel"); |
||
62 | this.server = server;
|
||
63 | |||
64 | frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||
65 | |||
66 | frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS)); |
||
67 | |||
68 | top = new JPanel(); |
||
69 | layout = new BoxLayout(top, BoxLayout.X_AXIS); |
||
70 | top.setLayout(layout); |
||
71 | top.add(buttonPanel()); |
||
72 | top.add(Box.createGlue());
|
||
73 | graphPanel = graphPanel(); |
||
74 | top.add(graphPanel); |
||
75 | |||
76 | frame.add(top); |
||
77 | if(USE_CONSOLE)
|
||
78 | frame.add(console()); |
||
79 | |||
80 | frame.pack(); |
||
81 | frame.setVisible(true);
|
||
82 | } |
||
83 | |||
84 | // returns the Panel containing the graph
|
||
85 | private JPanel graphPanel(){ |
||
86 | if(currentTest == -1 || currentTest == DiagnosticsServer.ALL_TESTS) |
||
87 | return blankPanel();
|
||
88 | |||
89 | String[] labels = server.getLabels(currentTest, testNum); |
||
90 | ArrayList[] data = server.getData(currentTest, testNum); |
||
91 | |||
92 | int numSeries = labels.length - 3; |
||
93 | XYSeries series[] = new XYSeries[numSeries]; |
||
94 | for(int i=0; i<numSeries; i++){ |
||
95 | series[i] = new XYSeries(labels[i+3]); |
||
96 | ArrayList x = data[2*i]; |
||
97 | ArrayList y = data[2*i+1]; |
||
98 | for(int j=0; j<x.size(); j++){ |
||
99 | series[i].add((Integer)x.get(j), (Integer)y.get(j)); |
||
100 | } |
||
101 | } |
||
102 | XYSeriesCollection xyDataset = new XYSeriesCollection(series[0]); |
||
103 | for(int i=1; i<numSeries; i++) |
||
104 | xyDataset.addSeries(series[i]); |
||
105 | |||
106 | JFreeChart chart = ChartFactory.createXYLineChart(labels[0],
|
||
107 | labels[1], labels[2], xyDataset, PlotOrientation.VERTICAL, true, |
||
108 | false, false); |
||
109 | ChartPanel panel = new ChartPanel(chart);
|
||
110 | |||
111 | JPanel graphPanel = new JPanel(); |
||
112 | graphPanel.add(panel); |
||
113 | return graphPanel;
|
||
114 | } |
||
115 | |||
116 | // returns a blank panel
|
||
117 | private JPanel blankPanel(){ |
||
118 | JPanel blank = new JPanel(); |
||
119 | blank.setBorder(BorderFactory.createMatteBorder(20, 20, 20, 20, new Color(238, 238, 238))); |
||
120 | blank.setBackground(Color.WHITE);
|
||
121 | blank.add(Box.createRigidArea(new Dimension(680, 420))); |
||
122 | return blank;
|
||
123 | } |
||
124 | |||
125 | // returns the console
|
||
126 | private JScrollPane console(){ |
||
127 | console = new JTextArea(10, 50); |
||
128 | JScrollPane pane = new JScrollPane(console); |
||
129 | console.setEditable(false);
|
||
130 | console.setLineWrap(false);
|
||
131 | Border inner = BorderFactory.createLineBorder(Color.BLACK); |
||
132 | Border outer = BorderFactory.createEmptyBorder(5, 15, 5, 15); |
||
133 | Border border = BorderFactory.createCompoundBorder(outer, inner); |
||
134 | pane.setBorder(border); |
||
135 | return pane;
|
||
136 | } |
||
137 | |||
138 | // adds the given String to the console
|
||
139 | public void addTextToConsole(final String s){ |
||
140 | SwingUtilities.invokeLater(new Runnable (){ |
||
141 | public void run() { |
||
142 | console.append(s); |
||
143 | } |
||
144 | }); |
||
145 | } |
||
146 | |||
147 | // the panel with the control buttons
|
||
148 | private JPanel buttonPanel(){ |
||
149 | int maxButtonWidth = 200; |
||
150 | int maxButtonHeight = 30; |
||
151 | |||
152 | JPanel buttonPanel = new JPanel(); |
||
153 | buttonPanel.setBorder(BorderFactory.createEmptyBorder(10, 15, 5, 15)); |
||
154 | buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS)); |
||
155 | buttonPanel.setMinimumSize(new Dimension(maxButtonWidth, 25 + ((maxButtonHeight + 5) * DiagnosticsServer.NUM_TESTS))); |
||
156 | buttonPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
|
||
157 | buttonPanel.setAlignmentY(Component.BOTTOM_ALIGNMENT);
|
||
158 | |||
159 | buttons[DiagnosticsServer.ALL_TESTS] = new JButton("Run all tests"); |
||
160 | buttons[DiagnosticsServer.RANGEFINDER] = new JButton("Run rangefinder test"); |
||
161 | buttons[DiagnosticsServer.ENCODER] = new JButton("Run encoder test"); |
||
162 | buttons[DiagnosticsServer.MOTOR] = new JButton("Run motor test"); |
||
163 | buttons[DiagnosticsServer.BOM] = new JButton("Run bom test"); |
||
164 | buttons[DiagnosticsServer.BOM_EMITTER] = new JButton("Run bom emitter test"); |
||
165 | buttons[DiagnosticsServer.BOM_DETECTOR] = new JButton("Run bom detector test"); |
||
166 | for(int i=0; i<DiagnosticsServer.NUM_TESTS; i++){ |
||
167 | buttons[i].setVerticalTextPosition(AbstractButton.CENTER);
|
||
168 | buttons[i].setActionCommand("frame " + i);
|
||
169 | buttons[i].addActionListener(this);
|
||
170 | buttons[i].setAlignmentX(Component.LEFT_ALIGNMENT);
|
||
171 | buttons[i].setAlignmentY(Component.TOP_ALIGNMENT);
|
||
172 | buttons[i].setMaximumSize(new Dimension(maxButtonWidth, maxButtonHeight)); |
||
173 | if(i != 0) |
||
174 | buttonPanel.add(Box.createRigidArea(new Dimension(0, 5))); |
||
175 | buttonPanel.add(buttons[i]); |
||
176 | } |
||
177 | stop = new JButton("Stop testing"); |
||
178 | stop.setVerticalTextPosition(AbstractButton.CENTER);
|
||
179 | stop.setActionCommand("stop");
|
||
180 | stop.addActionListener(this);
|
||
181 | stop.setAlignmentX(Component.LEFT_ALIGNMENT);
|
||
182 | stop.setAlignmentY(Component.TOP_ALIGNMENT);
|
||
183 | stop.setMaximumSize(new Dimension(maxButtonWidth, maxButtonHeight)); |
||
184 | //stop.setBackground(Color.RED);
|
||
185 | stop.setEnabled(false);
|
||
186 | buttonPanel.add(Box.createRigidArea(new Dimension(0, 5))); |
||
187 | buttonPanel.add(stop); |
||
188 | |||
189 | buttonPanel.add(Box.createGlue());
|
||
190 | |||
191 | return buttonPanel;
|
||
192 | } |
||
193 | |||
194 | // shows the dialog asking the user which specific parts to test
|
||
195 | private void getNumDialog(int testNum){ |
||
196 | String instr = "Choose which test to run"; |
||
197 | if(testNum == DiagnosticsServer.BOM){
|
||
198 | instr = "Choose which bom to test";
|
||
199 | } |
||
200 | else if(testNum == DiagnosticsServer.BOM_DETECTOR){ |
||
201 | instr = "Choose which detector to test";
|
||
202 | } |
||
203 | else if(testNum == DiagnosticsServer.BOM_EMITTER){ |
||
204 | instr = "Choose which emitter to test";
|
||
205 | } |
||
206 | else if(testNum == DiagnosticsServer.RANGEFINDER){ |
||
207 | instr = "Choose which rangefinder to test";
|
||
208 | } |
||
209 | else if(testNum == DiagnosticsServer.MOTOR){ |
||
210 | instr = "Choose which motor to test";
|
||
211 | } |
||
212 | else if(testNum == DiagnosticsServer.ENCODER){ |
||
213 | instr = "Choose which encoder to test";
|
||
214 | } |
||
215 | |||
216 | JLabel label = new JLabel(instr); |
||
217 | radios = radios(testNum); |
||
218 | |||
219 | JPanel grid = new JPanel(new GridLayout(0, 1)); |
||
220 | for (int i = 0; i < radios.length; i++) { |
||
221 | grid.add(radios[i]); |
||
222 | } |
||
223 | |||
224 | JPanel box = new JPanel(); |
||
225 | box.setBorder(BorderFactory.createEmptyBorder(5, 15, 5, 15)); |
||
226 | box.setLayout(new BoxLayout(box, BoxLayout.PAGE_AXIS)); |
||
227 | label.setAlignmentX(Component.LEFT_ALIGNMENT);
|
||
228 | box.add(label); |
||
229 | box.add(grid); |
||
230 | grid.setAlignmentX(Component.LEFT_ALIGNMENT);
|
||
231 | |||
232 | JPanel buttons = new JPanel(); |
||
233 | buttons.setLayout(new BoxLayout(buttons, BoxLayout.Y_AXIS)); |
||
234 | box.add(buttons); |
||
235 | JButton run = new JButton("Run test"); |
||
236 | run.addActionListener(this);
|
||
237 | run.setActionCommand("run");
|
||
238 | run.setMaximumSize(new Dimension(200, 30)); |
||
239 | buttons.add(run); |
||
240 | buttons.add(Box.createRigidArea(new Dimension(0, 5))); |
||
241 | JButton cancel = new JButton("Cancel"); |
||
242 | cancel.addActionListener(this);
|
||
243 | cancel.setActionCommand("cancel");
|
||
244 | cancel.setMaximumSize(new Dimension(200, 30)); |
||
245 | buttons.add(cancel); |
||
246 | |||
247 | numSelectWindow = new JFrame("Select test"); |
||
248 | numSelectWindow.setLayout(new BoxLayout(numSelectWindow.getContentPane(), BoxLayout.Y_AXIS)); |
||
249 | numSelectWindow.add(box, BorderLayout.PAGE_START);
|
||
250 | numSelectWindow.pack(); |
||
251 | numSelectWindow.setVisible(true);
|
||
252 | } |
||
253 | |||
254 | // returns the radio buttons for the getNumDialog
|
||
255 | private JRadioButton[] radios(int testNum){ |
||
256 | int numTests = 0; |
||
257 | int startIndex = 0; |
||
258 | String allText = "All tests"; |
||
259 | if(testNum == DiagnosticsServer.BOM || testNum == DiagnosticsServer.BOM_DETECTOR || testNum == DiagnosticsServer.BOM_EMITTER){
|
||
260 | numTests = DiagnosticsServer.NUM_BOMS; |
||
261 | startIndex = DiagnosticsServer.BOM_OFFSET; |
||
262 | if(testNum == DiagnosticsServer.BOM)
|
||
263 | allText = "All boms";
|
||
264 | else if(testNum == DiagnosticsServer.BOM_DETECTOR) |
||
265 | allText = "All detectors";
|
||
266 | else if(testNum == DiagnosticsServer.BOM_EMITTER) |
||
267 | allText = "All emitters";
|
||
268 | } |
||
269 | else if(testNum == DiagnosticsServer.RANGEFINDER){ |
||
270 | numTests = DiagnosticsServer.NUM_RANGEFINDERS; |
||
271 | startIndex = DiagnosticsServer.RANGEFINDER_OFFSET; |
||
272 | allText = "All rangefinders";
|
||
273 | } |
||
274 | else if(testNum == DiagnosticsServer.MOTOR){ |
||
275 | numTests = DiagnosticsServer.NUM_MOTORS; |
||
276 | startIndex = DiagnosticsServer.MOTOR_OFFSET; |
||
277 | allText = "Both motors";
|
||
278 | } |
||
279 | else if(testNum == DiagnosticsServer.ENCODER){ |
||
280 | numTests = DiagnosticsServer.NUM_ENCODERS; |
||
281 | startIndex = DiagnosticsServer.ENCODER_OFFSET; |
||
282 | allText = "Both encoders";
|
||
283 | } |
||
284 | |||
285 | JRadioButton radios[] = new JRadioButton[numTests+1]; |
||
286 | numSelectGroup = new ButtonGroup(); |
||
287 | for(int i=0; i<numTests+1; i++){ |
||
288 | if(i==0){ |
||
289 | radios[i] = new JRadioButton(allText); |
||
290 | radios[i].setSelected(true);
|
||
291 | } |
||
292 | else{
|
||
293 | radios[i] = new JRadioButton((i+startIndex-1) + ""); |
||
294 | radios[i].setSelected(false);
|
||
295 | } |
||
296 | radios[i].addActionListener(this);
|
||
297 | radios[i].setActionCommand(testNum + " " + (i-1)); |
||
298 | numSelectGroup.add(radios[i]); |
||
299 | } |
||
300 | |||
301 | return radios;
|
||
302 | } |
||
303 | |||
304 | // the Action handler
|
||
305 | public void actionPerformed(ActionEvent event) { |
||
306 | String actionCommand = event.getActionCommand();
|
||
307 | try{
|
||
308 | if(actionCommand.equals("stop")){ |
||
309 | server.stopTest(); |
||
310 | stop.setBackground(null);
|
||
311 | stop.setEnabled(false);
|
||
312 | } |
||
313 | else if(actionCommand.equals("cancel")){ |
||
314 | numSelectWindow.dispose(); |
||
315 | return;
|
||
316 | } |
||
317 | else if(actionCommand.equals("run")){ |
||
318 | Enumeration<AbstractButton> buttons = numSelectGroup.getElements(); |
||
319 | while(buttons.hasMoreElements()){
|
||
320 | AbstractButton button = buttons.nextElement();
|
||
321 | if(button.isSelected()){
|
||
322 | String command = button.getActionCommand();
|
||
323 | int spaceIndex = command.indexOf(" "); |
||
324 | Integer testNum = Integer.parseInt(command.substring(0, spaceIndex)); |
||
325 | Integer num = Integer.parseInt(command.substring(spaceIndex+1)); |
||
326 | numSelectWindow.dispose(); |
||
327 | currentTest = testNum; |
||
328 | this.testNum = num;
|
||
329 | stop.setBackground(Color.RED);
|
||
330 | stop.setEnabled(true);
|
||
331 | frame.repaint(); |
||
332 | server.startTest(testNum, num); |
||
333 | stop.setBackground(null);
|
||
334 | stop.setEnabled(false);
|
||
335 | top.remove(graphPanel); |
||
336 | graphPanel = graphPanel(); |
||
337 | top.add(graphPanel); |
||
338 | top.validate(); |
||
339 | break;
|
||
340 | } |
||
341 | } |
||
342 | } |
||
343 | else if(actionCommand.startsWith("frame ")){ |
||
344 | Integer num = Integer.parseInt(actionCommand.substring(6)); |
||
345 | getNumDialog(num); |
||
346 | } |
||
347 | } |
||
348 | catch(Exception e){ |
||
349 | System.out.println(e.getMessage());
|
||
350 | } |
||
351 | } |
||
352 | } |