From 1b87be975ae1110eeedcac5f260df54bdb42bd8c Mon Sep 17 00:00:00 2001 From: fros4943 Date: Mon, 6 Sep 2010 12:00:46 +0000 Subject: [PATCH] changed default udgm to calculate success probabilities by distance. the previous behavior of udgm was renamed to "UDGM: Constant Loss" --- tools/cooja/config/cooja_applet.config | 2 +- tools/cooja/config/cooja_default.config | 2 +- .../plugins/skins/UDGMVisualizerSkin.java | 25 +++++++- .../java/se/sics/cooja/radiomediums/UDGM.java | 32 ++++++++-- .../cooja/radiomediums/UDGMConstantLoss.java | 64 +++++++++++++++++++ 5 files changed, 116 insertions(+), 9 deletions(-) create mode 100644 tools/cooja/java/se/sics/cooja/radiomediums/UDGMConstantLoss.java diff --git a/tools/cooja/config/cooja_applet.config b/tools/cooja/config/cooja_applet.config index 5f2d483cd..2716ab234 100644 --- a/tools/cooja/config/cooja_applet.config +++ b/tools/cooja/config/cooja_applet.config @@ -2,4 +2,4 @@ se.sics.cooja.GUI.MOTETYPES = se.sics.cooja.motes.DisturberMoteType se.sics.cooj se.sics.cooja.GUI.PLUGINS = se.sics.cooja.plugins.Visualizer se.sics.cooja.plugins.LogListener se.sics.cooja.plugins.MoteInformation se.sics.cooja.plugins.MoteInterfaceViewer se.sics.cooja.plugins.VariableWatcher se.sics.cooja.plugins.EventListener se.sics.cooja.plugins.RadioLogger se.sics.cooja.mspmote.plugins.MspCodeWatcher se.sics.cooja.mspmote.plugins.MspStackWatcher se.sics.cooja.mspmote.plugins.MspCycleWatcher se.sics.cooja.GUI.IP_DISTRIBUTORS = se.sics.cooja.ipdistributors.RandomIPDistributor se.sics.cooja.ipdistributors.SpatialIPDistributor se.sics.cooja.ipdistributors.IdIPDistributor se.sics.cooja.GUI.POSITIONERS = se.sics.cooja.positioners.RandomPositioner se.sics.cooja.positioners.LinearPositioner se.sics.cooja.positioners.EllipsePositioner se.sics.cooja.positioners.ManualPositioner -se.sics.cooja.GUI.RADIOMEDIUMS = se.sics.cooja.radiomediums.UDGM se.sics.cooja.radiomediums.DirectedGraphMedium se.sics.mrm.MRM se.sics.cooja.radiomediums.SilentRadioMedium +se.sics.cooja.GUI.RADIOMEDIUMS = se.sics.cooja.radiomediums.UDGM se.sics.cooja.radiomediums.UDGMConstantLoss se.sics.cooja.radiomediums.DirectedGraphMedium se.sics.mrm.MRM se.sics.cooja.radiomediums.SilentRadioMedium diff --git a/tools/cooja/config/cooja_default.config b/tools/cooja/config/cooja_default.config index 8dc6a88a1..660156079 100644 --- a/tools/cooja/config/cooja_default.config +++ b/tools/cooja/config/cooja_default.config @@ -6,4 +6,4 @@ se.sics.cooja.GUI.MOTETYPES = se.sics.cooja.motes.ImportAppMoteType se.sics.cooj se.sics.cooja.GUI.PLUGINS = se.sics.cooja.plugins.Visualizer se.sics.cooja.plugins.LogListener se.sics.cooja.plugins.TimeLine se.sics.cooja.plugins.MoteInformation se.sics.cooja.plugins.MoteInterfaceViewer se.sics.cooja.plugins.VariableWatcher se.sics.cooja.plugins.EventListener se.sics.cooja.plugins.RadioLogger se.sics.cooja.plugins.ScriptRunner se.sics.cooja.plugins.Notes se.sics.cooja.GUI.IP_DISTRIBUTORS = se.sics.cooja.ipdistributors.RandomIPDistributor se.sics.cooja.ipdistributors.SpatialIPDistributor se.sics.cooja.ipdistributors.IdIPDistributor se.sics.cooja.GUI.POSITIONERS = se.sics.cooja.positioners.RandomPositioner se.sics.cooja.positioners.LinearPositioner se.sics.cooja.positioners.EllipsePositioner se.sics.cooja.positioners.ManualPositioner -se.sics.cooja.GUI.RADIOMEDIUMS = se.sics.cooja.radiomediums.UDGM se.sics.cooja.radiomediums.DirectedGraphMedium se.sics.cooja.radiomediums.SilentRadioMedium +se.sics.cooja.GUI.RADIOMEDIUMS = se.sics.cooja.radiomediums.UDGM se.sics.cooja.radiomediums.UDGMConstantLoss se.sics.cooja.radiomediums.DirectedGraphMedium se.sics.cooja.radiomediums.SilentRadioMedium diff --git a/tools/cooja/java/se/sics/cooja/plugins/skins/UDGMVisualizerSkin.java b/tools/cooja/java/se/sics/cooja/plugins/skins/UDGMVisualizerSkin.java index 1d4744888..543206405 100644 --- a/tools/cooja/java/se/sics/cooja/plugins/skins/UDGMVisualizerSkin.java +++ b/tools/cooja/java/se/sics/cooja/plugins/skins/UDGMVisualizerSkin.java @@ -26,12 +26,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: UDGMVisualizerSkin.java,v 1.10 2010/02/03 15:49:25 fros4943 Exp $ + * $Id: UDGMVisualizerSkin.java,v 1.11 2010/09/06 12:00:46 fros4943 Exp $ */ package se.sics.cooja.plugins.skins; import java.awt.Color; +import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Point; import java.awt.event.MouseAdapter; @@ -336,6 +337,28 @@ public class UDGMVisualizerSkin implements VisualizerSkin { y - translatedTransmissionMax.y, 2 * translatedTransmissionMax.x, 2 * translatedTransmissionMax.y); + + + FontMetrics fm = g.getFontMetrics(); + g.setColor(Color.BLACK); + + /* Print transmission success probabilities */ + 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 = (double)(((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); + } + } public void paintAfterMotes(Graphics g) { diff --git a/tools/cooja/java/se/sics/cooja/radiomediums/UDGM.java b/tools/cooja/java/se/sics/cooja/radiomediums/UDGM.java index b77720ca8..a9b2d6ab3 100644 --- a/tools/cooja/java/se/sics/cooja/radiomediums/UDGM.java +++ b/tools/cooja/java/se/sics/cooja/radiomediums/UDGM.java @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: UDGM.java,v 1.30 2010/02/03 15:49:25 fros4943 Exp $ + * $Id: UDGM.java,v 1.31 2010/09/06 12:00:46 fros4943 Exp $ */ package se.sics.cooja.radiomediums; @@ -80,7 +80,7 @@ import se.sics.cooja.radiomediums.DirectedGraphMedium.DestinationRadio; * @see UDGMVisualizerSkin * @author Fredrik Osterlind */ -@ClassDescription("Unit Disk Graph Medium (UDGM)") +@ClassDescription("Unit Disk Graph Medium (UDGM): Distance Loss") public class UDGM extends AbstractRadioMedium { private static Logger logger = Logger.getLogger(UDGM.class); @@ -89,14 +89,12 @@ public class UDGM extends AbstractRadioMedium { public double TRANSMITTING_RANGE = 50; /* Transmission range. */ public double INTERFERENCE_RANGE = 100; /* Interference range. Ignored if below transmission range. */ - private Simulation simulation; private DirectedGraphMedium dgrm; /* Used only for efficient destination lookup */ private Random random = null; public UDGM(Simulation simulation) { super(simulation); - this.simulation = simulation; random = simulation.getRandomGenerator(); dgrm = new DirectedGraphMedium() { protected void analyzeEdges() { @@ -166,7 +164,7 @@ public class UDGM extends AbstractRadioMedium { RadioConnection newConnection = new RadioConnection(sender); /* Fail radio transmission randomly - no radios will hear this transmission */ - if (SUCCESS_RATIO_TX < 1.0 && random.nextDouble() > SUCCESS_RATIO_TX) { + if (getTxSuccessProbability(sender) < 1.0 && random.nextDouble() > getTxSuccessProbability(sender)) { return newConnection; } @@ -222,7 +220,7 @@ public class UDGM extends AbstractRadioMedium { } else if (recv.isTransmitting()) { newConnection.addInterfered(recv); } else if (recv.isReceiving() || - (SUCCESS_RATIO_RX < 1.0 && random.nextDouble() > SUCCESS_RATIO_RX)) { + (random.nextDouble() > getRxSuccessProbability(sender, recv))) { /* Was receiving, or reception failed: start interfering */ newConnection.addInterfered(recv); recv.interfereAnyReception(); @@ -247,6 +245,28 @@ public class UDGM extends AbstractRadioMedium { return newConnection; } + + public double getSuccessProbability(Radio source, Radio dest) { + return getTxSuccessProbability(source) * getRxSuccessProbability(source, dest); + } + public double getTxSuccessProbability(Radio source) { + return SUCCESS_RATIO_TX; + } + public double getRxSuccessProbability(Radio source, Radio dest) { + double distance = source.getPosition().getDistanceTo(dest.getPosition()); + double distanceSquared = Math.pow(distance,2.0); + double distanceMax = TRANSMITTING_RANGE * + ((double) source.getCurrentOutputPowerIndicator() / (double) source.getOutputPowerIndicatorMax()); + if (distanceMax == 0.0) { + return 0.0; + } + double distanceMaxSquared = Math.pow(distanceMax,2.0); + double ratio = distanceSquared / distanceMaxSquared; + if (ratio > 1.0) { + return 0.0; + } + return 1.0 - ratio*(1.0-SUCCESS_RATIO_RX); + } public void updateSignalStrengths() { /* Override: uses distance as signal strength factor */ diff --git a/tools/cooja/java/se/sics/cooja/radiomediums/UDGMConstantLoss.java b/tools/cooja/java/se/sics/cooja/radiomediums/UDGMConstantLoss.java new file mode 100644 index 000000000..4b91f6ead --- /dev/null +++ b/tools/cooja/java/se/sics/cooja/radiomediums/UDGMConstantLoss.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2010, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: UDGMConstantLoss.java,v 1.1 2010/09/06 12:00:46 fros4943 Exp $ + */ + +package se.sics.cooja.radiomediums; + +import org.apache.log4j.Logger; + +import se.sics.cooja.ClassDescription; +import se.sics.cooja.Simulation; +import se.sics.cooja.interfaces.Radio; + +/** + * UDGM with constant loss probablity. + * + * @see UDGM + * @author Fredrik Osterlind + */ +@ClassDescription("UDGM: Constant Loss") +public class UDGMConstantLoss extends UDGM { + private static Logger logger = Logger.getLogger(UDGMConstantLoss.class); + + public UDGMConstantLoss(Simulation simulation) { + super(simulation); + } + + public double getRxSuccessProbability(Radio source, Radio dest) { + double distance = source.getPosition().getDistanceTo(dest.getPosition()); + double moteTransmissionRange = TRANSMITTING_RANGE + * ((double) source.getCurrentOutputPowerIndicator() / (double) source.getOutputPowerIndicatorMax()); + if (distance > moteTransmissionRange) { + return 0.0d; + } + return SUCCESS_RATIO_RX; + } + +}