example directional antenna

This commit is contained in:
Fredrik Osterlind 2011-11-01 11:39:31 +01:00
parent eb84fbeb79
commit ff42490e7b

View file

@ -34,6 +34,8 @@ package se.sics.cooja.interfaces;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Observable; import java.util.Observable;
@ -42,6 +44,7 @@ import java.util.Observer;
import javax.swing.Box; import javax.swing.Box;
import javax.swing.JButton; import javax.swing.JButton;
import javax.swing.JComboBox; import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JPanel; import javax.swing.JPanel;
@ -62,7 +65,7 @@ import se.sics.cooja.Simulation;
* *
* @author Fredrik Osterlind * @author Fredrik Osterlind
*/ */
public class ApplicationRadio extends Radio implements NoiseSourceRadio { public class ApplicationRadio extends Radio implements NoiseSourceRadio, DirectionalAntennaRadio {
private static Logger logger = Logger.getLogger(ApplicationRadio.class); private static Logger logger = Logger.getLogger(ApplicationRadio.class);
private Simulation simulation; private Simulation simulation;
@ -82,7 +85,7 @@ public class ApplicationRadio extends Radio implements NoiseSourceRadio {
private double signalStrength = -100; private double signalStrength = -100;
private int radioChannel = -1; private int radioChannel = -1;
private double outputPower = 0; private double outputPower = 0; /* typical cc2420 values: -25 <-> 0 dBm */
private int outputPowerIndicator = 100; private int outputPowerIndicator = 100;
private int interfered; private int interfered;
@ -264,7 +267,7 @@ public class ApplicationRadio extends Radio implements NoiseSourceRadio {
/** /**
* @param p New output power * @param p New output power
*/ */
public void setOutputPower(int p) { public void setOutputPower(double p) {
outputPower = p; outputPower = p;
} }
@ -286,31 +289,38 @@ public class ApplicationRadio extends Radio implements NoiseSourceRadio {
final JLabel statusLabel = new JLabel(""); final JLabel statusLabel = new JLabel("");
final JLabel lastEventLabel = new JLabel(""); final JLabel lastEventLabel = new JLabel("");
final JLabel channelLabel = new JLabel(""); final JLabel channelLabel = new JLabel("");
final JLabel powerLabel = new JLabel("Output power (dBm):");
final JLabel ssLabel = new JLabel(""); final JLabel ssLabel = new JLabel("");
final JButton updateButton = new JButton("Update SS"); final JButton updateButton = new JButton("Update SS");
JComboBox channelMenu = new JComboBox(new String[] { JComboBox channelMenu = new JComboBox(new String[] {
"ALL", "ALL",
"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
"11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20",
"21", "22", "23", "24", "25", "26", "27", "28", "29", "30" "21", "22", "23", "24", "25", "26", "27", "28", "29", "30"
}); });
channelMenu.addActionListener(new ActionListener() { channelMenu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
JComboBox m = (JComboBox) e.getSource(); JComboBox m = (JComboBox) e.getSource();
String s = (String) m.getSelectedItem(); String s = (String) m.getSelectedItem();
if (s == null || s.equals("ALL")) { if (s == null || s.equals("ALL")) {
setChannel(-1); setChannel(-1);
} else { } else {
setChannel(Integer.parseInt(s)); setChannel(Integer.parseInt(s));
} }
} }
}); });
if (getChannel() == -1) { if (getChannel() == -1) {
channelMenu.setSelectedIndex(0); channelMenu.setSelectedIndex(0);
} else { } else {
channelMenu.setSelectedIndex(getChannel()); channelMenu.setSelectedIndex(getChannel());
} }
final JFormattedTextField outputPower = new JFormattedTextField(new Double(getCurrentOutputPower()));
outputPower.addPropertyChangeListener("value", new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
setOutputPower(((Number)outputPower.getValue()).doubleValue());
}
});
box.add(statusLabel); box.add(statusLabel);
box.add(lastEventLabel); box.add(lastEventLabel);
@ -318,6 +328,8 @@ public class ApplicationRadio extends Radio implements NoiseSourceRadio {
box.add(updateButton); box.add(updateButton);
box.add(channelLabel); box.add(channelLabel);
box.add(channelMenu); box.add(channelMenu);
box.add(powerLabel);
box.add(outputPower);
updateButton.addActionListener(new ActionListener() { updateButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
@ -356,7 +368,8 @@ public class ApplicationRadio extends Radio implements NoiseSourceRadio {
} }
public Collection<Element> getConfigXML() { public Collection<Element> getConfigXML() {
/* TODO Save channel info? */ /* TODO Save channel info? */
/* TODO Save output power? */
return null; return null;
} }
@ -384,25 +397,36 @@ public class ApplicationRadio extends Radio implements NoiseSourceRadio {
} }
/* Noise source radio support */ /* Noise source radio support */
public int getNoiseLevel() { public int getNoiseLevel() {
return noiseSignal; return noiseSignal;
} }
public void addNoiseLevelListener(NoiseLevelListener l) { public void addNoiseLevelListener(NoiseLevelListener l) {
noiseListeners.add(l); noiseListeners.add(l);
} }
public void removeNoiseLevelListener(NoiseLevelListener l) { public void removeNoiseLevelListener(NoiseLevelListener l) {
noiseListeners.remove(l); noiseListeners.remove(l);
} }
/* Noise source radio support (app mote API) */ /* Noise source radio support (app mote API) */
private int noiseSignal = Integer.MIN_VALUE; private int noiseSignal = Integer.MIN_VALUE;
private ArrayList<NoiseLevelListener> noiseListeners = new ArrayList<NoiseLevelListener>(); private ArrayList<NoiseLevelListener> noiseListeners = new ArrayList<NoiseLevelListener>();
public void setNoiseLevel(int signal) { public void setNoiseLevel(int signal) {
this.noiseSignal = signal; this.noiseSignal = signal;
for (NoiseLevelListener l: noiseListeners) { for (NoiseLevelListener l: noiseListeners) {
l.noiseLevelChanged(this, signal); l.noiseLevelChanged(this, signal);
} }
} }
public double getDirection() {
return 0;
}
public double getRelativeGain(double radians, double distance) {
/* Simple sinus-based gain */
return 5.0*Math.sin(5.0*radians)/(0.01*distance);
}
public void addDirectionChangeListener(DirectionChangeListener l) {
}
public void removeDirectionChangeListener(DirectionChangeListener l) {
}
} }