Added optional color for mote relations

This commit is contained in:
nifi 2010-12-10 17:50:48 +00:00
parent e2436d023e
commit 5d542c2cad
3 changed files with 70 additions and 21 deletions

View File

@ -24,7 +24,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
* $Id: GUI.java,v 1.173 2010/12/10 15:54:52 fros4943 Exp $ * $Id: GUI.java,v 1.174 2010/12/10 17:50:48 nifi Exp $
*/ */
package se.sics.cooja; package se.sics.cooja;
@ -341,9 +341,11 @@ public class GUI extends Observable {
public static class MoteRelation { public static class MoteRelation {
public Mote source; public Mote source;
public Mote dest; public Mote dest;
public MoteRelation(Mote source, Mote dest) { public Color color;
public MoteRelation(Mote source, Mote dest, Color color) {
this.source = source; this.source = source;
this.dest = dest; this.dest = dest;
this.color = color;
} }
} }
private ArrayList<MoteRelation> moteRelations = new ArrayList<MoteRelation>(); private ArrayList<MoteRelation> moteRelations = new ArrayList<MoteRelation>();
@ -3783,11 +3785,22 @@ public class GUI extends Observable {
* @param dest Destination mote * @param dest Destination mote
*/ */
public void addMoteRelation(Mote source, Mote dest) { public void addMoteRelation(Mote source, Mote dest) {
addMoteRelation(source, dest, null);
}
/**
* Adds directed relation between given motes.
*
* @param source Source mote
* @param dest Destination mote
* @param color The color to use when visualizing the mote relation
*/
public void addMoteRelation(Mote source, Mote dest, Color color) {
if (source == null || dest == null) { if (source == null || dest == null) {
return; return;
} }
removeMoteRelation(source, dest); /* Unique relations */ removeMoteRelation(source, dest); /* Unique relations */
moteRelations.add(new MoteRelation(source, dest)); moteRelations.add(new MoteRelation(source, dest, color));
moteRelationObservable.setChangedAndNotify(); moteRelationObservable.setChangedAndNotify();
} }
@ -3805,9 +3818,11 @@ public class GUI extends Observable {
for (MoteRelation r: arr) { for (MoteRelation r: arr) {
if (r.source == source && r.dest == dest) { if (r.source == source && r.dest == dest) {
moteRelations.remove(r); moteRelations.remove(r);
/* Relations are unique */
moteRelationObservable.setChangedAndNotify();
break;
} }
} }
moteRelationObservable.setChangedAndNotify();
} }
/** /**
@ -3816,9 +3831,7 @@ public class GUI extends Observable {
* @see #addMoteRelationsObserver(Observer) * @see #addMoteRelationsObserver(Observer)
*/ */
public MoteRelation[] getMoteRelations() { public MoteRelation[] getMoteRelations() {
MoteRelation[] arr = new MoteRelation[moteRelations.size()]; return moteRelations.toArray(new MoteRelation[moteRelations.size()]);
moteRelations.toArray(arr);
return arr;
} }
/** /**

View File

@ -26,11 +26,12 @@
* 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.
* *
* $Id: Mote2MoteRelations.java,v 1.6 2010/02/10 13:29:27 fros4943 Exp $ * $Id: Mote2MoteRelations.java,v 1.7 2010/12/10 17:50:49 nifi Exp $
*/ */
package se.sics.cooja.interfaces; package se.sics.cooja.interfaces;
import java.awt.Color;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Observable; import java.util.Observable;
@ -142,26 +143,31 @@ public class Mote2MoteRelations extends MoteInterface {
return; return;
} }
String colorName = null;
int colorIndex = msg.indexOf(';');
if (colorIndex > 0) {
colorName = msg.substring(colorIndex + 1).trim();
msg = msg.substring(0, colorIndex).trim();
}
String[] args = msg.split(" "); String[] args = msg.split(" ");
if (args.length != 3) { if (args.length != 3) {
return; return;
} }
String id = args[1]; int destID;
try {
destID = Integer.parseInt(args[1]);
} catch (Exception e) {
// Not a mote id
return;
}
String state = args[2]; String state = args[2];
/* Locate destination mote */ /* Locate destination mote */
/* TODO Use Rime address interface instead of mote ID? */ /* TODO Use Rime address interface instead of mote ID? */
Mote destinationMote = null; Mote destinationMote = mote.getSimulation().getMoteWithID(destID);
Mote[] allMotes = Mote2MoteRelations.this.mote.getSimulation().getMotes();
for (Mote m: allMotes) {
if (id.equals("" + m.getID())) {
destinationMote = m;
break;
}
}
if (destinationMote == null) { if (destinationMote == null) {
logger.warn("No destination mote with ID: " + id); logger.warn("No destination mote with ID: " + destID);
return; return;
} }
if (destinationMote == mote) { if (destinationMote == mote) {
@ -175,7 +181,7 @@ public class Mote2MoteRelations extends MoteInterface {
return; return;
} }
relations.add(destinationMote); relations.add(destinationMote);
gui.addMoteRelation(mote, destinationMote); gui.addMoteRelation(mote, destinationMote, decodeColor(colorName));
} else { } else {
relations.remove(destinationMote); relations.remove(destinationMote);
gui.removeMoteRelation(mote, destinationMote); gui.removeMoteRelation(mote, destinationMote);
@ -185,6 +191,36 @@ public class Mote2MoteRelations extends MoteInterface {
notifyObservers(); notifyObservers();
} }
private Color decodeColor(String colorString) {
if (colorString == null) {
return null;
} else if (colorString.equalsIgnoreCase("red")) {
return Color.RED;
} else if (colorString.equalsIgnoreCase("green")) {
return Color.GREEN;
} else if (colorString.equalsIgnoreCase("blue")) {
return Color.BLUE;
} else if (colorString.equalsIgnoreCase("orange")) {
return Color.ORANGE;
} else if (colorString.equalsIgnoreCase("pink")) {
return Color.PINK;
} else if (colorString.equalsIgnoreCase("yellow")) {
return Color.YELLOW;
} else if (colorString.equalsIgnoreCase("gray")) {
return Color.GRAY;
} else if (colorString.equalsIgnoreCase("magenta")) {
return Color.MAGENTA;
} else if (colorString.equalsIgnoreCase("black")) {
return Color.BLACK;
} else {
try {
return Color.decode(colorString);
} catch (NumberFormatException e) {
}
return null;
}
}
public JPanel getInterfaceVisualizer() { public JPanel getInterfaceVisualizer() {
JPanel panel = new JPanel(); JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

View File

@ -26,7 +26,7 @@
* 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.
* *
* $Id: Visualizer.java,v 1.18 2010/12/03 13:54:25 fros4943 Exp $ * $Id: Visualizer.java,v 1.19 2010/12/10 17:50:49 nifi Exp $
*/ */
package se.sics.cooja.plugins; package se.sics.cooja.plugins;
@ -847,7 +847,6 @@ public class Visualizer extends VisPlugin {
Mote[] allMotes = simulation.getMotes(); Mote[] allMotes = simulation.getMotes();
/* Paint mote relations */ /* Paint mote relations */
g.setColor(Color.BLACK);
MoteRelation[] relations = simulation.getGUI().getMoteRelations(); MoteRelation[] relations = simulation.getGUI().getMoteRelations();
for (MoteRelation r: relations) { for (MoteRelation r: relations) {
Position sourcePos = r.source.getInterfaces().getPosition(); Position sourcePos = r.source.getInterfaces().getPosition();
@ -856,6 +855,7 @@ public class Visualizer extends VisPlugin {
Point sourcePoint = transformPositionToPixel(sourcePos); Point sourcePoint = transformPositionToPixel(sourcePos);
Point destPoint = transformPositionToPixel(destPos); 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); drawArrow(g, sourcePoint.x, sourcePoint.y, destPoint.x, destPoint.y, MOTE_RADIUS + 1);
} }