diff options
author | Juergen Haug | 2015-12-23 11:35:03 +0000 |
---|---|---|
committer | Juergen Haug | 2016-02-28 17:01:11 +0000 |
commit | 81750c5e633ad14e7ab25b016564af20fec0a1cc (patch) | |
tree | 951ca972625f09ffee924496591e97d927a74f0d /plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/StateMachineGen.xtend | |
parent | dc98de4bb145d8d3789909e32c11765596165fbb (diff) | |
download | org.eclipse.etrice-81750c5e633ad14e7ab25b016564af20fec0a1cc.tar.gz org.eclipse.etrice-81750c5e633ad14e7ab25b016564af20fec0a1cc.tar.xz org.eclipse.etrice-81750c5e633ad14e7ab25b016564af20fec0a1cc.zip |
[generators] added cpp generator draft
Change-Id: I4466d25800a35a869a2911485d36494f86089121
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.xtend | 115 |
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" } - - - } |