diff --git a/tools/cooja/apps/mrm/java/org/contikios/mrm/MRMVisualizerSkin.java b/tools/cooja/apps/mrm/java/org/contikios/mrm/MRMVisualizerSkin.java index 3a9ab4ab2..54bbf247a 100644 --- a/tools/cooja/apps/mrm/java/org/contikios/mrm/MRMVisualizerSkin.java +++ b/tools/cooja/apps/mrm/java/org/contikios/mrm/MRMVisualizerSkin.java @@ -26,7 +26,6 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ - package org.contikios.mrm; import java.awt.Color; @@ -51,6 +50,7 @@ import org.contikios.mrm.ChannelModel.TxPair; @ClassDescription("Radio environment (MRM)") @SupportedArguments(radioMediums = {MRM.class}) public class MRMVisualizerSkin implements VisualizerSkin { + private static final Logger logger = Logger.getLogger(MRMVisualizerSkin.class); private Simulation simulation = null; @@ -77,7 +77,7 @@ public class MRMVisualizerSkin implements VisualizerSkin { @Override public Color[] getColorOf(Mote mote) { if (visualizer.getSelectedMotes().contains(mote)) { - return new Color[] { Color.CYAN }; + return new Color[]{Color.CYAN}; } return null; } @@ -128,35 +128,36 @@ public class MRMVisualizerSkin implements VisualizerSkin { public Radio getFromRadio() { return selectedMote.getInterfaces().getRadio(); } + @Override public Radio getToRadio() { return dRadio; } }; double probArr[] = radioMedium.getChannelModel().getProbability( - txPair, - Double.NEGATIVE_INFINITY + txPair, + Double.NEGATIVE_INFINITY ); double prob = probArr[0]; double ss = probArr[1]; - + if (prob == 0.0d) { continue; } 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()); 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.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"; int msgWidth = fm.stringWidth(msg); 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); } } diff --git a/tools/cooja/java/org/contikios/cooja/plugins/Visualizer.java b/tools/cooja/java/org/contikios/cooja/plugins/Visualizer.java index 45654955f..6e6e5c2e9 100644 --- a/tools/cooja/java/org/contikios/cooja/plugins/Visualizer.java +++ b/tools/cooja/java/org/contikios/cooja/plugins/Visualizer.java @@ -27,7 +27,6 @@ * SUCH DAMAGE. * */ - package org.contikios.cooja.plugins; import java.awt.BasicStroke; @@ -139,11 +138,12 @@ import org.contikios.cooja.plugins.skins.UDGMVisualizerSkin; @ClassDescription("Network") @PluginType(PluginType.SIM_STANDARD_PLUGIN) public class Visualizer extends VisPlugin implements HasQuickHelp { + private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(Visualizer.class); 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 Simulation simulation = null; @@ -186,8 +186,9 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { private Selection selection; /* Visualizers */ - private static final ArrayList> visualizerSkins = - new ArrayList<>(); + private static final ArrayList> visualizerSkins + = new ArrayList<>(); + static { /* Register default visualizer skins */ registerVisualizerSkin(IDVisualizerSkin.class); @@ -213,20 +214,27 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { /* Popup menu */ public static interface SimulationMenuAction { + public boolean isEnabled(Visualizer visualizer, Simulation simulation); + public String getDescription(Visualizer visualizer, Simulation simulation); + public void doAction(Visualizer visualizer, Simulation simulation); } + public static interface MoteMenuAction { + public boolean isEnabled(Visualizer visualizer, Mote mote); + public String getDescription(Visualizer visualizer, Mote mote); + public void doAction(Visualizer visualizer, Mote mote); } - private ArrayList> simulationMenuActions = - new ArrayList<>(); - private ArrayList> moteMenuActions = - new ArrayList<>(); + private ArrayList> simulationMenuActions + = new ArrayList<>(); + private ArrayList> moteMenuActions + = new ArrayList<>(); public Visualizer(Simulation simulation, Cooja gui) { super("Network", gui); @@ -235,8 +243,8 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { /* Register external visualizers */ String[] skins = gui.getProjectConfig().getStringArrayValue(Visualizer.class, "SKINS"); - - for (String skinClass: skins) { + + for (String skinClass : skins) { Class skin = gui.tryLoadClass(this, VisualizerSkin.class, skinClass); if (registerVisualizerSkin(skin)) { logger.info("Registered external visualizer: " + skinClass); @@ -254,9 +262,11 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { viewMenu.removeAll(); populateSkinMenu(viewMenu); } + @Override public void menuDeselected(MenuEvent e) { } + @Override public void menuCanceled(MenuEvent e) { } @@ -275,8 +285,8 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { } }; zoomInAction.putValue( - Action.ACCELERATOR_KEY, - KeyStroke.getKeyStroke(KeyEvent.VK_PLUS, ActionEvent.CTRL_MASK) + Action.ACCELERATOR_KEY, + KeyStroke.getKeyStroke(KeyEvent.VK_PLUS, ActionEvent.CTRL_MASK) ); JMenuItem zoomInItem = new JMenuItem(zoomInAction); zoomMenu.add(zoomInItem); @@ -288,8 +298,8 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { } }; zoomOutAction.putValue( - Action.ACCELERATOR_KEY, - KeyStroke.getKeyStroke(KeyEvent.VK_MINUS, ActionEvent.CTRL_MASK) + Action.ACCELERATOR_KEY, + KeyStroke.getKeyStroke(KeyEvent.VK_MINUS, ActionEvent.CTRL_MASK) ); JMenuItem zoomOutItem = new JMenuItem(zoomOutAction); zoomMenu.add(zoomOutItem); @@ -308,6 +318,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { /* Main canvas */ canvas = new JPanel() { private static final long serialVersionUID = 1L; + @Override public void paintComponent(Graphics g) { super.paintComponent(g); @@ -317,12 +328,12 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { resetViewport--; } - ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - for (VisualizerSkin skin: currentSkins) { + ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + for (VisualizerSkin skin : currentSkins) { skin.paintBeforeMotes(g); } paintMotes(g); - for (VisualizerSkin skin: currentSkins) { + for (VisualizerSkin skin : currentSkins) { skin.paintAfterMotes(g); } selection.drawSelection(g); @@ -355,6 +366,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { }); } } + @Override public void moteWasRemoved(Mote mote) { 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(); if (pos != null) { pos.addObserver(posObserver); @@ -395,10 +407,11 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { /* Toggle highlight state */ if (highlightedMotes.contains(mote)) { highlightedMotes.remove(mote); - } else { + } + else { highlightedMotes.add(mote); } - timer.setDelay(timer.getDelay()-1); + timer.setDelay(timer.getDelay() - 1); repaint(); } }); @@ -429,10 +442,11 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { return; } - if (SwingUtilities.isLeftMouseButton(e)){ + if (SwingUtilities.isLeftMouseButton(e)) { handleMousePress(e); } } + @Override public void mouseReleased(MouseEvent e) { if (e.isPopupTrigger()) { @@ -451,10 +465,11 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { int x = mwe.getX(); int y = mwe.getY(); int rot = mwe.getWheelRotation(); - - if (rot > 0) { + + if (rot > 0) { zoomToFactor(zoomFactor() / 1.2, new Point(x, y)); - } else { + } + else { zoomToFactor(zoomFactor() * 1.2, new Point(x, y)); } @@ -478,29 +493,36 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { public void dragEnter(DropTargetDragEvent dtde) { if (acceptOrRejectDrag(dtde)) { dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE); - } else { + } + else { dtde.rejectDrag(); } } + @Override public void dragExit(DropTargetEvent dte) { } + @Override public void dropActionChanged(DropTargetDragEvent dtde) { if (acceptOrRejectDrag(dtde)) { dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE); - } else { + } + else { dtde.rejectDrag(); } } + @Override public void dragOver(DropTargetDragEvent dtde) { if (acceptOrRejectDrag(dtde)) { dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE); - } else { + } + else { dtde.rejectDrag(); } } + @Override public void drop(DropTargetDropEvent dtde) { Transferable transferable = dtde.getTransferable(); @@ -516,7 +538,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { try { List transferList = Arrays.asList( - transferable.getTransferData(DataFlavor.javaFileListFlavor) + transferable.getTransferData(DataFlavor.javaFileListFlavor) ); if (transferList.size() != 1) { return; @@ -537,6 +559,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { handleDropFile(file, dtde.getLocation()); } + private boolean acceptOrRejectDrag(DropTargetDragEvent dtde) { Transferable transferable = dtde.getTransferable(); @@ -554,7 +577,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { } try { List transferList = Arrays.asList( - transferable.getTransferData(DataFlavor.javaFileListFlavor) + transferable.getTransferData(DataFlavor.javaFileListFlavor) ); if (transferList.size() != 1) { return false; @@ -564,7 +587,8 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { return false; } file = list.get(0); - } catch (UnsupportedFlavorException | IOException e) { + } + catch (UnsupportedFlavorException | IOException e) { return false; } @@ -573,7 +597,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { } }; canvas.setDropTarget( - new DropTarget(canvas, DnDConstants.ACTION_COPY_OR_MOVE, dTargetListener, true, null) + new DropTarget(canvas, DnDConstants.ACTION_COPY_OR_MOVE, dTargetListener, true, null) ); resetViewport = 3; /* XXX Quick-fix */ @@ -584,7 +608,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { } private void generateAndActivateSkin(Class skinClass) { - for (VisualizerSkin skin: currentSkins) { + for (VisualizerSkin skin : currentSkins) { if (skinClass == skin.getClass()) { logger.warn("Selected visualizer already active: " + skinClass); return; @@ -601,7 +625,8 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { VisualizerSkin newSkin = skinClass.newInstance(); newSkin.setActive(Visualizer.this.simulation, Visualizer.this); currentSkins.add(0, newSkin); - } catch (InstantiationException | IllegalAccessException e1) { + } + catch (InstantiationException | IllegalAccessException e1) { e1.printStackTrace(); } repaint(); @@ -616,12 +641,12 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { /* Activate default skins */ String[] defaultSkins = Cooja.getExternalToolsSetting("VISUALIZER_DEFAULT_SKINS", "").split(";"); - for (String skin: defaultSkins) { + for (String skin : defaultSkins) { if (skin.isEmpty()) { continue; } - Class skinClass = - simulation.getCooja().tryLoadClass(this, VisualizerSkin.class, skin); + Class skinClass + = simulation.getCooja().tryLoadClass(this, VisualizerSkin.class, skin); generateAndActivateSkin(skinClass); } } @@ -690,7 +715,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { /* Add registered mote actions */ for (final Mote mote : motes) { menu.add(simulation.getCooja().createMotePluginsSubmenu(mote)); - for (Class menuActionClass: moteMenuActions) { + for (Class menuActionClass : moteMenuActions) { try { final MoteMenuAction menuAction = menuActionClass.newInstance(); if (menuAction.isEnabled(this, mote)) { @@ -703,7 +728,8 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { }); menu.add(menuItem); } - } catch (InstantiationException | IllegalAccessException e1) { + } + catch (InstantiationException | IllegalAccessException e1) { logger.fatal("Error: " + e1.getMessage(), e1); } } @@ -725,7 +751,8 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { }); menu.add(menuItem); } - } catch (InstantiationException | IllegalAccessException e1) { + } + catch (InstantiationException | IllegalAccessException e1) { logger.fatal("Error: " + e1.getMessage(), e1); } } @@ -733,11 +760,11 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { /* Visualizer skin actions */ menu.add(new JSeparator()); /*JMenu skinMenu = new JMenu("Visualizers"); - populateSkinMenu(skinMenu); - menu.add(skinMenu); - makeSkinsDefaultAction.putValue(Action.NAME, "Set default visualizers"); - JMenuItem skinDefaultItem = new JMenuItem(makeSkinsDefaultAction); - menu.add(skinDefaultItem);*/ + populateSkinMenu(skinMenu); + menu.add(skinMenu); + makeSkinsDefaultAction.putValue(Action.NAME, "Set default visualizers"); + JMenuItem skinDefaultItem = new JMenuItem(makeSkinsDefaultAction); + menu.add(skinDefaultItem);*/ /* Show menu */ menu.setLocation(new Point( @@ -748,27 +775,28 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { } private boolean showMoteToMoteRelations = true; + private void populateSkinMenu(MenuElement menu) { - /* Mote-to-mote relations */ - JCheckBoxMenuItem moteRelationsItem = new JCheckBoxMenuItem("Mote relations", showMoteToMoteRelations); - moteRelationsItem.addItemListener(new ItemListener() { + /* Mote-to-mote relations */ + JCheckBoxMenuItem moteRelationsItem = new JCheckBoxMenuItem("Mote relations", showMoteToMoteRelations); + moteRelationsItem.addItemListener(new ItemListener() { @Override - public void itemStateChanged(ItemEvent e) { - JCheckBoxMenuItem menuItem = ((JCheckBoxMenuItem)e.getItem()); - showMoteToMoteRelations = menuItem.isSelected(); - repaint(); - } - }); - if (menu instanceof JMenu) { - ((JMenu)menu).add(moteRelationsItem); - ((JMenu)menu).add(new JSeparator()); - } - if (menu instanceof JPopupMenu) { - ((JPopupMenu)menu).add(moteRelationsItem); - ((JPopupMenu)menu).add(new JSeparator()); - } - - for (Class skinClass: visualizerSkins) { + public void itemStateChanged(ItemEvent e) { + JCheckBoxMenuItem menuItem = ((JCheckBoxMenuItem) e.getItem()); + showMoteToMoteRelations = menuItem.isSelected(); + repaint(); + } + }); + if (menu instanceof JMenu) { + ((JMenu) menu).add(moteRelationsItem); + ((JMenu) menu).add(new JSeparator()); + } + if (menu instanceof JPopupMenu) { + ((JPopupMenu) menu).add(moteRelationsItem); + ((JPopupMenu) menu).add(new JSeparator()); + } + + for (Class skinClass : visualizerSkins) { /* Should skin be enabled in this simulation? */ if (!isSkinCompatible(skinClass)) { continue; @@ -779,7 +807,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { item.putClientProperty("skinclass", skinClass); /* Select skin if active */ - for (VisualizerSkin skin: currentSkins) { + for (VisualizerSkin skin : currentSkins) { if (skin.getClass() == skinClass) { item.setSelected(true); break; @@ -789,14 +817,14 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { item.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { - JCheckBoxMenuItem menuItem = ((JCheckBoxMenuItem)e.getItem()); + JCheckBoxMenuItem menuItem = ((JCheckBoxMenuItem) e.getItem()); if (menuItem == null) { logger.fatal("No menu item"); return; } - Class skinClass = - (Class) menuItem.getClientProperty("skinclass"); + Class skinClass + = (Class) menuItem.getClientProperty("skinclass"); if (skinClass == null) { logger.fatal("Unknown visualizer skin class: " + skinClass); return; @@ -805,10 +833,11 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { if (menuItem.isSelected()) { /* Create and activate new skin */ generateAndActivateSkin(skinClass); - } else { + } + else { /* Deactivate skin */ VisualizerSkin skinToDeactivate = null; - for (VisualizerSkin skin: currentSkins) { + for (VisualizerSkin skin : currentSkins) { if (skin.getClass() == skinClass) { skinToDeactivate = skin; break; @@ -826,10 +855,10 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { }); if (menu instanceof JMenu) { - ((JMenu)menu).add(item); + ((JMenu) menu).add(item); } 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) { showMenuItem = false; Class[] radioMediums = skinClass.getAnnotation(SupportedArguments.class).radioMediums(); - for (Class o: radioMediums) { + for (Class o : radioMediums) { if (o.isAssignableFrom(simulation.getRadioMedium().getClass())) { showMenuItem = true; break; @@ -1014,7 +1043,8 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { private void beginMoveRequest(Mote motesToMove, boolean withTiming, boolean confirm) { if (withTiming) { moveStartTime = System.currentTimeMillis(); - } else { + } + else { moveStartTime = -1; } mouseActionState = MotesActionState.DEFAULT_PRESS; @@ -1028,19 +1058,19 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { } 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) { Position center = transformPixelToPosition(zoomCenter); viewportTransform.setToScale( - newZoom, - newZoom + newZoom, + newZoom ); Position newCenter = transformPixelToPosition(zoomCenter); viewportTransform.translate( - newCenter.getXCoordinate() - center.getXCoordinate(), - newCenter.getYCoordinate() - center.getYCoordinate() + newCenter.getXCoordinate() - center.getXCoordinate(), + newCenter.getYCoordinate() - center.getYCoordinate() ); repaint(); } @@ -1077,9 +1107,9 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { * First mote in array is the bottom mote, last mote is the top mote. * * @param clickedX - * X coordinate + * X coordinate * @param clickedY - * Y coordinate + * Y coordinate * @return All motes at given position */ public Mote[] findMotesAtPosition(int clickedX, int clickedY) { @@ -1090,18 +1120,18 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { // Calculate painted mote radius in coordinates double paintedMoteWidth = transformToPositionX(MOTE_RADIUS) - - transformToPositionX(0); + - transformToPositionX(0); double paintedMoteHeight = transformToPositionY(MOTE_RADIUS) - - transformToPositionY(0); + - transformToPositionY(0); for (int i = 0; i < simulation.getMotesCount(); i++) { Position pos = simulation.getMote(i).getInterfaces().getPosition(); // Transform to unit circle before checking if mouse hit this mote double distanceX = Math.abs(xCoord - pos.getXCoordinate()) - / paintedMoteWidth; + / paintedMoteWidth; double distanceY = Math.abs(yCoord - pos.getYCoordinate()) - / paintedMoteHeight; + / paintedMoteHeight; if (distanceX * distanceX + distanceY * distanceY <= 1) { motes.add(simulation.getMote(i)); @@ -1120,24 +1150,24 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { /* Paint mote relations */ if (showMoteToMoteRelations) { - MoteRelation[] relations = simulation.getCooja().getMoteRelations(); - for (MoteRelation r: relations) { - Position sourcePos = r.source.getInterfaces().getPosition(); - Position destPos = r.dest.getInterfaces().getPosition(); + MoteRelation[] relations = simulation.getCooja().getMoteRelations(); + for (MoteRelation r : relations) { + Position sourcePos = r.source.getInterfaces().getPosition(); + Position destPos = r.dest.getInterfaces().getPosition(); - Point sourcePoint = transformPositionToPixel(sourcePos); - Point destPoint = transformPositionToPixel(destPos); + Point sourcePoint = transformPositionToPixel(sourcePos); + Point destPoint = transformPositionToPixel(destPos); - g.setColor(r.color == null ? Color.black : r.color); - drawArrow(g, sourcePoint.x, sourcePoint.y, destPoint.x, destPoint.y, MOTE_RADIUS + 1); - } + g.setColor(r.color == null ? Color.black : r.color); + drawArrow(g, sourcePoint.x, sourcePoint.y, destPoint.x, destPoint.y, MOTE_RADIUS + 1); + } } - for (Mote mote: allMotes) { + for (Mote mote : allMotes) { /* Use the first skin's non-null mote colors */ Color moteColors[] = null; - for (VisualizerSkin skin: currentSkins) { + for (VisualizerSkin skin : currentSkins) { moteColors = skin.getColorOf(mote); if (moteColors != null) { break; @@ -1156,33 +1186,37 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { if (mote == movedMotes) { g.setColor(MOVE_COLOR); g.fillOval(x - MOTE_RADIUS, y - MOTE_RADIUS, 2 * MOTE_RADIUS, - 2 * MOTE_RADIUS); - } else if (!highlightedMotes.isEmpty() && highlightedMotes.contains(mote)) { + 2 * MOTE_RADIUS); + } + else if (!highlightedMotes.isEmpty() && highlightedMotes.contains(mote)) { g.setColor(HIGHLIGHT_COLOR); g.fillOval(x - MOTE_RADIUS, y - MOTE_RADIUS, 2 * MOTE_RADIUS, - 2 * MOTE_RADIUS); - } else if (moteColors.length >= 2) { + 2 * MOTE_RADIUS); + } + else if (moteColors.length >= 2) { g.setColor(moteColors[0]); g.fillOval(x - MOTE_RADIUS, y - MOTE_RADIUS, 2 * MOTE_RADIUS, - 2 * MOTE_RADIUS); + 2 * MOTE_RADIUS); g.setColor(moteColors[1]); 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.fillOval(x - MOTE_RADIUS, y - MOTE_RADIUS, 2 * MOTE_RADIUS, - 2 * MOTE_RADIUS); + 2 * MOTE_RADIUS); } g.setColor(Color.BLACK); g.drawOval(x - MOTE_RADIUS, y - MOTE_RADIUS, 2 * MOTE_RADIUS, - 2 * MOTE_RADIUS); + 2 * MOTE_RADIUS); } } private Polygon arrowPoly = new Polygon(); + private void drawArrow(Graphics g, int xSource, int ySource, int xDest, int yDest, int delta) { double dx = xSource - xDest; double dy = ySource - yDest; @@ -1205,11 +1239,11 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { } 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) { - 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 */ - for (Mote mote: motes) { + for (Mote mote : motes) { Position pos = mote.getInterfaces().getPosition(); smallX = Math.min(smallX, pos.getXCoordinate()); bigX = Math.max(bigX, pos.getXCoordinate()); @@ -1245,20 +1279,22 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { /* Scale viewport */ if (smallX == bigX) { scaleX = 1; - } else { + } + else { scaleX = (bigX - smallX) / (canvas.getWidth()); } if (smallY == bigY) { scaleY = 1; - } else { + } + else { scaleY = (bigY - smallY) / (canvas.getHeight()); } 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( - newZoom, - newZoom + newZoom, + newZoom ); /* Center visible motes */ @@ -1266,14 +1302,14 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - Position viewMid = - transformPixelToPosition(canvas.getWidth()/2, canvas.getHeight()/2); + Position viewMid + = transformPixelToPosition(canvas.getWidth() / 2, canvas.getHeight() / 2); double motesMidX = (smallXfinal + bigXfinal) / 2.0; double motesMidY = (smallYfinal + bigYfinal) / 2.0; viewportTransform.translate( - viewMid.getXCoordinate() - motesMidX, - viewMid.getYCoordinate() - motesMidY); + viewMid.getXCoordinate() - motesMidX, + viewMid.getYCoordinate() - motesMidY); canvas.repaint(); } }); @@ -1284,14 +1320,14 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { * current sized canvas. * * @param pos - * Real-world position + * Real-world position * @return Pixel coordinates */ public Point transformPositionToPixel(Position pos) { return transformPositionToPixel( - pos.getXCoordinate(), - pos.getYCoordinate(), - pos.getZCoordinate() + pos.getXCoordinate(), + pos.getYCoordinate(), + pos.getZCoordinate() ); } @@ -1319,38 +1355,42 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { * Transforms a pixel coordinate to a real-world. Z-value will always be 0. * * @param pixelPos - * On-screen pixel coordinate + * On-screen pixel coordinate * @return Real world coordinate (z=0). */ public Position transformPixelToPosition(Point pixelPos) { return transformPixelToPosition(pixelPos.x, pixelPos.y); } + public Position transformPixelToPosition(int x, int y) { Position position = new Position(null); position.setCoordinates( - transformToPositionX(x), - transformToPositionY(y), - 0.0 + transformToPositionX(x), + transformToPositionY(y), + 0.0 ); return position; } private int transformToPixelX(double x) { - return (int) (viewportTransform.getScaleX()*x + viewportTransform.getTranslateX()); + return (int) (viewportTransform.getScaleX() * x + viewportTransform.getTranslateX()); } + private int transformToPixelY(double y) { - return (int) (viewportTransform.getScaleY()*y + viewportTransform.getTranslateY()); + return (int) (viewportTransform.getScaleY() * y + viewportTransform.getTranslateY()); } + private double transformToPositionX(int x) { - return (x - viewportTransform.getTranslateX())/viewportTransform.getScaleX() ; + return (x - viewportTransform.getTranslateX()) / viewportTransform.getScaleX(); } + private double transformToPositionY(int y) { - return (y - viewportTransform.getTranslateY())/viewportTransform.getScaleY() ; + return (y - viewportTransform.getTranslateY()) / viewportTransform.getScaleY(); } @Override public void closePlugin() { - for (VisualizerSkin skin: currentSkins) { + for (VisualizerSkin skin : currentSkins) { skin.setInactive(); } currentSkins.clear(); @@ -1362,7 +1402,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { } simulation.getEventCentral().removeMoteCountListener(newMotesListener); - for (Mote mote: simulation.getMotes()) { + for (Mote mote : simulation.getMotes()) { Position pos = mote.getInterfaces().getPosition(); if (pos != null) { pos.deleteObserver(posObserver); @@ -1372,6 +1412,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { protected boolean isDropFileAccepted(File file) { return true; /* TODO */ + } protected void handleDropFile(File file, Point point) { @@ -1392,17 +1433,17 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { /* Show mote-to-mote relations */ if (showMoteToMoteRelations) { - element = new Element("moterelations"); - element.setText("" + true); - config.add(element); + element = new Element("moterelations"); + element.setText("" + true); + config.add(element); } - + /* Skins */ - for (int i=currentSkins.size()-1; i >= 0; i--) { - VisualizerSkin skin = currentSkins.get(i); - element = new Element("skin"); - element.setText(skin.getClass().getName()); - config.add(element); + for (int i = currentSkins.size() - 1; i >= 0; i--) { + VisualizerSkin skin = currentSkins.get(i); + element = new Element("skin"); + element.setText(skin.getClass().getName()); + config.add(element); } /* Viewport */ @@ -1410,19 +1451,19 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { double[] matrix = new double[6]; viewportTransform.getMatrix(matrix); element.setText( - matrix[0] + " " + - matrix[1] + " " + - matrix[2] + " " + - matrix[3] + " " + - matrix[4] + " " + - matrix[5] + matrix[0] + " " + + matrix[1] + " " + + matrix[2] + " " + + matrix[3] + " " + + matrix[4] + " " + + matrix[5] ); config.add(element); /* Hide decorations */ BasicInternalFrameUI ui = (BasicInternalFrameUI) getUI(); - if (ui.getNorthPane().getPreferredSize() == null || - ui.getNorthPane().getPreferredSize().height == 0) { + if (ui.getNorthPane().getPreferredSize() == null + || ui.getNorthPane().getPreferredSize().height == 0) { element = new Element("hidden"); config.add(element); } @@ -1440,13 +1481,13 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { String wanted = element.getText(); /* Backwards compatibility: se.sics -> org.contikios */ if (wanted.startsWith("se.sics")) { - wanted = wanted.replaceFirst("se\\.sics", "org.contikios"); + wanted = wanted.replaceFirst("se\\.sics", "org.contikios"); } - for (Class skinClass: visualizerSkins) { + for (Class skinClass : visualizerSkins) { if (wanted.equals(skinClass.getName()) - /* Backwards compatibility */ - || wanted.equals(Cooja.getDescriptionOf(skinClass))) { + /* Backwards compatibility */ + || wanted.equals(Cooja.getDescriptionOf(skinClass))) { final Class skin = skinClass; SwingUtilities.invokeLater(new Runnable() { @Override @@ -1461,27 +1502,31 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { if (wanted != null) { logger.warn("Could not load visualizer: " + element.getText()); } - } else if (element.getName().equals("moterelations")) { - showMoteToMoteRelations = true; - } else if (element.getName().equals("viewport")) { + } + else if (element.getName().equals("moterelations")) { + showMoteToMoteRelations = true; + } + else if (element.getName().equals("viewport")) { try { String[] matrix = element.getText().split(" "); viewportTransform.setTransform( - Double.parseDouble(matrix[0]), - Double.parseDouble(matrix[1]), - Double.parseDouble(matrix[2]), - Double.parseDouble(matrix[3]), - Double.parseDouble(matrix[4]), - Double.parseDouble(matrix[5]) + Double.parseDouble(matrix[0]), + Double.parseDouble(matrix[1]), + Double.parseDouble(matrix[2]), + Double.parseDouble(matrix[3]), + Double.parseDouble(matrix[4]), + Double.parseDouble(matrix[5]) ); resetViewport = 0; - } catch (NumberFormatException e) { + } + catch (NumberFormatException e) { logger.warn("Bad viewport: " + e.getMessage()); resetViewport(); } - } else if (element.getName().equals("hidden")) { + } + else if (element.getName().equals("hidden")) { BasicInternalFrameUI ui = (BasicInternalFrameUI) getUI(); - ui.getNorthPane().setPreferredSize(new Dimension(0,0)); + ui.getNorthPane().setPreferredSize(new Dimension(0, 0)); } } return true; @@ -1491,7 +1536,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { @Override public void actionPerformed(ActionEvent e) { StringBuilder sb = new StringBuilder(); - for (VisualizerSkin skin: currentSkins) { + for (VisualizerSkin skin : currentSkins) { if (sb.length() > 0) { sb.append(';'); } @@ -1502,15 +1547,18 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { }; protected static class ButtonClickMoteMenuAction implements MoteMenuAction { + @Override public boolean isEnabled(Visualizer visualizer, Mote mote) { return mote.getInterfaces().getButton() != null - && !mote.getInterfaces().getButton().isPressed(); + && !mote.getInterfaces().getButton().isPressed(); } + @Override public String getDescription(Visualizer visualizer, Mote mote) { return "Click button on " + mote; } + @Override public void doAction(Visualizer visualizer, Mote mote) { mote.getInterfaces().getButton().clickButton(); @@ -1518,14 +1566,17 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { }; protected static class DeleteMoteMenuAction implements MoteMenuAction { + @Override public boolean isEnabled(Visualizer visualizer, Mote mote) { return true; } + @Override public String getDescription(Visualizer visualizer, Mote mote) { return "Delete " + mote; } + @Override public void doAction(Visualizer visualizer, Mote mote) { mote.getSimulation().removeMote(mote); @@ -1533,14 +1584,17 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { }; protected static class ShowLEDMoteMenuAction implements MoteMenuAction { + @Override public boolean isEnabled(Visualizer visualizer, Mote mote) { return mote.getInterfaces().getLED() != null; } + @Override public String getDescription(Visualizer visualizer, Mote mote) { return "Show LEDs on " + mote; } + @Override public void doAction(Visualizer visualizer, Mote mote) { Simulation simulation = mote.getSimulation(); @@ -1552,12 +1606,12 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { /* Extract description (input to plugin) */ String desc = Cooja.getDescriptionOf(mote.getInterfaces().getLED()); - MoteInterfaceViewer viewer = - (MoteInterfaceViewer) simulation.getCooja().tryStartPlugin( - MoteInterfaceViewer.class, - simulation.getCooja(), - simulation, - mote); + MoteInterfaceViewer viewer + = (MoteInterfaceViewer) simulation.getCooja().tryStartPlugin( + MoteInterfaceViewer.class, + simulation.getCooja(), + simulation, + mote); if (viewer == null) { return; } @@ -1567,24 +1621,27 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { }; protected static class ShowSerialMoteMenuAction implements MoteMenuAction { + @Override public boolean isEnabled(Visualizer visualizer, Mote mote) { - for (MoteInterface intf: mote.getInterfaces().getInterfaces()) { + for (MoteInterface intf : mote.getInterfaces().getInterfaces()) { if (intf instanceof SerialPort) { return true; } } return false; } + @Override public String getDescription(Visualizer visualizer, Mote mote) { return "Show serial port on " + mote; } + @Override public void doAction(Visualizer visualizer, Mote mote) { Simulation simulation = mote.getSimulation(); SerialPort serialPort = null; - for (MoteInterface intf: mote.getInterfaces().getInterfaces()) { + for (MoteInterface intf : mote.getInterfaces().getInterfaces()) { if (intf instanceof SerialPort) { serialPort = (SerialPort) intf; break; @@ -1598,12 +1655,12 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { /* Extract description (input to plugin) */ String desc = Cooja.getDescriptionOf(serialPort); - MoteInterfaceViewer viewer = - (MoteInterfaceViewer) simulation.getCooja().tryStartPlugin( - MoteInterfaceViewer.class, - simulation.getCooja(), - simulation, - mote); + MoteInterfaceViewer viewer + = (MoteInterfaceViewer) simulation.getCooja().tryStartPlugin( + MoteInterfaceViewer.class, + simulation.getCooja(), + simulation, + mote); if (viewer == null) { return; } @@ -1613,14 +1670,17 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { }; protected static class MoveMoteMenuAction implements MoteMenuAction { + @Override public boolean isEnabled(Visualizer visualizer, Mote mote) { return true; } + @Override public String getDescription(Visualizer visualizer, Mote mote) { return "Move " + mote; } + @Override public void doAction(Visualizer visualizer, Mote mote) { visualizer.beginMoveRequest(mote, false, false); @@ -1628,15 +1688,18 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { }; protected static class ResetViewportAction implements SimulationMenuAction { + @Override public void doAction(Visualizer visualizer, Simulation simulation) { visualizer.resetViewport = 1; visualizer.repaint(); } + @Override public String getDescription(Visualizer visualizer, Simulation simulation) { return "Reset viewport"; } + @Override public boolean isEnabled(Visualizer visualizer, Simulation simulation) { return true; @@ -1644,6 +1707,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { }; protected static class ToggleDecorationsMenuAction implements SimulationMenuAction { + @Override public void doAction(final Visualizer visualizer, Simulation simulation) { if (!(visualizer.getUI() instanceof BasicInternalFrameUI)) { @@ -1651,13 +1715,14 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { } BasicInternalFrameUI ui = (BasicInternalFrameUI) visualizer.getUI(); - if (ui.getNorthPane().getPreferredSize() == null || - ui.getNorthPane().getPreferredSize().height == 0) { + if (ui.getNorthPane().getPreferredSize() == null + || ui.getNorthPane().getPreferredSize().height == 0) { /* Restore window decorations */ ui.getNorthPane().setPreferredSize(null); - } else { + } + else { /* Hide window decorations */ - ui.getNorthPane().setPreferredSize(new Dimension(0,0)); + ui.getNorthPane().setPreferredSize(new Dimension(0, 0)); } visualizer.revalidate(); SwingUtilities.invokeLater(new Runnable() { @@ -1667,6 +1732,7 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { } }); } + @Override public String getDescription(Visualizer visualizer, Simulation simulation) { if (!(visualizer.getUI() instanceof BasicInternalFrameUI)) { @@ -1674,12 +1740,13 @@ public class Visualizer extends VisPlugin implements HasQuickHelp { } BasicInternalFrameUI ui = (BasicInternalFrameUI) visualizer.getUI(); - if (ui.getNorthPane().getPreferredSize() == null || - ui.getNorthPane().getPreferredSize().height == 0) { + if (ui.getNorthPane().getPreferredSize() == null + || ui.getNorthPane().getPreferredSize().height == 0) { return "Restore window decorations"; } return "Hide window decorations"; } + @Override public boolean isEnabled(Visualizer visualizer, Simulation simulation) { return visualizer.getUI() instanceof BasicInternalFrameUI; diff --git a/tools/cooja/java/org/contikios/cooja/plugins/skins/DGRMVisualizerSkin.java b/tools/cooja/java/org/contikios/cooja/plugins/skins/DGRMVisualizerSkin.java index 7d8bf882b..cc991be25 100644 --- a/tools/cooja/java/org/contikios/cooja/plugins/skins/DGRMVisualizerSkin.java +++ b/tools/cooja/java/org/contikios/cooja/plugins/skins/DGRMVisualizerSkin.java @@ -27,7 +27,6 @@ * SUCH DAMAGE. * */ - package org.contikios.cooja.plugins.skins; import java.awt.Color; @@ -53,113 +52,122 @@ import org.contikios.cooja.radiomediums.DirectedGraphMedium; @ClassDescription("Radio environment (DGRM)") @SupportedArguments(radioMediums = {DirectedGraphMedium.class}) public class DGRMVisualizerSkin implements VisualizerSkin { - private static final Logger logger = Logger.getLogger(DGRMVisualizerSkin.class); - private Simulation simulation = null; - private Visualizer visualizer = null; + private static final Logger logger = Logger.getLogger(DGRMVisualizerSkin.class); + + private Simulation simulation = null; + private Visualizer visualizer = null; @Override - public void setActive(Simulation simulation, Visualizer vis) { - if (!(simulation.getRadioMedium() instanceof DirectedGraphMedium)) { - logger.fatal("Cannot activate DGRM skin for unknown radio medium: " + simulation.getRadioMedium()); - return; - } - this.simulation = simulation; - this.visualizer = vis; - } + public void setActive(Simulation simulation, Visualizer vis) { + if (!(simulation.getRadioMedium() instanceof DirectedGraphMedium)) { + logger.fatal("Cannot activate DGRM skin for unknown radio medium: " + simulation.getRadioMedium()); + return; + } + this.simulation = simulation; + this.visualizer = vis; + } @Override - public void setInactive() { - if (simulation == null) { - /* Skin was never activated */ - return; - } - } + public void setInactive() { + if (simulation == null) { + /* Skin was never activated */ + return; + } + } @Override - public Color[] getColorOf(Mote mote) { - if (visualizer.getSelectedMotes().contains(mote)) { - return new Color[] { Color.CYAN }; - } - return null; - } + public Color[] getColorOf(Mote mote) { + if (visualizer.getSelectedMotes().contains(mote)) { + return new Color[]{Color.CYAN}; + } + return null; + } @Override - public void paintBeforeMotes(Graphics g) { - Set selectedMotes = visualizer.getSelectedMotes(); - if (simulation == null || selectedMotes == null) { - return; - } + public void paintBeforeMotes(Graphics g) { + Set selectedMotes = visualizer.getSelectedMotes(); + if (simulation == null || selectedMotes == null) { + return; + } - for (final Mote selectedMote : selectedMotes) { - if (selectedMote.getInterfaces().getRadio() == null) { - continue; - } + for (final Mote selectedMote : selectedMotes) { + if (selectedMote.getInterfaces().getRadio() == null) { + continue; + } - /* Paint transmission and interference range for selected mote */ - Position motePos = selectedMote.getInterfaces().getPosition(); + /* Paint transmission and interference range for selected mote */ + Position motePos = selectedMote.getInterfaces().getPosition(); - Point pixelCoord = visualizer.transformPositionToPixel(motePos); - int x = pixelCoord.x; - int y = pixelCoord.y; - Radio selectedRadio = selectedMote.getInterfaces().getRadio(); + Point pixelCoord = visualizer.transformPositionToPixel(motePos); + int x = pixelCoord.x; + int y = pixelCoord.y; + Radio selectedRadio = selectedMote.getInterfaces().getRadio(); - FontMetrics fm = g.getFontMetrics(); - g.setColor(Color.BLACK); + FontMetrics fm = g.getFontMetrics(); + g.setColor(Color.BLACK); - DirectedGraphMedium radioMedium = (DirectedGraphMedium) simulation.getRadioMedium(); + DirectedGraphMedium radioMedium = (DirectedGraphMedium) simulation.getRadioMedium(); - /* Print transmission success probabilities */ - DestinationRadio[] dests = radioMedium.getPotentialDestinations(selectedRadio); - if (dests == null || dests.length == 0) { - String msg = "No edges"; - int msgWidth = fm.stringWidth(msg); - g.setColor(Color.BLACK); - g.drawString(msg, x - msgWidth / 2, y + 2 * Visualizer.MOTE_RADIUS + 3); - continue; - } - String msg = dests.length + " edges"; - int msgWidth = fm.stringWidth(msg); - g.setColor(Color.BLACK); - g.drawString(msg, x - msgWidth / 2, y + 2 * Visualizer.MOTE_RADIUS + 3); - /* Draw LQI/RSSI edges */ - for (DestinationRadio r : dests) { - double prob = ((DGRMDestinationRadio)r).ratio; - double rssi = ((DGRMDestinationRadio)r).signal; - double pos_rssi = rssi + 100; - int lqi = ((DGRMDestinationRadio)r).lqi; - float red = (float)(1 - prob*pos_rssi/90*lqi/100); - if(red > 1) red = 1; - if(red < 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) { - continue; - } - Position pos = r.radio.getPosition(); - Point pixel = visualizer.transformPositionToPixel(pos); - g.setColor(new Color(red, green, 0.0f)); - g.drawString("LQI: " + lqi, (x + pixel.x) / 2, (y + pixel.y) / 2); - g.drawString("RSSI: " + rssi, (x + pixel.x) / 2, (y + pixel.y) / 2 + g.getFontMetrics().getHeight()); - g.drawLine(x, y, pixel.x, pixel.y); - /* Draw success ratio only if single mote selected */ - if (selectedMotes.size() == 1) { - g.setColor(Color.BLACK); - msg = String.format("%1.1f%%", 100.0 * prob); - msgWidth = fm.stringWidth(msg); - g.drawString(msg, pixel.x - msgWidth/2, pixel.y + 2*Visualizer.MOTE_RADIUS + 3); - } - } - } - } + /* Print transmission success probabilities */ + DestinationRadio[] dests = radioMedium.getPotentialDestinations(selectedRadio); + if (dests == null || dests.length == 0) { + String msg = "No edges"; + int msgWidth = fm.stringWidth(msg); + g.setColor(Color.BLACK); + g.drawString(msg, x - msgWidth / 2, y + 2 * Visualizer.MOTE_RADIUS + 3); + continue; + } + String msg = dests.length + " edges"; + int msgWidth = fm.stringWidth(msg); + g.setColor(Color.BLACK); + g.drawString(msg, x - msgWidth / 2, y + 2 * Visualizer.MOTE_RADIUS + 3); + /* Draw LQI/RSSI edges */ + for (DestinationRadio r : dests) { + double prob = ((DGRMDestinationRadio) r).ratio; + double rssi = ((DGRMDestinationRadio) r).signal; + double pos_rssi = rssi + 100; + int lqi = ((DGRMDestinationRadio) r).lqi; + float red = (float) (1 - prob * pos_rssi / 90 * lqi / 100); + if (red > 1) { + red = 1; + } + if (red < 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) { + continue; + } + Position pos = r.radio.getPosition(); + Point pixel = visualizer.transformPositionToPixel(pos); + g.setColor(new Color(red, green, 0.0f)); + g.drawString("LQI: " + lqi, (x + pixel.x) / 2, (y + pixel.y) / 2); + g.drawString("RSSI: " + rssi, (x + pixel.x) / 2, (y + pixel.y) / 2 + g.getFontMetrics().getHeight()); + g.drawLine(x, y, pixel.x, pixel.y); + /* Draw success ratio only if single mote selected */ + if (selectedMotes.size() == 1) { + g.setColor(Color.BLACK); + msg = String.format("%1.1f%%", 100.0 * prob); + msgWidth = fm.stringWidth(msg); + g.drawString(msg, pixel.x - msgWidth / 2, pixel.y + 2 * Visualizer.MOTE_RADIUS + 3); + } + } + } + } @Override - public void paintAfterMotes(Graphics g) { - } + public void paintAfterMotes(Graphics g) { + } @Override - public Visualizer getVisualizer() { - return visualizer; - } + public Visualizer getVisualizer() { + return visualizer; + } } diff --git a/tools/cooja/java/org/contikios/cooja/plugins/skins/UDGMVisualizerSkin.java b/tools/cooja/java/org/contikios/cooja/plugins/skins/UDGMVisualizerSkin.java index 4c0a18b0f..45f7a826a 100644 --- a/tools/cooja/java/org/contikios/cooja/plugins/skins/UDGMVisualizerSkin.java +++ b/tools/cooja/java/org/contikios/cooja/plugins/skins/UDGMVisualizerSkin.java @@ -27,7 +27,6 @@ * SUCH DAMAGE. * */ - package org.contikios.cooja.plugins.skins; import java.awt.BorderLayout; @@ -87,6 +86,7 @@ import org.contikios.cooja.radiomediums.UDGM; @ClassDescription("Radio environment (UDGM)") @SupportedArguments(radioMediums = {UDGM.class}) public class UDGMVisualizerSkin implements VisualizerSkin { + private static final Logger logger = Logger.getLogger(UDGMVisualizerSkin.class); 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() { @Override public void stateChanged(ChangeEvent e) { - radioMedium.setTxRange(((SpinnerNumberModel) - txRangeSpinner.getModel()).getNumber().doubleValue()); + radioMedium.setTxRange(((SpinnerNumberModel) txRangeSpinner.getModel()) + .getNumber().doubleValue()); visualizer.repaint(); } }); @@ -167,8 +167,8 @@ public class UDGMVisualizerSkin implements VisualizerSkin { interferenceRangeSpinner.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { - radioMedium.setInterferenceRange(((SpinnerNumberModel) - interferenceRangeSpinner.getModel()).getNumber().doubleValue()); + radioMedium.setInterferenceRange(((SpinnerNumberModel) interferenceRangeSpinner.getModel()) + .getNumber().doubleValue()); visualizer.repaint(); } }); @@ -176,8 +176,8 @@ public class UDGMVisualizerSkin implements VisualizerSkin { successRatioTxSpinner.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { - radioMedium.SUCCESS_RATIO_TX = ((SpinnerNumberModel) - successRatioTxSpinner.getModel()).getNumber().doubleValue(); + radioMedium.SUCCESS_RATIO_TX = ((SpinnerNumberModel) successRatioTxSpinner.getModel()) + .getNumber().doubleValue(); visualizer.repaint(); } }); @@ -185,8 +185,8 @@ public class UDGMVisualizerSkin implements VisualizerSkin { successRatioRxSpinner.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { - radioMedium.SUCCESS_RATIO_RX = ((SpinnerNumberModel) - successRatioRxSpinner.getModel()).getNumber().doubleValue(); + radioMedium.SUCCESS_RATIO_RX = ((SpinnerNumberModel) successRatioRxSpinner.getModel()) + .getNumber().doubleValue(); visualizer.repaint(); } }); @@ -199,7 +199,7 @@ public class UDGMVisualizerSkin implements VisualizerSkin { JPanel main = new JPanel(); main.setLayout(new BoxLayout(main, BoxLayout.Y_AXIS)); main.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); - + rangeTX = Box.createHorizontalBox(); rangeTX.add(new JLabel("TX range:")); rangeTX.add(Box.createHorizontalStrut(5)); @@ -221,12 +221,12 @@ public class UDGMVisualizerSkin implements VisualizerSkin { rangeINT.setVisible(false); ratioTX.setVisible(false); ratioRX.setVisible(false); - + main.add(rangeTX); main.add(rangeINT); main.add(ratioTX); main.add(ratioRX); - + rrFrame = new JInternalFrame("UDGM", false, true); rrFrame.setVisible(false); rrFrame.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); @@ -264,7 +264,7 @@ public class UDGMVisualizerSkin implements VisualizerSkin { @Override public Color[] getColorOf(Mote mote) { if (visualizer.getSelectedMotes().contains(mote)) { - return new Color[] { Color.CYAN }; + return new Color[]{Color.CYAN}; } return null; } @@ -280,7 +280,7 @@ public class UDGMVisualizerSkin implements VisualizerSkin { Area intRangeMaxArea = new Area(); Area trxRangeArea = new Area(); Area trxRangeMaxArea = new Area(); - + for (Mote selectedMote : selectedMotes) { if (selectedMote.getInterfaces().getRadio() == null) { continue; @@ -336,7 +336,7 @@ public class UDGMVisualizerSkin implements VisualizerSkin { y - translatedTransmission.y, 2 * translatedTransmission.x, 2 * translatedTransmission.y))); - + intRangeMaxArea.add(new Area(new Ellipse2D.Double( x - translatedInterferenceMax.x, y - translatedInterferenceMax.y, @@ -349,16 +349,16 @@ public class UDGMVisualizerSkin implements VisualizerSkin { y - translatedTransmissionMax.y, 2 * translatedTransmissionMax.x, 2 * translatedTransmissionMax.y))); - + } - + Graphics2D g2d = (Graphics2D) g; - + g2d.setColor(COLOR_INT); g2d.fill(intRangeArea); g.setColor(Color.GRAY); g2d.draw(intRangeMaxArea); - + g.setColor(COLOR_TX); g2d.fill(trxRangeArea); g.setColor(Color.GRAY); @@ -371,20 +371,20 @@ public class UDGMVisualizerSkin implements VisualizerSkin { if (selectedMotes.size() == 1) { Mote selectedMote = selectedMotes.toArray(new Mote[0])[0]; Radio selectedRadio = selectedMote.getInterfaces().getRadio(); - for (Mote m: simulation.getMotes()) { - if (m == selectedMote) { - continue; - } - double prob = - ((UDGM) simulation.getRadioMedium()).getSuccessProbability(selectedRadio, m.getInterfaces().getRadio()); - if (prob == 0.0d) { - continue; - } - String msg = (((int)(1000*prob))/10.0) + "%"; - Position pos = m.getInterfaces().getPosition(); - Point pixel = visualizer.transformPositionToPixel(pos); - int msgWidth = fm.stringWidth(msg); - g.drawString(msg, pixel.x - msgWidth/2, pixel.y + 2*Visualizer.MOTE_RADIUS + 3); + for (Mote m : simulation.getMotes()) { + if (m == selectedMote) { + continue; + } + double prob + = ((UDGM) simulation.getRadioMedium()).getSuccessProbability(selectedRadio, m.getInterfaces().getRadio()); + if (prob == 0.0d) { + continue; + } + String msg = (((int) (1000 * prob)) / 10.0) + "%"; + Position pos = m.getInterfaces().getPosition(); + Point pixel = visualizer.transformPositionToPixel(pos); + int msgWidth = fm.stringWidth(msg); + 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 { + @Override public boolean isEnabled(Visualizer visualizer, Simulation simulation) { return true; @@ -420,6 +421,7 @@ public class UDGMVisualizerSkin implements VisualizerSkin { }; public static class SuccessRatioMenuAction implements SimulationMenuAction { + @Override public boolean isEnabled(Visualizer visualizer, Simulation simulation) { return true; @@ -433,7 +435,7 @@ public class UDGMVisualizerSkin implements VisualizerSkin { @Override public void doAction(Visualizer visualizer, Simulation simulation) { VisualizerSkin[] skins = visualizer.getCurrentSkins(); - for (VisualizerSkin skin: skins) { + for (VisualizerSkin skin : skins) { if (skin instanceof UDGMVisualizerSkin) { UDGMVisualizerSkin vskin = ((UDGMVisualizerSkin) skin); vskin.ratioTX.setVisible(true);