Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuergen Haug2015-12-23 11:35:03 +0000
committerJuergen Haug2016-02-28 17:01:11 +0000
commit81750c5e633ad14e7ab25b016564af20fec0a1cc (patch)
tree951ca972625f09ffee924496591e97d927a74f0d /plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/StateMachineGen.xtend
parentdc98de4bb145d8d3789909e32c11765596165fbb (diff)
downloadorg.eclipse.etrice-81750c5e633ad14e7ab25b016564af20fec0a1cc.tar.gz
org.eclipse.etrice-81750c5e633ad14e7ab25b016564af20fec0a1cc.tar.xz
org.eclipse.etrice-81750c5e633ad14e7ab25b016564af20fec0a1cc.zip
[generators] added cpp generator draft
Diffstat (limited to 'plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/StateMachineGen.xtend')
-rw-r--r--plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/StateMachineGen.xtend115
1 files changed, 57 insertions, 58 deletions
diff --git a/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/StateMachineGen.xtend b/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/StateMachineGen.xtend
index f8a84c8ca..de45d9c2c 100644
--- a/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/StateMachineGen.xtend
+++ b/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/StateMachineGen.xtend
@@ -4,86 +4,85 @@
* 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:
* Henrik Rentz-Reichert (initial contribution)
* Peter Karlitschek
- *
+ *
*******************************************************************************/
package org.eclipse.etrice.generator.cpp.gen
import com.google.inject.Inject
import com.google.inject.Singleton
-import java.util.ArrayList
import org.eclipse.etrice.core.genmodel.fsm.fsmgen.ExpandedModelComponent
-import org.eclipse.etrice.core.room.ActorClass
import org.eclipse.etrice.generator.generic.GenericStateMachineGenerator
import org.eclipse.etrice.generator.generic.RoomExtensions
-import org.eclipse.xtext.util.Pair
+import org.eclipse.etrice.generator.cpp.Main
+import org.eclipse.etrice.core.room.ActorClass
-import static org.eclipse.xtext.util.Tuples.*
-/**
- * @author Peter Karlitschek
- *
- */
@Singleton
class StateMachineGen extends GenericStateMachineGenerator {
-
+
@Inject extension RoomExtensions
- @Inject ProtocolClassGen cppProtGen
-
- override genExtraDecl(ExpandedModelComponent xpac) {
-// val ac = xpac.actorClass
- '''
- protected:
- static std::string s_stateStrings[];
- static const int s_numberOfStates;
-
- private:
- void setState(int new_state);
- '''}
-
- override genExtra(ExpandedModelComponent xpac) {
- val ac = xpac.modelComponent as ActorClass
- '''
- std::string «ac.name»::s_stateStrings[] = {"<no state>","<top>",«FOR state : ac.getAllBaseStatesLeavesLast() SEPARATOR ","»"«state.genStatePathName»"
- «ENDFOR»};
- const int «ac.name»::s_numberOfStates = «ac.getAllBaseStatesLeavesLast().size + 2»;
-
- void «ac.name»::setState(int new_state) {
- DebuggingService::getInstance().addActorState(*this, s_stateStrings[new_state]);
- if (s_stateStrings[new_state]!="Idle") {
-««« TODOTS: model switch for activation
- std::cout << getInstancePath() << " -> " << s_stateStrings[new_state] << std::endl;
- }
- m_state = new_state;
- }
- '''}
-
- override genTriggerConstants(ExpandedModelComponent xpac) {
- val triggers = if (langExt.usesInheritance)
- xpac.getOwnTriggers() else xpac.triggers
- val list = new ArrayList<Pair<String, String>>()
- list.add(pair("POLLING", "0"));
- for (mif : triggers) {
- list.add(pair(xpac.getTriggerCodeName(mif), "IFITEM_"+mif.from.name+" + EVT_SHIFT*"+cppProtGen.getMessageID(mif)))
+ override genExtra(ExpandedModelComponent xpac, boolean generateImplementation) {
+ val states = newArrayList
+ var ac = xpac.modelComponent
+ val clsName = xpac.modelComponent.componentName
+
+// it is crucial that we obey the order that is used for state IDs
+// that means we have to collect base classes first and each base class list with leaf states last
+ while (ac!=null) {
+ states.addAll(0, ac.allBaseStates.leafStatesLast)
+ ac = ac.base
}
-
- return langExt.genEnumeration("triggers", list)
+ if(generateImplementation)
+ '''
+ «IF Main::settings.generateMSCInstrumentation || Main::settings.generateWithVerboseOutput»
+ // state names
+ const std::string «clsName»::s_stateStrings[] = {
+ "<no state>",
+ "<top>",
+ «FOR state : states SEPARATOR ","»
+ "«state.genStatePathName»"
+ «ENDFOR»
+ };
+ «ENDIF»
+ const int «clsName»::s_numberOfStates = «2+states.size»;
+
+ void «clsName»::setState(int new_state) {
+ «IF Main::settings.generateMSCInstrumentation»
+ DebuggingService::getInstance().addActorState(*this, s_stateStrings[new_state]);
+ «ENDIF»
+ «IF Main::settings.generateWithVerboseOutput»
+ if (s_stateStrings[new_state] != "Idle") {
+ std::cout << getInstancePath() << " -> " << s_stateStrings[new_state] << std::endl;
+ }
+ «ENDIF»
+ m_state = new_state;
+ }
+ '''
+ else
+ '''
+ «IF Main::settings.generateMSCInstrumentation || Main::settings.generateWithVerboseOutput»
+ static const std::string s_stateStrings[];
+ «ENDIF»
+ static const int s_numberOfStates;
+
+ int history[«2+states.size»];
+
+ void setState(int new_state);
+ '''
}
-
- override constPointer(String classname) {
- return "const " + classname + "*"
+
+ override public stateType() {
+ "etInt16"
}
-
+
override boolType() {
- return "bool"
+ "etBool"
}
-
-
-
}

Back to the top