// Parallel Computing // // Control panel for simulator // // Author Matthew Caryl // Created 4.4.97 package Parallel; import java.awt.Graphics; import java.awt.Color; import java.awt.Event; import java.applet.Applet; import java.lang.System; import java.io.*; import java.awt.*; public final class Controls extends Panel { // // Private interface // private Simulator owner; private Button zoom_in_button; private Button zoom_out_button; private Button granularity_up; private Button granularity_down; private Button speed_up; private Button speed_down; private Label hertz_label; private Label time_label; private Label granularity_label; private long total_cycles = 0; private long start_time; private long clock_speed; // // Public interface // public Controls(Simulator O, long C, int T) { owner = O; clock_speed = C; zoom_in_button = new Button("Zoom in"); zoom_out_button = new Button("Zoom out"); granularity_up = new Button("High grain"); granularity_down = new Button("Low grain"); speed_up = new Button("Speed up"); speed_down = new Button("Slow down"); Panel top = new Panel(); top.setLayout(new GridLayout(1, 6, 2, 2)); top.add(zoom_in_button); top.add(zoom_out_button); top.add(granularity_up); top.add(granularity_down); top.add(speed_up); top.add(speed_down); hertz_label = new Label(" "); hertz_label.setAlignment(Label.RIGHT); time_label = new Label(" "); time_label.setAlignment(Label.RIGHT); granularity_label = new Label(" "); granularity_label.setAlignment(Label.RIGHT); Label microsecond_text = new Label(" µs"); microsecond_text.setAlignment(Label.LEFT); Label hertz_text = new Label(" Hz"); hertz_text.setAlignment(Label.LEFT); Label granularity_text = new Label(" Grain"); granularity_text.setAlignment(Label.LEFT); Panel timePanel = new Panel(); Panel hertzPanel = new Panel(); Panel granularityPanel = new Panel(); timePanel.setLayout(new GridLayout(1, 2)); timePanel.add(time_label); timePanel.add(microsecond_text); hertzPanel.setLayout(new GridLayout(1, 2)); hertzPanel.add(hertz_label); hertzPanel.add(hertz_text); granularityPanel.setLayout(new GridLayout(1, 2)); granularityPanel.add(granularity_label); granularityPanel.add(granularity_text); Panel bottom = new Panel(); bottom.setLayout(new GridLayout(1, 3, 2, 2)); bottom.add(hertzPanel); bottom.add(timePanel); bottom.add(granularityPanel); this.setLayout(new BorderLayout()); this.add("North", top); this.add("South", bottom); granularity_label.setText(Integer.toString(owner.granularity())); } // ready new timing period public void startTimer() { start_time = System.currentTimeMillis(); } // finish old timing period public void stopTimer(int cycles) { total_cycles += cycles; long duration = System.currentTimeMillis() - start_time; // milliseconds int time_microseconds = (int) (total_cycles / (clock_speed / 1000000)); time_label.setText(Integer.toString(time_microseconds)); float speed_hertz = (float) (cycles * 1000) / (float) (duration); if (speed_hertz >= 1f) hertz_label.setText(Integer.toString((int) (speed_hertz + 0.5f)) + " (" + Integer.toString((int) owner.desiredHertz()) + ")"); else hertz_label.setText(Float.toString(speed_hertz) + " (" + Float.toString(owner.desiredHertz()) + ")"); } public boolean handleEvent(Event e) { if (e.id == Event.ACTION_EVENT) { if (e.target == zoom_out_button) { owner.rescale(-1); return true; } else if (e.target == zoom_in_button) { owner.rescale(1); return true; } else if (e.target == granularity_down) { owner.granularity(owner.granularity() - 1); granularity_label.setText(Integer.toString(owner.granularity())); return true; } else if (e.target == granularity_up) { owner.granularity(owner.granularity() + 1); granularity_label.setText(Integer.toString(owner.granularity())); return true; } else if (e.target == speed_up) { owner.desiredHertz(owner.desiredHertz() * 2); return true; } else if (e.target == speed_down) { owner.desiredHertz(owner.desiredHertz() / 2); return true; } } return false; } }