⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 radiolinkplugin.java

📁 传感器网络中的嵌入式操作系统源代码
💻 JAVA
字号:
// $Id: RadioLinkPlugin.java,v 1.6.2.3 2003/08/26 09:08:11 cssharp Exp $/*									tab:2 * * * "Copyright (c) 2000 and The Regents of the University  * of California.  All rights reserved. * * Permission to use, copy, modify, and distribute this software and * its documentation for any purpose, without fee, and without written * agreement is hereby granted, provided that the above copyright * notice and the following two paragraphs appear in all copies of * this software. *  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL * DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS * DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE * PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF * CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, * UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * * Authors:	Nelson Lee * Date:        December 11 2002 * Desc:        Default Mote Plugin *              Implements functionality for viewing packets received *              by motes * *//** * @author Nelson Lee */package net.tinyos.sim.plugins;import java.util.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import net.tinyos.message.*;import net.tinyos.sim.*;import net.tinyos.sim.event.*;/* All plugins must extend the 'Plugin' class. 'SimConst' provides * some useful constants. */public class RadioLinkPlugin extends Plugin implements SimConst {  private static final int BROADCAST_ADDR = 0xffff;  /* Total number of links to draw at once. */  private static final int numberLinksToRemember = 10;  /* Data structure for remembering recently-seen radio links. */  private LinkHolder holder = new LinkHolder(numberLinksToRemember);  /* The main event-handling function. Every event handled by TinyViz   * will be delivered to each plugin through this method. There are   * a few types of events that can be received - see the 'event'    * subdirectory.    */  public void handleEvent(SimEvent event) {    /* An event indicating that a radio message was sent - what we     * really care about here.      */    if (event instanceof RadioMsgSentEvent) {      RadioMsgSentEvent rmEvent = (RadioMsgSentEvent)event;      /* Get the actual message */      TOSMsg msg = rmEvent.getMessage();      /* Look at the mote ID of the sender and receiver, add a link */      holder.addLink(new RadioLink(rmEvent.getMoteID(), msg.get_addr()));      /* Refresh the display */      tv.getMotePanel().refresh();    } else if (event instanceof SimObjectEvent) {      /* These events occur when motes are added or removed from the        * display.        */      SimObjectEvent simObjectEvent = (SimObjectEvent)event;      switch (simObjectEvent.getType()) {	case SimObjectEvent.OBJECT_ADDED:	  // do nothing	  break;	case SimObjectEvent.OBJECT_REMOVED:	  // remove all links associated with the deleted mote	  if (simObjectEvent.getSimObject() instanceof MoteSimObject) {	    MoteSimObject m = (MoteSimObject) simObjectEvent.getSimObject();	    int moteID = m.getID();	    Enumeration enum = holder.getLinks();	    while(enum.hasMoreElements()) {	      RadioLink radioLink = (RadioLink) enum.nextElement();	      if (radioLink.getMoteSender() == moteID || radioLink.getMoteReceiver() == moteID) {		holder.removeLink(radioLink);	      }	    }	  }	  break;      }    } else if (event instanceof AttributeEvent) {      /* These events occur when an attribute changes -- such as the        * location of a mote.       */      AttributeEvent attributeEvent = (AttributeEvent)event;      switch (attributeEvent.getType()) {	case ATTRIBUTE_CHANGED:	  if (attributeEvent.getAttribute() instanceof MoteCoordinateAttribute)	    /* Just redraw the mote panel, so our links appear in the 	     * right place	     */	    motePanel.refresh();      }    }   }  /* This method is called when a plugin is "registered", ie., enabled   * by the user from the plugins menu. Here we create the widgets to appear    * in the plugin control panel.   */  public void register() {    /* Nothing interesting here but a little informative message. */    JTextArea ta = new JTextArea(3,40);    ta.setFont(tv.defaultFont);    ta.setEditable(false);    ta.setBackground(Color.lightGray);    ta.setLineWrap(true);    ta.setText("Displays recent radio packets.\nBlue circles denote message broadcast.\nRed lines show direct message sent.");    pluginPanel.add(ta);  }  /* This method is called when a plugin is disabled by the user - here   * we do nothing.   */  public void deregister() {}  /* This method is called when the simulation state is reset, which    * may happen when the simulation stops running, or in between    * simulations when using AutoRun files. Here we want to clear out our   * internal state.   */  public void reset() {    holder = new LinkHolder(numberLinksToRemember);    motePanel.refresh();  }  /* Called when it's time to redraw the mote panel. Here we just redraw   * the arrows representing radio links.   */  public void draw(Graphics graphics) {    /* Iterate through the links */    Enumeration enum = holder.getLinks();    while (enum.hasMoreElements()) {      RadioLink link = (RadioLink)enum.nextElement();      int sendaddr = link.getMoteSender();      int recvaddr = link.getMoteReceiver();      try {        /* Look up the location of the sender */	MoteSimObject moteSender = state.getMoteSimObject(link.getMoteSender());	MoteCoordinateAttribute moteSenderCoordinate = moteSender.getCoordinate();        /* If it's a broadcast, draw a circle around the mote. */      	if (recvaddr == BROADCAST_ADDR) {          /* We use the CoordinateTransformer methods to translate	   * between virtual mote coordinates and screen coordinates */	  graphics.setColor(Color.blue);	  int x = (int)cT.simXToGUIX(moteSenderCoordinate.getX()) - 12;	  int y = (int)cT.simYToGUIY(moteSenderCoordinate.getY()) - 12;	  graphics.drawOval(x, y, 24, 24);	} else {	  /* If it's a directed message, look up the receiver position */	  MoteSimObject moteReceiver = state.getMoteSimObject(link.getMoteReceiver());	  MoteCoordinateAttribute moteReceiverCoordinate = moteReceiver.getCoordinate();	  /* Draw an arrow. The Arrow class is found in the parent 	   * directory.	   */	  graphics.setColor(Color.magenta);	  Arrow.drawArrow(graphics,	      (int)cT.simXToGUIX(moteSenderCoordinate.getX()),	      (int)cT.simYToGUIY(moteSenderCoordinate.getY()),	      (int)cT.simXToGUIX(moteReceiverCoordinate.getX()),	      (int)cT.simYToGUIY(moteReceiverCoordinate.getY()), 	      Arrow.SIDE_LEAD);	}      } catch (NullPointerException e) {	/* We may get a NullPointerException if the radio message is sent 	 * from or to a mote we don't know about yet - just ignore this 	 * link.	 */	continue;      }    }  }  /* The toString() method is important - it gives the plugin a name in   * the plugins menu and panel. Use a *short* but descriptive name here.   */  public String toString() {    return "Radio links";  }  /* Internal class representing radio links. */  private class RadioLink {    private int moteSender;    private int moteReceiver;    public RadioLink(int moteSender, int moteReceiver) {      this.moteSender = moteSender;      this.moteReceiver = moteReceiver;    }    public int getMoteSender() {      return moteSender;    }    public int getMoteReceiver() {      return moteReceiver;    }  }  private class LinkHolder {    private Vector holder = new Vector();    private int numLinks;    public LinkHolder(int numLinks) {      this.numLinks = numLinks;    }    public Enumeration getLinks() {      return holder.elements();    }    public void addLink(RadioLink link) {      if (holder.size() == numLinks) {	holder.remove(0);      }      holder.add(link);    }    public void removeLink(RadioLink link) {      holder.remove(link);    }  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -