/** * Returns simulation with with given ID. * * @param id ID * @return Mote or null * @see Mote#getID() */ public Mote getMoteWithID(int id) { for (Mote m : motes) { if (m.getID() == id) { return m; } } return null; }
/** * Sets the current simulation config depending on the given configuration. * * @param configXML Simulation configuration * @param visAvailable True if simulation is allowed to show visualizers * @param manualRandomSeed Simulation random seed. May be null, in which case the configuration is * used * @return True if simulation was configured successfully * @throws Exception If configuration could not be loaded */ public boolean setConfigXML( Collection<Element> configXML, boolean visAvailable, Long manualRandomSeed) throws Exception { // Parse elements for (Element element : configXML) { // Title if (element.getName().equals("title")) { title = element.getText(); } // Delay time if (element.getName().equals("delaytime")) { setDelayTime(Integer.parseInt(element.getText())); } // Random seed if (element.getName().equals("randomseed")) { long newSeed; if (element.getText().equals("generated")) { randomSeedGenerated = true; newSeed = new Random().nextLong(); } else { newSeed = Long.parseLong(element.getText()); } if (manualRandomSeed != null) { newSeed = manualRandomSeed; } setRandomSeed(newSeed); } // Max mote startup delay if (element.getName().equals("motedelay")) { maxMoteStartupDelay = Integer.parseInt(element.getText()) * MILLISECOND; } if (element.getName().equals("motedelay_us")) { maxMoteStartupDelay = Integer.parseInt(element.getText()); } // Radio medium if (element.getName().equals("radiomedium")) { String radioMediumClassName = element.getText().trim(); Class<? extends RadioMedium> radioMediumClass = myGUI.tryLoadClass(this, RadioMedium.class, radioMediumClassName); if (radioMediumClass != null) { // Create radio medium specified in config try { currentRadioMedium = RadioMedium.generateRadioMedium(radioMediumClass, this); } catch (Exception e) { currentRadioMedium = null; logger.warn("Could not load radio medium class: " + radioMediumClassName); } } // Show configure simulation dialog boolean createdOK = false; if (visAvailable) { createdOK = CreateSimDialog.showDialog(GUI.getTopParentContainer(), this); } else { createdOK = true; } if (!createdOK) { logger.debug("Simulation not created, aborting"); throw new Exception("Load aborted by user"); } // Check if radio medium specific config should be applied if (radioMediumClassName.equals(currentRadioMedium.getClass().getName())) { currentRadioMedium.setConfigXML(element.getChildren(), visAvailable); } else { logger.info("Radio Medium changed - ignoring radio medium specific config"); } } /* Event central */ if (element.getName().equals("events")) { eventCentral.setConfigXML(this, element.getChildren(), visAvailable); } // Mote type if (element.getName().equals("motetype")) { String moteTypeClassName = element.getText().trim(); /* Try to recreate simulation using a different mote type */ if (visAvailable) { String[] availableMoteTypes = getGUI().getProjectConfig().getStringArrayValue("se.sics.cooja.GUI.MOTETYPES"); String newClass = (String) JOptionPane.showInputDialog( GUI.getTopParentContainer(), "The simulation is about to load '" + moteTypeClassName + "'\n" + "You may try to load the simulation using a different mote type.\n", "Loading mote type", JOptionPane.QUESTION_MESSAGE, null, availableMoteTypes, moteTypeClassName); if (newClass != null && !newClass.equals(moteTypeClassName)) { logger.warn("Changing mote type class: " + moteTypeClassName + " -> " + newClass); moteTypeClassName = newClass; } } Class<? extends MoteType> moteTypeClass = myGUI.tryLoadClass(this, MoteType.class, moteTypeClassName); if (moteTypeClass == null) { logger.fatal("Could not load mote type class: " + moteTypeClassName); throw new MoteType.MoteTypeCreationException( "Could not load mote type class: " + moteTypeClassName); } MoteType moteType = moteTypeClass.getConstructor((Class[]) null).newInstance(); boolean createdOK = moteType.setConfigXML(this, element.getChildren(), visAvailable); if (createdOK) { addMoteType(moteType); } else { logger.fatal("Mote type was not created: " + element.getText().trim()); throw new Exception("All mote types were not recreated"); } } /* Mote */ if (element.getName().equals("mote")) { /* Read mote type identifier */ MoteType moteType = null; for (Element subElement : (Collection<Element>) element.getChildren()) { if (subElement.getName().equals("motetype_identifier")) { moteType = getMoteType(subElement.getText()); if (moteType == null) { throw new Exception("No mote type '" + subElement.getText() + "' for mote"); } break; } } if (moteType == null) { throw new Exception("No mote type specified for mote"); } /* Create mote using mote type */ Mote mote = moteType.generateMote(this); if (mote.setConfigXML(this, element.getChildren(), visAvailable)) { if (getMoteWithID(mote.getID()) != null) { logger.warn("Ignoring duplicate mote ID: " + mote.getID()); } else { addMote(mote); } } else { logger.fatal("Mote was not created: " + element.getText().trim()); throw new Exception("All motes were not recreated"); } } } if (currentRadioMedium != null) { currentRadioMedium.simulationFinishedLoading(); } setChanged(); notifyObservers(this); /* Execute simulation thread events now, before simulation starts */ while (hasPollRequests) { popSimulationInvokes().run(); } return true; }