Browse Source

code generator now supports choices and inlines functions

terfloth@itemis.de 13 years ago
parent
commit
622169ed3e

+ 28 - 19
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/templates/CustomStatemachineC.xpt

@@ -102,15 +102,15 @@ else {
 ((StatemachineBase*)handle)->state[0] = last_state;
 «ENDDEFINE»
 
-«DEFINE ConditionMethodsProto FOR ExecutionStat
-  «FOREACH reactions AS r -»
+«DEFINE ConditionMethodsProto FOR ExecutionNod
+  «FOREACH reactions.select(e|e.check.refs.size > 0) AS r -»
   «IF r.check != null -»
 static boolean «r.check.functionName()»(«StName()»* handle);
   «ENDIF -»«ENDFOREACH -»
 «ENDDEFINE»
 
 «DEFINE ConditionMethodsImplement FOR ExecutionNode»
-  «FOREACH reactions AS r -»
+  «FOREACH reactions.select(e|e.check.refs.size > 0) AS r -»
   «IF r.check != null -»
 boolean «r.check.functionName()»(«StName()»* handle) {
   boolean retValue = «getBoolFalse()»;
@@ -123,14 +123,14 @@ boolean 
   «ENDFOREACH»
 «ENDDEFINE»
 
-«DEFINE StatementMethodsProto FOR ExecutionStat
-  «FOREACH reactions AS r -»
+«DEFINE StatementMethodsProto FOR ExecutionNod
+  «FOREACH reactions.select(e|e.effect.caller.size > 0) AS r -»
 static void «r.effect.functionName()»(«StName()»* handle);
  «ENDFOREACH -»
 «ENDDEFINE»
 
-«DEFINE StatementMethodsImplement FOR ExecutionStat
-  «FOREACH reactions AS r -»
+«DEFINE StatementMethodsImplement FOR ExecutionNod
+  «FOREACH reactions.select(e|e.effect.caller.size > 0) AS r -»
 void «r.effect.functionName()»(«StName()»* handle) {   
   «EXPAND ActionCode FOR r.effect -»
 }
@@ -141,25 +141,29 @@ void 
 «EXPAND ActionCode FOREACH this.steps»
 «ENDDEFINE»
 
-«DEFINE ReactMethodsProto FOR ExecutionState»
+«DEFINE ReactMethodsProto FOR ExecutionNode»
+«IF (ExecutionState.isInstance(this) || this.reactSequence.caller.size > 0) -»
 static void «stName()»_react_«this.simpleName»(«StName()»* handle);
+«ENDIF -»
 «ENDDEFINE»
 
-«DEFINE ReactMethodsImplement FOR ExecutionState»
+«DEFINE ReactMethodsImplement FOR ExecutionNode»
+«IF (ExecutionState.isInstance(this) || this.reactSequence.caller.size > 0) -»
 void «stName()»_react_«this.simpleName»(«StName()»* handle)
 {
 	«EXPAND ReactCode FOR reactSequence»
 }
+«ENDIF -»
 «ENDDEFINE»
 
 «DEFINE EnterMethodProto FOR ExecutionState»
-«IF this.entryAction != null -»
+«IF this.entryAction != null && entryAction.caller.size > 0 
 static void «this.entryAction.entryActionFunctionName()»(«StName()»* handle);
 «ENDIF -»
 «ENDDEFINE»
 
 «DEFINE EnterMethodImplement FOR ExecutionState»
-«IF this.entryAction != null»
+«IF this.entryAction != null && entryAction.caller.size > 0»
 void «this.entryAction.entryActionFunctionName()»(«StName()»* handle)
 {
 «EXPAND ActionCode FOR this.entryAction»
@@ -168,13 +172,13 @@ void 
 «ENDDEFINE»
 
 «DEFINE ExitMethodProto FOR ExecutionState»
-«IF this.exitAction != null -»
+«IF this.exitAction != null && exitAction.caller.size > 0 
 static void «this.exitAction.exitActionFunctionName()»(«StName()»* handle);
 «ENDIF -»
 «ENDDEFINE»
 
 «DEFINE ExitMethodImplement FOR ExecutionState»
-«IF this.exitAction != null»
+«IF this.exitAction != null && exitAction.caller.size > 0 »
 void «this.exitAction.exitActionFunctionName()»(«StName()»* handle)
 {
 «EXPAND ActionCode FOR this.exitAction»
@@ -185,13 +189,13 @@ void 
 
 
 «DEFINE EnterSequenceProto FOR ExecutionState»
-«IF this.enterSequence != null -»
+«IF this.enterSequence != null && enterSequence.caller.size > 0 
 static void «this.enterSequence.enterSequenceFunctionName()»(«StName()»* handle);
 «ENDIF -»
 «ENDDEFINE»
 
 «DEFINE EnterSequenceImplement FOR ExecutionState»
-«IF this.enterSequence != null»
+«IF this.enterSequence != null && enterSequence .caller.size > 0 »
 void «this.enterSequence.enterSequenceFunctionName()»(«StName()»* handle)
 {
 «EXPAND ActionCode FOR this.enterSequence»
@@ -200,13 +204,13 @@ void 
 «ENDDEFINE»
 
 «DEFINE ExitSequenceProto FOR ExecutionState»
-«IF this.exitSequence != null -»
+«IF this.exitSequence != null && exitSequence.caller.size > 0 
 static void «this.exitSequence.exitSequenceFunctionName()»(«StName()»* handle);
 «ENDIF -»
 «ENDDEFINE»
 
 «DEFINE ExitSequenceImplement FOR ExecutionState»
-«IF this.exitSequence != null»
+«IF this.exitSequence != null && exitSequence.caller.size > 0 -»
 void «this.exitSequence.exitSequenceFunctionName()»(«StName()»* handle)
 {
 «EXPAND ActionCode FOR this.exitSequence»
@@ -221,21 +225,26 @@ void 
 #include "«StName()».h"
 
 «EXPAND ConditionMethodsProto FOREACH this.states»
+«EXPAND ConditionMethodsProto FOREACH this.nodes»
 «EXPAND StatementMethodsProto FOREACH this.states»
-«EXPAND ReactMethodsProto FOREACH this.states»
+«EXPAND StatementMethodsProto FOREACH this.nodes»
 «EXPAND EnterMethodProto FOREACH this.states»
 «EXPAND ExitMethodProto FOREACH this.states»
 «EXPAND EnterSequenceProto FOREACH this.states»
 «EXPAND ExitSequenceProto FOREACH this.states»
+«EXPAND ReactMethodsProto FOREACH this.states»
+«EXPAND ReactMethodsProto FOREACH this.nodes»
 
 «EXPAND ConditionMethodsImplement FOREACH this.states»
 «EXPAND ConditionMethodsImplement FOREACH this.nodes»
 «EXPAND StatementMethodsImplement FOREACH this.states»
-«EXPAND ReactMethodsImplement 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 ReactMethodsImplement FOREACH this.states»
+«EXPAND ReactMethodsImplement FOREACH this.nodes»
 
 «REM»
 boolean «stName()»_is_in(«StName()»* handle, States state)

+ 6 - 2
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/templates/Naming.ext

@@ -31,8 +31,9 @@ cached String functionName(Step step) :
 	(step.isEntryAction()) ? step.entryActionFunctionName() : ( 
 	(step.isExitAction()) ? step.exitActionFunctionName() : (
 	(step.isEnterSequence()) ? step.enterSequenceFunctionName() : ( 
-	(step.isExitSequence()) ? step.exitSequenceFunctionName() : 
-	" !! unknown function type !!" )))));
+	(step.isExitSequence()) ? step.exitSequenceFunctionName() : (
+	(step.isReactSequence()) ? step.reactSequenceFunctionName() :
+	" !! unknown function type !!" ))))));
  
 String actionFunctionName(Step this) :  this.stName() + "_actions_" + this.reaction().state().simpleName + "_" + this.reaction().name; 
 String checkFunctionName(Step this) : this.stName() + "_condition_" + this.reaction().state().simpleName + "_" + this.reaction().name; 
@@ -40,6 +41,8 @@ String entryActionFunctionName(Step this) : this.stName() + "_entryActions_" + t
 String exitActionFunctionName(Step this) : this.stName() + "_exitActions_" + this.state().simpleName; 
 String enterSequenceFunctionName(Step this) : this.stName() + "_enterSequence_" + this.state().simpleName; 
 String exitSequenceFunctionName(Step this) : this.stName() + "_exitSequence_" + this.state().simpleName; 
+String reactSequenceFunctionName(Step this) : "react"+ this.state().simpleName; 
+
 
 boolean isEffect(Step step) : (! Check.isInstance(step)) && Reaction.isInstance(step.eContainer) ;
 boolean isReactionCheck(Step step) : Reaction.isInstance(step.eContainer) && Check.isInstance(step);
@@ -47,6 +50,7 @@ boolean isEntryAction(Step step) : ExecutionState.isInstance(step.eContainer) &&
 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;
+isReactSequence(Step step) : Sequence.isInstance(step) && step.name == "react";
 
 Reaction reaction(Step this) : (Reaction) this.eContainer ;
 ExecutionState state(Reaction this) : (ExecutionState) eContainer;