From 6cbe94b7e938aebed110ae861f9c07678db307db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20L=C3=B6scher?= Date: Thu, 6 Nov 2014 17:16:24 +0100 Subject: [PATCH 1/5] New PluginType SIM_CONTROL_PLUGIN for sim control SIM_CONTROL_PLGUIN are handled like SIM_PLUGIN, with one exception. If the simulation is started with -nogui= than it is checked if a controlling plugin is loaded. If not, the simulation terminates with an error message. --- .../cooja/java/org/contikios/cooja/Cooja.java | 37 ++++++++++--------- .../java/org/contikios/cooja/PluginType.java | 12 ++++++ .../contikios/cooja/plugins/ScriptRunner.java | 6 ++- 3 files changed, 37 insertions(+), 18 deletions(-) diff --git a/tools/cooja/java/org/contikios/cooja/Cooja.java b/tools/cooja/java/org/contikios/cooja/Cooja.java index d053fd45e..a0e9dccda 100644 --- a/tools/cooja/java/org/contikios/cooja/Cooja.java +++ b/tools/cooja/java/org/contikios/cooja/Cooja.java @@ -952,18 +952,20 @@ public class Cooja extends Observable { String tooltip = "
";
         if (pluginType == PluginType.COOJA_PLUGIN || pluginType == PluginType.COOJA_STANDARD_PLUGIN) {
           tooltip += "Cooja plugin: ";
-        } else if (pluginType == PluginType.SIM_PLUGIN || pluginType == PluginType.SIM_STANDARD_PLUGIN) {
+        } else if (pluginType == PluginType.SIM_PLUGIN || pluginType == PluginType.SIM_STANDARD_PLUGIN
+        		|| pluginType == PluginType.SIM_CONTROL_PLUGIN) {
           tooltip += "Simulation plugin: ";
           if (getSimulation() == null) {
             menuItem.setEnabled(false);
           }
         } else if (pluginType == PluginType.MOTE_PLUGIN) {
-          tooltip += "Mote plugin: ";
+          tooltip += "Mote plugin: "; 
         }
         tooltip += description + " (" + newPluginClass.getName() + ")";
 
         /* Check if simulation plugin depends on any particular radio medium */
-        if ((pluginType == PluginType.SIM_PLUGIN || pluginType == PluginType.SIM_STANDARD_PLUGIN) && (getSimulation() != null)) {
+        if ((pluginType == PluginType.SIM_PLUGIN || pluginType == PluginType.SIM_STANDARD_PLUGIN
+        		|| pluginType == PluginType.SIM_CONTROL_PLUGIN) && (getSimulation() != null)) {
           if (newPluginClass.getAnnotation(SupportedArguments.class) != null) {
             boolean active = false;
             Class[] radioMediums = newPluginClass.getAnnotation(SupportedArguments.class).radioMediums();
@@ -1020,7 +1022,8 @@ public class Cooja extends Observable {
           }
 
           int pluginType = pluginClass.getAnnotation(PluginType.class).value();
-          if (pluginType != PluginType.SIM_PLUGIN && pluginType != PluginType.SIM_STANDARD_PLUGIN) {
+          if (pluginType != PluginType.SIM_PLUGIN && pluginType != PluginType.SIM_STANDARD_PLUGIN
+        		  && pluginType == PluginType.SIM_CONTROL_PLUGIN) {
             continue;
           }
 
@@ -1848,8 +1851,8 @@ public class Cooja extends Observable {
           pluginClass.getConstructor(new Class[] { Mote.class, Simulation.class, Cooja.class })
           .newInstance(argMote, argSimulation, argGUI);
 
-      } else if (pluginType == PluginType.SIM_PLUGIN
-          || pluginType == PluginType.SIM_STANDARD_PLUGIN) {
+      } else if (pluginType == PluginType.SIM_PLUGIN || pluginType == PluginType.SIM_STANDARD_PLUGIN
+    		  || pluginType == PluginType.SIM_CONTROL_PLUGIN) {
         if (argGUI == null) {
           throw new PluginConstructionException("No GUI argument for simulation plugin");
         }
@@ -1931,7 +1934,8 @@ public class Cooja extends Observable {
     try {
       if (pluginType == PluginType.COOJA_PLUGIN || pluginType == PluginType.COOJA_STANDARD_PLUGIN) {
         pluginClass.getConstructor(new Class[] { Cooja.class });
-      } else if (pluginType == PluginType.SIM_PLUGIN || pluginType == PluginType.SIM_STANDARD_PLUGIN) {
+      } else if (pluginType == PluginType.SIM_PLUGIN || pluginType == PluginType.SIM_STANDARD_PLUGIN 
+    		  || pluginType == PluginType.SIM_CONTROL_PLUGIN) {
         pluginClass.getConstructor(new Class[] { Simulation.class, Cooja.class });
       } else if (pluginType == PluginType.MOTE_PLUGIN) {
         pluginClass.getConstructor(new Class[] { Mote.class, Simulation.class, Cooja.class });
@@ -3247,19 +3251,19 @@ public class Cooja extends Observable {
       }
       Cooja gui = sim.getCooja();
 
-      /* Make sure at least one test editor is controlling the simulation */
-      boolean hasEditor = false;
+      /* Make sure at least one plugin controlling the simulation */
+      boolean hasController = false;
       for (Plugin startedPlugin : gui.startedPlugins) {
-        if (startedPlugin instanceof ScriptRunner) {
-          hasEditor = true;
-          break;
-        }
+    	int pluginType = startedPlugin.getClass().getAnnotation(PluginType.class).value();
+    	if (pluginType == PluginType.SIM_CONTROL_PLUGIN) {
+    	  hasController = true;
+    	}
       }
 
       /* Backwards compatibility:
-       * simulation has no test editor, but has external (old style) test script.
+       * simulation has no control plugin, but has external (old style) test script.
        * We will manually start a test editor from here. */
-      if (!hasEditor) {
+      if (!hasController) {
         File scriptFile = new File(config.substring(0, config.length()-4) + ".js");
         if (scriptFile.exists()) {
           logger.info("Detected old simulation test, starting test editor manually from: " + scriptFile);
@@ -3280,8 +3284,7 @@ public class Cooja extends Observable {
         }
       }
 
-      sim.setSpeedLimit(null);
-      sim.startSimulation();
+
       
     } else if (args.length > 0 && args[0].startsWith("-applet")) {
 
diff --git a/tools/cooja/java/org/contikios/cooja/PluginType.java b/tools/cooja/java/org/contikios/cooja/PluginType.java
index 34790a823..9bf6344e9 100644
--- a/tools/cooja/java/org/contikios/cooja/PluginType.java
+++ b/tools/cooja/java/org/contikios/cooja/PluginType.java
@@ -109,6 +109,18 @@ public @interface PluginType {
    * @see #COOJA_PLUGIN
    */
   public static final int COOJA_STANDARD_PLUGIN = 5;
+  
+  /**
+   * Simulation Control Plugin
+   * 
+   * A Simulation Control Plugin indicates control over the simulation. If COOJA
+   * is loaded in nogui mode, it will terminate if no controll plugin is present.
+   * 
+   * COOJA plugins are available via the plugins menubar.
+   * 
+   * When constructed, a COOJA plugin is given the current GUI.  
+   */
+  public static final int SIM_CONTROL_PLUGIN = 6;
 
   int value();
 }
diff --git a/tools/cooja/java/org/contikios/cooja/plugins/ScriptRunner.java b/tools/cooja/java/org/contikios/cooja/plugins/ScriptRunner.java
index b77d365c8..4e3be7297 100644
--- a/tools/cooja/java/org/contikios/cooja/plugins/ScriptRunner.java
+++ b/tools/cooja/java/org/contikios/cooja/plugins/ScriptRunner.java
@@ -88,7 +88,7 @@ import org.contikios.cooja.dialogs.MessageList;
 import org.contikios.cooja.util.StringUtils;
 
 @ClassDescription("Simulation script editor")
-@PluginType(PluginType.SIM_PLUGIN)
+@PluginType(PluginType.SIM_CONTROL_PLUGIN)
 public class ScriptRunner extends VisPlugin {
   private static final long serialVersionUID = 7614358340336799109L;
   private static Logger logger = Logger.getLogger(ScriptRunner.class);
@@ -274,6 +274,10 @@ public class ScriptRunner extends VisPlugin {
     if (script != null) {
       updateScript(script);
     }
+    
+    /* start simulation */
+    simulation.setSpeedLimit(null);
+    simulation.startSimulation();
   }
 
   public void setLinkFile(File source) {

From 4dcc3ba7fa293c9865bdb7c2b9c3cd3980786edc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andreas=20L=C3=B6scher?= 
Date: Thu, 6 Nov 2014 17:23:01 +0100
Subject: [PATCH 2/5] Better error message when aborting simulation

---
 tools/cooja/java/org/contikios/cooja/Cooja.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tools/cooja/java/org/contikios/cooja/Cooja.java b/tools/cooja/java/org/contikios/cooja/Cooja.java
index a0e9dccda..34ff20195 100644
--- a/tools/cooja/java/org/contikios/cooja/Cooja.java
+++ b/tools/cooja/java/org/contikios/cooja/Cooja.java
@@ -959,7 +959,7 @@ public class Cooja extends Observable {
             menuItem.setEnabled(false);
           }
         } else if (pluginType == PluginType.MOTE_PLUGIN) {
-          tooltip += "Mote plugin: "; 
+          tooltip += "Mote plugin: ";
         }
         tooltip += description + " (" + newPluginClass.getName() + ")";
 
@@ -3279,7 +3279,7 @@ public class Cooja extends Observable {
             System.exit(1);
           }
         } else {
-          logger.fatal("No test editor controlling simulation, aborting");
+          logger.fatal("No plugin controlling simulation, aborting");
           System.exit(1);
         }
       }

From 0e729592f352eb04cd10c27469404f1cf7700379 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andreas=20L=C3=B6scher?= 
Date: Fri, 7 Nov 2014 11:45:38 +0100
Subject: [PATCH 3/5] Added the control plugin behaviour to executeJAR

---
 .../org/contikios/cooja/util/ExecuteJAR.java  | 20 +++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/tools/cooja/java/org/contikios/cooja/util/ExecuteJAR.java b/tools/cooja/java/org/contikios/cooja/util/ExecuteJAR.java
index 9ba6bd01a..7946cfbd0 100644
--- a/tools/cooja/java/org/contikios/cooja/util/ExecuteJAR.java
+++ b/tools/cooja/java/org/contikios/cooja/util/ExecuteJAR.java
@@ -230,18 +230,18 @@ public class ExecuteJAR {
       logger.info("Checking mote types: '" + Cooja.getDescriptionOf(t.getClass()) + "'");
     }
 
-    /* Check dependencies: Contiki Test Editor */
-    boolean hasTestEditor = false;
-    for (Plugin startedPlugin : gui.getStartedPlugins()) {
-      if (startedPlugin instanceof ScriptRunner) {
-        hasTestEditor = true;
-        break;
-      }
+    /* Check dependencies: Contiki Control Plugin */
+    boolean hasController = false;
+    for (Plugin startedPlugin : gui.startedPlugins) {
+  	int pluginType = startedPlugin.getClass().getAnnotation(PluginType.class).value();
+  	if (pluginType == PluginType.SIM_CONTROL_PLUGIN) {
+  	  hasController = true;
+  	}
     }
-    logger.info("Checking that Contiki Test Editor exists: " + hasTestEditor);
-    if (!hasTestEditor) {
+    logger.info("Checking that Contiki Control Plugin exists: " + hasController);
+    if (!hasController) {
       throw new RuntimeException(
-          "The simulation needs at least one active Contiki Test Editor plugin.\n" +
+          "The simulation needs at least one active control plugin.\n" +
           "The plugin is needed to control the non-visualized simulation."
       );
     }

From f68bc3a40bae71c8c32137c425bd03103ccc6870 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andreas=20L=C3=B6scher?= 
Date: Fri, 7 Nov 2014 12:09:14 +0100
Subject: [PATCH 4/5] fixed a bug in executeJAR

---
 .../java/org/contikios/cooja/util/ExecuteJAR.java     | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/tools/cooja/java/org/contikios/cooja/util/ExecuteJAR.java b/tools/cooja/java/org/contikios/cooja/util/ExecuteJAR.java
index 7946cfbd0..66bbbd193 100644
--- a/tools/cooja/java/org/contikios/cooja/util/ExecuteJAR.java
+++ b/tools/cooja/java/org/contikios/cooja/util/ExecuteJAR.java
@@ -57,6 +57,7 @@ import org.contikios.cooja.dialogs.CompileContiki;
 import org.contikios.cooja.dialogs.MessageList;
 import org.contikios.cooja.dialogs.MessageList.MessageContainer;
 import org.contikios.cooja.plugins.ScriptRunner;
+import org.contikios.cooja.PluginType;
 
 public class ExecuteJAR {
   private static Logger logger = Logger.getLogger(ExecuteJAR.class);
@@ -232,11 +233,11 @@ public class ExecuteJAR {
 
     /* Check dependencies: Contiki Control Plugin */
     boolean hasController = false;
-    for (Plugin startedPlugin : gui.startedPlugins) {
-  	int pluginType = startedPlugin.getClass().getAnnotation(PluginType.class).value();
-  	if (pluginType == PluginType.SIM_CONTROL_PLUGIN) {
-  	  hasController = true;
-  	}
+    for (Plugin startedPlugin : gui.getStartedPlugins()) {
+      int pluginType = startedPlugin.getClass().getAnnotation(PluginType.class).value();
+      if (pluginType == PluginType.SIM_CONTROL_PLUGIN) {
+        hasController = true;
+      }
     }
     logger.info("Checking that Contiki Control Plugin exists: " + hasController);
     if (!hasController) {

From 6d61893e0995f57358a938459ef8922ac8eddc53 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andreas=20L=C3=B6scher?= 
Date: Fri, 7 Nov 2014 13:53:16 +0100
Subject: [PATCH 5/5] Fixed a bug with the ScriptRunner plugin

The ScriptRunner plugin started the simulation in GUI and NOGUI mode.
Now the simulation is only started in nogui mode
---
 tools/cooja/java/org/contikios/cooja/Cooja.java      |  2 +-
 .../org/contikios/cooja/plugins/ScriptRunner.java    | 12 ++++++++----
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/tools/cooja/java/org/contikios/cooja/Cooja.java b/tools/cooja/java/org/contikios/cooja/Cooja.java
index 34ff20195..c131e3e22 100644
--- a/tools/cooja/java/org/contikios/cooja/Cooja.java
+++ b/tools/cooja/java/org/contikios/cooja/Cooja.java
@@ -1023,7 +1023,7 @@ public class Cooja extends Observable {
 
           int pluginType = pluginClass.getAnnotation(PluginType.class).value();
           if (pluginType != PluginType.SIM_PLUGIN && pluginType != PluginType.SIM_STANDARD_PLUGIN
-        		  && pluginType == PluginType.SIM_CONTROL_PLUGIN) {
+        		  && pluginType != PluginType.SIM_CONTROL_PLUGIN) {
             continue;
           }
 
diff --git a/tools/cooja/java/org/contikios/cooja/plugins/ScriptRunner.java b/tools/cooja/java/org/contikios/cooja/plugins/ScriptRunner.java
index 4e3be7297..bce5764e6 100644
--- a/tools/cooja/java/org/contikios/cooja/plugins/ScriptRunner.java
+++ b/tools/cooja/java/org/contikios/cooja/plugins/ScriptRunner.java
@@ -274,10 +274,14 @@ public class ScriptRunner extends VisPlugin {
     if (script != null) {
       updateScript(script);
     }
-    
-    /* start simulation */
-    simulation.setSpeedLimit(null);
-    simulation.startSimulation();
+  }
+
+  public void startPlugin() {
+	/* start simulation */
+	if (!Cooja.isVisualized()) {
+	  simulation.setSpeedLimit(null);
+	  simulation.startSimulation();
+	}
   }
 
   public void setLinkFile(File source) {