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

Fixed bug #635 : C code generator fails for entry action sequence in statechart enter function

terfloth@itemis.de 13 лет назад
Родитель
Сommit
1503a25ffb

+ 45 - 2
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/templates/CustomStatemachineC.xpt

@@ -82,8 +82,8 @@ if (
 «this.step.functionName()»(«IF isSingleton() == false»«this.statemachineHandleName()»«ENDIF»);
 «this.step.functionName()»(«IF isSingleton() == false»«this.statemachineHandleName()»«ENDIF»);
 «ENDDEFINE»
 «ENDDEFINE»
 
 
-«DEFINE ActionCode FOR Sequence»
-  «EXPAND ActionCode FOREACH this.steps»
+«DEFINE ActionCode FOR Sequence -»
+  «EXPAND ActionCode FOREACH this.steps -»
 «ENDDEFINE»
 «ENDDEFINE»
 
 
 «DEFINE ActionCode FOR Check -»
 «DEFINE ActionCode FOR Check -»
@@ -185,6 +185,39 @@ void 
 «ENDIF -»
 «ENDIF -»
 «ENDDEFINE»
 «ENDDEFINE»
 
 
+
+«DEFINE EnterMethodProto FOR ExecutionFlow -»
+«IF this.entryAction != null && entryAction.caller.size > 0 -»
+static void «entryAction.statemachineEntryActionFunction() -»;
+«ENDIF -»
+«ENDDEFINE»
+
+«DEFINE EnterMethodImplement FOR ExecutionFlow -»
+«IF this.entryAction != null && entryAction.caller.size > 0»
+void «entryAction.statemachineEntryActionFunction()»
+{
+«EXPAND ActionCode FOR this.entryAction -»
+}
+«ENDIF -»
+«ENDDEFINE»
+
+«DEFINE ExitMethodProto FOR ExecutionFlow -»
+«IF this.exitAction != null && exitAction.caller.size > 0 -»
+static void «this.exitAction.statemachineExitActionFunction() -»;
+«ENDIF -»
+«ENDDEFINE»
+
+«DEFINE ExitMethodImplement FOR ExecutionFlow -»
+«IF this.exitAction != null && exitAction.caller.size > 0 -»
+void «this.exitAction.statemachineExitActionFunction()»
+{
+«EXPAND ActionCode FOR this.exitAction -»
+}
+«ENDIF -»
+«ENDDEFINE»
+
+
+
 «DEFINE EnterMethodProto FOR ExecutionState -»
 «DEFINE EnterMethodProto FOR ExecutionState -»
 «IF this.entryAction != null && entryAction.caller.size > 0 -»
 «IF this.entryAction != null && entryAction.caller.size > 0 -»
 static void «entryAction.entryActionFunction()»;
 static void «entryAction.entryActionFunction()»;
@@ -277,6 +310,7 @@ void 
 «ENDIF -»
 «ENDIF -»
 «ENDDEFINE»
 «ENDDEFINE»
 
 
+
 «DEFINE file FOR ExecutionFlow»
 «DEFINE file FOR ExecutionFlow»
 «FILE StName()+'.c'»
 «FILE StName()+'.c'»
 «this.getLicenseHeader()»
 «this.getLicenseHeader()»
@@ -293,12 +327,16 @@ static 
 static «StName()»* «statemachineHandleName()»;
 static «StName()»* «statemachineHandleName()»;
 «ENDIF»
 «ENDIF»
 
 
+// function prototypes
+
 «EXPAND ConditionMethodsProto FOR this -»
 «EXPAND ConditionMethodsProto FOR this -»
 «EXPAND ConditionMethodsProto FOREACH this.states -»
 «EXPAND ConditionMethodsProto FOREACH this.states -»
 «EXPAND ConditionMethodsProto FOREACH this.nodes -»
 «EXPAND ConditionMethodsProto FOREACH this.nodes -»
 «EXPAND StatementMethodsProto FOR this -»
 «EXPAND StatementMethodsProto FOR this -»
 «EXPAND StatementMethodsProto FOREACH this.states -»
 «EXPAND StatementMethodsProto FOREACH this.states -»
 «EXPAND StatementMethodsProto FOREACH this.nodes -»
 «EXPAND StatementMethodsProto FOREACH this.nodes -»
+«EXPAND EnterMethodProto FOR this -»
+«EXPAND ExitMethodProto FOR this -»
 «EXPAND EnterMethodProto FOREACH this.states -»
 «EXPAND EnterMethodProto FOREACH this.states -»
 «EXPAND ExitMethodProto FOREACH this.states -»
 «EXPAND ExitMethodProto FOREACH this.states -»
 «EXPAND EnterSequenceProto FOREACH this.states -»
 «EXPAND EnterSequenceProto FOREACH this.states -»
@@ -310,12 +348,17 @@ static 
 «EXPAND ReactMethodsProto FOREACH this.states -»
 «EXPAND ReactMethodsProto FOREACH this.states -»
 «EXPAND ReactMethodsProto FOREACH this.nodes -»
 «EXPAND ReactMethodsProto FOREACH this.nodes -»
 
 
+
+// function implementations
+
 «EXPAND ConditionMethodsImplement FOR this -»
 «EXPAND ConditionMethodsImplement FOR this -»
 «EXPAND ConditionMethodsImplement FOREACH this.states -»
 «EXPAND ConditionMethodsImplement FOREACH this.states -»
 «EXPAND ConditionMethodsImplement FOREACH this.nodes -»
 «EXPAND ConditionMethodsImplement FOREACH this.nodes -»
 «EXPAND StatementMethodsImplement FOR this -»
 «EXPAND StatementMethodsImplement FOR this -»
 «EXPAND StatementMethodsImplement FOREACH this.states -»
 «EXPAND StatementMethodsImplement FOREACH this.states -»
 «EXPAND StatementMethodsImplement FOREACH this.nodes -»
 «EXPAND StatementMethodsImplement FOREACH this.nodes -»
+«EXPAND EnterMethodImplement FOR this -»
+«EXPAND ExitMethodImplement FOR this -»
 «EXPAND EnterMethodImplement FOREACH this.states -»
 «EXPAND EnterMethodImplement FOREACH this.states -»
 «EXPAND ExitMethodImplement FOREACH this.states -»
 «EXPAND ExitMethodImplement FOREACH this.states -»
 «EXPAND EnterSequenceImplement FOREACH this.states -»
 «EXPAND EnterSequenceImplement FOREACH this.states -»

+ 18 - 1
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/templates/Naming.ext

@@ -53,6 +53,8 @@ String StateEnumName(ExecutionState state) :
 cached String functionName(Step step) : 
 cached String functionName(Step step) : 
 	(step.isEffect()) ? step.actionFunctionName() : (
 	(step.isEffect()) ? step.actionFunctionName() : (
 	(step.isReactionCheck()) ? step.checkFunctionName() : (
 	(step.isReactionCheck()) ? step.checkFunctionName() : (
+	(step.isStatemachineEntryAction()) ? step.statemachineEntryActionFunctionName() : ( 
+	(step.isStatemachineExitAction()) ? step.statemachineExitActionFunctionName() : ( 
 	(step.isEntryAction()) ? step.entryActionFunctionName() : ( 
 	(step.isEntryAction()) ? step.entryActionFunctionName() : ( 
 	(step.isExitAction()) ? step.exitActionFunctionName() : (
 	(step.isExitAction()) ? step.exitActionFunctionName() : (
 	(step.isEnterSequence()) ? step.enterSequenceFunctionName() : ( 
 	(step.isEnterSequence()) ? step.enterSequenceFunctionName() : ( 
@@ -60,14 +62,17 @@ cached String functionName(Step step) :
 	(step.isReactSequence()) ? step.reactSequenceFunctionName() : (
 	(step.isReactSequence()) ? step.reactSequenceFunctionName() : (
 	(step.isShallowEnterSequence()) ? step.shallowEnterSequenceFunctionName() : (
 	(step.isShallowEnterSequence()) ? step.shallowEnterSequenceFunctionName() : (
 	(step.isDeepEnterSequence()) ? step.deepEnterSequenceFunctionName() : (
 	(step.isDeepEnterSequence()) ? step.deepEnterSequenceFunctionName() : (
-	" !! unknown function type "+step+" in "+step.eContainer.toString()+" !!" )))))))));
+	" !! unknown function type "+step+" in "+step.eContainer.toString()+" !!" )))))))))));
 
 
 
 
 ExecutionState state(Step this) : (ExecutionState) this.eContainer;
 ExecutionState state(Step this) : (ExecutionState) this.eContainer;
