Browse Source

Adds Abstract Events - enables scheduling of e.g. sensor updated

Andreas T. Meyer-Berg 5 years ago
parent
commit
d3e28692ce

+ 30 - 2
src/main/java/de/tu_darmstadt/tk/SmartHomeNetworkSim/core/protocols/MQTT_protocol.java

@@ -10,12 +10,14 @@ import java.util.Random;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Packet;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Port;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Protocol;
+import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.SimulationManager;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.SmartDevice;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.devices.BoolCollector;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.devices.BoolSensor;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.devices.FloatCollector;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.devices.FloatSensor;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.protocols.packets.MQTT_packet;
+import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.scheduler.AbstractEvent;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.util.Pair;
 
 /**
@@ -321,10 +323,36 @@ public class MQTT_protocol implements Protocol {
 							// Update Collector
 							if (device instanceof FloatSensor && p.getOwner() instanceof FloatCollector
 									&& newTopic.equals(((FloatSensor) device).getFSinfoName())) {
-								((FloatCollector) p.getOwner()).setFCval(((FloatSensor) device).getFSval());
+								/**
+								 * original Float Value -> if it might change during the two events
+								 */
+								float oldValue = ((FloatSensor) device).getFSval();
+								/**
+								 * Schedule Event to update the sensor 
+								 * -> therefore multiple parallel interactions would be in the right order
+								 */
+								SimulationManager.scheduleEvent(new AbstractEvent(timestep + p.getResponseTime()) {	
+									@Override
+									public void simulateEvent() {
+										((FloatCollector) p.getOwner()).setFCval(oldValue);
+									}
+								});
 							} else if (device instanceof BoolSensor && p.getOwner() instanceof BoolCollector
 									&& newTopic.equals(((BoolSensor) device).getBSinfoName())) {
-								((BoolCollector) p.getOwner()).setBCval(((BoolSensor) device).getBSval());
+								/**
+								 * Original sensor value
+								 */
+								boolean oldValue = ((BoolSensor) device).getBSval();
+								/**
+								 * Schedule Event to update the sensor 
+								 * -> therefore multiple parallel interactions would be in the right order
+								 */
+								SimulationManager.scheduleEvent(new AbstractEvent(timestep + p.getResponseTime()) {	
+									@Override
+									public void simulateEvent() {
+										((BoolCollector) p.getOwner()).setBCval(oldValue);
+									}
+								});
 							}
 						}
 					}

+ 31 - 0
src/main/java/de/tu_darmstadt/tk/SmartHomeNetworkSim/core/scheduler/AbstractEvent.java

@@ -0,0 +1,31 @@
+package de.tu_darmstadt.tk.SmartHomeNetworkSim.core.scheduler;
+
+/**
+ * Abstract Event can be used to schedule changes to the model. For example, updates of devices.
+ *
+ * @author Andreas T. Meyer-Berg
+ */
+public abstract class AbstractEvent implements Schedulable {
+
+	/**
+	 * Timestep the event takes place
+	 */
+	private long timestep;
+	
+	/**
+	 * Creates an Event at the given timestep, which can be scheduled.
+	 * @param timestep timestep, the event should be scheduled
+	 */
+	public AbstractEvent(long timestep){
+		this.timestep = timestep;
+	}
+	
+	@Override
+	public long getEventTime(){
+		return timestep;
+	}
+
+	@Override
+	public abstract void simulateEvent();
+
+}