Преглед изворни кода

Changed TimingService to use Virtual Time

Andreas Mülder пре 13 година
родитељ
комит
ed42636199

+ 5 - 0
plugins/org.yakindu.sct.model.sexec.interpreter/src/org/yakindu/sct/model/sexec/interpreter/ITimingService.java

@@ -11,6 +11,7 @@
 package org.yakindu.sct.model.sexec.interpreter;
 
 import org.yakindu.sct.simulation.core.runtime.IExecutionContext;
+import org.yakindu.sct.simulation.core.runtime.timer.VirtualClock;
 
 /**
  * 
@@ -47,4 +48,8 @@ public interface ITimingService {
 	 */
 	public void stop();
 
+	public void setTimeScaleFactor(double factor);
+	
+	public void init(VirtualClock clock);
+
 }

+ 18 - 8
plugins/org.yakindu.sct.model.sexec.interpreter/src/org/yakindu/sct/model/sexec/interpreter/impl/ExecutionFlowInterpreter.xtend

@@ -64,13 +64,14 @@ import org.yakindu.sct.simulation.core.runtime.AbstractExecutionFacade
 import org.yakindu.sct.model.sexec.Trace
 import java.util.Arrays
 import org.yakindu.sct.model.sexec.impl.ExecutionStateImpl
+import org.yakindu.sct.simulation.core.runtime.IExecutionContextListener
 
 /**
  * 
  * @author andreas muelder - Initial contribution and API
  * 
  */
-class ExecutionFlowInterpreter extends AbstractExecutionFacade implements IExecutionFlowInterpreter {
+class ExecutionFlowInterpreter extends AbstractExecutionFacade implements IExecutionFlowInterpreter,IExecutionContextListener {
 	
 	@Inject
 	IStatementInterpreter interpreter
@@ -92,8 +93,11 @@ class ExecutionFlowInterpreter extends AbstractExecutionFacade implements IExecu
 		for(scope : flow.scopes){
 			scope.declareContents
 		} 
-		
 		executionContext.initStateConfigurationVector(flow.stateVector.size)
+		executionContext.addExecutionContextListener(this);
+	
+		timingService.init(executionContext.virtualClock)
+		executionContext.virtualClock.start
 	}
 	
 	override tearDown(){
@@ -226,9 +230,6 @@ class ExecutionFlowInterpreter extends AbstractExecutionFacade implements IExecu
 	def dispatch execute(EnterState enterState){
 		executionContext.stateConfiguration.set(enterState.state.stateVector.offset, enterState.state)
 		nextSVIdx = enterState.state.stateVector.offset // mark all state vector elements up to this as processed ...		
-
-		System::out.println( "enter " + enterState.state.simpleName + " > " + executionContext.stateConfiguration.fold("scv: ", [ m, s | m + (if (s==null) " _" else " " + s.simpleName )] ) )
-
 		null
 	}
 	
@@ -238,9 +239,6 @@ class ExecutionFlowInterpreter extends AbstractExecutionFacade implements IExecu
 	
 	def dispatch execute(ExitState exitState){
 		executionContext.stateConfiguration.set(exitState.state.stateVector.offset, null)
-
-		System::out.println( "exit " + exitState.state.simpleName + " > " + executionContext.stateConfiguration.fold("scv: ", [ m, s | m + (if (s==null) " _" else " " + s.simpleName )] ) )
-		
 		null
 	}
 	
@@ -285,4 +283,16 @@ class ExecutionFlowInterpreter extends AbstractExecutionFacade implements IExecu
 		timingService.unscheduleTimeEvent(timeEvent.timeEvent.name)
 		null
 	}
+	
+	override void eventRaised(ExecutionEvent event){
+		
+	}
+
+	override void variableValueChanged(ExecutionVariable variable){
+		
+	}
+
+	override void timeScaleFactorChanged(double oldFactor, double newFactor){
+		timingService.setTimeScaleFactor(newFactor)
+	}
 }

+ 26 - 11
plugins/org.yakindu.sct.model.sexec.interpreter/src/org/yakindu/sct/model/sexec/interpreter/impl/TimerTaskTimingService.java

@@ -13,28 +13,30 @@ package org.yakindu.sct.model.sexec.interpreter.impl;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Timer;
-import java.util.TimerTask;
 
 import org.yakindu.sct.model.sexec.interpreter.ITimingService;
 import org.yakindu.sct.simulation.core.runtime.IExecutionContext;
+import org.yakindu.sct.simulation.core.runtime.timer.VirtualClock;
+import org.yakindu.sct.simulation.core.runtime.timer.VirtualTimer;
+import org.yakindu.sct.simulation.core.runtime.timer.VirtualTimerTask;
 
 /**
- * Implementation of {@link ITimingService} interface using standard 
+ * Implementation of {@link ITimingService} interface using standard
  * 
  * @author andreas muelder - Initial contribution and API
  * 
  */
 public class TimerTaskTimingService implements ITimingService {
 
-	private Timer timer;
-	private Map<String, TimerTask> timerTasks;
+	private VirtualTimer timer;
+
+	private Map<String, VirtualTimerTask> timerTasks;
 
 	public TimerTaskTimingService() {
-		timer = new Timer();
-		timerTasks = new HashMap<String, TimerTask>();
+		timerTasks = new HashMap<String, VirtualTimerTask>();
 	}
 
+	
 	public void scheduleTimeEvent(IExecutionContext context, String eventName,
 			boolean isPeriodical, int duration) {
 		TimeEventTask timeEventTask = new TimeEventTask(context, eventName);
@@ -47,12 +49,12 @@ public class TimerTaskTimingService implements ITimingService {
 	}
 
 	public void unscheduleTimeEvent(String eventName) {
-		TimerTask timerTask = timerTasks.get(eventName);
+		VirtualTimerTask timerTask = timerTasks.get(eventName);
 		timerTask.cancel();
 		timer.purge();
 	}
 
-	public class TimeEventTask extends TimerTask {
+	public class TimeEventTask extends VirtualTimerTask {
 
 		private final IExecutionContext context;
 		private final String eventName;
@@ -76,9 +78,22 @@ public class TimerTaskTimingService implements ITimingService {
 	}
 
 	public void stop() {
-		Collection<TimerTask> values = timerTasks.values();
-		for (TimerTask timerTask : values) {
+		Collection<VirtualTimerTask> values = timerTasks.values();
+		for (VirtualTimerTask timerTask : values) {
 			timerTask.cancel();
 		}
 	}
+
+	public void init(VirtualClock clock) {
+		timer = new VirtualTimer(clock);
+	}
+
+	public void setTimeScaleFactor(double factor) {
+		timer.getClock().setFactor(factor);
+	}
+
+	public VirtualTimer getTimer() {
+		return timer;
+	}
+
 }