+ExecutionState flow(Step this) : (ExecutionFlow) this.eContainer;
 ExecutionScope scope(Step this) : (ExecutionScope) this.eContainer;
 ExecutionScope scope(Step this) : (ExecutionScope) this.eContainer;
 
 
 boolean isEffect(Step step) : (! Check.isInstance(step)) && Reaction.isInstance(step.eContainer) ;
 boolean isEffect(Step step) : (! Check.isInstance(step)) && Reaction.isInstance(step.eContainer) ;
 boolean isReactionCheck(Step step) : Reaction.isInstance(step.eContainer) && Check.isInstance(step);
 boolean isReactionCheck(Step step) : Reaction.isInstance(step.eContainer) && Check.isInstance(step);
+boolean isStatemachineEntryAction(Step step) : ExecutionFlow.isInstance(step.eContainer) && step.flow().entryAction == step;
+boolean isStatemachineExitAction(Step step) : ExecutionFlow.isInstance(step.eContainer) && step.flow().exitAction == step;
 boolean isEntryAction(Step step) : ExecutionState.isInstance(step.eContainer) && step.state().entryAction == 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 isExitAction(Step step) : ExecutionState.isInstance(step.eContainer) && step.state().exitAction == step;
 boolean isEnterSequence(Step step) : ExecutionScope.isInstance(step.eContainer) && step.scope().enterSequence == step;
 boolean isEnterSequence(Step step) : ExecutionScope.isInstance(step.eContainer) && step.scope().enterSequence == step;
