[cooja] Reformatted Visualizer and skins code

This commit is contained in:
Enrico Joerns 2014-04-10 19:03:43 +02:00
parent ea979fa027
commit cef3c4079d
4 changed files with 399 additions and 321 deletions

View file

@ -26,7 +26,6 @@
* 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.
*/ */
package org.contikios.mrm; package org.contikios.mrm;
import java.awt.Color; import java.awt.Color;
@ -51,6 +50,7 @@ import org.contikios.mrm.ChannelModel.TxPair;
@ClassDescription("Radio environment (MRM)") @ClassDescription("Radio environment (MRM)")
@SupportedArguments(radioMediums = {MRM.class}) @SupportedArguments(radioMediums = {MRM.class})
public class MRMVisualizerSkin implements VisualizerSkin { public class MRMVisualizerSkin implements VisualizerSkin {
private static final Logger logger = Logger.getLogger(MRMVisualizerSkin.class); private static final Logger logger = Logger.getLogger(MRMVisualizerSkin.class);
private Simulation simulation = null; private Simulation simulation = null;
@ -77,7 +77,7 @@ public class MRMVisualizerSkin implements VisualizerSkin {
@Override @Override
public Color[] getColorOf(Mote mote) { public Color[] getColorOf(Mote mote) {
if (visualizer.getSelectedMotes().contains(mote)) { if (visualizer.getSelectedMotes().contains(mote)) {
return new Color[] { Color.CYAN }; return new Color[]{Color.CYAN};
} }
return null; return null;
} }
@ -128,6 +128,7 @@ public class MRMVisualizerSkin implements VisualizerSkin {
public Radio getFromRadio() { public Radio getFromRadio() {
return selectedMote.getInterfaces().getRadio(); return selectedMote.getInterfaces().getRadio();
} }
@Override @Override
public Radio getToRadio() { public Radio getToRadio() {
return dRadio; return dRadio;
@ -144,19 +145,19 @@ public class MRMVisualizerSkin implements VisualizerSkin {
continue; continue;
} }
edges++; edges++;
String msg = String.format("%1.1f%%, %1.2fdB", 100.0*prob, ss); String msg = String.format("%1.1f%%, %1.2fdB", 100.0 * prob, ss);
Point pixel = visualizer.transformPositionToPixel(d.getInterfaces().getPosition()); Point pixel = visualizer.transformPositionToPixel(d.getInterfaces().getPosition());
int msgWidth = fm.stringWidth(msg); int msgWidth = fm.stringWidth(msg);
g.setColor(new Color(1-(float)prob, (float)prob, 0.0f)); g.setColor(new Color(1 - (float) prob, (float) prob, 0.0f));
g.drawLine(x, y, pixel.x, pixel.y); g.drawLine(x, y, pixel.x, pixel.y);
g.setColor(Color.BLACK); g.setColor(Color.BLACK);
g.drawString(msg, pixel.x - msgWidth/2, pixel.y + 2*Visualizer.MOTE_RADIUS + 3); g.drawString(msg, pixel.x - msgWidth / 2, pixel.y + 2 * Visualizer.MOTE_RADIUS + 3);
} }
String msg = dests.length + " edges"; String msg = dests.length + " edges";
int msgWidth = fm.stringWidth(msg); int msgWidth = fm.stringWidth(msg);
g.setColor(Color.BLACK); g.setColor(Color.BLACK);
g.drawString(msg, x - msgWidth/2, y + 2*Visualizer.MOTE_RADIUS + 3); g.drawString(msg, x - msgWidth / 2, y + 2 * Visualizer.MOTE_RADIUS + 3);
} }
} }

View file

