Преглед на файлове

C/C++ generator using modulo operators on sc_real (double) (#1699)

* edited implementation

* fixed C ExpressionGenerator for fmod

* added C tests

* added Cpp Tests

* removed wrong import

* moved extensions to new extensions package

* organized imports after implementing new extensions package

* using timerInterface instead of timer

* added copyright

* updated oxygen target
rherrmannr преди 7 години
родител
ревизия
b0330ad9e0
променени са 43 файла, в които са добавени 461 реда и са изтрити 30 реда
  1. 1 0
      plugins/org.yakindu.sct.generator.c/META-INF/MANIFEST.MF
  2. 27 0
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/CExpressionsGenerator.xtend
  3. 3 0
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/CGenerator.xtend
  4. 2 1
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/CNamingService.xtend
  5. 3 0
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/FlowCode.xtend
  6. 3 0
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/StatemachineHeader.xtend
  7. 3 0
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/StatemachineRequiredHeader.xtend
  8. 11 1
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/StatemachineSource.xtend
  9. 1 0
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/Timer.xtend
  10. 2 0
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/Types.xtend
  11. 2 2
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/eventdriven/EventNaming.xtend
  12. 2 5
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/eventdriven/StatechartEventsHeader.xtend
  13. 1 1
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/eventdriven/StatechartEventsSource.xtend
  14. 32 0
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/extensions/ExpressionsChecker.xtend
  15. 2 2
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/GenmodelEntries.xtend
  16. 2 1
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/Naming.xtend
  17. 1 1
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/Navigation.xtend
  18. 1 1
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/CppCodeGeneratorModule.java
  19. 1 1
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/CppNaming.xtend
  20. 2 2
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/CppNamingService.xtend
  21. 1 1
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/FlowCode.xtend
  22. 1 1
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/Navigation.xtend
  23. 3 0
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/StatemachineImplementation.xtend
  24. 1 1
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/StatemachineInterface.xtend
  25. 1 1
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/TimedStatemachineInterface.xtend
  26. 1 1
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/TimerInterface.xtend
  27. 1 1
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/Types.xtend
  28. 2 2
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/features/GenmodelEntriesExtension.xtend
  29. 19 0
      test-plugins/org.yakindu.sct.generator.c.test/gtests/FloatModulo/FloatModulo.sgen
  30. 37 0
      test-plugins/org.yakindu.sct.generator.c.test/gtests/FloatModulo/FloatModuloTest.cc
  31. 32 4
      test-plugins/org.yakindu.sct.generator.c.test/model/test.sgen
  32. 1 0
      test-plugins/org.yakindu.sct.generator.c.test/src/org/yakindu/sct/generator/c/gtest/GTestHelper.java
  33. 1 0
      test-plugins/org.yakindu.sct.generator.c.test/test-gen/org/yakindu/sct/generator/c/test/AllTests.java
  34. 34 0
      test-plugins/org.yakindu.sct.generator.c.test/test-gen/org/yakindu/sct/generator/c/test/FloatModuloTest.java
  35. 19 0
      test-plugins/org.yakindu.sct.generator.cpp.test/gtests/FloatModulo/FloatModulo.sgen
  36. 41 0
      test-plugins/org.yakindu.sct.generator.cpp.test/gtests/FloatModulo/FloatModuloTest.cc
  37. 28 0
      test-plugins/org.yakindu.sct.generator.cpp.test/model/test.sgen
  38. 1 0
      test-plugins/org.yakindu.sct.generator.cpp.test/test-gen/org/yakindu/sct/generator/cpp/test/AllTests.java
  39. 35 0
      test-plugins/org.yakindu.sct.generator.cpp.test/test-gen/org/yakindu/sct/generator/cpp/test/FloatModuloTest.java
  40. 1 0
      test-plugins/org.yakindu.sct.test.models/.settings/org.eclipse.core.resources.prefs
  41. 89 0
      test-plugins/org.yakindu.sct.test.models/testmodels/SCTUnit/FloatModulo.sct
  42. 1 0
      test-plugins/org.yakindu.sct.test.models/tests/AllTests.sctunit
  43. 9 0
      test-plugins/org.yakindu.sct.test.models/tests/FloatModulo.sctunit

+ 1 - 0
plugins/org.yakindu.sct.generator.c/META-INF/MANIFEST.MF

@@ -12,6 +12,7 @@ Require-Bundle: org.yakindu.sct.model.sexec,
  org.yakindu.sct.model.stext.lib
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Export-Package: org.yakindu.sct.generator.c,
+ org.yakindu.sct.generator.c.extensions,
  org.yakindu.sct.generator.c.features,
  org.yakindu.sct.generator.c.types
 Bundle-Vendor: statecharts.org

+ 27 - 0
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/CExpressionsGenerator.xtend

@@ -12,6 +12,8 @@
 package org.yakindu.sct.generator.c
 
 import com.google.inject.Inject
+import org.yakindu.base.expressions.expressions.AssignmentExpression
+import org.yakindu.base.expressions.expressions.AssignmentOperator
 import org.yakindu.base.expressions.expressions.BoolLiteral
 import org.yakindu.base.expressions.expressions.ElementReferenceExpression
 import org.yakindu.base.expressions.expressions.Expression
@@ -20,7 +22,9 @@ import org.yakindu.base.expressions.expressions.LogicalAndExpression
 import org.yakindu.base.expressions.expressions.LogicalNotExpression
 import org.yakindu.base.expressions.expressions.LogicalOrExpression
 import org.yakindu.base.expressions.expressions.LogicalRelationExpression
+import org.yakindu.base.expressions.expressions.MultiplicativeOperator
 import org.yakindu.base.expressions.expressions.NullLiteral
+import org.yakindu.base.expressions.expressions.NumericalMultiplyDivideExpression
 import org.yakindu.base.types.Enumerator
 import org.yakindu.base.types.Event
 import org.yakindu.base.types.Operation
@@ -28,6 +32,8 @@ import org.yakindu.base.types.Property
 import org.yakindu.base.types.inferrer.ITypeSystemInferrer
 import org.yakindu.base.types.typesystem.GenericTypeSystem
 import org.yakindu.base.types.typesystem.ITypeSystem
+import org.yakindu.sct.generator.c.extensions.Naming
+import org.yakindu.sct.generator.c.extensions.Navigation
 import org.yakindu.sct.generator.core.templates.ExpressionsGenerator
 import org.yakindu.sct.model.sexec.naming.INamingService
 import org.yakindu.sct.model.stext.stext.ActiveStateReferenceExpression
@@ -83,6 +89,21 @@ class CExpressionsGenerator extends ExpressionsGenerator {
 		(strcmp(«leftOperand.code», «rightOperand.code») «operator.literal» 0)
 	«ELSE»«leftOperand.code» «operator.literal» «rightOperand.code»«ENDIF»'''
 
+	override dispatch CharSequence code(AssignmentExpression it) {
+		if (it.operator.equals(AssignmentOperator.MOD_ASSIGN) && haveCommonTypeReal(it)) {
+			'''«varRef.code» = fmod(«varRef.code»,«expression.code»)'''
+		} else
+			'''«varRef.code» «operator.literal» «expression.code»'''
+	}
+
+	def dispatch CharSequence code(NumericalMultiplyDivideExpression expression) {
+		if (expression.operator == MultiplicativeOperator.MOD && haveCommonTypeReal(expression)) {
+			'''fmod(«expression.leftOperand.code.toString.trim»,«expression.rightOperand.code»)'''
+		} else {
+			super._code(expression);
+		}
+	}
+
 	/* Feature call */
 	def dispatch CharSequence code(FeatureCall it) {
 		it.code(it.definition)
@@ -118,4 +139,10 @@ class CExpressionsGenerator extends ExpressionsGenerator {
 
 	def dispatch CharSequence sc_boolean_code(LogicalRelationExpression it) '''(«it.code») ? bool_true : bool_false'''
 
+	def boolean haveCommonTypeReal(Expression expression) {
+		if(isSame(getCommonType((infer(expression).getType), getType(ITypeSystem.INTEGER)),
+			getType(ITypeSystem.INTEGER))) return false
+		return true
+	}
+
 }

+ 3 - 0
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/CGenerator.xtend

@@ -13,6 +13,9 @@ package org.yakindu.sct.generator.c
 import com.google.inject.Inject
 import org.eclipse.xtext.generator.IFileSystemAccess
 import org.yakindu.sct.generator.c.IGenArtifactConfigurations.GenArtifactConfiguration
+import org.yakindu.sct.generator.c.extensions.GenmodelEntries
+import org.yakindu.sct.generator.c.extensions.Naming
+import org.yakindu.sct.generator.c.extensions.Navigation
 import org.yakindu.sct.generator.core.IExecutionFlowGenerator
 import org.yakindu.sct.generator.core.library.ICoreLibraryHelper
 import org.yakindu.sct.model.sexec.ExecutionFlow

+ 2 - 1
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/CNamingService.xtend

@@ -15,6 +15,7 @@ import com.google.inject.Inject
 import java.util.Arrays
 import java.util.Map
 import org.yakindu.base.base.NamedElement
+import org.yakindu.sct.generator.c.extensions.GenmodelEntries
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sexec.ExecutionState
 import org.yakindu.sct.model.sexec.Step
@@ -22,10 +23,10 @@ import org.yakindu.sct.model.sexec.extensions.SExecExtensions
 import org.yakindu.sct.model.sexec.naming.DefaultNamingService
 import org.yakindu.sct.model.sgen.GeneratorEntry
 import org.yakindu.sct.model.sgraph.State
+import org.yakindu.sct.model.sgraph.Statechart
 import org.yakindu.sct.model.stext.stext.TimeEventSpec
 
 import static org.yakindu.sct.generator.c.CKeywords.*
-import org.yakindu.sct.model.sgraph.Statechart
 
 public class CNamingService extends DefaultNamingService {
 	

+ 3 - 0
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/FlowCode.xtend

@@ -11,6 +11,9 @@
 package org.yakindu.sct.generator.c
 
 import com.google.inject.Inject
+import org.yakindu.sct.generator.c.extensions.GenmodelEntries
+import org.yakindu.sct.generator.c.extensions.Naming
+import org.yakindu.sct.generator.c.extensions.Navigation
 import org.yakindu.sct.model.sexec.Call
 import org.yakindu.sct.model.sexec.Check
 import org.yakindu.sct.model.sexec.CheckRef

+ 3 - 0
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/StatemachineHeader.xtend

@@ -13,6 +13,9 @@ package org.yakindu.sct.generator.c
 import com.google.inject.Inject
 import org.yakindu.base.types.Declaration
 import org.yakindu.base.types.Direction
+import org.yakindu.sct.generator.c.extensions.GenmodelEntries
+import org.yakindu.sct.generator.c.extensions.Naming
+import org.yakindu.sct.generator.c.extensions.Navigation
 import org.yakindu.sct.generator.core.types.ICodegenTypeSystemAccess
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sexec.TimeEvent

+ 3 - 0
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/StatemachineRequiredHeader.xtend

@@ -12,6 +12,9 @@ package org.yakindu.sct.generator.c
 
 import com.google.inject.Inject
 import org.yakindu.base.types.Declaration
+import org.yakindu.sct.generator.c.extensions.GenmodelEntries
+import org.yakindu.sct.generator.c.extensions.Naming
+import org.yakindu.sct.generator.c.extensions.Navigation
 import org.yakindu.sct.generator.core.types.ICodegenTypeSystemAccess
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sexec.naming.INamingService

+ 11 - 1
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/StatemachineSource.xtend

@@ -13,6 +13,13 @@ package org.yakindu.sct.generator.c
 import com.google.inject.Inject
 import java.util.List
 import org.eclipse.xtext.util.Strings
+import org.yakindu.base.expressions.expressions.AssignmentExpression
+import org.yakindu.base.expressions.expressions.AssignmentOperator
+import org.yakindu.base.expressions.expressions.MultiplicativeOperator
+import org.yakindu.base.expressions.expressions.NumericalMultiplyDivideExpression
+import org.yakindu.sct.generator.c.extensions.GenmodelEntries
+import org.yakindu.sct.generator.c.extensions.Naming
+import org.yakindu.sct.generator.c.extensions.Navigation
 import org.yakindu.sct.generator.core.types.ICodegenTypeSystemAccess
 import org.yakindu.sct.model.sexec.Check
 import org.yakindu.sct.model.sexec.ExecutionFlow
@@ -20,9 +27,10 @@ import org.yakindu.sct.model.sexec.Step
 import org.yakindu.sct.model.sexec.extensions.StateVectorExtensions
 import org.yakindu.sct.model.sexec.naming.INamingService
 import org.yakindu.sct.model.sgen.GeneratorEntry
+import org.yakindu.sct.model.stext.stext.EventDefinition
 import org.yakindu.sct.model.stext.stext.StatechartScope
 import org.yakindu.sct.model.stext.stext.VariableDefinition
-import org.yakindu.sct.model.stext.stext.EventDefinition
+import org.yakindu.sct.generator.c.extensions.ExpressionsChecker
 
 class StatemachineSource implements IContentTemplate {
 	
@@ -34,6 +42,7 @@ class StatemachineSource implements IContentTemplate {
 	@Inject protected extension FlowCode
 	@Inject protected extension ConstantInitializationResolver
 	@Inject protected extension StateVectorExtensions
+	@Inject protected extension ExpressionsChecker
 	
 	override content(ExecutionFlow it, GeneratorEntry entry, extension IGenArtifactConfigurations artifactConfigs) { 
 		initializeNamingService
@@ -42,6 +51,7 @@ class StatemachineSource implements IContentTemplate {
 		
 		#include <stdlib.h>
 		#include <string.h>
+		«IF modOnReal»#include <math.h>«ENDIF»
 		#include "«(typesModule.h).relativeTo(module.c)»"
 		#include "«(module.h).relativeTo(module.c)»"
 		«IF timed || !it.operations.empty»

+ 1 - 0
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/Timer.xtend

@@ -12,6 +12,7 @@ package org.yakindu.sct.generator.c
 
 import com.google.inject.Inject
 import org.eclipse.xtext.generator.IFileSystemAccess
+import org.yakindu.sct.generator.c.extensions.Naming
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sgraph.Statechart
 

+ 2 - 0
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/Types.xtend

@@ -11,6 +11,8 @@
 package org.yakindu.sct.generator.c
 
 import com.google.inject.Inject
+import org.yakindu.sct.generator.c.extensions.GenmodelEntries
+import org.yakindu.sct.generator.c.extensions.Naming
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sgen.GeneratorEntry
 

+ 2 - 2
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/eventdriven/EventNaming.xtend

@@ -12,8 +12,8 @@ package org.yakindu.sct.generator.c.eventdriven
 
 import com.google.inject.Inject
 import org.yakindu.base.types.Event
-import org.yakindu.sct.generator.c.Naming
-import org.yakindu.sct.generator.c.Navigation
+import org.yakindu.sct.generator.c.extensions.Naming
+import org.yakindu.sct.generator.c.extensions.Navigation
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sexec.naming.INamingService
 

+ 2 - 5
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/eventdriven/StatechartEventsHeader.xtend

@@ -12,14 +12,11 @@ package org.yakindu.sct.generator.c.eventdriven
 
 import com.google.inject.Inject
 import org.yakindu.base.types.Direction
-import org.yakindu.sct.generator.c.IContentTemplate
-import org.yakindu.sct.generator.c.IGenArtifactConfigurations
-import org.yakindu.sct.generator.c.Naming
-import org.yakindu.sct.generator.c.Navigation
+import org.yakindu.sct.generator.c.extensions.Naming
+import org.yakindu.sct.generator.c.extensions.Navigation
 import org.yakindu.sct.generator.core.types.ICodegenTypeSystemAccess
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sexec.naming.INamingService
-import org.yakindu.sct.model.sgen.GeneratorEntry
 
 /**
  * @author René Beckmann

+ 1 - 1
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/eventdriven/StatechartEventsSource.xtend

@@ -11,7 +11,7 @@
 package org.yakindu.sct.generator.c.eventdriven
 
 import com.google.inject.Inject
-import org.yakindu.sct.generator.c.Navigation
+import org.yakindu.sct.generator.c.extensions.Navigation
 import org.yakindu.sct.generator.core.types.ICodegenTypeSystemAccess
 import org.yakindu.sct.model.sexec.ExecutionFlow
 

+ 32 - 0
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/extensions/ExpressionsChecker.xtend

@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2012 committers of YAKINDU and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * Contributors:
+ * 	committers of YAKINDU - initial API and implementation
+ * 
+ */
+package org.yakindu.sct.generator.c.extensions
+
+import com.google.inject.Inject
+import org.yakindu.base.expressions.expressions.AssignmentExpression
+import org.yakindu.base.expressions.expressions.AssignmentOperator
+import org.yakindu.base.expressions.expressions.MultiplicativeOperator
+import org.yakindu.base.expressions.expressions.NumericalMultiplyDivideExpression
+import org.yakindu.sct.generator.c.CExpressionsGenerator
+import org.yakindu.sct.model.sexec.ExecutionFlow
+
+class ExpressionsChecker {
+
+	@Inject protected extension CExpressionsGenerator
+
+	def modOnReal(ExecutionFlow it) {
+		!eAllContents.filter(NumericalMultiplyDivideExpression).filter[operator == MultiplicativeOperator.MOD].filter [
+			it.haveCommonTypeReal
+		].isEmpty || !eAllContents.filter(AssignmentExpression).filter[operator == AssignmentOperator.MOD_ASSIGN].filter [
+			it.haveCommonTypeReal
+		].isEmpty
+	}
+}

+ 2 - 2
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/GenmodelEntries.xtend

@@ -7,7 +7,7 @@
   Contributors:
   	Markus Muehlbrandt - Initial contribution and API
  */
-package org.yakindu.sct.generator.c
+package org.yakindu.sct.generator.c.extensions
 
 import org.yakindu.sct.generator.c.features.ICFeatureConstants
 import org.yakindu.sct.model.sgen.FeatureParameterValue
@@ -96,4 +96,4 @@ class GenmodelEntries {
 		}
 		return false
 	}
-}
+}

+ 2 - 1
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/Naming.xtend

@@ -8,7 +8,7 @@
  * 	committers of YAKINDU - initial API and implementation
  * 
  */
-package org.yakindu.sct.generator.c
+package org.yakindu.sct.generator.c.extensions
 
 import com.google.inject.Inject
 import java.util.List
@@ -17,6 +17,7 @@ import org.yakindu.base.types.Enumerator
 import org.yakindu.base.types.Event
 import org.yakindu.base.types.Operation
 import org.yakindu.base.types.Property
+import org.yakindu.sct.generator.c.extensions.Navigation
 import org.yakindu.sct.generator.core.types.ICodegenTypeSystemAccess
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sexec.ExecutionState

+ 1 - 1
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/Navigation.xtend

@@ -8,7 +8,7 @@
  * 	committers of YAKINDU - initial API and implementation
  * 
  */
-package org.yakindu.sct.generator.c
+package org.yakindu.sct.generator.c.extensions
 
 import java.util.ArrayList
 import org.eclipse.emf.ecore.EObject

+ 1 - 1
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/CppCodeGeneratorModule.java

@@ -18,8 +18,8 @@ import org.yakindu.base.types.Annotation;
 import org.yakindu.base.types.inferrer.ITypeSystemInferrer;
 import org.yakindu.sct.generator.c.DefaultGenArtifactConfigurations;
 import org.yakindu.sct.generator.c.IGenArtifactConfigurations;
-import org.yakindu.sct.generator.c.Naming;
 import org.yakindu.sct.generator.c.SimpleGenArtifactConfigurations;
+import org.yakindu.sct.generator.c.extensions.Naming;
 import org.yakindu.sct.generator.c.types.CTypeSystemAccess;
 import org.yakindu.sct.generator.core.IExecutionFlowGenerator;
 import org.yakindu.sct.generator.core.IGeneratorModule;

+ 1 - 1
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/CppNaming.xtend

@@ -14,7 +14,7 @@ package org.yakindu.sct.generator.cpp
 import com.google.inject.Inject
 import org.yakindu.base.types.Event
 import org.yakindu.base.types.Parameter
-import org.yakindu.sct.generator.c.Naming
+import org.yakindu.sct.generator.c.extensions.Naming
 import org.yakindu.sct.generator.core.types.ICodegenTypeSystemAccess
 import org.yakindu.sct.generator.cpp.features.GenmodelEntriesExtension
 import org.yakindu.sct.model.sexec.ExecutionFlow

+ 2 - 2
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/CppNamingService.xtend

@@ -13,8 +13,9 @@ package org.yakindu.sct.generator.cpp
 
 import com.google.inject.Inject
 import java.util.Arrays
+import org.yakindu.base.base.NamedElement
 import org.yakindu.sct.generator.c.CNamingService
-import org.yakindu.sct.generator.c.GenmodelEntries
+import org.yakindu.sct.generator.c.extensions.GenmodelEntries
 import org.yakindu.sct.model.sexec.ExecutionState
 import org.yakindu.sct.model.sexec.Step
 import org.yakindu.sct.model.sexec.extensions.SExecExtensions
@@ -23,7 +24,6 @@ import org.yakindu.sct.model.sgraph.State
 import org.yakindu.sct.model.stext.stext.TimeEventSpec
 
 import static org.yakindu.sct.generator.cpp.CppKeywords.*
-import org.yakindu.base.base.NamedElement
 
 class CppNamingService extends CNamingService {
 

+ 1 - 1
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/FlowCode.xtend

@@ -18,13 +18,13 @@ import org.yakindu.sct.model.sexec.EnterState
 import org.yakindu.sct.model.sexec.Execution
 import org.yakindu.sct.model.sexec.ExitState
 import org.yakindu.sct.model.sexec.HistoryEntry
+import org.yakindu.sct.model.sexec.If
 import org.yakindu.sct.model.sexec.SaveHistory
 import org.yakindu.sct.model.sexec.ScheduleTimeEvent
 import org.yakindu.sct.model.sexec.Sequence
 import org.yakindu.sct.model.sexec.StateSwitch
 import org.yakindu.sct.model.sexec.UnscheduleTimeEvent
 import org.yakindu.sct.model.sexec.naming.INamingService
-import org.yakindu.sct.model.sexec.If
 
 class FlowCode extends org.yakindu.sct.generator.c.FlowCode {
 	

+ 1 - 1
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/Navigation.xtend

@@ -17,7 +17,7 @@ import org.yakindu.sct.model.stext.stext.ImportScope
 import org.yakindu.sct.model.stext.stext.OperationDefinition
 import org.yakindu.sct.model.stext.stext.StatechartScope
 
-class Navigation extends org.yakindu.sct.generator.c.Navigation {
+class Navigation extends org.yakindu.sct.generator.c.extensions.Navigation {
 	
 	def getStatechartScopes(ExecutionFlow it) {
 		scopes.filter(typeof(StatechartScope))

+ 3 - 0
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/StatemachineImplementation.xtend

@@ -27,6 +27,7 @@ import org.yakindu.sct.model.stext.stext.StatechartScope
 import org.yakindu.sct.model.stext.stext.VariableDefinition
 
 import static org.eclipse.xtext.util.Strings.*
+import org.yakindu.sct.generator.c.extensions.ExpressionsChecker
 
 class StatemachineImplementation implements IContentTemplate {
 	
@@ -39,6 +40,7 @@ class StatemachineImplementation implements IContentTemplate {
 	@Inject protected extension CppExpressionsGenerator
 	@Inject protected extension StateVectorExtensions
 	@Inject protected extension EventCode
+	@Inject protected extension ExpressionsChecker
 	
 	protected GeneratorEntry entry
 	
@@ -49,6 +51,7 @@ class StatemachineImplementation implements IContentTemplate {
 		
 		#include "«module.h»"
 		#include <string.h>
+		«IF modOnReal»#include <math.h>«ENDIF»
 		
 		/*! \file Implementation of the state machine '«name»'
 		*/

+ 1 - 1
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/StatemachineInterface.xtend

@@ -10,9 +10,9 @@
 package org.yakindu.sct.generator.cpp
 
 import com.google.inject.Inject
-import org.yakindu.sct.generator.c.GenmodelEntries
 import org.yakindu.sct.generator.c.IContentTemplate
 import org.yakindu.sct.generator.c.IGenArtifactConfigurations
+import org.yakindu.sct.generator.c.extensions.GenmodelEntries
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sgen.GeneratorEntry
 

+ 1 - 1
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/TimedStatemachineInterface.xtend

@@ -10,9 +10,9 @@
 package org.yakindu.sct.generator.cpp
 
 import com.google.inject.Inject
-import org.yakindu.sct.generator.c.GenmodelEntries
 import org.yakindu.sct.generator.c.IContentTemplate
 import org.yakindu.sct.generator.c.IGenArtifactConfigurations
+import org.yakindu.sct.generator.c.extensions.GenmodelEntries
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sgen.GeneratorEntry
 

+ 1 - 1
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/TimerInterface.xtend

@@ -10,9 +10,9 @@
 package org.yakindu.sct.generator.cpp
 
 import com.google.inject.Inject
-import org.yakindu.sct.generator.c.GenmodelEntries
 import org.yakindu.sct.generator.c.IContentTemplate
 import org.yakindu.sct.generator.c.IGenArtifactConfigurations
+import org.yakindu.sct.generator.c.extensions.GenmodelEntries
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sgen.GeneratorEntry
 

+ 1 - 1
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/Types.xtend

@@ -11,9 +11,9 @@
 package org.yakindu.sct.generator.cpp
 
 import com.google.inject.Inject
-import org.yakindu.sct.generator.c.GenmodelEntries
 import org.yakindu.sct.generator.c.IContentTemplate
 import org.yakindu.sct.generator.c.IGenArtifactConfigurations
+import org.yakindu.sct.generator.c.extensions.GenmodelEntries
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sgen.GeneratorEntry
 

+ 2 - 2
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/features/GenmodelEntriesExtension.xtend

@@ -10,9 +10,9 @@
 */
 package org.yakindu.sct.generator.cpp.features
 
-import org.yakindu.sct.generator.c.GenmodelEntries
-import org.yakindu.sct.model.sgen.GeneratorEntry
+import org.yakindu.sct.generator.c.extensions.GenmodelEntries
 import org.yakindu.sct.generator.cpp.features.CPPFeatureConstants.Visibility
+import org.yakindu.sct.model.sgen.GeneratorEntry
 
 class GenmodelEntriesExtension extends GenmodelEntries {
 

+ 19 - 0
test-plugins/org.yakindu.sct.generator.c.test/gtests/FloatModulo/FloatModulo.sgen

@@ -0,0 +1,19 @@
+GeneratorModel for yakindu::c {
+	statechart FloatModulo {
+		feature Outlet {
+			targetProject = "gtests"
+			targetFolder = "FloatModulo"
+		}
+		feature FunctionInlining {
+			inlineReactions = false
+			inlineEntryActions = false
+			inlineEnterSequences = false 
+			inlineExitActions = false
+			inlineExitSequences = false
+			inlineChoices = false
+			inlineEntries = false
+			inlineEnterRegion = false
+			inlineExitRegion = false
+		}
+	}
+}

+ 37 - 0
test-plugins/org.yakindu.sct.generator.c.test/gtests/FloatModulo/FloatModuloTest.cc

@@ -0,0 +1,37 @@
+/* Generated by YAKINDU Statechart Tools code generator. */
+
+#include "gtest/gtest.h"
+#include "FloatModulo.h"
+
+#include "sc_timer_service.h"
+
+
+
+//! The timers are managed by a timer service. */
+static sc_unit_timer_service_t timer_service;
+
+static FloatModulo statechart;
+
+class FloatModuloTest : public ::testing::Test{
+	protected:
+	virtual void SetUp() {
+		floatModulo_init(&statechart);
+		sc_timer_service_init(
+			&timer_service,
+			0,
+			(sc_run_cycle_fp) &floatModulo_runCycle,
+			false,
+			200,
+			&statechart
+		);
+	}
+};
+
+
+TEST_F(FloatModuloTest, test) {
+	floatModulo_enter(&statechart);
+	sc_timer_service_proceed_cycles(&timer_service, 1);
+	EXPECT_TRUE(floatModulo_isFinal(&statechart));
+}
+
+

+ 32 - 4
test-plugins/org.yakindu.sct.generator.c.test/model/test.sgen

@@ -17,14 +17,14 @@ GeneratorModel for sctunit::c {
 			inlineEntryActions = false
 			inlineExitActions = false
 			inlineEnterSequences = false
-			inlineExitSequences = false
+			inlineExitSequences = false 
 			inlineChoices = false
 			inlineEnterRegion = false
 			inlineExitRegion = false
 			inlineEntries = false
 		}
-
-	}
+ 
+	} 
 
 	test AlwaysOncycle {
 
@@ -32,7 +32,7 @@ GeneratorModel for sctunit::c {
 			targetProject = "org.yakindu.sct.generator.c.test"
 			targetFolder = "gtests/AlwaysOncycle"
 			libraryTargetFolder = "libraryTarget"
-		}
+		} 
 
 		feature JUnitWrapper {
 			WrapToJUnit = true
@@ -761,6 +761,34 @@ GeneratorModel for sctunit::c {
 		}
 		
 	}
+	
+	test FloatModulo {
+		feature Outlet {
+			targetProject = "org.yakindu.sct.generator.c.test"
+			targetFolder = "gtests/FloatModulo"
+			libraryTargetFolder = "libraryTarget"
+		}
+
+		feature JUnitWrapper {
+			WrapToJUnit = true
+		}
+
+		feature FunctionInlining {
+			inlineReactions = false
+			inlineEntryActions = false
+			inlineExitActions = false
+			inlineEnterSequences = false
+			inlineExitSequences = false
+			inlineChoices = false
+			inlineEnterRegion = false
+			inlineExitRegion = false
+			inlineEntries = false
+		}
+		
+		feature SGenModel{
+			GenerateSGen = true
+		}
+	}
 
 	test Guard {
 

+ 1 - 0
test-plugins/org.yakindu.sct.generator.c.test/src/org/yakindu/sct/generator/c/gtest/GTestHelper.java

@@ -201,6 +201,7 @@ public class GTestHelper {
 		}
 		command.add("-lgtest");
 		command.add("-lgtest_main");
+		command.add("-lm");
 		command.add("-lstdc++");
 		command.add("-pthread");
 		// command.add("-pg");

+ 1 - 0
test-plugins/org.yakindu.sct.generator.c.test/test-gen/org/yakindu/sct/generator/c/test/AllTests.java

@@ -36,6 +36,7 @@ import org.junit.runners.Suite.SuiteClasses;
 	ExitStateTest.class,
 	FeatureCallsTest.class,
 	FinalStateTest.class,
+	FloatModuloTest.class,
 	GuardTest.class,
 	GuardedEntryTest.class,
 	GuardedExitTest.class,

+ 34 - 0
test-plugins/org.yakindu.sct.generator.c.test/test-gen/org/yakindu/sct/generator/c/test/FloatModuloTest.java

@@ -0,0 +1,34 @@
+/* Generated by YAKINDU Statechart Tools code generator. */
+package org.yakindu.sct.generator.c.test;
+
+import org.junit.Before;
+import org.junit.runner.RunWith;
+import org.yakindu.sct.generator.c.gtest.GTest;
+import org.yakindu.sct.generator.c.gtest.GTestRunner;
+import org.yakindu.sct.generator.c.gtest.GTestHelper;
+
+@GTest(
+	statechartBundle = "org.yakindu.sct.test.models",
+	sourceFile = "gtests/FloatModulo/FloatModuloTest.cc",
+	program = "gtests/FloatModulo/FloatModulo",
+	model = "testmodels/SCTUnit/FloatModulo.sct",
+	additionalFilesToCopy = {
+		"libraryTarget/sc_timer_service.c",
+		"libraryTarget/sc_timer_service.h"
+	},
+	additionalFilesToCompile = {
+		"FloatModulo.c",
+		"sc_timer_service.c"
+	}
+)
+@RunWith(GTestRunner.class)
+public class FloatModuloTest {
+
+	protected final GTestHelper helper = new GTestHelper(this);
+
+	@Before
+	public void setUp() {
+		helper.generate();
+		helper.compile();
+	}
+}

+ 19 - 0
test-plugins/org.yakindu.sct.generator.cpp.test/gtests/FloatModulo/FloatModulo.sgen

@@ -0,0 +1,19 @@
+GeneratorModel for yakindu::cpp {
+	statechart FloatModulo {
+		feature Outlet {
+			targetProject = "gtests"
+			targetFolder = "FloatModulo"
+		}
+		feature FunctionInlining {
+			inlineReactions = false
+			inlineEntryActions = false
+			inlineEnterSequences = false 
+			inlineExitActions = false
+			inlineExitSequences = false
+			inlineChoices = false
+			inlineEntries = false
+			inlineEnterRegion = false
+			inlineExitRegion = false
+		}
+	}
+}

+ 41 - 0
test-plugins/org.yakindu.sct.generator.cpp.test/gtests/FloatModulo/FloatModuloTest.cc

@@ -0,0 +1,41 @@
+/* Generated by YAKINDU Statechart Tools code generator. */
+#include <string>
+#include "gtest/gtest.h"
+#include "FloatModulo.h"
+#include "sc_runner.h"
+#include "sc_types.h"
+
+
+
+static FloatModulo* statechart;
+
+//! The timers are managed by a timer service. */
+static SctUnitRunner * runner;
+
+class FloatModuloTest : public ::testing::Test{
+	protected:
+	virtual void SetUp() {
+		statechart = new FloatModulo();
+		statechart->init();
+		runner = new SctUnitRunner(
+			statechart,
+			false,
+			200
+		);
+	}
+	virtual void TearDown() {
+		delete statechart;
+		delete runner;
+	}
+};
+
+
+TEST_F(FloatModuloTest, test) {
+	
+	statechart->enter();
+	
+	runner->proceed_cycles(1);
+	
+	EXPECT_TRUE(statechart->isFinal());
+	
+}

+ 28 - 0
test-plugins/org.yakindu.sct.generator.cpp.test/model/test.sgen

@@ -760,6 +760,34 @@ GeneratorModel for sctunit::cpp {
 		}
 	}
 	
+	test FloatModulo {
+		feature Outlet {
+			targetProject = "org.yakindu.sct.generator.cpp.test"
+			targetFolder = "gtests/FloatModulo"
+			libraryTargetFolder = "libraryTarget"
+		}
+
+		feature JUnitWrapper {
+			WrapToJUnit = true
+		}
+
+		feature FunctionInlining {
+			inlineReactions = false
+			inlineEntryActions = false
+			inlineExitActions = false
+			inlineEnterSequences = false
+			inlineExitSequences = false
+			inlineChoices = false
+			inlineEnterRegion = false
+			inlineExitRegion = false
+			inlineEntries = false
+		}
+		
+		feature SGenModel{
+			GenerateSGen = true
+		}
+	}
+	
 	test Guard{
 		
 		feature Outlet{ 

+ 1 - 0
test-plugins/org.yakindu.sct.generator.cpp.test/test-gen/org/yakindu/sct/generator/cpp/test/AllTests.java

@@ -35,6 +35,7 @@ import org.junit.runners.Suite.SuiteClasses;
 	ExitStateTest.class,
 	FeatureCallsTest.class,
 	FinalStateTest.class,
+	FloatModuloTest.class,
 	GuardTest.class,
 	GuardedEntryTest.class,
 	GuardedExitTest.class,

+ 35 - 0
test-plugins/org.yakindu.sct.generator.cpp.test/test-gen/org/yakindu/sct/generator/cpp/test/FloatModuloTest.java

@@ -0,0 +1,35 @@
+/* Generated by YAKINDU Statechart Tools code generator. */
+package org.yakindu.sct.generator.cpp.test;
+
+import org.junit.Before;
+import org.junit.runner.RunWith;
+import org.yakindu.sct.generator.c.gtest.GTest;
+import org.yakindu.sct.generator.c.gtest.GTestRunner;
+import org.yakindu.sct.generator.c.gtest.GTestHelper;
+import org.yakindu.sct.generator.c.gtest.GTestHelper.Compiler;
+
+@GTest(
+	statechartBundle = "org.yakindu.sct.test.models",
+	sourceFile = "gtests/FloatModulo/FloatModuloTest.cc",
+	program = "gtests/FloatModulo/FloatModulo",
+	model = "testmodels/SCTUnit/FloatModulo.sct",
+	additionalFilesToCopy = {
+		"libraryTarget/sc_runner.h",
+		"libraryTarget/sc_runner.cpp"
+	},
+	additionalFilesToCompile = {
+		"FloatModulo.cpp",
+		"sc_runner.cpp"
+	}
+)
+@RunWith(GTestRunner.class)
+public class FloatModuloTest {
+protected final GTestHelper helper = new GTestHelper(this, Compiler.GPLUSPLUS);
+
+	@Before
+	public void setUp() {
+		helper.generate();
+		helper.compile();
+	}
+
+}

+ 1 - 0
test-plugins/org.yakindu.sct.test.models/.settings/org.eclipse.core.resources.prefs

@@ -11,6 +11,7 @@ encoding//testmodels/SCTUnit/ExitOnSelfTransition.sct=UTF-8
 encoding//testmodels/SCTUnit/ExitState.sct=UTF-8
 encoding//testmodels/SCTUnit/ExitStatechart.sct=UTF-8
 encoding//testmodels/SCTUnit/FinalState.sct=UTF-8
+encoding//testmodels/SCTUnit/FloatModulo.sct=UTF-8
 encoding//testmodels/SCTUnit/GuardedEntry.sct=UTF-8
 encoding//testmodels/SCTUnit/GuardedExit.sct=UTF-8
 encoding//testmodels/SCTUnit/HistoryWithoutInitialStep.sct=UTF-8

Файловите разлики са ограничени, защото са твърде много
+ 89 - 0
test-plugins/org.yakindu.sct.test.models/testmodels/SCTUnit/FloatModulo.sct


+ 1 - 0
test-plugins/org.yakindu.sct.test.models/tests/AllTests.sctunit

@@ -35,6 +35,7 @@ testsuite AllTests {
 	ExitState,
 	FeatureCalls,
 	FinalState,
+	FloatModulo,
 	Guard, 
 	GuardedEntry, 
 	GuardedExit, 

+ 9 - 0
test-plugins/org.yakindu.sct.test.models/tests/FloatModulo.sctunit

@@ -0,0 +1,9 @@
+testclass FloatModulo for statechart FloatModulo {
+	
+	@Test
+	operation test() {
+			enter
+			proceed 1 cycle
+			assert is_final						
+	}
+}