removed unused code including simulation observers, making the code cleaner and more efficient

This commit is contained in:
Fredrik Osterlind 2012-06-05 09:25:45 +02:00
parent 4a4efd0c32
commit c276f90247

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2009, Swedish Institute of Computer Science. * Copyright (c) 2012, Swedish Institute of Computer Science.
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -25,8 +25,6 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
*
* $Id: TrafficVisualizerSkin.java,v 1.5 2010/02/26 07:46:26 nifi Exp $
*/ */
package se.sics.cooja.plugins.skins; package se.sics.cooja.plugins.skins;
@ -35,168 +33,115 @@ import java.awt.Color;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.Point; import java.awt.Point;
import java.awt.Polygon; import java.awt.Polygon;
import java.util.ArrayDeque; import java.util.ArrayList;
import java.util.Observable; import java.util.Observable;
import java.util.Observer; import java.util.Observer;
import javax.swing.Box;
import javax.swing.JLabel;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import se.sics.cooja.ClassDescription; import se.sics.cooja.ClassDescription;
import se.sics.cooja.Mote; import se.sics.cooja.Mote;
import se.sics.cooja.RadioConnection; import se.sics.cooja.RadioConnection;
import se.sics.cooja.Simulation; import se.sics.cooja.Simulation;
import se.sics.cooja.SimEventCentral.MoteCountListener; import se.sics.cooja.SupportedArguments;
import se.sics.cooja.TimeEvent;
import se.sics.cooja.interfaces.Position; import se.sics.cooja.interfaces.Position;
import se.sics.cooja.interfaces.Radio; import se.sics.cooja.interfaces.Radio;
import se.sics.cooja.plugins.Visualizer; import se.sics.cooja.plugins.Visualizer;
import se.sics.cooja.plugins.VisualizerSkin; import se.sics.cooja.plugins.VisualizerSkin;
import se.sics.cooja.plugins.Visualizer.SimulationMenuAction;
import se.sics.cooja.radiomediums.AbstractRadioMedium; import se.sics.cooja.radiomediums.AbstractRadioMedium;
/** /**
* Radio traffic visualizer skin. * Radio traffic history visualizer skin.
* *
* Transmitting motes are painted blue. Receiving motes are painted green.
* Interfered motes are painted red. Motes without radios are painted gray. All
* other motes are painted white.
*
* In contrast to the {@link UDGMVisualizerSkin}, this skin listens to all mote
* radios, not to the radio medium. The radio traffic skin also displays a
* history.
*
* @see UDGMVisualizerSkin * @see UDGMVisualizerSkin
* @author Fredrik Osterlind * @author Fredrik Osterlind
*/ */
@ClassDescription("Radio traffic") @ClassDescription("Radio traffic")
@SupportedArguments(radioMediums = {AbstractRadioMedium.class})
public class TrafficVisualizerSkin implements VisualizerSkin { public class TrafficVisualizerSkin implements VisualizerSkin {
private static Logger logger = Logger.getLogger(TrafficVisualizerSkin.class); private static Logger logger = Logger.getLogger(TrafficVisualizerSkin.class);
private Simulation simulation = null;
private Visualizer visualizer = null;
private Box counters;
private final int MAX_HISTORY_SIZE = 200; private final int MAX_HISTORY_SIZE = 200;
private boolean showHistory = true;
private ArrayDeque<RadioConnectionArrow> history = new ArrayDeque<RadioConnectionArrow>();
private AbstractRadioMedium radioMedium; private boolean active = false;
private Observer radioObserver, radioMediumObserver; private Simulation simulation = null;
private Visualizer visualizer = null;
private AbstractRadioMedium radioMedium = null;
private ArrayList<RadioConnectionArrow> history = new ArrayList<RadioConnectionArrow>();
private Observer radioMediumObserver = new Observer() {
public void update(Observable obs, Object obj) {
RadioConnection last = radioMedium.getLastConnection();
if (last != null && history.size() < MAX_HISTORY_SIZE) {
history.add(new RadioConnectionArrow(last));
visualizer.repaint();
}
}
};
private TimeEvent ageArrowsTimeEvent = new TimeEvent(0) {
public void execute(long t) {
if (!active) {
return;
}
if (history.size() > 0) {
boolean hasOld = false;
/* Increase age */
for (RadioConnectionArrow connArrow : history) {
connArrow.increaseAge();
if(connArrow.getAge() >= connArrow.getMaxAge()) {
hasOld = true;
}
}
/* Remove too old arrows */
if (hasOld) {
RadioConnectionArrow[] historyArr = history.toArray(new RadioConnectionArrow[0]);
for (RadioConnectionArrow connArrow : historyArr) {
if(connArrow.getAge() >= connArrow.getMaxAge()) {
history.remove(connArrow);
}
}
}
visualizer.repaint();
}
/* Reschedule myself */
simulation.scheduleEvent(this, t + 100*Simulation.MILLISECOND);
}
};
public void setActive(final Simulation simulation, Visualizer vis) { public void setActive(final Simulation simulation, Visualizer vis) {
if (!(simulation.getRadioMedium() instanceof AbstractRadioMedium)) {
logger.fatal("Radio medium type not supported: "
+ simulation.getRadioMedium());
return;
}
this.radioMedium = (AbstractRadioMedium) simulation.getRadioMedium(); this.radioMedium = (AbstractRadioMedium) simulation.getRadioMedium();
this.simulation = simulation; this.simulation = simulation;
this.visualizer = vis; this.visualizer = vis;
this.active = true;
history.clear();
final JLabel txCounter = new JLabel("TX: " + radioMedium.COUNTER_TX); simulation.invokeSimulationThread(new Runnable() {
final JLabel rxCounter = new JLabel("RX: " + radioMedium.COUNTER_RX); public void run() {
final JLabel interferedCounter = new JLabel("INT: " /* Start observing radio medium for transmissions */
+ radioMedium.COUNTER_INTERFERED); radioMedium.addRadioMediumObserver(radioMediumObserver);
counters = Box.createHorizontalBox(); /* Fade away arrows */
counters.add(txCounter); simulation.scheduleEvent(ageArrowsTimeEvent, simulation.getSimulationTime() + 100*Simulation.MILLISECOND);
counters.add(Box.createHorizontalStrut(10));
counters.add(rxCounter);
counters.add(Box.createHorizontalStrut(10));
counters.add(interferedCounter);
/* visualizer.getCurrentCanvas().add(counters); */
/* Start observing radio medium and radios */
radioMedium.addRadioMediumObserver(radioMediumObserver = new Observer() {
public void update(Observable obs, Object obj) {
txCounter.setText("TX: " + radioMedium.COUNTER_TX);
rxCounter.setText("RX: " + radioMedium.COUNTER_RX);
interferedCounter.setText("INT: " + +radioMedium.COUNTER_INTERFERED);
if (showHistory) {
RadioConnection last = radioMedium.getLastConnection();
if (last != null && history.size() < MAX_HISTORY_SIZE) {
history.add(new RadioConnectionArrow(last));
}
}
visualizer.repaint();
} }
}); });
radioObserver = new Observer() {
public void update(Observable o, Object arg) {
visualizer.repaint();
}
};
simulation.getEventCentral().addMoteCountListener(new MoteCountListener() {
public void moteWasAdded(Mote mote) {
Radio r = mote.getInterfaces().getRadio();
if (r != null) {
r.addObserver(radioObserver);
}
}
public void moteWasRemoved(Mote mote) {
Radio r = mote.getInterfaces().getRadio();
if (r != null) {
r.deleteObserver(radioObserver);
}
history.clear();
}
});
for (Mote mote : simulation.getMotes()) {
Radio r = mote.getInterfaces().getRadio();
if (r != null) {
r.addObserver(radioObserver);
}
}
simulation.addMillisecondObserver(new Observer() {
public void update(Observable obs, Object obj) {
if((simulation.getSimulationTimeMillis() % 100) == 0) {
RadioConnectionArrow[] historyArr = history.toArray(new RadioConnectionArrow[0]);
if(historyArr.length > 0) {
visualizer.repaint();
}
for (RadioConnectionArrow connArrow : historyArr) {
if (connArrow == null) {
continue;
}
connArrow.increaseAge();
if(connArrow.getAge() >= connArrow.getMaxAge()) {
history.remove(connArrow);
}
}
}
}
});
/* Register menu actions */
visualizer.registerSimulationMenuAction(ToggleHistoryAction.class);
} }
public void setInactive() { public void setInactive() {
this.active = false;
if (simulation == null) { if (simulation == null) {
/* Skin was never activated */ /* Skin was never activated */
return; return;
} }
visualizer.getCurrentCanvas().remove(counters); /* Stop observing radio medium */
/* Stop observing radio medium and radios */
radioMedium.deleteRadioMediumObserver(radioMediumObserver); radioMedium.deleteRadioMediumObserver(radioMediumObserver);
for (Mote mote : simulation.getMotes()) {
Radio r = mote.getInterfaces().getRadio();
if (r != null) {
r.addObserver(radioObserver);
}
}
/* Unregister menu actions */
visualizer.unregisterSimulationMenuAction(ToggleHistoryAction.class);
} }
public Color[] getColorOf(Mote mote) { public Color[] getColorOf(Mote mote) {
@ -232,51 +177,18 @@ public class TrafficVisualizerSkin implements VisualizerSkin {
private int xCor(int len, double dir) { private int xCor(int len, double dir) {
return (int)(0.5 + len * Math.sin(dir)); return (int)(0.5 + len * Math.sin(dir));
} }
public void paintBeforeMotes(Graphics g) { public void paintBeforeMotes(Graphics g) {
if (simulation == null) { RadioConnectionArrow[] historyArr = history.toArray(new RadioConnectionArrow[0]);
/* Skin was never activated */ for (RadioConnectionArrow connArrow : historyArr) {
return; float colorHistoryIndex = (float)connArrow.getAge() / (float)connArrow.getMaxAge();
} g.setColor(new Color(colorHistoryIndex, colorHistoryIndex, 1.0f));
Radio source = connArrow.getConnection().getSource();
if (showHistory) { Point sourcePoint = visualizer.transformPositionToPixel(source.getPosition());
/* Paint history in gray */ for (Radio destRadio : connArrow.getConnection().getDestinations()) {
RadioConnectionArrow[] historyArr = history.toArray(new RadioConnectionArrow[0]); Position destPos = destRadio.getPosition();
for (RadioConnectionArrow connArrow : historyArr) { Point destPoint = visualizer.transformPositionToPixel(destPos);
if (connArrow == null) { drawArrow(g, sourcePoint.x, sourcePoint.y, destPoint.x, destPoint.y, 8);
continue;
}
float colorHistoryIndex = (float)connArrow.getAge() / (float)connArrow.getMaxAge();
g.setColor(new Color(colorHistoryIndex, colorHistoryIndex, 1.0f));
Radio source = connArrow.getConnection().getSource();
Point sourcePoint = visualizer.transformPositionToPixel(source
.getPosition());
for (Radio destRadio : connArrow.getConnection().getDestinations()) {
Position destPos = destRadio.getPosition();
Point destPoint = visualizer.transformPositionToPixel(destPos);
drawArrow(g, sourcePoint.x, sourcePoint.y, destPoint.x, destPoint.y, 8);
}
}
}
/* Paint active connections in black */
RadioConnection[] conns = radioMedium.getActiveConnections();
if (conns != null) {
g.setColor(Color.BLACK);
for (RadioConnection conn : conns) {
if (conn == null) {
continue;
}
Radio source = conn.getSource();
Point sourcePoint = visualizer.transformPositionToPixel(source
.getPosition());
for (Radio destRadio : conn.getDestinations()) {
if (destRadio == null) {
continue;
}
Position destPos = destRadio.getPosition();
Point destPoint = visualizer.transformPositionToPixel(destPos);
drawArrow(g, sourcePoint.x, sourcePoint.y, destPoint.x, destPoint.y, 8);
}
} }
} }
} }
@ -284,41 +196,11 @@ public class TrafficVisualizerSkin implements VisualizerSkin {
public void paintAfterMotes(Graphics g) { public void paintAfterMotes(Graphics g) {
} }
public static class ToggleHistoryAction implements SimulationMenuAction {
public boolean isEnabled(Visualizer visualizer, Simulation simulation) {
return true;
}
public String getDescription(Visualizer visualizer, Simulation simulation) {
VisualizerSkin[] skins = visualizer.getCurrentSkins();
boolean showing = false;
for (VisualizerSkin skin : skins) {
if (skin instanceof TrafficVisualizerSkin) {
showing = ((TrafficVisualizerSkin) skin).showHistory;
}
}
if (showing) {
return "Hide traffic history";
}
return "Show traffic history";
}
public void doAction(Visualizer visualizer, Simulation simulation) {
VisualizerSkin[] skins = visualizer.getCurrentSkins();
for (VisualizerSkin skin : skins) {
if (skin instanceof TrafficVisualizerSkin) {
((TrafficVisualizerSkin) skin).showHistory = !((TrafficVisualizerSkin) skin).showHistory;
visualizer.repaint();
}
}
}
};
public Visualizer getVisualizer() { public Visualizer getVisualizer() {
return visualizer; return visualizer;
} }
private class RadioConnectionArrow { private static class RadioConnectionArrow {
private RadioConnection conn; private RadioConnection conn;
private int age; private int age;
private final int MAX_AGE = 10; private final int MAX_AGE = 10;