@@ -100,6 +105,12 @@ String actionFunctionName(Step this) :
 String checkFunctionName(Step this) :  
 String checkFunctionName(Step this) :  
 	  this.stName() + "_condition_" + this.getStateName() + "_" + this.getReactionName();
 	  this.stName() + "_condition_" + this.getStateName() + "_" + this.getReactionName();
 
 
+String statemachineEntryActionFunctionName(Step this) :  
+	  this.stName() + "_entryActions_statemachine";
+
+String statemachineExitActionFunctionName(Step this) :  
+	  this.stName() + "_exitActions_statemachine";
+
 String entryActionFunctionName(Step this) :  
 String entryActionFunctionName(Step this) :  
 	  this.stName() + "_entryActions_" + this.getStateName();
 	  this.stName() + "_entryActions_" + this.getStateName();
 	  
 	  
@@ -141,6 +152,12 @@ String actionFunction(Step this) :
 String checkFunction(Step this) :  
 String checkFunction(Step this) :  
 	  this.checkFunctionName() + "("+ handleAddition() + ")";
 	  this.checkFunctionName() + "("+ handleAddition() + ")";
 
 
+String statemachineEntryActionFunction(Step this) :  
+	  this.statemachineEntryActionFunctionName() + "("+ handleAddition() + ")";
+ 
+String statemachineExitActionFunction(Step this) :  
+	  this.statemachineExitActionFunctionName() + "("+ handleAddition() + ")";
+ 
 String entryActionFunction(Step this) :  
 String entryActionFunction(Step this) :  
 	  this.entryActionFunctionName() + "("+ handleAddition() + ")";
 	  this.entryActionFunctionName() + "("+ handleAddition() + ")";