@ -27,7 +27,6 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
*/ */
package org.contikios.cooja.plugins; package org.contikios.cooja.plugins;
import java.awt.BasicStroke; import java.awt.BasicStroke;
@ -139,11 +138,12 @@ import org.contikios.cooja.plugins.skins.UDGMVisualizerSkin;
@ClassDescription("Network") @ClassDescription("Network")
@PluginType(PluginType.SIM_STANDARD_PLUGIN) @PluginType(PluginType.SIM_STANDARD_PLUGIN)
public class Visualizer extends VisPlugin implements HasQuickHelp { public class Visualizer extends VisPlugin implements HasQuickHelp {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(Visualizer.class); private static final Logger logger = Logger.getLogger(Visualizer.class);
public static final int MOTE_RADIUS = 8; public static final int MOTE_RADIUS = 8;
private static final Color[] DEFAULT_MOTE_COLORS = { Color.WHITE }; private static final Color[] DEFAULT_MOTE_COLORS = {Color.WHITE};
private Cooja gui = null; private Cooja gui = null;
private Simulation simulation = null; private Simulation simulation = null;
@ -186,8 +186,9 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
private Selection selection; private Selection selection;
/* Visualizers */ /* Visualizers */
private static final ArrayList<Class<? extends VisualizerSkin>> visualizerSkins = private static final ArrayList<Class<? extends VisualizerSkin>> visualizerSkins
new ArrayList<>(); = new ArrayList<>();
static { static {
/* Register default visualizer skins */ /* Register default visualizer skins */
registerVisualizerSkin(IDVisualizerSkin.class); registerVisualizerSkin(IDVisualizerSkin.class);
@ -213,20 +214,27 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
/* Popup menu */ /* Popup menu */
public static interface SimulationMenuAction { public static interface SimulationMenuAction {
public boolean isEnabled(Visualizer visualizer, Simulation simulation); public boolean isEnabled(Visualizer visualizer, Simulation simulation);
public String getDescription(Visualizer visualizer, Simulation simulation); public String getDescription(Visualizer visualizer, Simulation simulation);
public void doAction(Visualizer visualizer, Simulation simulation); public void doAction(Visualizer visualizer, Simulation simulation);
} }
public static interface MoteMenuAction { public static interface MoteMenuAction {
public boolean isEnabled(Visualizer visualizer, Mote mote); public boolean isEnabled(Visualizer visualizer, Mote mote);
public String getDescription(Visualizer visualizer, Mote mote); public String getDescription(Visualizer visualizer, Mote mote);
public void doAction(Visualizer visualizer, Mote mote); public void doAction(Visualizer visualizer, Mote mote);
} }
private ArrayList<Class<? extends SimulationMenuAction>> simulationMenuActions = private ArrayList<Class<? extends SimulationMenuAction>> simulationMenuActions
new ArrayList<>(); = new ArrayList<>();
private ArrayList<Class<? extends MoteMenuAction>> moteMenuActions = private ArrayList<Class<? extends MoteMenuAction>> moteMenuActions
new ArrayList<>(); = new ArrayList<>();
public Visualizer(Simulation simulation, Cooja gui) { public Visualizer(Simulation simulation, Cooja gui) {
super("Network", gui); super("Network", gui);
@ -236,7 +244,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
/* Register external visualizers */ /* Register external visualizers */
String[] skins = gui.getProjectConfig().getStringArrayValue(Visualizer.class, "SKINS"); String[] skins = gui.getProjectConfig().getStringArrayValue(Visualizer.class, "SKINS");
for (String skinClass: skins) { for (String skinClass : skins) {
Class<? extends VisualizerSkin> skin = gui.tryLoadClass(this, VisualizerSkin.class, skinClass); Class<? extends VisualizerSkin> skin = gui.tryLoadClass(this, VisualizerSkin.class, skinClass);
if (registerVisualizerSkin(skin)) { if (registerVisualizerSkin(skin)) {
logger.info("Registered external visualizer: " + skinClass); logger.info("Registered external visualizer: " + skinClass);
@ -254,9 +262,11 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
viewMenu.removeAll(); viewMenu.removeAll();
populateSkinMenu(viewMenu); populateSkinMenu(viewMenu);
} }
@Override @Override
public void menuDeselected(MenuEvent e) { public void menuDeselected(MenuEvent e) {
} }
@Override @Override
public void menuCanceled(MenuEvent e) { public void menuCanceled(MenuEvent e) {
} }
@ -308,6 +318,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
/* Main canvas */ /* Main canvas */
canvas = new JPanel() { canvas = new JPanel() {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@Override @Override
public void paintComponent(Graphics g) { public void paintComponent(Graphics g) {
super.paintComponent(g); super.paintComponent(g);
@ -317,12 +328,12 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
resetViewport--; resetViewport--;
} }
((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
for (VisualizerSkin skin: currentSkins) { for (VisualizerSkin skin : currentSkins) {
skin.paintBeforeMotes(g); skin.paintBeforeMotes(g);
} }
paintMotes(g); paintMotes(g);
for (VisualizerSkin skin: currentSkins) { for (VisualizerSkin skin : currentSkins) {
skin.paintAfterMotes(g); skin.paintAfterMotes(g);
} }
selection.drawSelection(g); selection.drawSelection(g);
@ -355,6 +366,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
}); });
} }
} }
@Override @Override
public void moteWasRemoved(Mote mote) { public void moteWasRemoved(Mote mote) {
Position pos = mote.getInterfaces().getPosition(); Position pos = mote.getInterfaces().getPosition();
@ -364,7 +376,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
} }
} }
}); });
for (Mote mote: simulation.getMotes()) { for (Mote mote : simulation.getMotes()) {
Position pos = mote.getInterfaces().getPosition(); Position pos = mote.getInterfaces().getPosition();
if (pos != null) { if (pos != null) {
pos.addObserver(posObserver); pos.addObserver(posObserver);
@ -395,10 +407,11 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
/* Toggle highlight state */ /* Toggle highlight state */
if (highlightedMotes.contains(mote)) { if (highlightedMotes.contains(mote)) {
highlightedMotes.remove(mote); highlightedMotes.remove(mote);
} else { }
else {
highlightedMotes.add(mote); highlightedMotes.add(mote);
} }
timer.setDelay(timer.getDelay()-1); timer.setDelay(timer.getDelay() - 1);
repaint(); repaint();
} }
}); });
@ -429,10 +442,11 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
return; return;
} }
if (SwingUtilities.isLeftMouseButton(e)){ if (SwingUtilities.isLeftMouseButton(e)) {
handleMousePress(e); handleMousePress(e);
} }
} }
@Override @Override
public void mouseReleased(MouseEvent e) { public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger()) { if (e.isPopupTrigger()) {
@ -454,7 +468,8 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
if (rot > 0) { if (rot > 0) {
zoomToFactor(zoomFactor() / 1.2, new Point(x, y)); zoomToFactor(zoomFactor() / 1.2, new Point(x, y));
} else { }
else {
zoomToFactor(zoomFactor() * 1.2, new Point(x, y)); zoomToFactor(zoomFactor() * 1.2, new Point(x, y));
} }
@ -478,29 +493,36 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
public void dragEnter(DropTargetDragEvent dtde) { public void dragEnter(DropTargetDragEvent dtde) {
if (acceptOrRejectDrag(dtde)) { if (acceptOrRejectDrag(dtde)) {
dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE); dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
} else { }
else {
dtde.rejectDrag(); dtde.rejectDrag();
} }
} }
@Override @Override
public void dragExit(DropTargetEvent dte) { public void dragExit(DropTargetEvent dte) {
} }
@Override @Override
public void dropActionChanged(DropTargetDragEvent dtde) { public void dropActionChanged(DropTargetDragEvent dtde) {
if (acceptOrRejectDrag(dtde)) { if (acceptOrRejectDrag(dtde)) {
dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE); dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
} else { }
else {
dtde.rejectDrag(); dtde.rejectDrag();
} }
} }
@Override @Override
public void dragOver(DropTargetDragEvent dtde) { public void dragOver(DropTargetDragEvent dtde) {
if (acceptOrRejectDrag(dtde)) { if (acceptOrRejectDrag(dtde)) {
dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE); dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
} else { }
else {
dtde.rejectDrag(); dtde.rejectDrag();
} }
} }
@Override @Override
public void drop(DropTargetDropEvent dtde) { public void drop(DropTargetDropEvent dtde) {
Transferable transferable = dtde.getTransferable(); Transferable transferable = dtde.getTransferable();
@ -537,6 +559,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
handleDropFile(file, dtde.getLocation()); handleDropFile(file, dtde.getLocation());
} }
private boolean acceptOrRejectDrag(DropTargetDragEvent dtde) { private boolean acceptOrRejectDrag(DropTargetDragEvent dtde) {
Transferable transferable = dtde.getTransferable(); Transferable transferable = dtde.getTransferable();
@ -564,7 +587,8 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
return false; return false;
} }
file = list.get(0); file = list.get(0);
} catch (UnsupportedFlavorException | IOException e) { }
catch (UnsupportedFlavorException | IOException e) {
return false; return false;
} }
@ -584,7 +608,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
} }
private void generateAndActivateSkin(Class<? extends VisualizerSkin> skinClass) { private void generateAndActivateSkin(Class<? extends VisualizerSkin> skinClass) {
for (VisualizerSkin skin: currentSkins) { for (VisualizerSkin skin : currentSkins) {
if (skinClass == skin.getClass()) { if (skinClass == skin.getClass()) {
logger.warn("Selected visualizer already active: " + skinClass); logger.warn("Selected visualizer already active: " + skinClass);
return; return;
@ -601,7 +625,8 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
VisualizerSkin newSkin = skinClass.newInstance(); VisualizerSkin newSkin = skinClass.newInstance();
newSkin.setActive(Visualizer.this.simulation, Visualizer.this); newSkin.setActive(Visualizer.this.simulation, Visualizer.this);
currentSkins.add(0, newSkin); currentSkins.add(0, newSkin);
} catch (InstantiationException | IllegalAccessException e1) { }
catch (InstantiationException | IllegalAccessException e1) {
e1.printStackTrace(); e1.printStackTrace();
} }
repaint(); repaint();
@ -616,12 +641,12 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
/* Activate default skins */ /* Activate default skins */
String[] defaultSkins = Cooja.getExternalToolsSetting("VISUALIZER_DEFAULT_SKINS", "").split(";"); String[] defaultSkins = Cooja.getExternalToolsSetting("VISUALIZER_DEFAULT_SKINS", "").split(";");
for (String skin: defaultSkins) { for (String skin : defaultSkins) {
if (skin.isEmpty()) { if (skin.isEmpty()) {
continue; continue;
} }
Class<? extends VisualizerSkin> skinClass = Class<? extends VisualizerSkin> skinClass
simulation.getCooja().tryLoadClass(this, VisualizerSkin.class, skin); = simulation.getCooja().tryLoadClass(this, VisualizerSkin.class, skin);
generateAndActivateSkin(skinClass); generateAndActivateSkin(skinClass);
} }
} }
@ -690,7 +715,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
/* Add registered mote actions */ /* Add registered mote actions */
for (final Mote mote : motes) { for (final Mote mote : motes) {
menu.add(simulation.getCooja().createMotePluginsSubmenu(mote)); menu.add(simulation.getCooja().createMotePluginsSubmenu(mote));
for (Class<? extends MoteMenuAction> menuActionClass: moteMenuActions) { for (Class<? extends MoteMenuAction> menuActionClass : moteMenuActions) {
try { try {
final MoteMenuAction menuAction = menuActionClass.newInstance(); final MoteMenuAction menuAction = menuActionClass.newInstance();
if (menuAction.isEnabled(this, mote)) { if (menuAction.isEnabled(this, mote)) {
@ -703,7 +728,8 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
}); });
menu.add(menuItem); menu.add(menuItem);
} }
} catch (InstantiationException | IllegalAccessException e1) { }
catch (InstantiationException | IllegalAccessException e1) {
logger.fatal("Error: " + e1.getMessage(), e1); logger.fatal("Error: " + e1.getMessage(), e1);
} }
} }
@ -725,7 +751,8 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
}); });
menu.add(menuItem); menu.add(menuItem);
} }
} catch (InstantiationException | IllegalAccessException e1) { }
catch (InstantiationException | IllegalAccessException e1) {
logger.fatal("Error: " + e1.getMessage(), e1); logger.fatal("Error: " + e1.getMessage(), e1);
} }
} }
@ -748,27 +775,28 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
} }
private boolean showMoteToMoteRelations = true; private boolean showMoteToMoteRelations = true;
private void populateSkinMenu(MenuElement menu) { private void populateSkinMenu(MenuElement menu) {
/* Mote-to-mote relations */ /* Mote-to-mote relations */
JCheckBoxMenuItem moteRelationsItem = new JCheckBoxMenuItem("Mote relations", showMoteToMoteRelations); JCheckBoxMenuItem moteRelationsItem = new JCheckBoxMenuItem("Mote relations", showMoteToMoteRelations);
moteRelationsItem.addItemListener(new ItemListener() { moteRelationsItem.addItemListener(new ItemListener() {
@Override @Override
public void itemStateChanged(ItemEvent e) { public void itemStateChanged(ItemEvent e) {
JCheckBoxMenuItem menuItem = ((JCheckBoxMenuItem)e.getItem()); JCheckBoxMenuItem menuItem = ((JCheckBoxMenuItem) e.getItem());
showMoteToMoteRelations = menuItem.isSelected(); showMoteToMoteRelations = menuItem.isSelected();
repaint(); repaint();
} }
}); });
if (menu instanceof JMenu) { if (menu instanceof JMenu) {
((JMenu)menu).add(moteRelationsItem); ((JMenu) menu).add(moteRelationsItem);
((JMenu)menu).add(new JSeparator()); ((JMenu) menu).add(new JSeparator());
} }
if (menu instanceof JPopupMenu) { if (menu instanceof JPopupMenu) {
((JPopupMenu)menu).add(moteRelationsItem); ((JPopupMenu) menu).add(moteRelationsItem);
((JPopupMenu)menu).add(new JSeparator()); ((JPopupMenu) menu).add(new JSeparator());
} }
for (Class<? extends VisualizerSkin> skinClass: visualizerSkins) { for (Class<? extends VisualizerSkin> skinClass : visualizerSkins) {
/* Should skin be enabled in this simulation? */ /* Should skin be enabled in this simulation? */
if (!isSkinCompatible(skinClass)) { if (!isSkinCompatible(skinClass)) {
continue; continue;
@ -779,7 +807,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
item.putClientProperty("skinclass", skinClass); item.putClientProperty("skinclass", skinClass);
/* Select skin if active */ /* Select skin if active */
for (VisualizerSkin skin: currentSkins) { for (VisualizerSkin skin : currentSkins) {
if (skin.getClass() == skinClass) { if (skin.getClass() == skinClass) {
item.setSelected(true); item.setSelected(true);
break; break;
@ -789,14 +817,14 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
item.addItemListener(new ItemListener() { item.addItemListener(new ItemListener() {
@Override @Override
public void itemStateChanged(ItemEvent e) { public void itemStateChanged(ItemEvent e) {
JCheckBoxMenuItem menuItem = ((JCheckBoxMenuItem)e.getItem()); JCheckBoxMenuItem menuItem = ((JCheckBoxMenuItem) e.getItem());
if (menuItem == null) { if (menuItem == null) {
logger.fatal("No menu item"); logger.fatal("No menu item");
return; return;
} }
Class<VisualizerSkin> skinClass = Class<VisualizerSkin> skinClass
(Class<VisualizerSkin>) menuItem.getClientProperty("skinclass"); = (Class<VisualizerSkin>) menuItem.getClientProperty("skinclass");
if (skinClass == null) { if (skinClass == null) {
logger.fatal("Unknown visualizer skin class: " + skinClass); logger.fatal("Unknown visualizer skin class: " + skinClass);
return; return;
@ -805,10 +833,11 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
if (menuItem.isSelected()) { if (menuItem.isSelected()) {
/* Create and activate new skin */ /* Create and activate new skin */
generateAndActivateSkin(skinClass); generateAndActivateSkin(skinClass);
} else { }
else {
/* Deactivate skin */ /* Deactivate skin */
VisualizerSkin skinToDeactivate = null; VisualizerSkin skinToDeactivate = null;
for (VisualizerSkin skin: currentSkins) { for (VisualizerSkin skin : currentSkins) {
if (skin.getClass() == skinClass) { if (skin.getClass() == skinClass) {
skinToDeactivate = skin; skinToDeactivate = skin;
break; break;
@ -826,10 +855,10 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
}); });
if (menu instanceof JMenu) { if (menu instanceof JMenu) {
((JMenu)menu).add(item); ((JMenu) menu).add(item);
} }
if (menu instanceof JPopupMenu) { if (menu instanceof JPopupMenu) {
((JPopupMenu)menu).add(item); ((JPopupMenu) menu).add(item);
} }
} }
} }
@ -844,7 +873,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
if (skinClass.getAnnotation(SupportedArguments.class) != null) { if (skinClass.getAnnotation(SupportedArguments.class) != null) {
showMenuItem = false; showMenuItem = false;
Class<? extends RadioMedium>[] radioMediums = skinClass.getAnnotation(SupportedArguments.class).radioMediums(); Class<? extends RadioMedium>[] radioMediums = skinClass.getAnnotation(SupportedArguments.class).radioMediums();
for (Class<? extends Object> o: radioMediums) { for (Class<? extends Object> o : radioMediums) {
if (o.isAssignableFrom(simulation.getRadioMedium().getClass())) { if (o.isAssignableFrom(simulation.getRadioMedium().getClass())) {
showMenuItem = true; showMenuItem = true;
break; break;
@ -1014,7 +1043,8 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
private void beginMoveRequest(Mote motesToMove, boolean withTiming, boolean confirm) { private void beginMoveRequest(Mote motesToMove, boolean withTiming, boolean confirm) {
if (withTiming) { if (withTiming) {
moveStartTime = System.currentTimeMillis(); moveStartTime = System.currentTimeMillis();
} else { }
else {
moveStartTime = -1; moveStartTime = -1;
} }
mouseActionState = MotesActionState.DEFAULT_PRESS; mouseActionState = MotesActionState.DEFAULT_PRESS;
@ -1028,7 +1058,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
} }
private void zoomToFactor(double newZoom) { private void zoomToFactor(double newZoom) {
zoomToFactor(newZoom, new Point(canvas.getWidth()/2, canvas.getHeight()/2)); zoomToFactor(newZoom, new Point(canvas.getWidth() / 2, canvas.getHeight() / 2));
} }
private void zoomToFactor(double newZoom, Point zoomCenter) { private void zoomToFactor(double newZoom, Point zoomCenter) {
@ -1121,7 +1151,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
/* Paint mote relations */ /* Paint mote relations */
if (showMoteToMoteRelations) { if (showMoteToMoteRelations) {
MoteRelation[] relations = simulation.getCooja().getMoteRelations(); MoteRelation[] relations = simulation.getCooja().getMoteRelations();
for (MoteRelation r: relations) { for (MoteRelation r : relations) {
Position sourcePos = r.source.getInterfaces().getPosition(); Position sourcePos = r.source.getInterfaces().getPosition();
Position destPos = r.dest.getInterfaces().getPosition(); Position destPos = r.dest.getInterfaces().getPosition();
@ -1133,11 +1163,11 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
} }
} }
for (Mote mote: allMotes) { for (Mote mote : allMotes) {
/* Use the first skin's non-null mote colors */ /* Use the first skin's non-null mote colors */
Color moteColors[] = null; Color moteColors[] = null;
for (VisualizerSkin skin: currentSkins) { for (VisualizerSkin skin : currentSkins) {
moteColors = skin.getColorOf(mote); moteColors = skin.getColorOf(mote);
if (moteColors != null) { if (moteColors != null) {
break; break;
@ -1157,11 +1187,13 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
g.setColor(MOVE_COLOR); g.setColor(MOVE_COLOR);
g.fillOval(x - MOTE_RADIUS, y - MOTE_RADIUS, 2 * MOTE_RADIUS, g.fillOval(x - MOTE_RADIUS, y - MOTE_RADIUS, 2 * MOTE_RADIUS,
2 * MOTE_RADIUS); 2 * MOTE_RADIUS);
} else if (!highlightedMotes.isEmpty() && highlightedMotes.contains(mote)) { }
else if (!highlightedMotes.isEmpty() && highlightedMotes.contains(mote)) {
g.setColor(HIGHLIGHT_COLOR); g.setColor(HIGHLIGHT_COLOR);
g.fillOval(x - MOTE_RADIUS, y - MOTE_RADIUS, 2 * MOTE_RADIUS, g.fillOval(x - MOTE_RADIUS, y - MOTE_RADIUS, 2 * MOTE_RADIUS,
2 * MOTE_RADIUS); 2 * MOTE_RADIUS);
} else if (moteColors.length >= 2) { }
else if (moteColors.length >= 2) {
g.setColor(moteColors[0]); g.setColor(moteColors[0]);
g.fillOval(x - MOTE_RADIUS, y - MOTE_RADIUS, 2 * MOTE_RADIUS, g.fillOval(x - MOTE_RADIUS, y - MOTE_RADIUS, 2 * MOTE_RADIUS,
2 * MOTE_RADIUS); 2 * MOTE_RADIUS);
@ -1170,7 +1202,8 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
g.fillOval(x - MOTE_RADIUS / 2, y - MOTE_RADIUS / 2, MOTE_RADIUS, g.fillOval(x - MOTE_RADIUS / 2, y - MOTE_RADIUS / 2, MOTE_RADIUS,
MOTE_RADIUS); MOTE_RADIUS);
} else if (moteColors.length >= 1) { }
else if (moteColors.length >= 1) {
g.setColor(moteColors[0]); g.setColor(moteColors[0]);
g.fillOval(x - MOTE_RADIUS, y - MOTE_RADIUS, 2 * MOTE_RADIUS, g.fillOval(x - MOTE_RADIUS, y - MOTE_RADIUS, 2 * MOTE_RADIUS,
2 * MOTE_RADIUS); 2 * MOTE_RADIUS);
@ -1183,6 +1216,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
} }
private Polygon arrowPoly = new Polygon(); private Polygon arrowPoly = new Polygon();
private void drawArrow(Graphics g, int xSource, int ySource, int xDest, int yDest, int delta) { private void drawArrow(Graphics g, int xSource, int ySource, int xDest, int yDest, int delta) {
double dx = xSource - xDest; double dx = xSource - xDest;
double dy = ySource - yDest; double dy = ySource - yDest;
@ -1205,11 +1239,11 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
} }
private int yCor(int len, double dir) { private int yCor(int len, double dir) {
return (int)(0.5 + len * Math.cos(dir)); return (int) (0.5 + len * Math.cos(dir));
} }
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));
} }
/** /**
@ -1234,7 +1268,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
} }
/* Extremes */ /* Extremes */
for (Mote mote: motes) { for (Mote mote : motes) {
Position pos = mote.getInterfaces().getPosition(); Position pos = mote.getInterfaces().getPosition();
smallX = Math.min(smallX, pos.getXCoordinate()); smallX = Math.min(smallX, pos.getXCoordinate());
bigX = Math.max(bigX, pos.getXCoordinate()); bigX = Math.max(bigX, pos.getXCoordinate());
@ -1245,17 +1279,19 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
/* Scale viewport */ /* Scale viewport */
if (smallX == bigX) { if (smallX == bigX) {
scaleX = 1; scaleX = 1;
} else { }
else {
scaleX = (bigX - smallX) / (canvas.getWidth()); scaleX = (bigX - smallX) / (canvas.getWidth());
} }
if (smallY == bigY) { if (smallY == bigY) {
scaleY = 1; scaleY = 1;
} else { }
else {
scaleY = (bigY - smallY) / (canvas.getHeight()); scaleY = (bigY - smallY) / (canvas.getHeight());
} }
viewportTransform.setToIdentity(); viewportTransform.setToIdentity();
double newZoom = (1.0/(BORDER_SCALE_FACTOR*Math.max(scaleX, scaleY))); double newZoom = (1.0 / (BORDER_SCALE_FACTOR * Math.max(scaleX, scaleY)));
viewportTransform.setToScale( viewportTransform.setToScale(
newZoom, newZoom,
newZoom newZoom
@ -1266,8 +1302,8 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
SwingUtilities.invokeLater(new Runnable() { SwingUtilities.invokeLater(new Runnable() {
@Override @Override
public void run() { public void run() {
Position viewMid = Position viewMid
transformPixelToPosition(canvas.getWidth()/2, canvas.getHeight()/2); = transformPixelToPosition(canvas.getWidth() / 2, canvas.getHeight() / 2);
double motesMidX = (smallXfinal + bigXfinal) / 2.0; double motesMidX = (smallXfinal + bigXfinal) / 2.0;
double motesMidY = (smallYfinal + bigYfinal) / 2.0; double motesMidY = (smallYfinal + bigYfinal) / 2.0;
@ -1325,6 +1361,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
public Position transformPixelToPosition(Point pixelPos) { public Position transformPixelToPosition(Point pixelPos) {
return transformPixelToPosition(pixelPos.x, pixelPos.y); return transformPixelToPosition(pixelPos.x, pixelPos.y);
} }
public Position transformPixelToPosition(int x, int y) { public Position transformPixelToPosition(int x, int y) {
Position position = new Position(null); Position position = new Position(null);
position.setCoordinates( position.setCoordinates(
@ -1336,21 +1373,24 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
} }
private int transformToPixelX(double x) { private int transformToPixelX(double x) {
return (int) (viewportTransform.getScaleX()*x + viewportTransform.getTranslateX()); return (int) (viewportTransform.getScaleX() * x + viewportTransform.getTranslateX());
} }
private int transformToPixelY(double y) { private int transformToPixelY(double y) {
return (int) (viewportTransform.getScaleY()*y + viewportTransform.getTranslateY()); return (int) (viewportTransform.getScaleY() * y + viewportTransform.getTranslateY());
} }
private double transformToPositionX(int x) { private double transformToPositionX(int x) {
return (x - viewportTransform.getTranslateX())/viewportTransform.getScaleX() ; return (x - viewportTransform.getTranslateX()) / viewportTransform.getScaleX();
} }
private double transformToPositionY(int y) { private double transformToPositionY(int y) {
return (y - viewportTransform.getTranslateY())/viewportTransform.getScaleY() ; return (y - viewportTransform.getTranslateY()) / viewportTransform.getScaleY();
} }
@Override @Override
public void closePlugin() { public void closePlugin() {
for (VisualizerSkin skin: currentSkins) { for (VisualizerSkin skin : currentSkins) {
skin.setInactive(); skin.setInactive();
} }
currentSkins.clear(); currentSkins.clear();
@ -1362,7 +1402,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
} }
simulation.getEventCentral().removeMoteCountListener(newMotesListener); simulation.getEventCentral().removeMoteCountListener(newMotesListener);
for (Mote mote: simulation.getMotes()) { for (Mote mote : simulation.getMotes()) {
Position pos = mote.getInterfaces().getPosition(); Position pos = mote.getInterfaces().getPosition();
if (pos != null) { if (pos != null) {
pos.deleteObserver(posObserver); pos.deleteObserver(posObserver);
@ -1372,6 +1412,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
protected boolean isDropFileAccepted(File file) { protected boolean isDropFileAccepted(File file) {
return true; /* TODO */ return true; /* TODO */
} }
protected void handleDropFile(File file, Point point) { protected void handleDropFile(File file, Point point) {
@ -1398,7 +1439,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
} }
/* Skins */ /* Skins */
for (int i=currentSkins.size()-1; i >= 0; i--) { for (int i = currentSkins.size() - 1; i >= 0; i--) {
VisualizerSkin skin = currentSkins.get(i); VisualizerSkin skin = currentSkins.get(i);
element = new Element("skin"); element = new Element("skin");
element.setText(skin.getClass().getName()); element.setText(skin.getClass().getName());
@ -1410,19 +1451,19 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
double[] matrix = new double[6]; double[] matrix = new double[6];
viewportTransform.getMatrix(matrix); viewportTransform.getMatrix(matrix);
element.setText( element.setText(
matrix[0] + " " + matrix[0] + " "
matrix[1] + " " + + matrix[1] + " "
matrix[2] + " " + + matrix[2] + " "
matrix[3] + " " + + matrix[3] + " "
matrix[4] + " " + + matrix[4] + " "
matrix[5] + matrix[5]
); );
config.add(element); config.add(element);
/* Hide decorations */ /* Hide decorations */
BasicInternalFrameUI ui = (BasicInternalFrameUI) getUI(); BasicInternalFrameUI ui = (BasicInternalFrameUI) getUI();
if (ui.getNorthPane().getPreferredSize() == null || if (ui.getNorthPane().getPreferredSize() == null
ui.getNorthPane().getPreferredSize().height == 0) { || ui.getNorthPane().getPreferredSize().height == 0) {
element = new Element("hidden"); element = new Element("hidden");
config.add(element); config.add(element);
} }
@ -1443,7 +1484,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
wanted = wanted.replaceFirst("se\\.sics", "org.contikios"); wanted = wanted.replaceFirst("se\\.sics", "org.contikios");
} }
for (Class<? extends VisualizerSkin> skinClass: visualizerSkins) { for (Class<? extends VisualizerSkin> skinClass : visualizerSkins) {
if (wanted.equals(skinClass.getName()) if (wanted.equals(skinClass.getName())
/* Backwards compatibility */ /* Backwards compatibility */
|| wanted.equals(Cooja.getDescriptionOf(skinClass))) { || wanted.equals(Cooja.getDescriptionOf(skinClass))) {
@ -1461,9 +1502,11 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
if (wanted != null) { if (wanted != null) {
logger.warn("Could not load visualizer: " + element.getText()); logger.warn("Could not load visualizer: " + element.getText());
} }
} else if (element.getName().equals("moterelations")) { }
else if (element.getName().equals("moterelations")) {
showMoteToMoteRelations = true; showMoteToMoteRelations = true;
} else if (element.getName().equals("viewport")) { }
else if (element.getName().equals("viewport")) {
try { try {
String[] matrix = element.getText().split(" "); String[] matrix = element.getText().split(" ");
viewportTransform.setTransform( viewportTransform.setTransform(
@ -1475,13 +1518,15 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
Double.parseDouble(matrix[5]) Double.parseDouble(matrix[5])
); );
resetViewport = 0; resetViewport = 0;
} catch (NumberFormatException e) { }
catch (NumberFormatException e) {
logger.warn("Bad viewport: " + e.getMessage()); logger.warn("Bad viewport: " + e.getMessage());
resetViewport(); resetViewport();
} }
} else if (element.getName().equals("hidden")) { }
else if (element.getName().equals("hidden")) {
BasicInternalFrameUI ui = (BasicInternalFrameUI) getUI(); BasicInternalFrameUI ui = (BasicInternalFrameUI) getUI();
ui.getNorthPane().setPreferredSize(new Dimension(0,0)); ui.getNorthPane().setPreferredSize(new Dimension(0, 0));
} }
} }
return true; return true;
@ -1491,7 +1536,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (VisualizerSkin skin: currentSkins) { for (VisualizerSkin skin : currentSkins) {
if (sb.length() > 0) { if (sb.length() > 0) {
sb.append(';'); sb.append(';');
} }
@ -1502,15 +1547,18 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
}; };
protected static class ButtonClickMoteMenuAction implements MoteMenuAction { protected static class ButtonClickMoteMenuAction implements MoteMenuAction {
@Override @Override
public boolean isEnabled(Visualizer visualizer, Mote mote) { public boolean isEnabled(Visualizer visualizer, Mote mote) {
return mote.getInterfaces().getButton() != null return mote.getInterfaces().getButton() != null
&& !mote.getInterfaces().getButton().isPressed(); && !mote.getInterfaces().getButton().isPressed();
} }
@Override @Override
public String getDescription(Visualizer visualizer, Mote mote) { public String getDescription(Visualizer visualizer, Mote mote) {
return "Click button on " + mote; return "Click button on " + mote;
} }
@Override @Override
public void doAction(Visualizer visualizer, Mote mote) { public void doAction(Visualizer visualizer, Mote mote) {
mote.getInterfaces().getButton().clickButton(); mote.getInterfaces().getButton().clickButton();
@ -1518,14 +1566,17 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
}; };
protected static class DeleteMoteMenuAction implements MoteMenuAction { protected static class DeleteMoteMenuAction implements MoteMenuAction {
@Override @Override
public boolean isEnabled(Visualizer visualizer, Mote mote) { public boolean isEnabled(Visualizer visualizer, Mote mote) {
return true; return true;
} }
@Override @Override
public String getDescription(Visualizer visualizer, Mote mote) { public String getDescription(Visualizer visualizer, Mote mote) {
return "Delete " + mote; return "Delete " + mote;
} }
@Override @Override
public void doAction(Visualizer visualizer, Mote mote) { public void doAction(Visualizer visualizer, Mote mote) {
mote.getSimulation().removeMote(mote); mote.getSimulation().removeMote(mote);
@ -1533,14 +1584,17 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
}; };
protected static class ShowLEDMoteMenuAction implements MoteMenuAction { protected static class ShowLEDMoteMenuAction implements MoteMenuAction {
@Override @Override
public boolean isEnabled(Visualizer visualizer, Mote mote) { public boolean isEnabled(Visualizer visualizer, Mote mote) {
return mote.getInterfaces().getLED() != null; return mote.getInterfaces().getLED() != null;
} }
@Override @Override
public String getDescription(Visualizer visualizer, Mote mote) { public String getDescription(Visualizer visualizer, Mote mote) {
return "Show LEDs on " + mote; return "Show LEDs on " + mote;
} }
@Override @Override
public void doAction(Visualizer visualizer, Mote mote) { public void doAction(Visualizer visualizer, Mote mote) {
Simulation simulation = mote.getSimulation(); Simulation simulation = mote.getSimulation();
@ -1552,8 +1606,8 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
/* Extract description (input to plugin) */ /* Extract description (input to plugin) */
String desc = Cooja.getDescriptionOf(mote.getInterfaces().getLED()); String desc = Cooja.getDescriptionOf(mote.getInterfaces().getLED());
MoteInterfaceViewer viewer = MoteInterfaceViewer viewer
(MoteInterfaceViewer) simulation.getCooja().tryStartPlugin( = (MoteInterfaceViewer) simulation.getCooja().tryStartPlugin(
MoteInterfaceViewer.class, MoteInterfaceViewer.class,
simulation.getCooja(), simulation.getCooja(),
simulation, simulation,
@ -1567,24 +1621,27 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
}; };
protected static class ShowSerialMoteMenuAction implements MoteMenuAction { protected static class ShowSerialMoteMenuAction implements MoteMenuAction {
@Override @Override
public boolean isEnabled(Visualizer visualizer, Mote mote) { public boolean isEnabled(Visualizer visualizer, Mote mote) {
for (MoteInterface intf: mote.getInterfaces().getInterfaces()) { for (MoteInterface intf : mote.getInterfaces().getInterfaces()) {
if (intf instanceof SerialPort) { if (intf instanceof SerialPort) {
return true; return true;
} }
} }
return false; return false;
} }
@Override @Override
public String getDescription(Visualizer visualizer, Mote mote) { public String getDescription(Visualizer visualizer, Mote mote) {
return "Show serial port on " + mote; return "Show serial port on " + mote;
} }
@Override @Override
public void doAction(Visualizer visualizer, Mote mote) { public void doAction(Visualizer visualizer, Mote mote) {
Simulation simulation = mote.getSimulation(); Simulation simulation = mote.getSimulation();
SerialPort serialPort = null; SerialPort serialPort = null;
for (MoteInterface intf: mote.getInterfaces().getInterfaces()) { for (MoteInterface intf : mote.getInterfaces().getInterfaces()) {
if (intf instanceof SerialPort) { if (intf instanceof SerialPort) {
serialPort = (SerialPort) intf; serialPort = (SerialPort) intf;
break; break;
@ -1598,8 +1655,8 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
/* Extract description (input to plugin) */ /* Extract description (input to plugin) */
String desc = Cooja.getDescriptionOf(serialPort); String desc = Cooja.getDescriptionOf(serialPort);
MoteInterfaceViewer viewer = MoteInterfaceViewer viewer
(MoteInterfaceViewer) simulation.getCooja().tryStartPlugin( = (MoteInterfaceViewer) simulation.getCooja().tryStartPlugin(
MoteInterfaceViewer.class, MoteInterfaceViewer.class,
simulation.getCooja(), simulation.getCooja(),
simulation, simulation,
@ -1613,14 +1670,17 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
}; };
protected static class MoveMoteMenuAction implements MoteMenuAction { protected static class MoveMoteMenuAction implements MoteMenuAction {
@Override @Override
public boolean isEnabled(Visualizer visualizer, Mote mote) { public boolean isEnabled(Visualizer visualizer, Mote mote) {
return true; return true;
} }
@Override @Override
public String getDescription(Visualizer visualizer, Mote mote) { public String getDescription(Visualizer visualizer, Mote mote) {
return "Move " + mote; return "Move " + mote;
} }
@Override @Override
public void doAction(Visualizer visualizer, Mote mote) { public void doAction(Visualizer visualizer, Mote mote) {
visualizer.beginMoveRequest(mote, false, false); visualizer.beginMoveRequest(mote, false, false);
@ -1628,15 +1688,18 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
}; };
protected static class ResetViewportAction implements SimulationMenuAction { protected static class ResetViewportAction implements SimulationMenuAction {
@Override @Override
public void doAction(Visualizer visualizer, Simulation simulation) { public void doAction(Visualizer visualizer, Simulation simulation) {
visualizer.resetViewport = 1; visualizer.resetViewport = 1;
visualizer.repaint(); visualizer.repaint();
} }
@Override @Override
public String getDescription(Visualizer visualizer, Simulation simulation) { public String getDescription(Visualizer visualizer, Simulation simulation) {
return "Reset viewport"; return "Reset viewport";
} }
@Override @Override
public boolean isEnabled(Visualizer visualizer, Simulation simulation) { public boolean isEnabled(Visualizer visualizer, Simulation simulation) {
return true; return true;
@ -1644,6 +1707,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
}; };
protected static class ToggleDecorationsMenuAction implements SimulationMenuAction { protected static class ToggleDecorationsMenuAction implements SimulationMenuAction {
@Override @Override
public void doAction(final Visualizer visualizer, Simulation simulation) { public void doAction(final Visualizer visualizer, Simulation simulation) {
if (!(visualizer.getUI() instanceof BasicInternalFrameUI)) { if (!(visualizer.getUI() instanceof BasicInternalFrameUI)) {
@ -1651,13 +1715,14 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
} }
BasicInternalFrameUI ui = (BasicInternalFrameUI) visualizer.getUI(); BasicInternalFrameUI ui = (BasicInternalFrameUI) visualizer.getUI();
if (ui.getNorthPane().getPreferredSize() == null || if (ui.getNorthPane().getPreferredSize() == null
ui.getNorthPane().getPreferredSize().height == 0) { || ui.getNorthPane().getPreferredSize().height == 0) {
/* Restore window decorations */ /* Restore window decorations */
ui.getNorthPane().setPreferredSize(null); ui.getNorthPane().setPreferredSize(null);
} else { }
else {
/* Hide window decorations */ /* Hide window decorations */
ui.getNorthPane().setPreferredSize(new Dimension(0,0)); ui.getNorthPane().setPreferredSize(new Dimension(0, 0));
} }
visualizer.revalidate(); visualizer.revalidate();
SwingUtilities.invokeLater(new Runnable() { SwingUtilities.invokeLater(new Runnable() {
@ -1667,6 +1732,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
} }
}); });
} }
@Override @Override
public String getDescription(Visualizer visualizer, Simulation simulation) { public String getDescription(Visualizer visualizer, Simulation simulation) {
if (!(visualizer.getUI() instanceof BasicInternalFrameUI)) { if (!(visualizer.getUI() instanceof BasicInternalFrameUI)) {
@ -1674,12 +1740,13 @@ public class Visualizer extends VisPlugin implements HasQuickHelp {
} }
BasicInternalFrameUI ui = (BasicInternalFrameUI) visualizer.getUI(); BasicInternalFrameUI ui = (BasicInternalFrameUI) visualizer.getUI();
if (ui.getNorthPane().getPreferredSize() == null || if (ui.getNorthPane().getPreferredSize() == null
ui.getNorthPane().getPreferredSize().height == 0) { || ui.getNorthPane().getPreferredSize().height == 0) {
return "Restore window decorations"; return "Restore window decorations";
} }
return "Hide window decorations"; return "Hide window decorations";
} }
@Override @Override
public boolean isEnabled(Visualizer visualizer, Simulation simulation) { public boolean isEnabled(Visualizer visualizer, Simulation simulation) {
return visualizer.getUI() instanceof BasicInternalFrameUI; return visualizer.getUI() instanceof BasicInternalFrameUI;

View file

@ -27,7 +27,6 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
*/ */
package org.contikios.cooja.plugins.skins; package org.contikios.cooja.plugins.skins;
import java.awt.Color; import java.awt.Color;
@ -53,6 +52,7 @@ import org.contikios.cooja.radiomediums.DirectedGraphMedium;
@ClassDescription("Radio environment (DGRM)") @ClassDescription("Radio environment (DGRM)")
@SupportedArguments(radioMediums = {DirectedGraphMedium.class}) @SupportedArguments(radioMediums = {DirectedGraphMedium.class})
public class DGRMVisualizerSkin implements VisualizerSkin { public class DGRMVisualizerSkin implements VisualizerSkin {
private static final Logger logger = Logger.getLogger(DGRMVisualizerSkin.class); private static final Logger logger = Logger.getLogger(DGRMVisualizerSkin.class);
private Simulation simulation = null; private Simulation simulation = null;
@ -79,7 +79,7 @@ public class DGRMVisualizerSkin implements VisualizerSkin {
@Override @Override
public Color[] getColorOf(Mote mote) { public Color[] getColorOf(Mote mote) {
if (visualizer.getSelectedMotes().contains(mote)) { if (visualizer.getSelectedMotes().contains(mote)) {
return new Color[] { Color.CYAN }; return new Color[]{Color.CYAN};
} }
return null; return null;
} }
@ -124,16 +124,24 @@ public class DGRMVisualizerSkin implements VisualizerSkin {
g.drawString(msg, x - msgWidth / 2, y + 2 * Visualizer.MOTE_RADIUS + 3); g.drawString(msg, x - msgWidth / 2, y + 2 * Visualizer.MOTE_RADIUS + 3);
/* Draw LQI/RSSI edges */ /* Draw LQI/RSSI edges */
for (DestinationRadio r : dests) { for (DestinationRadio r : dests) {
double prob = ((DGRMDestinationRadio)r).ratio; double prob = ((DGRMDestinationRadio) r).ratio;
double rssi = ((DGRMDestinationRadio)r).signal; double rssi = ((DGRMDestinationRadio) r).signal;
double pos_rssi = rssi + 100; double pos_rssi = rssi + 100;
int lqi = ((DGRMDestinationRadio)r).lqi; int lqi = ((DGRMDestinationRadio) r).lqi;
float red = (float)(1 - prob*pos_rssi/90*lqi/100); float red = (float) (1 - prob * pos_rssi / 90 * lqi / 100);
if(red > 1) red = 1; if (red > 1) {
if(red < 0) red = 0; red = 1;
float green = (float)(prob*pos_rssi/90*lqi/100); }
if(green > 1) green = 1; if (red < 0) {
if(green < 0) green = 0; red = 0;
}
float green = (float) (prob * pos_rssi / 90 * lqi / 100);
if (green > 1) {
green = 1;
}
if (green < 0) {
green = 0;
}
if (prob == 0.0d) { if (prob == 0.0d) {
continue; continue;
} }
@ -148,7 +156,7 @@ public class DGRMVisualizerSkin implements VisualizerSkin {
g.setColor(Color.BLACK); g.setColor(Color.BLACK);
msg = String.format("%1.1f%%", 100.0 * prob); msg = String.format("%1.1f%%", 100.0 * prob);
msgWidth = fm.stringWidth(msg); msgWidth = fm.stringWidth(msg);
g.drawString(msg, pixel.x - msgWidth/2, pixel.y + 2*Visualizer.MOTE_RADIUS + 3); g.drawString(msg, pixel.x - msgWidth / 2, pixel.y + 2 * Visualizer.MOTE_RADIUS + 3);
} }
} }
} }

View file

@ -27,7 +27,6 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
*/ */
package org.contikios.cooja.plugins.skins; package org.contikios.cooja.plugins.skins;
import java.awt.BorderLayout; import java.awt.BorderLayout;
@ -87,6 +86,7 @@ import org.contikios.cooja.radiomediums.UDGM;
@ClassDescription("Radio environment (UDGM)") @ClassDescription("Radio environment (UDGM)")
@SupportedArguments(radioMediums = {UDGM.class}) @SupportedArguments(radioMediums = {UDGM.class})
public class UDGMVisualizerSkin implements VisualizerSkin { public class UDGMVisualizerSkin implements VisualizerSkin {
private static final Logger logger = Logger.getLogger(UDGMVisualizerSkin.class); private static final Logger logger = Logger.getLogger(UDGMVisualizerSkin.class);
private static final Color COLOR_TX = new Color(0, 255, 0, 100); private static final Color COLOR_TX = new Color(0, 255, 0, 100);
@ -158,8 +158,8 @@ public class UDGMVisualizerSkin implements VisualizerSkin {
txRangeSpinner.addChangeListener(new ChangeListener() { txRangeSpinner.addChangeListener(new ChangeListener() {
@Override @Override
public void stateChanged(ChangeEvent e) { public void stateChanged(ChangeEvent e) {
radioMedium.setTxRange(((SpinnerNumberModel) radioMedium.setTxRange(((SpinnerNumberModel) txRangeSpinner.getModel())
txRangeSpinner.getModel()).getNumber().doubleValue()); .getNumber().doubleValue());
visualizer.repaint(); visualizer.repaint();
} }
}); });
@ -167,8 +167,8 @@ public class UDGMVisualizerSkin implements VisualizerSkin {
interferenceRangeSpinner.addChangeListener(new ChangeListener() { interferenceRangeSpinner.addChangeListener(new ChangeListener() {
@Override @Override
public void stateChanged(ChangeEvent e) { public void stateChanged(ChangeEvent e) {
radioMedium.setInterferenceRange(((SpinnerNumberModel) radioMedium.setInterferenceRange(((SpinnerNumberModel) interferenceRangeSpinner.getModel())
interferenceRangeSpinner.getModel()).getNumber().doubleValue()); .getNumber().doubleValue());
visualizer.repaint(); visualizer.repaint();
} }
}); });
@ -176,8 +176,8 @@ public class UDGMVisualizerSkin implements VisualizerSkin {
successRatioTxSpinner.addChangeListener(new ChangeListener() { successRatioTxSpinner.addChangeListener(new ChangeListener() {
@Override @Override
public void stateChanged(ChangeEvent e) { public void stateChanged(ChangeEvent e) {
radioMedium.SUCCESS_RATIO_TX = ((SpinnerNumberModel) radioMedium.SUCCESS_RATIO_TX = ((SpinnerNumberModel) successRatioTxSpinner.getModel())
successRatioTxSpinner.getModel()).getNumber().doubleValue(); .getNumber().doubleValue();
visualizer.repaint(); visualizer.repaint();
} }
}); });
@ -185,8 +185,8 @@ public class UDGMVisualizerSkin implements VisualizerSkin {
successRatioRxSpinner.addChangeListener(new ChangeListener() { successRatioRxSpinner.addChangeListener(new ChangeListener() {
@Override @Override
public void stateChanged(ChangeEvent e) { public void stateChanged(ChangeEvent e) {
radioMedium.SUCCESS_RATIO_RX = ((SpinnerNumberModel) radioMedium.SUCCESS_RATIO_RX = ((SpinnerNumberModel) successRatioRxSpinner.getModel())
successRatioRxSpinner.getModel()).getNumber().doubleValue(); .getNumber().doubleValue();
visualizer.repaint(); visualizer.repaint();
} }
}); });
@ -264,7 +264,7 @@ public class UDGMVisualizerSkin implements VisualizerSkin {
@Override @Override
public Color[] getColorOf(Mote mote) { public Color[] getColorOf(Mote mote) {
if (visualizer.getSelectedMotes().contains(mote)) { if (visualizer.getSelectedMotes().contains(mote)) {
return new Color[] { Color.CYAN }; return new Color[]{Color.CYAN};
} }
return null; return null;
} }
@ -371,20 +371,20 @@ public class UDGMVisualizerSkin implements VisualizerSkin {
if (selectedMotes.size() == 1) { if (selectedMotes.size() == 1) {
Mote selectedMote = selectedMotes.toArray(new Mote[0])[0]; Mote selectedMote = selectedMotes.toArray(new Mote[0])[0];
Radio selectedRadio = selectedMote.getInterfaces().getRadio(); Radio selectedRadio = selectedMote.getInterfaces().getRadio();
for (Mote m: simulation.getMotes()) { for (Mote m : simulation.getMotes()) {
if (m == selectedMote) { if (m == selectedMote) {
continue; continue;
} }
double prob = double prob
((UDGM) simulation.getRadioMedium()).getSuccessProbability(selectedRadio, m.getInterfaces().getRadio()); = ((UDGM) simulation.getRadioMedium()).getSuccessProbability(selectedRadio, m.getInterfaces().getRadio());
if (prob == 0.0d) { if (prob == 0.0d) {
continue; continue;
} }
String msg = (((int)(1000*prob))/10.0) + "%"; String msg = (((int) (1000 * prob)) / 10.0) + "%";
Position pos = m.getInterfaces().getPosition(); Position pos = m.getInterfaces().getPosition();
Point pixel = visualizer.transformPositionToPixel(pos); Point pixel = visualizer.transformPositionToPixel(pos);
int msgWidth = fm.stringWidth(msg); int msgWidth = fm.stringWidth(msg);
g.drawString(msg, pixel.x - msgWidth/2, pixel.y + 2*Visualizer.MOTE_RADIUS + 3); g.drawString(msg, pixel.x - msgWidth / 2, pixel.y + 2 * Visualizer.MOTE_RADIUS + 3);
} }
} }
@ -395,6 +395,7 @@ public class UDGMVisualizerSkin implements VisualizerSkin {
} }
public static class RangeMenuAction implements SimulationMenuAction { public static class RangeMenuAction implements SimulationMenuAction {
@Override @Override
public boolean isEnabled(Visualizer visualizer, Simulation simulation) { public boolean isEnabled(Visualizer visualizer, Simulation simulation) {
return true; return true;
@ -420,6 +421,7 @@ public class UDGMVisualizerSkin implements VisualizerSkin {
}; };
public static class SuccessRatioMenuAction implements SimulationMenuAction { public static class SuccessRatioMenuAction implements SimulationMenuAction {
@Override @Override
public boolean isEnabled(Visualizer visualizer, Simulation simulation) { public boolean isEnabled(Visualizer visualizer, Simulation simulation) {
return true; return true;
@ -433,7 +435,7 @@ public class UDGMVisualizerSkin implements VisualizerSkin {
@Override @Override
public void doAction(Visualizer visualizer, Simulation simulation) { public void doAction(Visualizer visualizer, Simulation simulation) {
VisualizerSkin[] skins = visualizer.getCurrentSkins(); VisualizerSkin[] skins = visualizer.getCurrentSkins();
for (VisualizerSkin skin: skins) { for (VisualizerSkin skin : skins) {
if (skin instanceof UDGMVisualizerSkin) { if (skin instanceof UDGMVisualizerSkin) {
UDGMVisualizerSkin vskin = ((UDGMVisualizerSkin) skin); UDGMVisualizerSkin vskin = ((UDGMVisualizerSkin) skin);
vskin.ratioTX.setVisible(true); vskin.ratioTX.setVisible(true);