|
@@ -18,6 +18,67 @@ Contributors:
|
|
|
«EXTENSION org::yakindu::sct::generator::java::templates::GenmodelEntries»
|
|
|
«EXTENSION org::yakindu::sct::generator::java::templates::Naming»
|
|
|
|
|
|
+«DEFINE Imports(sgen::GeneratorEntry entry) FOR ExecutionFlow»
|
|
|
+«IF createInterfaceObserverSupport(entry) && hasOutgoingEvents()-»
|
|
|
+import java.util.LinkedList;
|
|
|
+import java.util.List;
|
|
|
+«ENDIF-»
|
|
|
+«IF isTimedStatemachine()-»
|
|
|
+ import «entry.getBasePackageName()».TimeEvent;
|
|
|
+ import «entry.getBasePackageName()».ITimerService;
|
|
|
+«ENDIF-»
|
|
|
+«ENDDEFINE»
|
|
|
+
|
|
|
+«DEFINE FieldDeclarations(sgen::GeneratorEntry entry) FOR ExecutionFlow»
|
|
|
+ «FOREACH getInternalScopeEvents() AS event-»
|
|
|
+ private final boolean «event.getEventIdentifier()»;
|
|
|
+
|
|
|
+ «IF !event.type.isVoid()-»
|
|
|
+ private final «event.type.getJavaType()» «event.getEventValueIdentifier()»;
|
|
|
+
|
|
|
+ «ENDIF-»
|
|
|
+ «ENDFOREACH-»
|
|
|
+
|
|
|
+ «FOREACH getTimeEvents() AS timeEvent-»
|
|
|
+ private final TimeEvent «timeEvent.getEventIdentifier()» = new TimeEvent(«timeEvent.periodic», «getTimeEvents().indexOf(timeEvent)»);
|
|
|
+ «ENDFOREACH»
|
|
|
+
|
|
|
+ «IF isTimedStatemachine()-»
|
|
|
+ private final boolean[] timeEvents = new boolean[«getTimeEvents().size»];
|
|
|
+ «ENDIF-»
|
|
|
+
|
|
|
+ «FOREACH this.scopes.typeSelect(InterfaceScope) AS scope-»
|
|
|
+ «EXPAND StatemachineInterfaceImpl::InterfaceImpl(entry) FOR scope-»
|
|
|
+
|
|
|
+ private «scope.getInterfaceImplName()» «scope.getInterfaceIdentifier()»;
|
|
|
+ «ENDFOREACH-»
|
|
|
+
|
|
|
+ public enum State {
|
|
|
+ «FOREACH states AS state-»
|
|
|
+ «state.getName()»,
|
|
|
+ «ENDFOREACH-»
|
|
|
+ «getNullStateName()»
|
|
|
+ };
|
|
|
+
|
|
|
+ «FOREACH getInternalScopeVariables() AS variable-»
|
|
|
+ private «variable.type.getJavaType()» «variable.getValueName()»«variable.getInitialValueAssignment()»;
|
|
|
+
|
|
|
+ «ENDFOREACH-»
|
|
|
+ «IF hasHistory()-»
|
|
|
+ private State[] historyVector = new State[«historyVector.size»];
|
|
|
+
|
|
|
+ «ENDIF-»
|
|
|
+ private final State[] stateVector = new State[«stateVector.size»];
|
|
|
+
|
|
|
+ private int nextStateIndex;
|
|
|
+
|
|
|
+ «IF isTimedStatemachine()-»
|
|
|
+ private ITimerService timerService;
|
|
|
+
|
|
|
+ private long cycleStartTime;
|
|
|
+ «ENDIF-»
|
|
|
+«ENDDEFINE»
|
|
|
+
|
|
|
«DEFINE ActionCode FOR Step-»
|
|
|
// ActionCode for Step «toString()» not defined
|
|
|
«ENDDEFINE»
|
|
@@ -45,12 +106,12 @@ Contributors:
|
|
|
|
|
|
«DEFINE ActionCode FOR ScheduleTimeEvent-»
|
|
|
«getComment()-»
|
|
|
-getTimerService().setTimer(«timeEvent.getEventName()», «timeValue.toCode()», cycleStartTime);
|
|
|
+getTimerService().setTimer(«timeEvent.getEventIdentifier()», «timeValue.toCode()», cycleStartTime);
|
|
|
«ENDDEFINE»
|
|
|
|
|
|
«DEFINE ActionCode FOR UnscheduleTimeEvent-»
|
|
|
«getComment()-»
|
|
|
-getTimerService().resetTimer(«timeEvent.getEventName()»);
|
|
|
+getTimerService().resetTimer(«timeEvent.getEventIdentifier()»);
|
|
|
«ENDDEFINE»
|
|
|
|
|
|
«DEFINE ActionCode FOR Execution-»
|
|
@@ -222,27 +283,30 @@ else {
|
|
|
|
|
|
«IF !event.type.isVoid()-»
|
|
|
private void raise«event.getEventName()»(«event.type.getJavaType()» value) {
|
|
|
- «event.getEventName()».setValue(value);
|
|
|
- getOccuredEvents().add(«event.getEventName()»);
|
|
|
+ «event.getEventValueIdentifier()» = value;
|
|
|
+ «event.getEventIdentifier()» = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ private «event.type.getJavaType()» get«event.getEventName()»Value() {
|
|
|
+ «event.getIllegalAccessValidation()»
|
|
|
+ return «event.getEventValueIdentifier()»;
|
|
|
}
|
|
|
+
|
|
|
«ELSE-»
|
|
|
private void raise«event.getEventName()»() {
|
|
|
- getOccuredEvents().add(«event.getEventName()»);
|
|
|
+ «event.getEventIdentifier()» = true;
|
|
|
}
|
|
|
+
|
|
|
«ENDIF-»
|
|
|
- private «event.getEventType()» «event.getter()» {
|
|
|
- return «event.getEventName()»;
|
|
|
- }
|
|
|
-
|
|
|
«ENDFOREACH-»
|
|
|
«REM»Create getters and setters for variables«ENDREM»
|
|
|
«FOREACH getInternalScopeVariables() AS variable-»
|
|
|
- private «variable.type.getJavaType()» get«variable.getValueName().toFirstUpper()»() {
|
|
|
- return «variable.getValueName()»;
|
|
|
+ private «variable.type.getJavaType()» get«variable.getVarName()»() {
|
|
|
+ return «variable.getVariableIdentifier()»;
|
|
|
}
|
|
|
|
|
|
private void set«variable.getValueName().toFirstUpper()»(«variable.type.getJavaType()» value) {
|
|
|
- «variable.getValueName()» = value;
|
|
|
+ «variable.getVariableIdentifier()» = value;
|
|
|
}
|
|
|
|
|
|
«ENDFOREACH-»
|
|
@@ -254,308 +318,55 @@ else {
|
|
|
«IF event.direction == Direction::IN-»
|
|
|
«IF !event.type.isVoid()-»
|
|
|
public void raise«event.getEventName()»(«event.type.getJavaType()» value) {
|
|
|
- getDefaultInterface().raise«event.getEventName()»(value);
|
|
|
+ «getInterfaceIdentifier()».raise«event.getEventName()»(value);
|
|
|
}
|
|
|
«ELSE»
|
|
|
public void raise«event.getEventName()»() {
|
|
|
- getDefaultInterface().raise«event.getEventName()»();
|
|
|
+ «getInterfaceIdentifier()».raise«event.getEventName()»();
|
|
|
}
|
|
|
«ENDIF-»
|
|
|
«ENDIF-»
|
|
|
|
|
|
«IF event.direction == Direction::OUT-»
|
|
|
public boolean isRaised«event.getEventName()»() {
|
|
|
- return getOutEvents().contains(«event.getter()»);
|
|
|
+ return «getInterfaceIdentifier()».isRaised«event.getEventName()»();
|
|
|
}
|
|
|
-
|
|
|
- public «event.getEventType()» «event.getter()» {
|
|
|
- return getDefaultInterface().«event.getter()»;
|
|
|
+ «IF !event.type.isVoid()-»
|
|
|
+ public «event.type.getJavaType()» get«event.getEventName()»Value() {
|
|
|
+ return «getInterfaceIdentifier()».get«event.getEventName()»Value();
|
|
|
}
|
|
|
+ «ENDIF»
|
|
|
«ENDIF-»
|
|
|
«ENDFOREACH-»
|
|
|
|
|
|
«FOREACH declarations.typeSelect(VariableDefinition) AS variable-»
|
|
|
public «variable.type.getJavaType()» «variable.getter()» {
|
|
|
- return getDefaultInterface().«variable.getter()»;
|
|
|
+ return «getInterfaceIdentifier()».«variable.getter()»;
|
|
|
}
|
|
|
|
|
|
public void set«variable.getValueName().toFirstUpper()»(«variable.type.getJavaType()» value) {
|
|
|
- getDefaultInterface().set«variable.getValueName().toFirstUpper()»(value);
|
|
|
+ «getInterfaceIdentifier()».set«variable.getValueName().toFirstUpper()»(value);
|
|
|
}
|
|
|
«ENDFOREACH-»
|
|
|
|
|
|
«IF (hasVariables() || hasIncomingEvents()) && entry.createGenericInterfaceSupport()-»
|
|
|
public boolean raiseEvent(String name) {
|
|
|
- return getDefaultInterface().raiseEvent(name);
|
|
|
+ return «getInterfaceIdentifier()».raiseEvent(name);
|
|
|
}
|
|
|
|
|
|
«IF hasIncomingEvents()-»
|
|
|
@SuppressWarnings("unchecked")
|
|
|
«ENDIF-»
|
|
|
public boolean raiseEvent(String name, Object value) {
|
|
|
- return getDefaultInterface().raiseEvent(name, value);
|
|
|
+ return «getInterfaceIdentifier()».raiseEvent(name, value);
|
|
|
}
|
|
|
|
|
|
public boolean setVariable(String name, Object value) {
|
|
|
- return getDefaultInterface().setVariable(name, value);
|
|
|
+ return «getInterfaceIdentifier()».setVariable(name, value);
|
|
|
}
|
|
|
|
|
|
public Object getVariable(String name) {
|
|
|
- return getDefaultInterface().getVariable(name);
|
|
|
+ return «getInterfaceIdentifier()».getVariable(name);
|
|
|
}
|
|
|
«ENDIF-»
|
|
|
«ENDDEFINE»
|
|
|
-
|
|
|
-«DEFINE file(sgen::GeneratorEntry entry) FOR ExecutionFlow-»
|
|
|
-«FILE getImplementationPackagePath(entry)+"/"+getCycleBasedStatemachineName()+'.java'-»
|
|
|
-«getLicenseHeader(entry)»
|
|
|
-package «getImplementationPackageName(entry)»;
|
|
|
-
|
|
|
-import java.util.Collection;
|
|
|
-import java.util.HashSet;
|
|
|
-import «entry.getBasePackageName()».Event;
|
|
|
-import «entry.getBasePackageName()».EventVector;
|
|
|
-«IF entry.createGenericInterfaceSupport()-»
|
|
|
- import java.util.HashMap;
|
|
|
- import java.util.Map;
|
|
|
- import «entry.getBasePackageName()».IGenericAccessStatemachine;
|
|
|
- import «entry.getBasePackageName()».IGenericAccessInterface;
|
|
|
-«ENDIF-»
|
|
|
-«IF isTimedStatemachine()-»
|
|
|
- import «entry.getBasePackageName()».TimeEvent;
|
|
|
- import «entry.getBasePackageName()».ITimedStatemachine;
|
|
|
- import «entry.getBasePackageName()».ITimerService;
|
|
|
-«ELSE-»
|
|
|
- import «entry.getBasePackageName()».IStatemachine;
|
|
|
-«ENDIF-»
|
|
|
-«IF !getInternalScopeValuedEvents().isEmpty || hasDefaultInterfaceValuedEvents()-»
|
|
|
- import «entry.getBasePackageName()».ValuedEvent;
|
|
|
-«ENDIF-»
|
|
|
-«IF getStatemachineExtension(entry) != null-»
|
|
|
- import «entry.getBasePackageName()».NotificationSender;
|
|
|
-«ENDIF-»
|
|
|
-
|
|
|
-public class «getCycleBasedStatemachineName()» «getStatemachineExtension(entry)» implements «getStatemachineInterfaceTypes(entry)» {
|
|
|
-
|
|
|
- «IF getInternalScopeEvents().size > 0-»
|
|
|
- private enum Events {
|
|
|
- «FOREACH getInternalScopeEvents() AS event-»
|
|
|
- «event.getEventName()»,
|
|
|
- «ENDFOREACH-»
|
|
|
- }
|
|
|
- «ENDIF-»
|
|
|
-
|
|
|
- «IF isTimedStatemachine()-»
|
|
|
- private enum TimeEvents {
|
|
|
- «FOREACH getTimeEvents() AS timeEvent-»
|
|
|
- «timeEvent.getEventName().toFirstUpper()»,
|
|
|
- «ENDFOREACH-»
|
|
|
- }
|
|
|
- «ENDIF-»
|
|
|
-
|
|
|
- «FOREACH getInternalScopeEvents() AS event-»
|
|
|
- private final «event.getEventType()» «event.getEventName()» = new «event.getEventType()»(«event.getCreationSignature()»);
|
|
|
- «ENDFOREACH-»
|
|
|
-
|
|
|
- «FOREACH getTimeEvents() AS timeEvent-»
|
|
|
- private static final TimeEvent<TimeEvents> «timeEvent.getEventName()» = new TimeEvent<TimeEvents>(TimeEvents.«timeEvent.getEventName().toFirstUpper()»,«((Scope)timeEvent.eContainer).getOffset()», «timeEvent.periodic»);
|
|
|
- «ENDFOREACH»
|
|
|
-
|
|
|
- public enum State {
|
|
|
- «FOREACH states AS state-»
|
|
|
- «state.getName()»,
|
|
|
- «ENDFOREACH-»
|
|
|
- «getNullStateName()»
|
|
|
- };
|
|
|
-
|
|
|
- «IF entry.createGenericInterfaceSupport()-»
|
|
|
- protected Map<String,IGenericAccessInterface> interfaceMap;
|
|
|
- «ELSE-»
|
|
|
- «FOREACH scopes.typeSelect(InterfaceScope) AS interface-»
|
|
|
- private «interface.getInterfaceImplName()» «interface.getInterfaceName().toFirstLower()»;
|
|
|
- «ENDFOREACH-»
|
|
|
- «ENDIF-»
|
|
|
-
|
|
|
- «FOREACH getInternalScopeVariables() AS variable-»
|
|
|
- private «variable.type.getJavaType()» «variable.getValueName()»«variable.getInitialValueAssignment()»;
|
|
|
-
|
|
|
- «ENDFOREACH-»
|
|
|
-
|
|
|
- «IF hasHistory()-»
|
|
|
- private State[] historyVector = new State[«historyVector.size»];
|
|
|
- «ENDIF-»
|
|
|
-
|
|
|
- private final State[] stateVector = new State[«stateVector.size»];
|
|
|
-
|
|
|
- private int nextStateIndex;
|
|
|
-
|
|
|
- private final EventVector<Event<? extends Enum<?>>> occuredEvents;
|
|
|
-
|
|
|
- private final Collection<Event<? extends Enum<?>>> outEvents;
|
|
|
-
|
|
|
- «IF isTimedStatemachine()-»
|
|
|
- private ITimerService timerService;
|
|
|
-
|
|
|
- private long cycleStartTime;
|
|
|
- «ENDIF-»
|
|
|
-
|
|
|
- public «getCycleBasedStatemachineName()»() {
|
|
|
- occuredEvents = new EventVector<Event<? extends Enum<?>>>(«getEventsCount()»);
|
|
|
- outEvents = new HashSet<Event<? extends Enum<?>>>();
|
|
|
- «IF entry.createGenericInterfaceSupport()-»
|
|
|
- interfaceMap = new HashMap<String, IGenericAccessInterface>();
|
|
|
- «FOREACH getInterfaceScope() AS interface-»
|
|
|
- interfaceMap.put("«interface.getInterfaceName()»", new «interface.getInterfaceImplName()»(«interface.getInterfaceParameter()»));
|
|
|
- «ENDFOREACH-»
|
|
|
- «ELSE-»
|
|
|
- «FOREACH getInterfaceScope() AS interface-»
|
|
|
- «interface.getInterfaceName().toFirstLower()» = new «interface.getInterfaceImplName()»(«interface.getInterfaceParameter()»);
|
|
|
- «ENDFOREACH-»
|
|
|
- «ENDIF-»
|
|
|
- «FOREACH getTimeEvents() AS timeEvent-»
|
|
|
- «timeEvent.getEventName()».setStatemachine(this);
|
|
|
- «ENDFOREACH»
|
|
|
- }
|
|
|
-
|
|
|
- protected Collection<Event<? extends Enum<?>>> getOccuredEvents() {
|
|
|
- return occuredEvents;
|
|
|
- }
|
|
|
-
|
|
|
- protected Collection<Event<? extends Enum<?>>> getOutEvents(){
|
|
|
- return outEvents;
|
|
|
- }
|
|
|
-
|
|
|
- protected boolean eventOccured() {
|
|
|
- return !occuredEvents.isEmpty();
|
|
|
- }
|
|
|
-
|
|
|
- public void init() {
|
|
|
- «IF isTimedStatemachine()-»
|
|
|
- assert timerService != null;
|
|
|
- «ENDIF-»
|
|
|
- for (int i = 0; i < «stateVector.size»; i++) {
|
|
|
- stateVector[i] = State.$NullState$;
|
|
|
- }
|
|
|
-
|
|
|
- «IF hasHistory()-»
|
|
|
- for (int i = 0; i < «historyVector.size»; i++) {
|
|
|
- historyVector[i] = State.$NullState$;
|
|
|
- }
|
|
|
- «ENDIF-»
|
|
|
-
|
|
|
- occuredEvents.clear();
|
|
|
- }
|
|
|
-
|
|
|
- public boolean isStateActive(State state){
|
|
|
- for (int i=0;i<stateVector.length;i++){
|
|
|
- if (stateVector[i]==state) {
|
|
|
- return true;
|
|
|
- }
|
|
|
- }
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- «IF isTimedStatemachine()-»
|
|
|
- public void setTimerService(ITimerService timerService) {
|
|
|
- this.timerService = timerService;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- public ITimerService getTimerService() {
|
|
|
- assert timerService != null;
|
|
|
- return timerService;
|
|
|
- }
|
|
|
-
|
|
|
- public void onTimeEventRaised(TimeEvent<? extends Enum<?>> timeEvent) {
|
|
|
- getOccuredEvents().add(timeEvent);
|
|
|
- }
|
|
|
- «ENDIF-»
|
|
|
-
|
|
|
- «IF entry.createGenericInterfaceSupport()-»
|
|
|
- public IGenericAccessInterface getInterface(String name) {
|
|
|
- return interfaceMap.get(name);
|
|
|
- }
|
|
|
-
|
|
|
- protected Map<String, IGenericAccessInterface> getInterfaceMap() {
|
|
|
- return interfaceMap;
|
|
|
- }
|
|
|
- «ENDIF-»
|
|
|
-
|
|
|
- «FOREACH scopes.typeSelect(InterfaceScope) AS interface-»
|
|
|
- public «interface.getInterfaceName()» get«interface.getInterfaceName()»() {
|
|
|
- «IF entry.createGenericInterfaceSupport()-»
|
|
|
- return («interface.getInterfaceName()») getInterface("«interface.getInterfaceName()»");
|
|
|
- «ELSE-»
|
|
|
- return «interface.getInterfaceName().toFirstLower()»;
|
|
|
- «ENDIF-»
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- protected «interface.getIInterfaceImplName()» get«interface.getInterfaceImplName()»() {
|
|
|
- «IF entry.createGenericInterfaceSupport()-»
|
|
|
- return («interface.getIInterfaceImplName()») getInterface("«interface.getInterfaceName()»");
|
|
|
- «ELSE-»
|
|
|
- return «interface.getInterfaceName().toFirstLower()»;
|
|
|
- «ENDIF-»
|
|
|
- }
|
|
|
- «ENDFOREACH-»
|
|
|
-
|
|
|
- «EXPAND InternalScopeMethods FOR this»
|
|
|
- «EXPAND DefaultInterfaceMethods(entry) FOREACH getDefaultInterface()»
|
|
|
- «REM»Create enterSequences for statemachine«ENDREM»
|
|
|
- «IF enterSequence.steps.size > 0 -»
|
|
|
- public void «enterSequenceName()»() {
|
|
|
- «IF isTimedStatemachine()-»
|
|
|
- cycleStartTime = System.currentTimeMillis();
|
|
|
- «ENDIF-»
|
|
|
- «EXPAND ActionCode FOREACH enterSequence.steps-»
|
|
|
- }
|
|
|
- «ENDIF-»
|
|
|
-
|
|
|
- «IF exitSequence.steps.size > 0-»
|
|
|
- public void «exitSequenceName()»(){
|
|
|
- «EXPAND ActionCode FOREACH exitSequence.steps-»
|
|
|
- }
|
|
|
- «ENDIF»
|
|
|
-
|
|
|
-
|
|
|
-«EXPAND ConditionMethodsImplement FOR this-»
|
|
|
-«EXPAND ConditionMethodsImplement FOREACH this.states-»
|
|
|
-«EXPAND ConditionMethodsImplement FOREACH this.nodes-»
|
|
|
-«EXPAND StatementMethodsImplement FOR this-»
|
|
|
-«EXPAND StatementMethodsImplement FOREACH this.states-»
|
|
|
-«EXPAND StatementMethodsImplement FOREACH this.nodes-»
|
|
|
-«EXPAND EnterMethodImplement FOREACH this.states-»
|
|
|
-«EXPAND ExitMethodImplement FOREACH this.states-»
|
|
|
-«EXPAND EnterSequenceImplement FOREACH this.states-»
|
|
|
-«EXPAND ExitSequenceImplement FOREACH this.states-»
|
|
|
-«EXPAND EnterSequenceImplement FOREACH this.regions-»
|
|
|
-«EXPAND ExitSequenceImplement FOREACH this.regions-»
|
|
|
-«EXPAND DeepEnterSequenceImplement FOREACH this.regions-»
|
|
|
-«EXPAND ShallowEnterSequenceImplement FOREACH this.regions-»
|
|
|
-«EXPAND ReactMethodsImplement FOREACH this.states-»
|
|
|
-«EXPAND ReactMethodsImplement FOREACH this.nodes-»
|
|
|
- public void runCycle() {
|
|
|
- «IF isTimedStatemachine()-»
|
|
|
- cycleStartTime = System.currentTimeMillis();
|
|
|
- «ENDIF-»
|
|
|
- outEvents.clear();
|
|
|
-
|
|
|
- for (nextStateIndex = 0; nextStateIndex < stateVector.length; nextStateIndex++) {
|
|
|
-
|
|
|
- switch (stateVector[nextStateIndex]) {
|
|
|
- «FOREACH this.states AS state-»
|
|
|
- case «state.getName()»:
|
|
|
- react«state.getName()»();
|
|
|
- break;
|
|
|
- «ENDFOREACH-»
|
|
|
- default:
|
|
|
- // «getNullStateName()»
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- occuredEvents.clear();
|
|
|
- }
|
|
|
-}
|
|
|
-«ENDFILE-»
|
|
|
-«ENDDEFINE»
|