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

📄 contikimote.java

📁 Contiki是一个开源
💻 JAVA
字号:
/* * Copyright (c) 2006, 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: ContikiMote.java,v 1.8 2008/10/28 12:05:30 fros4943 Exp $ */package se.sics.cooja.contikimote;import java.util.*;import org.apache.log4j.Logger;import org.jdom.Element;import se.sics.cooja.*;/** * A Contiki mote executes an actual Contiki system via * a loaded shared library and JNI. * It contains a section mote memory, a mote interface handler and a * Contiki mote type. * * The mote type is responsible for the connection to the loaded * Contiki system. * * When ticked a Contiki mote polls all interfaces, copies the mote * memory to the core, lets the Contiki system handle one event, * fetches the updated memory and finally polls all interfaces again. * The mote state is also updated during a mote tick. * * @author      Fredrik Osterlind */public class ContikiMote implements Mote {  private static Logger logger = Logger.getLogger(ContikiMote.class);  private ContikiMoteType myType = null;  private SectionMoteMemory myMemory = null;  private MoteInterfaceHandler myInterfaceHandler = null;  private Simulation mySim = null;  // Time to wake up if sleeping  private int wakeUpTime = 0;  private State myState = State.ACTIVE;  // State observable  private class StateObservable extends Observable {    private void stateChanged() {      setChanged();      notifyObservers();    }  }  private StateObservable stateObservable = new StateObservable();  /**   * Creates a new uninitialized Contiki mote.   *   * This mote needs at least a type, a memory, a mote interface handler   * and to be connected to a simulation.   */  public ContikiMote() {  }  /**   * Creates a new mote of given type.   * Both the initial mote memory and the interface handler   * are supplied from the mote type.   *   * @param moteType Mote type   * @param sim Mote's simulation   */  public ContikiMote(ContikiMoteType moteType, Simulation sim) {    this.mySim = sim;    this.myType = moteType;    this.myMemory = moteType.createInitialMemory();    this.myInterfaceHandler = new MoteInterfaceHandler(this, moteType.getMoteInterfaces());    myState = State.ACTIVE;  }  public void setState(State newState) {    if (myState == State.DEAD) {      return;    }    if (myState == State.ACTIVE && newState != State.ACTIVE) {      myState = newState;      stateObservable.stateChanged();    }    if (myState == State.LPM && newState != State.LPM) {      myState = newState;      stateObservable.stateChanged();    }    if (myState == State.DEAD) {      mySim.getRadioMedium().unregisterMote(this, mySim);    }  }  public State getState() {    return myState;  }  public void addStateObserver(Observer newObserver) {    stateObservable.addObserver(newObserver);  }  public void deleteStateObserver(Observer newObserver) {    stateObservable.deleteObserver(newObserver);  }  public MoteInterfaceHandler getInterfaces() {    return myInterfaceHandler;  }  public void setInterfaces(MoteInterfaceHandler newInterfaces) {    myInterfaceHandler = newInterfaces;  }  public MoteMemory getMemory() {    return myMemory;  }  public void setMemory(MoteMemory memory) {    myMemory = (SectionMoteMemory) memory;  }  public MoteType getType() {    return myType;  }  public void setType(MoteType type) {    myType = (ContikiMoteType) type;  }  public Simulation getSimulation() {    return mySim;  }  public void setSimulation(Simulation simulation) {    mySim = simulation;  }  /**   * Ticks this mote once. This is done by first polling all interfaces   * and letting them act on the stored memory before the memory is set. Then   * the mote is ticked, and the new memory is received.   * Finally all interfaces are allowing to act on the new memory in order to   * discover relevant changes. This method also checks if mote should go to sleep   * depending on Contiki specifics; pending timers and polled processes.   *   * @param simTime Current simulation time   */  public boolean tick(int simTime) {    State currentState = getState();    // If mote is dead, do nothing at all    if (currentState == State.DEAD) {      return false;    }    // If mote is sleeping and has a wake up time, should it wake up now?    if (currentState == State.LPM && wakeUpTime > 0 && wakeUpTime <= simTime) {      setState(State.ACTIVE);      currentState = getState();      wakeUpTime = 0;    }    // If mote is active..    if (currentState == State.ACTIVE) {      // Let all active interfaces act before tick      // Observe that each interface may put the mote to sleep at this point      myInterfaceHandler.doActiveActionsBeforeTick();    }    // And let passive interfaces act even if mote is sleeping    myInterfaceHandler.doPassiveActionsBeforeTick();    // If mote is still active, complete this tick    currentState = getState();    if (currentState == State.ACTIVE) {      // Copy mote memory to core      myType.setCoreMemory(myMemory);      // Tick node      myType.tick();      // Fetch new updated memory from core      myType.getCoreMemory(myMemory);      // Let all active interfaces act again after tick      myInterfaceHandler.doActiveActionsAfterTick();    }    // Finally let all passive interfaces act    myInterfaceHandler.doPassiveActionsAfterTick();    // If mote is awake, should it go to sleep?    if (currentState == State.ACTIVE) {      // Check if this mote should sleep (no more pending timers or processes to poll)      int processRunValue = myMemory.getIntValueOf("simProcessRunValue");      int etimersPending = myMemory.getIntValueOf("simEtimerPending");      int nextExpirationTime = myMemory.getIntValueOf("simNextExpirationTime");      if (processRunValue == 0 && etimersPending == 0) {        setState(State.LPM);        wakeUpTime = 0;      }      if (processRunValue == 0 && etimersPending == 1 && nextExpirationTime > 0) {        setState(State.LPM);        wakeUpTime = nextExpirationTime;      }    }    return false;  }  /**   * Returns the current Contiki mote config represented by XML elements.   * This config also includes all mote interface configs.   *   * @return Current simulation config   */  public Collection<Element> getConfigXML() {    Vector<Element> config = new Vector<Element>();    Element element;    // Mote type identifier    element = new Element("motetype_identifier");    element.setText(getType().getIdentifier());    config.add(element);    // Mote interfaces    for (MoteInterface moteInterface: getInterfaces().getInterfaces()) {      element = new Element("interface_config");      element.setText(moteInterface.getClass().getName());      Collection interfaceXML = moteInterface.getConfigXML();      if (interfaceXML != null) {        element.addContent(interfaceXML);        config.add(element);      }    }    return config;  }  public boolean setConfigXML(Simulation simulation, Collection<Element> configXML, boolean visAvailable) {    mySim = simulation;    myState = State.ACTIVE;    for (Element element: configXML) {      String name = element.getName();      if (name.equals("motetype_identifier")) {        myType = (ContikiMoteType) simulation.getMoteType(element.getText());        myMemory = myType.createInitialMemory();        myInterfaceHandler = new MoteInterfaceHandler(this, myType.getMoteInterfaces());      } else if (name.equals("interface_config")) {        Class<? extends MoteInterface> moteInterfaceClass =          simulation.getGUI().tryLoadClass(this, MoteInterface.class, element.getText().trim());        if (moteInterfaceClass == null) {          logger.fatal("Could not load mote interface class: " + element.getText().trim());          return false;        }        MoteInterface moteInterface = myInterfaceHandler.getInterfaceOfType(moteInterfaceClass);        if (moteInterface != null) {          moteInterface.setConfigXML(element.getChildren(), visAvailable);        } else {          logger.warn("Can't restore configuration for non-existing interface: " + moteInterfaceClass.getName());        }      }    }    return true;  }  public String toString() {    if (getInterfaces().getMoteID() != null) {      return "Contiki Mote, ID=" + getInterfaces().getMoteID().getMoteID();    } else {      return "Contiki Mote, ID=null";    }  }}

⌨️ 快捷键说明

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