Kaynağa Gözat

Statemachine timing compensates time drift between event recognition and timer initialization now.

markus.muehlbrandt@itemis.de 13 yıl önce
ebeveyn
işleme
d944fb9d56

+ 1 - 2
plugins/org.yakindu.sct.generator.java/build.properties

@@ -1,5 +1,4 @@
-source.. = src/,\
-           src-gen
+source.. = src/
 bin.includes = META-INF/,\
                .,\
                plugin.xml,\

+ 5 - 1
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/templates/CustomBaseStatemachine.xpt

@@ -28,7 +28,7 @@ Contributors:
 «ENDDEFINE»
 
 «DEFINE ActionCode FOR ScheduleTimeEvent-»
-getTimerHandler().setTimer(«timeEvent.getName()», «timeValue.toCode()»);
+getTimerHandler().setTimer(«timeEvent.getName()», «timeValue.toCode()», cycleStartTime);
 «ENDDEFINE»
 
 «DEFINE ActionCode FOR UnscheduleTimeEvent-»
@@ -136,6 +136,7 @@ else {
 
 «DEFINE EntryCode FOR EnterState-»
 	public void «statemachineEntryFunctionName()» {
+		cycleStartTime = System.currentTimeMillis();
 		«EXPAND ActionCode FOR this-»
 		«IF state.entryAction != null-»
 		«state.entryAction.entryActionFunctionName()»();
@@ -202,6 +203,8 @@ public abstract class 
 	
 	private ITimerHandler timerHandler;
 	
+	private long cycleStartTime;
+	
 	public «getBaseStatemachineName()»(Collection<Event> occuredEvents) {
 		this.occuredEvents = occuredEvents;
 		this.outEvents = new HashSet<Event>();
@@ -284,6 +287,7 @@ public abstract class 
 «EXPAND ExitMethodImplement FOREACH this.states-»
 
 	protected void runCycle(Collection<?> events) {
+		cycleStartTime = System.currentTimeMillis();
 		getOutEvents().clear();
 		for (State state : activeStates) {
 			switch (state) {

+ 1 - 1
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/templates/ITimerHandler.xpt

@@ -22,7 +22,7 @@ package 
 
 public interface ITimerHandler {
 	
-	public void setTimer(TimeEvent event, long time);
+	public void setTimer(TimeEvent event, long time, long cycleStartTime);
 	
 	public void resetTimer(TimeEvent event);
 }

+ 7 - 6
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/templates/TimerHandler.xpt

@@ -40,7 +40,7 @@ public class TimerHandler implements ITimerHandler {
 	}
 
 	@Override
-	public void setTimer(final TimeEvent event, long time) {
+	public void setTimer(final TimeEvent event, long time, long cycleStartTime) {
 		// Reset existing TimerTask for event. This step isn't necessary if
 		// timer tasks are properly reset by sexec model.
 		if (timerTaskMap.containsKey(event)) {
@@ -58,12 +58,13 @@ public class TimerHandler implements ITimerHandler {
 		//set time field of event
 		event.setTime(time);
 		
-		//start scheduling the timer.
+		// start scheduling the timer
 		if (event.getValue()) {
-			timer.scheduleAtFixedRate(timerTaskMap.get(event), time, time);
-		}
-		else {
-			timer.schedule(timerTaskMap.get(event), time);
+			timer.scheduleAtFixedRate(timerTaskMap.get(event),
+					time - (System.currentTimeMillis() - cycleStartTime), time);
+		} else {
+			timer.schedule(timerTaskMap.get(event),
+					time - (System.currentTimeMillis() - cycleStartTime));
 		}
 	}