milliseconds -> microseconds update + more effective repainting using swing timers (avoid AWT event floods)

This commit is contained in:
fros4943 2009-05-26 14:27:00 +00:00
parent e5219e0d8b
commit 7985a9310b
5 changed files with 109 additions and 85 deletions

View File

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: LogListener.java,v 1.12 2008/10/03 14:30:51 fros4943 Exp $
* $Id: LogListener.java,v 1.13 2009/05/26 14:27:00 fros4943 Exp $
*/
package se.sics.cooja.plugins;
@ -88,7 +88,7 @@ public class LogListener extends VisPlugin {
if (lastMessage.length() > 0 && lastMessage.charAt(lastMessage.length() - 1) == '\n') {
lastMessage = lastMessage.substring(0, lastMessage.length() - 1);
}
String outputString = "TIME:" + simulation.getSimulationTime() + "\t";
String outputString = "TIME:" + simulation.getSimulationTimeMillis() + "\t";
if (mote != null && mote.getInterfaces().getMoteID() != null) {
outputString += "ID:" + mote.getInterfaces().getMoteID().getMoteID() + "\t";
}
@ -247,8 +247,8 @@ public class LogListener extends VisPlugin {
setTitle("Log Listener - Listening on " + nrLogs + " mote logs");
pack();
setSize(gui.getDesktopPane().getWidth(), getHeight());
setLocation(0, gui.getDesktopPane().getHeight() - getHeight());
setSize(gui.getDesktopPane().getWidth(), 150);
setLocation(0, gui.getDesktopPane().getHeight() - 300);
try {
setSelected(true);

View File

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: ScriptParser.java,v 1.4 2009/01/15 13:11:56 fros4943 Exp $
* $Id: ScriptParser.java,v 1.5 2009/05/26 14:27:00 fros4943 Exp $
*/
package se.sics.cooja.plugins;
@ -38,6 +38,8 @@ import javax.script.ScriptException;
import org.apache.log4j.Logger;
import se.sics.cooja.Simulation;
public class ScriptParser {
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(ScriptParser.class);
@ -130,7 +132,7 @@ public class ScriptParser {
throw new ScriptSyntaxErrorException("Only one timeout handler allowed");
}
timeoutTime = Long.parseLong(matcher.group(1));
timeoutTime = Long.parseLong(matcher.group(1))*Simulation.MILLISECOND;
timeoutCode = ";";
matcher.reset(code);
@ -161,7 +163,7 @@ public class ScriptParser {
throw new ScriptSyntaxErrorException("Only one timeout handler allowed");
}
timeoutTime = Long.parseLong(matcher.group(1));
timeoutTime = Long.parseLong(matcher.group(1))*Simulation.MILLISECOND;
timeoutCode = matcher.group(2);
matcher.reset(code);
@ -228,7 +230,7 @@ public class ScriptParser {
Matcher matcher = pattern.matcher(code);
while (matcher.find()) {
long time = Long.parseLong(matcher.group(1));
long time = Long.parseLong(matcher.group(1))*Simulation.MILLISECOND;
String msg = matcher.group(2);
code = matcher.replaceFirst(

View File

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: ScriptRunner.java,v 1.17 2009/04/23 08:54:10 fros4943 Exp $
* $Id: ScriptRunner.java,v 1.18 2009/05/26 14:27:00 fros4943 Exp $
*/
package se.sics.cooja.plugins;
@ -86,8 +86,8 @@ public class ScriptRunner implements Plugin {
" */\n" +
"\n" +
"/* Make test automatically fail (timeout) after 100 simulated seconds */\n" +
"//TIMEOUT(100000); /* no action at timeout */\n" +
"TIMEOUT(100000, log.log(\"last msg: \" + msg + \"\\n\")); /* print last msg at timeout */\n" +
"//TIMEOUT(100000); /* milliseconds. no action at timeout */\n" +
"TIMEOUT(100000, log.log(\"last msg: \" + msg + \"\\n\")); /* milliseconds. print last msg at timeout */\n" +
"\n" +
"log.log(\"first mote output: '\" + msg + \"'\\n\");\n" +
"\n" +

View File

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: SimControl.java,v 1.13 2009/04/23 08:48:01 fros4943 Exp $
* $Id: SimControl.java,v 1.14 2009/05/26 14:27:00 fros4943 Exp $
*/
package se.sics.cooja.plugins;
@ -38,6 +38,7 @@ import java.beans.PropertyChangeListener;
import java.text.NumberFormat;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;
import javax.swing.event.*;
import org.apache.log4j.Logger;
@ -59,16 +60,14 @@ public class SimControl extends VisPlugin {
private static final int SLIDE_MAX = 921; // e^9.21 => ~10000
private static final int TIME_MAX = 10000;
private static final int LABEL_UPDATE_INTERVAL = 100;
private JSlider sliderDelay;
private JLabel simulationTime, delayLabel;
private JButton startButton, stopButton;
private JFormattedTextField stopTimeTextField;
private int simulationStopTime = -1;
private Observer simObserver;
private Observer tickObserver;
private long lastTextUpdateTime = -1;
/**
* Create a new simulation control panel.
@ -83,55 +82,42 @@ public class SimControl extends VisPlugin {
JButton button;
JPanel smallPanel;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// Register as tickobserver
simulation.addTickObserver(tickObserver = new Observer() {
public void update(Observable obs, Object obj) {
if (simulation == null || simulationTime == null) {
return;
}
/* Update current time label when simulation is running */
if (simulation.isRunning()) {
updateLabelTimer.start();
}
// During simulation running, only update text 10 times each second
if (lastTextUpdateTime < System.currentTimeMillis() - 100) {
lastTextUpdateTime = System.currentTimeMillis();
simulationTime.setText("Current simulation time: " + simulation.getSimulationTime());
}
if (simulationStopTime > 0 && simulationStopTime <= simulation.getSimulationTime() && simulation.isRunning()) {
// Time to stop simulation now
simulation.stopSimulation();
simulationStopTime = -1;
stopTimeTextField.setValue(simulation.getSimulationTime());
}
/* Observe current simulation */
simulation.addObserver(simObserver = new Observer() {
public void update(Observable obs, Object obj) {
if (simulation.isRunning()) {
startButton.setEnabled(false);
stopButton.setEnabled(true);
/* Start label update timer */
if (!updateLabelTimer.isRunning()) {
updateLabelTimer.start();
}
});
} else {
startButton.setEnabled(true);
stopButton.setEnabled(false);
// Register as simulation observer
simulation.addObserver(simObserver = new Observer() {
public void update(Observable obs, Object obj) {
if (simulation.isRunning()) {
startButton.setEnabled(false);
stopButton.setEnabled(true);
} else {
startButton.setEnabled(true);
stopButton.setEnabled(false);
/* Update simulation stop text field */
if (!stopEvent.isScheduled()) {
stopTimeTextField.setValue(simulation.getSimulationTimeMillis());
}
}
if (simulationStopTime < 0) {
stopTimeTextField.setValue(simulation.getSimulationTime());
}
}
if (sliderDelay != null) {
sliderDelay.setValue(convertTimeToSlide(simulation.getDelayTime()));
simulationTime.setText("Current simulation time: " + simulation.getSimulationTime());
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
sliderDelay.setValue(convertTimeToSlide(simulation.getDelayTime()));
simulationTime.setText("Current simulation time: " + simulation.getSimulationTimeMillis());
simulationTime.setToolTipText("Simulation time in microseconds: " + simulation.getSimulationTime());
}
});
}
});
// Main panel
JPanel controlPanel = new JPanel();
controlPanel.setLayout(new BoxLayout(controlPanel, BoxLayout.Y_AXIS));
@ -177,20 +163,26 @@ public class SimControl extends VisPlugin {
stopTimeTextField = new JFormattedTextField(integerFormat);
stopTimeTextField.addPropertyChangeListener("value", new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
/* Remove already scheduled stop event */
if (stopEvent.isScheduled()) {
stopEvent.remove();
}
JFormattedTextField numberTextField = (JFormattedTextField) e.getSource();
int untilTime = ((Number) numberTextField.getValue()).intValue();
if (untilTime <= simulation.getSimulationTime()) {
long stopTime = ((Number) numberTextField.getValue()).intValue()*Simulation.MILLISECOND;
if (stopTime <= simulation.getSimulationTime()) {
/* No simulation stop scheduled */
numberTextField.setBackground(Color.LIGHT_GRAY);
numberTextField.setToolTipText("Enter future simulation time");
simulationStopTime = -1;
} else {
/* Schedule simulation stop */
numberTextField.setBackground(Color.WHITE);
numberTextField.setToolTipText("Simulation will stop at time: " + untilTime);
simulationStopTime = untilTime;
numberTextField.setToolTipText("Simulation will stop at time (us): " + stopTime);
simulation.scheduleEvent(stopEvent, stopTime);
}
}
});
stopTimeTextField.setValue(simulation.getSimulationTime());
stopTimeTextField.setValue(simulation.getSimulationTimeMillis());
stopTimeTextField.setSize(100, stopTimeTextField.getHeight());
smallPanel.add(stopTimeTextField);
@ -204,7 +196,7 @@ public class SimControl extends VisPlugin {
smallPanel.setLayout(new BoxLayout(smallPanel, BoxLayout.X_AXIS));
smallPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 0, 5));
label = new JLabel("Current simulation time: " + simulation.getSimulationTime());
label = new JLabel("Current simulation time: " + simulation.getSimulationTimeMillis());
smallPanel.add(label);
simulationTime = label;
@ -296,7 +288,7 @@ public class SimControl extends VisPlugin {
simulation.stopSimulation();
}
} else if (e.getActionCommand().equals("single_ms")) {
simulation.tickSimulation();
simulation.stepMillisecondSimulation();
} else {
logger.debug("Unhandled action: " + e.getActionCommand());
}
@ -304,14 +296,35 @@ public class SimControl extends VisPlugin {
} MyEventHandler myEventHandler = new MyEventHandler();
public void closePlugin() {
// Remove log observer from all log interfaces
/* Remove simulation observer */
if (simObserver != null) {
simulation.deleteObserver(simObserver);
}
if (tickObserver != null) {
simulation.deleteTickObserver(tickObserver);
/* Remove stop event */
if (stopEvent.isScheduled()) {
stopEvent.remove();
}
/* Remove label update timer */
updateLabelTimer.stop();
}
private TimeEvent stopEvent = new TimeEvent(0) {
public void execute(long t) {
/* Stop simulation */
simulation.stopSimulation();
}
};
private Timer updateLabelTimer = new Timer(LABEL_UPDATE_INTERVAL, new ActionListener() {
public void actionPerformed(ActionEvent e) {
simulationTime.setText("Current simulation time: " + simulation.getSimulationTimeMillis());
/* Automatically stop if simulation is no longer running */
if (!simulation.isRunning()) {
updateLabelTimer.stop();
}
}
});
}

View File

@ -26,14 +26,17 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: SimInformation.java,v 1.5 2009/03/10 21:20:30 fros4943 Exp $
* $Id: SimInformation.java,v 1.6 2009/05/26 14:27:00 fros4943 Exp $
*/
package se.sics.cooja.plugins;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;
import se.sics.cooja.*;
@ -45,9 +48,10 @@ import se.sics.cooja.*;
@ClassDescription("Simulation Information")
@PluginType(PluginType.SIM_PLUGIN)
public class SimInformation extends VisPlugin {
private static final long serialVersionUID = 1L;
private Simulation simulation;
private static final int LABEL_UPDATE_INTERVAL = 100;
private final static int LABEL_WIDTH = 170;
private final static int LABEL_HEIGHT = 15;
@ -57,7 +61,6 @@ public class SimInformation extends VisPlugin {
private JLabel labelNrMoteTypes;
private Observer simObserver;
private Observer tickObserver;
/**
* Create a new simulation information window.
@ -112,7 +115,7 @@ public class SimInformation extends VisPlugin {
smallPane.add(Box.createHorizontalGlue());
label = new JLabel();
label.setText("" + simulation.getSimulationTime());
label.setText("" + simulation.getSimulationTimeMillis());
labelSimTime = label;
smallPane.add(label);
@ -199,24 +202,20 @@ public class SimInformation extends VisPlugin {
}
if (simulation.isRunning()) {
labelStatus.setText("RUNNING");
updateLabelTimer.start();
} else {
labelStatus.setText("STOPPED");
}
labelNrMotes.setText("" + simulation.getMotesCount());
labelNrMoteTypes.setText("" + simulation.getMoteTypes().length);
}
});
// Register as tick observer
simulation.addTickObserver(tickObserver = new Observer() {
public void update(Observable obs, Object obj) {
if (labelSimTime != null) {
labelSimTime.setText("" + simulation.getSimulationTime());
}
}
});
/* Update current time label when simulation is running */
if (simulation.isRunning()) {
updateLabelTimer.start();
}
try {
setSelected(true);
} catch (java.beans.PropertyVetoException e) {
@ -231,9 +230,19 @@ public class SimInformation extends VisPlugin {
simulation.deleteObserver(simObserver);
}
if (tickObserver != null) {
simulation.deleteTickObserver(tickObserver);
}
/* Remove label update timer */
updateLabelTimer.stop();
}
private Timer updateLabelTimer = new Timer(LABEL_UPDATE_INTERVAL, new ActionListener() {
public void actionPerformed(ActionEvent e) {
labelSimTime.setText("" + simulation.getSimulationTimeMillis());
/* Automatically stop if simulation is no longer running */
if (!simulation.isRunning()) {
updateLabelTimer.stop();
}
}
});
}