Browse Source

Adds global scheduling of network traffic

Not possible to schedule Event before the last simulated event.
Static SimulationManager.scheduler allows scheduling of new events while
simulating others. E.g. by adding events for response packets in
protocols, event for delayed manipulations, like turn on the light after
5 mins or anything one could imaging.
Andreas T. Meyer-Berg 5 years ago
parent
commit
4619538e98

+ 3 - 0
src/main/java/de/tu_darmstadt/tk/SmartHomeNetworkSim/core/Port.java

@@ -314,5 +314,8 @@ public class Port implements Schedulable {
 		//Encapsulate in Links
 		connection.getLink().addPackets(packets);
 		
+		if(status==Port.SENDING)
+			SimulationManager.scheduleEvent(this);
+		
 	}
 }

+ 38 - 2
src/main/java/de/tu_darmstadt/tk/SmartHomeNetworkSim/core/SimulationManager.java

@@ -6,6 +6,7 @@ import java.util.Observable;
 import javax.swing.Timer;
 
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.control.Controller;
+import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.scheduler.Schedulable;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.scheduler.Scheduler;
 
 /**
@@ -78,7 +79,7 @@ public class SimulationManager extends Observable {
 	/**
 	 * Scheduler which stores the event queue and enables scheduling and running of further events
 	 */
-	private Scheduler scheduler;
+	private static Scheduler scheduler;
 	
 	/**
 	 * Creates a new Simulationmanager
@@ -131,7 +132,23 @@ public class SimulationManager extends Observable {
 		//TODO: Export
 		
 		//Simulates the network
-		simulateNetwork(startTime, duration);
+		boolean oldWay = false;
+		if(oldWay)
+			simulateNetwork(startTime, duration);
+		else{
+			long maxTime = startTime+duration;
+			scheduler.scheduleAll(model);
+			for(Connection con:model.getConnections()){
+				Link l = con.getLink();
+				if(l!=null)
+					l.addPackets(con.getTerminationPackages(startTime));
+			}
+			while(scheduler.hasNext(maxTime)){
+				Schedulable currentEvent = scheduler.getAndRemoveFirst();
+				System.out.println("Event time: "+currentEvent.getEventTime());
+				currentEvent.simulateEvent();
+			}
+		}
 		runAlgorithms(startTime+duration);
 		collectionMan.collectPackets();
 		//Run all 
@@ -340,6 +357,7 @@ public class SimulationManager extends Observable {
 		this.controller = controller;
 		if(algo!=null)
 			algos.add(algo);
+		
 	}
 	
 	/**
@@ -365,4 +383,22 @@ public class SimulationManager extends Observable {
 	public PacketExportManager getPacketExportManager(){
 		return exportMan;
 	}
+	
+	/**
+	 * Adds an event to the event queue, which will be simulated later. Returns falls, if it could not be added (e.g. timestep to low)
+	 * @param event event which should be scheduled
+	 * @return true if it was scheduled, false if not
+	 */
+	public static boolean scheduleEvent(Schedulable event){
+		return scheduler.scheduleEvent(event);
+	}
+	
+	/**
+	 * Removes an event from the global event queue
+	 * @param event Event which should be removed
+	 * @return true, if it was removed, false if not
+	 */
+	public static boolean removeEvent(Schedulable event){
+		return scheduler.removeEvent(event);
+	}
 }

+ 54 - 0
src/main/java/de/tu_darmstadt/tk/SmartHomeNetworkSim/core/scheduler/Scheduler.java

@@ -2,6 +2,10 @@ package de.tu_darmstadt.tk.SmartHomeNetworkSim.core.scheduler;
 
 import java.util.TreeSet;
 
+import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Connection;
+import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Model;
+import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Port;
+
 /**
  * The Scheduler manages the EventQueue of the framework and allows manipulating the queue.
  *
@@ -33,9 +37,59 @@ public class Scheduler {
 	 * @return true if it was scheduled, false if otherwise
 	 */
 	public boolean scheduleEvent(Schedulable event){
+		if(event.getEventTime()<minimumTimeStep)
+			return false;
 		return eventQueue.add(event);
 	}
 	
+	/**
+	 * Schedules all network events of the given model
+	 * @param m Model which should be scheduled
+	 */
+	public void scheduleAll(Model m){
+		for(Connection c: m.getConnections())
+			for(Port p:c.getParticipants()){
+				if(p != null && p.getStatus() == Port.SENDING)
+				scheduleEvent(p);				
+			}
+	}
+	
+	/**
+	 * Return true, if the EventQueue contains another event before the given maximum time
+	 * @param maxTime exclusive maximum time events should have in this simulation interval
+	 * @return true, if 
+	 */
+	public boolean hasNext(long maxTime){
+		if(eventQueue.isEmpty()) 
+			return false;
+		return eventQueue.first().getEventTime()<maxTime;
+	}
+	
+	/**
+	 * Returns the next Event, which will be simulated
+	 * @return next event
+	 */
+	public Schedulable getNextEvent(){
+		return eventQueue.first();
+	}
+	
+	/**
+	 * Returns the first Element of the queue and removes it.
+	 * @return
+	 */
+	public Schedulable getAndRemoveFirst(){
+		return eventQueue.pollFirst();
+	}
+	
+	/**
+	 * Removes the event from the Event Queue, it will not be simulated
+	 * @param event Event to be removed
+	 * @return true if it was removed
+	 */
+	public boolean removeEvent(Schedulable event){
+		return eventQueue.remove(event);
+	}
+	
 	/**
 	 * Resets the EventQueue by removing all events and resetting the minimum timestep
 	 */