added predefined obstacles (no need for external images)

This commit is contained in:
fros4943 2008-02-18 08:21:59 +00:00
parent 3675479274
commit f577b17ab3
2 changed files with 87 additions and 82 deletions

View file

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: FormulaViewer.java,v 1.2 2007/03/23 21:13:43 fros4943 Exp $
* $Id: FormulaViewer.java,v 1.3 2008/02/18 08:21:59 fros4943 Exp $
*/
package se.sics.mrm;
@ -45,7 +45,7 @@ import se.sics.cooja.*;
/**
* This plugin allows a user to reconfigure current radio channel parameters.
*
*
* @author Fredrik Osterlind
*/
@ClassDescription("MRM - Formula Viewer")
@ -61,11 +61,11 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
private static Dimension labelDimension = new Dimension(240, 20);
private static NumberFormat doubleFormat = NumberFormat.getNumberInstance();
private static NumberFormat integerFormat = NumberFormat.getIntegerInstance();
private Vector<JFormattedTextField> allIntegerParameters = new Vector<JFormattedTextField>();
private Vector<JFormattedTextField> allDoubleParameters = new Vector<JFormattedTextField>();
private Vector<JCheckBox> allBooleanParameters = new Vector<JCheckBox>();
private JPanel areaGeneral;
private JPanel areaTransmitter;
private JPanel areaReceiver;
@ -74,12 +74,12 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
/**
* Creates a new formula viewer.
*
*
* @param simulationToVisualize Simulation which holds the MRM channel model.
*/
public FormulaViewer(Simulation simulationToVisualize, GUI gui) {
super("MRM - Formula Viewer", gui);
currentSimulation = simulationToVisualize;
currentRadioMedium = (MRM) currentSimulation.getRadioMedium();
currentChannelModel = currentRadioMedium.getChannelModel();
@ -96,7 +96,7 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
setContentPane(scrollPane);
JPanel collapsableArea;
// General parameters
collapsableArea = createCollapsableArea("General parameters", allComponents);
areaGeneral = collapsableArea;
@ -135,14 +135,14 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
collapsableArea,
currentChannelModel.getParameterDoubleValue("system_gain_mean")
);
addDoubleParameter(
"system_gain_var",
currentChannelModel.getParameterDescription("system_gain_var"),
collapsableArea,
currentChannelModel.getParameterDoubleValue("system_gain_var")
);
addDoubleParameter(
"wavelength",
currentChannelModel.getParameterDescription("wavelength"),
@ -160,7 +160,7 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
collapsableArea,
currentChannelModel.getParameterDoubleValue("tx_power")
);
addDoubleParameter(
"tx_antenna_gain",
currentChannelModel.getParameterDescription("tx_antenna_gain"),
@ -185,7 +185,7 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
collapsableArea,
currentChannelModel.getParameterDoubleValue("rx_antenna_gain")
);
// Ray Tracer parameters
collapsableArea = createCollapsableArea("Ray Tracer parameters", allComponents);
areaRayTracer = collapsableArea;
@ -238,7 +238,7 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
collapsableArea,
currentChannelModel.getParameterIntegerValue("rt_max_diffractions")
);
/* addBooleanParameter(
"rt_use_scattering",
currentChannelModel.getParameterDescription("rt_use_scattering"),
@ -266,14 +266,14 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
collapsableArea,
currentChannelModel.getParameterDoubleValue("rt_diffr_coefficient")
);
/* addDoubleParameter(
"rt_scatt_coefficient",
currentChannelModel.getParameterDescription("rt_scatt_coefficient"),
collapsableArea,
currentChannelModel.getParameterDoubleValue("rt_scatt_coefficient")
);
*/
*/
// Shadowing parameters
collapsableArea = createCollapsableArea("Shadowing parameters", allComponents);
areaShadowing = collapsableArea;
@ -285,22 +285,22 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
currentChannelModel.getParameterDoubleValue("obstacle_attenuation")
);
// Add channel model observer responsible to keep all GUI components synched
currentChannelModel.addSettingsObserver(channelModelSettingsObserver);
// Set initial size etc.
pack();
setVisible(true);
// Tries to select this plugin
try {
setSelected(true);
} catch (java.beans.PropertyVetoException e) {
// Could not select
}
}
/**
@ -325,43 +325,44 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
};
collapsableArea.setLayout(new BoxLayout(collapsableArea, BoxLayout.Y_AXIS));
collapsableArea.setVisible(false);
JPanel titlePanel = new JPanel(new BorderLayout()) {
public Dimension getMaximumSize() {
return new Dimension(super.getMaximumSize().width, getPreferredSize().height);
}
};
titlePanel.add(BorderLayout.WEST, new JLabel(title));
JCheckBox collapseCheckBox = new JCheckBox("show settings", false);
collapseCheckBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (((JCheckBox) e.getSource()).isSelected())
if (((JCheckBox) e.getSource()).isSelected()) {
collapsableArea.setVisible(true);
else
} else {
collapsableArea.setVisible(false);
}
}
});
collapsableArea.putClientProperty("my_checkbox", collapseCheckBox);
titlePanel.add(BorderLayout.EAST, collapseCheckBox);
collapsableArea.setBorder(
BorderFactory.createLineBorder(Color.LIGHT_GRAY)
);
);
collapsableArea.setAlignmentY(Component.TOP_ALIGNMENT);
holdingPanel.add(titlePanel);
holdingPanel.add(collapsableArea);
contentPane.add(holdingPanel);
return collapsableArea;
}
/**
* Creates and adds a panel with a label and a
* Creates and adds a panel with a label and a
* text field which accepts doubles.
*
*
* @param id Identifier of new parameter
* @param description Description of new parameter
* @param contentPane Where to add created panel
@ -372,7 +373,7 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
JPanel panel = new JPanel();
JLabel label;
JFormattedTextField textField;
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
panel.setAlignmentY(Component.TOP_ALIGNMENT);
panel.add(Box.createHorizontalStrut(10));
@ -392,16 +393,16 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
}
});
allDoubleParameters.add(textField);
contentPane.add(panel);
return textField;
}
/**
* Creates and adds a panel with a label and a
* Creates and adds a panel with a label and a
* text field which accepts integers.
*
*
* @param id Identifier of new parameter
* @param description Description of new parameter
* @param contentPane Where to add created panel
@ -412,7 +413,7 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
JPanel panel = new JPanel();
JLabel label;
JFormattedTextField textField;
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
panel.setAlignmentY(Component.TOP_ALIGNMENT);
panel.add(Box.createHorizontalStrut(10));
@ -438,11 +439,11 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
return textField;
}
/**
* Creates and adds a panel with a label and a
* Creates and adds a panel with a label and a
* boolean checkbox.
*
*
* @param id Identifier of new parameter
* @param description Description of new parameter
* @param contentPane Where to add created panel
@ -453,7 +454,7 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
JPanel panel = new JPanel();
JLabel label;
JCheckBox checkBox;
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
panel.setAlignmentY(Component.TOP_ALIGNMENT);
panel.add(Box.createHorizontalStrut(10));
@ -479,10 +480,10 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
return checkBox;
}
/**
* Creates and adds a panel with a description label.
*
*
* @param description Description of new parameter
* @param contentPane Where to add created panel
* @return Created label
@ -490,7 +491,7 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
private JLabel addLabelParameter(String description, Container contentPane) {
JPanel panel = new JPanel();
JLabel label;
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
panel.setAlignmentY(Component.TOP_ALIGNMENT);
panel.add(Box.createHorizontalStrut(10));
@ -502,7 +503,7 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
return label;
}
/**
* Listens to settings changes in the channel model.
* If it changes, all GUI parameters are updated accordingly.
@ -511,21 +512,21 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
public void update(Observable obs, Object obj) {
// Update all integers
for (int i=0; i < allIntegerParameters.size(); i++) {
JFormattedTextField textField = (JFormattedTextField) allIntegerParameters.get(i);
JFormattedTextField textField = allIntegerParameters.get(i);
String id = (String) textField.getClientProperty("id");
textField.setValue(currentChannelModel.getParameterValue(id));
}
// Update all doubles
for (int i=0; i < allDoubleParameters.size(); i++) {
JFormattedTextField textField = (JFormattedTextField) allDoubleParameters.get(i);
JFormattedTextField textField = allDoubleParameters.get(i);
String id = (String) textField.getClientProperty("id");
textField.setValue(currentChannelModel.getParameterValue(id));
}
// Update all booleans
for (int i=0; i < allBooleanParameters.size(); i++) {
JCheckBox checkBox = (JCheckBox) allBooleanParameters.get(i);
JCheckBox checkBox = allBooleanParameters.get(i);
String id = (String) checkBox.getClientProperty("id");
checkBox.setSelected(currentChannelModel.getParameterBooleanValue(id));
}
@ -533,7 +534,7 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
repaint();
}
};
public void closePlugin() {
// Remove the channel model observer
if (currentChannelModel != null && channelModelSettingsObserver != null) {
@ -542,12 +543,12 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
logger.fatal("Can't remove channel model observer: " + channelModelSettingsObserver);
}
}
/**
* Returns XML elements representing the current configuration.
*
*
* @see #setConfigXML(Collection)
* @return XML element collection
* @return XML element collection
*/
public Collection<Element> getConfigXML() {
Vector<Element> config = new Vector<Element>();
@ -573,7 +574,7 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
/**
* Sets the configuration depending on the given XML elements.
*
*
* @see #getConfigXML()
* @param configXML
* Config XML elements
@ -608,7 +609,7 @@ public class FormulaViewer extends se.sics.cooja.VisPlugin {
ActionEvent.ACTION_PERFORMED, ""));
}
}
return true;
return true;
}
}

View file

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: MRM.java,v 1.5 2007/03/23 21:22:37 fros4943 Exp $
* $Id: MRM.java,v 1.6 2008/02/18 08:21:59 fros4943 Exp $
*/
package se.sics.mrm;
@ -42,18 +42,18 @@ import se.sics.cooja.radiomediums.AbstractRadioMedium;
/**
* This is the main class of the COOJA Multi-path Ray-tracing Medium (MRM)
* package.
*
*
* MRM is meant to be an alternative to the simpler radio mediums available in
* COOJA. It is packet based and uses a 2D ray-tracing approach to approximate
* signal strength attenuations between simulated radios. Currently the
* ray-tracing only supports reflections and refractions through homogeneous
* obstacles.
*
*
* MRM provides a number of plugins for example a plugin for visualizing radio
* environments, and a plugin for configuring the radio medium.
*
*
* Future work includes adding diffractions and scattering support.
*
*
* @author Fredrik Osterlind
*/
@ClassDescription("Multi-path Ray-tracer Medium (MRM)")
@ -62,20 +62,20 @@ public class MRM extends AbstractRadioMedium {
private ChannelModel currentChannelModel = null;
private Simulation mySimulation = null;
private Random random = new Random();
/**
* Notifies observers when this radio medium has changed settings.
*/
private SettingsObservable settingsObservable = new SettingsObservable();
/**
* Creates a new Multi-path Ray-tracing Medium (MRM).
*/
public MRM(Simulation simulation) {
super(simulation);
// Create the channel model
currentChannelModel = new ChannelModel();
@ -91,20 +91,22 @@ public class MRM extends AbstractRadioMedium {
// Loop through all radios
for (Radio listeningRadio: getRegisteredRadios()) {
// Ignore sending radio and radios on different channels
if (sendingRadio == listeningRadio)
if (sendingRadio == listeningRadio) {
continue;
if (sendingRadio.getChannel() != listeningRadio.getChannel())
}
if (sendingRadio.getChannel() != listeningRadio.getChannel()) {
continue;
}
double listeningPositionX = listeningRadio.getPosition().getXCoordinate();
double listeningPositionY = listeningRadio.getPosition().getYCoordinate();
// Calculate probability of reception of listening radio
double[] probData = currentChannelModel.getProbability(
sendingPosition.getXCoordinate(),
sendingPosition.getYCoordinate(),
listeningPositionX,
listeningPositionY,
sendingPosition.getXCoordinate(),
sendingPosition.getYCoordinate(),
listeningPositionX,
listeningPositionY,
-Double.MAX_VALUE
);
@ -148,7 +150,7 @@ public class MRM extends AbstractRadioMedium {
// Interfere radio
newConnection.addInterfered(listeningRadio, probData[1]);
listeningRadio.interfereAnyReception();
// TODO Radios always get interfered right now, should recalculate probability
// if (maxInterferenceSignalStrength + SOME_RELEVANT_LIMIT > transmissionSignalStrength) {
// // Recalculating probability of delivery
@ -166,7 +168,7 @@ public class MRM extends AbstractRadioMedium {
}
}
return newConnection;
}
@ -188,8 +190,9 @@ public class MRM extends AbstractRadioMedium {
// ((MRMRadioConnection) conn).getSource().setCurrentSignalStrength(12345); // TODO Set signal strength on source?
for (Radio dstRadio : ((MRMRadioConnection) conn).getDestinations()) {
double signalStrength = ((MRMRadioConnection) conn).getDestinationSignalStrength(dstRadio);
if (signalStrength > dstRadio.getCurrentSignalStrength())
if (signalStrength > dstRadio.getCurrentSignalStrength()) {
dstRadio.setCurrentSignalStrength(signalStrength);
}
}
}
@ -197,8 +200,9 @@ public class MRM extends AbstractRadioMedium {
for (RadioConnection conn : getActiveConnections()) {
for (Radio interferedRadio : ((MRMRadioConnection) conn).getInterfered()) {
double signalStrength = ((MRMRadioConnection) conn).getInterferenceSignalStrength(interferedRadio);
if (signalStrength > interferedRadio.getCurrentSignalStrength())
if (signalStrength > interferedRadio.getCurrentSignalStrength()) {
interferedRadio.setCurrentSignalStrength(signalStrength);
}
if (!interferedRadio.isInterfered()) {
// Set to interfered again
@ -226,20 +230,20 @@ public class MRM extends AbstractRadioMedium {
// Forwarding to current channel model
return currentChannelModel.getConfigXML();
}
public boolean setConfigXML(Collection<Element> configXML,
boolean visAvailable) {
// Forwarding to current channel model
return currentChannelModel.setConfigXML(configXML);
}
// -- MRM specific methods --
/**
* Adds an observer which is notified when this radio medium has
* changed settings, such as added or removed radios.
*
*
* @param obs New observer
*/
public void addSettingsObserver(Observer obs) {
@ -248,24 +252,24 @@ public class MRM extends AbstractRadioMedium {
/**
* Deletes an earlier registered setting observer.
*
*
* @param osb
* Earlier registered observer
*/
public void deleteSettingsObserver(Observer obs) {
settingsObservable.deleteObserver(obs);
}
/**
* Returns position of given radio.
*
*
* @param radio Registered radio
* @return Position of given radio
*/
public Position getRadioPosition(Radio radio) {
return radio.getPosition();
}
/**
* @return Number of registered radios.
*/
@ -275,7 +279,7 @@ public class MRM extends AbstractRadioMedium {
/**
* Returns radio at given index.
*
*
* @param index Index of registered radio.
* @return Radio at given index
*/
@ -286,7 +290,7 @@ public class MRM extends AbstractRadioMedium {
/**
* Returns the current channel model object, responsible for
* all probability and transmission calculations.
*
*
* @return Current channel model
*/
public ChannelModel getChannelModel() {
@ -302,11 +306,11 @@ public class MRM extends AbstractRadioMedium {
class MRMRadioConnection extends RadioConnection {
private Hashtable<Radio, Double> signalStrengths = new Hashtable<Radio, Double>();
public MRMRadioConnection(Radio sourceRadio) {
super(sourceRadio);
}
public void addDestination(Radio radio, double signalStrength) {
signalStrengths.put(radio, signalStrength);
addDestination(radio);
@ -325,5 +329,5 @@ public class MRM extends AbstractRadioMedium {
return signalStrengths.get(radio);
}
}
}