📄 simulation.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: Simulation.java,v 1.11 2007/03/23 21:38:45 fros4943 Exp $ */package se.sics.cooja;import java.util.*;import org.apache.log4j.Logger;import org.jdom.*;import se.sics.cooja.dialogs.*;/** * A simulation consists of a number of motes and mote types. * * The motes in the simulation are ticked one by one in a simulation loop. When * all motes have been ticked once, the simulation time is updated and then the * simulation sleeps for some specified delay time. Any tick observers are also * notified at this time. * * When observing the simulation itself, the simulation state, added or deleted * motes etc. are observed, as opposed to individual mote changes. Changes of * individual motes should instead be observed via corresponding mote * interfaces. * * @author Fredrik Osterlind */public class Simulation extends Observable implements Runnable { private Vector<Mote> motes = new Vector<Mote>(); private Vector<MoteType> moteTypes = new Vector<MoteType>(); private int delayTime = 5; private int currentSimulationTime = 0; private int tickTime = 1; private String title = null; private RadioMedium currentRadioMedium = null; private static Logger logger = Logger.getLogger(Simulation.class); private boolean isRunning = false; private boolean stopSimulation = false; private Thread thread = null; private GUI myGUI = null; // Tick observable private class TickObservable extends Observable { private void allTicksPerformed() { setChanged(); notifyObservers(); } } private TickObservable tickObservable = new TickObservable(); /** * Add tick observer. This observer is notified once every tick loop, that is, * when all motes have been ticked. * * @see #deleteTickObserver(Observer) * @param newObserver * New observer */ public void addTickObserver(Observer newObserver) { tickObservable.addObserver(newObserver); } /** * Delete an existing tick observer. * * @see #addTickObserver(Observer) * @param observer * Observer to delete */ public void deleteTickObserver(Observer observer) { tickObservable.deleteObserver(observer); } public void run() { long lastStartTime = System.currentTimeMillis(); logger.info("Simulation main loop started, system time: " + lastStartTime); isRunning = true; // Notify observers simulation is starting this.setChanged(); this.notifyObservers(this); while (isRunning) { try { // Tick all motes for (Mote moteToTick : motes) { moteToTick.tick(currentSimulationTime); } // Increase simulation time currentSimulationTime += tickTime; // Notify tick observers tickObservable.allTicksPerformed(); // Sleep if (delayTime > 0) Thread.sleep(delayTime); if (stopSimulation) { // We should only tick once (and we just did), so abort now stopSimulation = false; isRunning = false; thread = null; } } catch (InterruptedException e) { isRunning = false; thread = null; break; } catch (IllegalArgumentException e) { logger.warn("llegalArgumentException:" + e); isRunning = false; thread = null; break; } catch (IllegalMonitorStateException e) { logger.warn("IllegalMonitorStateException:" + e); isRunning = false; thread = null; break; } } isRunning = false; thread = null; stopSimulation = false; // Notify observers simulation has stopped this.setChanged(); this.notifyObservers(this); logger.info("Simulation main loop stopped, system time: " + System.currentTimeMillis() + "\tDuration: " + (System.currentTimeMillis() - lastStartTime) + " ms"); } /** * Creates a new simulation with a delay time of 100 ms. */ public Simulation(GUI gui) { myGUI = gui; } /** * Starts this simulation (notifies observers). */ public void startSimulation() { if (!isRunning()) { isRunning = true; thread = new Thread(this); thread.start(); } } /** * Stops this simulation (notifies observers). */ public void stopSimulation() { if (isRunning()) { stopSimulation = true; thread.interrupt(); // Wait until simulation stops if (Thread.currentThread() != thread) while (thread != null && thread.isAlive()) { try { Thread.sleep(10); } catch (InterruptedException e) { } } } } /** * Starts simulation if stopped, ticks all motes once, and finally stops * simulation again. */ public void tickSimulation() { stopSimulation = true; if (!isRunning()) { thread = new Thread(this); thread.start(); } // Wait until simulation stops while (thread != null && thread.isAlive()) { try { Thread.sleep(10); } catch (InterruptedException e) { } } } /** * @return GUI holding this simulation */ public GUI getGUI() { return myGUI; } /** * Returns the current simulation config represented by XML elements. This * config also includes the current radio medium, all mote types and motes. * * @return Current simulation config */ public Collection<Element> getConfigXML() { Vector<Element> config = new Vector<Element>(); Element element; // Title element = new Element("title"); element.setText(title); config.add(element); // Delay time element = new Element("delaytime"); element.setText(Integer.toString(delayTime)); config.add(element); // Tick time element = new Element("ticktime"); element.setText(Integer.toString(tickTime)); config.add(element); // Radio Medium element = new Element("radiomedium"); element.setText(currentRadioMedium.getClass().getName()); Collection radioMediumXML = currentRadioMedium.getConfigXML(); if (radioMediumXML != null) element.addContent(radioMediumXML); config.add(element); // Mote types for (MoteType moteType : getMoteTypes()) { element = new Element("motetype"); element.setText(moteType.getClass().getName()); Collection moteTypeXML = moteType.getConfigXML(); if (moteTypeXML != null) element.addContent(moteTypeXML); config.add(element); } // Motes for (Mote mote : motes) { element = new Element("mote"); element.setText(mote.getClass().getName()); Collection moteXML = mote.getConfigXML(); if (moteXML != null) element.addContent(moteXML); config.add(element); } return config; } /** * Sets the current simulation config depending on the given XML elements. * * @see #getConfigXML() * @param configXML * Config XML elements * @param visAvailable * True if simulation is allowed to show visualizers while loading * the given config * @return True if simulation config set successfully * @throws Exception * If configuration could not be loaded */ public boolean setConfigXML(Collection<Element> configXML, boolean visAvailable) throws Exception { // Parse elements for (Element element : configXML) { // Title if (element.getName().equals("title")) { title = element.getText(); } // Delay time if (element.getName().equals("delaytime")) { delayTime = Integer.parseInt(element.getText()); } // Tick time
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -