Просмотр исходного кода

C code generator for enter and exit of regions

benjamin.schwertfeger@gmail.com 14 лет назад
Родитель
Сommit
2e38e1a52a

+ 10 - 5
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/templates/CustomStatemachineC.xpt

@@ -56,7 +56,7 @@ Templates for the main statechart c file.
 «ENDDEFINE»
 
 «DEFINE ActionCode FOR Call»
-«this.step.functionName()»(«IF isSingleton() == false»(«StName()»*) handle«ENDIF»);
+«this.step.functionName()»(«IF isSingleton() == false»«this.statemachineHandleName()»«ENDIF»);
 «ENDDEFINE»
 
 «DEFINE ActionCode FOR Sequence»
@@ -199,13 +199,13 @@ void 
 
 
 
-«DEFINE EnterSequenceProto FOR ExecutionState -»
+«DEFINE EnterSequenceProto FOR ExecutionScope -»
 «IF this.enterSequence != null && enterSequence.caller.size > 0 -»
 static void «this.enterSequence.enterSequenceFunction()»;
 «ENDIF -»
 «ENDDEFINE»
 
-«DEFINE EnterSequenceImplement FOR ExecutionState -»
+«DEFINE EnterSequenceImplement FOR ExecutionScope -»
 «IF this.enterSequence != null && enterSequence .caller.size > 0 »
 void «this.enterSequence.enterSequenceFunction()»
 {
@@ -214,13 +214,13 @@ void 
 «ENDIF -»
 «ENDDEFINE»
 
-«DEFINE ExitSequenceProto FOR ExecutionState -»
+«DEFINE ExitSequenceProto FOR ExecutionScope -»
 «IF this.exitSequence != null && exitSequence.caller.size > 0 -»
 static void «this.exitSequence.exitSequenceFunction()»;
 «ENDIF -»
 «ENDDEFINE»
 
-«DEFINE ExitSequenceImplement FOR ExecutionState -»
+«DEFINE ExitSequenceImplement FOR ExecutionScope -»
 «IF this.exitSequence != null && exitSequence.caller.size > 0 -»
 void «this.exitSequence.exitSequenceFunction()»
 {
@@ -231,6 +231,7 @@ void 
 
 
 
+
 «DEFINE file FOR ExecutionFlow»
 «FILE StName()+'.c'»
 «this.getLicenseHeader()»
@@ -253,6 +254,8 @@ static 
 «EXPAND ExitMethodProto FOREACH this.states -»
 «EXPAND EnterSequenceProto FOREACH this.states -»
 «EXPAND ExitSequenceProto FOREACH this.states -»
+«EXPAND EnterSequenceProto FOREACH this.eAllContents.typeSelect(ExecutionRegion) -»
+«EXPAND ExitSequenceProto FOREACH this.eAllContents.typeSelect(ExecutionRegion) -»
 «EXPAND ReactMethodsProto FOREACH this.states -»
 «EXPAND ReactMethodsProto FOREACH this.nodes -»
 
@@ -264,6 +267,8 @@ static 
 «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 ReactMethodsImplement FOREACH this.states -»
 «EXPAND ReactMethodsImplement FOREACH this.nodes -»
 

+ 20 - 3
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/templates/Naming.ext

@@ -53,13 +53,14 @@ cached String functionName(Step step) :
 
 
 ExecutionState state(Step this) : (ExecutionState) this.eContainer;
+ExecutionScope scope(Step this) : (ExecutionScope) this.eContainer;
 
 boolean isEffect(Step step) : Reaction.isInstance(step.eContainer) ;
 boolean isReactionCheck(Step step) : Reaction.isInstance(step.eContainer) && Check.isInstance(step);
 boolean isEntryAction(Step step) : ExecutionState.isInstance(step.eContainer) && step.state().entryAction == step;
 boolean isExitAction(Step step) : ExecutionState.isInstance(step.eContainer) && step.state().exitAction == step;
-boolean isEnterSequence(Step step) : ExecutionState.isInstance(step.eContainer) && step.state().enterSequence == step;
-boolean isExitSequence(Step step) : ExecutionState.isInstance(step.eContainer) && step.state().exitSequence == step;
+boolean isEnterSequence(Step step) : ExecutionScope.isInstance(step.eContainer) && step.scope().enterSequence == step;
+boolean isExitSequence(Step step) : ExecutionScope.isInstance(step.eContainer) && step.scope().exitSequence == step;
 boolean isReactSequence(Step step) : Sequence.isInstance(step) && step.name == "react";
 
 
@@ -136,8 +137,24 @@ String reactFunction(ExecutionNode this) :
 
 
 String getStateName(Step this) : this.eContainer.getStateName(); 
-String getStateName(Object this) : (((EObject)this).eContainer != null)?((EObject)this).eContainer.getStateName():"unkown";
+String getStateName(emf::EObject this) : (this.eContainer != null)?this.eContainer.getStateName():"unkown";
 String getStateName(ExecutionState this) : this.simpleName;
+String getStateName(ExecutionRegion this) : 
+	if (ExecutionState.isInstance(superScope)) 
+	then (
+		getStateName((ExecutionState)superScope)+getNullSafeRegionName()
+	) else 
+		"Region"+getNullSafeRegionName();
+
+private String getNullSafeRegionName(ExecutionRegion this) :
+	if (name == null)
+	then (
+		if (ExecutionScope.isInstance(superScope))
+		then
+			superScope.subScopes.indexOf(this)
+		else "DefaultRegion"
+	)
+	else name.replaceAll(" ","").toFirstUpper();
 
 String getReactionName(Object this) : "uknown";
 String getReactionName(Check this) : this.eContainer.getReactionName(); 

+ 2 - 0
plugins/org.yakindu.sct.generator.core/library/CoreFeatureTypeLibrary.xmi

@@ -17,5 +17,7 @@
     <parameters name="inlineEnterSequences" optional="true" parameterType="BOOLEAN"/>
     <parameters name="inlineExitSequences" optional="true" parameterType="BOOLEAN"/>
     <parameters name="inlineChoices" optional="true" parameterType="BOOLEAN"/>
+    <parameters name="inlineEnterRegion" optional="true" parameterType="BOOLEAN"/>
+    <parameters name="inlineExitRegion" optional="true" parameterType="BOOLEAN"/>
   </types>
 </sgen:FeatureTypeLibrary>