diff options
author | Jan Belle | 2016-10-07 07:43:11 +0000 |
---|---|---|
committer | Jan Belle | 2016-10-07 10:15:04 +0000 |
commit | 6a2dc3b10e15050fd488514656e1c30902393437 (patch) | |
tree | 738d096fb3b632ec680c22f0c7b6888747f62794 | |
parent | 5401d4aee22c108a672d5f0724b54c9c3f847fcd (diff) | |
download | org.eclipse.etrice-6a2dc3b10e15050fd488514656e1c30902393437.tar.gz org.eclipse.etrice-6a2dc3b10e15050fd488514656e1c30902393437.tar.xz org.eclipse.etrice-6a2dc3b10e15050fd488514656e1c30902393437.zip |
[runtime.cpp] Refactored cpp runtime
- Refactored initialization process
- Fixed RTObject double deleting children
- Sub actors are now static members
- Added ReplicatedActorClassBase for replicated actors
[generator.cpp] Modified ActorClassGen and NodeGen to fit the runtime
changes
Change-Id: I172bcae0cba98234d61c8e741b23be6604cc6131
28 files changed, 1046 insertions, 454 deletions
diff --git a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/contentassist/RoomProposalProvider.java b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/contentassist/RoomProposalProvider.java index ea239cac4..ba35fcbad 100644 --- a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/contentassist/RoomProposalProvider.java +++ b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/contentassist/RoomProposalProvider.java @@ -26,14 +26,10 @@ import org.eclipse.etrice.core.room.ActorContainerRef; import org.eclipse.etrice.core.room.ActorInstanceMapping; import org.eclipse.etrice.core.room.ActorRef; import org.eclipse.etrice.core.room.DataClass; -import org.eclipse.etrice.core.room.LayerConnection; import org.eclipse.etrice.core.room.Operation; import org.eclipse.etrice.core.room.RefPath; -import org.eclipse.etrice.core.room.RefSAPoint; -import org.eclipse.etrice.core.room.RelaySAPoint; import org.eclipse.etrice.core.room.RoomAnnotationTargetEnum; import org.eclipse.etrice.core.room.RoomPackage; -import org.eclipse.etrice.core.room.SPP; import org.eclipse.etrice.core.room.StandardOperation; import org.eclipse.etrice.core.room.util.RoomHelpers; import org.eclipse.jface.text.contentassist.ICompletionProposal; @@ -41,9 +37,7 @@ import org.eclipse.jface.viewers.StyledString; import org.eclipse.swt.graphics.Image; import org.eclipse.xtext.Assignment; import org.eclipse.xtext.RuleCall; -import org.eclipse.xtext.naming.IQualifiedNameProvider; import org.eclipse.xtext.resource.IEObjectDescription; -import org.eclipse.xtext.ui.editor.contentassist.ConfigurableCompletionProposal; import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext; import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor; @@ -123,9 +117,6 @@ public class RoomProposalProvider extends AbstractRoomProposalProvider { @Inject protected RoomNameProvider roomNameProvider; - @Inject - protected IQualifiedNameProvider fqnProvider; - protected Function<IEObjectDescription, ICompletionProposal> getProposalFactory(String ruleName, ContentAssistContext contentAssistContext) { if (contentAssistContext!=null && contentAssistContext.getCurrentModel().eClass()==RoomPackage.eINSTANCE.getActorRef()) return new FilteredProposalCreator(new ActorRefFilter(), contentAssistContext, ruleName); @@ -228,37 +219,6 @@ public class RoomProposalProvider extends AbstractRoomProposalProvider { return refs; } - @Override - public void completeLayerConnection_To(EObject model, - Assignment assignment, ContentAssistContext context, - ICompletionProposalAcceptor acceptor) { - super.completeLayerConnection_To(model, assignment, context, acceptor); - - if (model instanceof LayerConnection) { - LayerConnection lc = (LayerConnection) model; - if (lc.getFrom() instanceof RefSAPoint) { - - } - else if (lc.getFrom() instanceof RelaySAPoint) { - SPP spp = ((RelaySAPoint)lc.getFrom()).getRelay(); - List<ActorClass> classes = roomHelpers.getClassHierarchy((ActorClass) spp.eContainer()); - for (ActorClass ac : classes) { - for (ActorRef ar : ac.getActorRefs()) { - StyledString displayString = getStyledDisplayString(ar, fqnProvider.apply(ar).toString(), ar.getName()); - ICompletionProposal result = createCompletionProposal(ar.getName(), displayString, getImage(ar), getPriorityHelper().getDefaultPriority(), - context.getPrefix(), context); - if (result instanceof ConfigurableCompletionProposal) { - ((ConfigurableCompletionProposal) result).setProposalContextResource(context.getResource()); - ((ConfigurableCompletionProposal) result).setAdditionalProposalInfo(ar); - ((ConfigurableCompletionProposal) result).setHover(getHover()); - } - acceptor.accept(result); - } - } - } - } - } - // public void completeActorRef_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { // super.completeActorRef_Type( // model, diff --git a/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/naming/RoomFragmentProvider.java b/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/naming/RoomFragmentProvider.java index c04d8d463..d772b0c89 100644 --- a/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/naming/RoomFragmentProvider.java +++ b/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/naming/RoomFragmentProvider.java @@ -109,25 +109,16 @@ public class RoomFragmentProvider extends FSMFragmentProvider { private String caseSAPointShort(SAPoint sapt) { if (sapt==null) return "null"; - if (sapt instanceof RefSAPoint) { - if (((RefSAPoint) sapt).getRef()==null) - return "<not_resolved>"; + if (sapt instanceof RefSAPoint) return ((RefSAPoint) sapt).getRef().getName(); - } - else if (sapt instanceof RelaySAPoint) { - if (((RelaySAPoint) sapt).getRelay()==null) - return "<not_resolved>"; + else if (sapt instanceof RelaySAPoint) return ((RelaySAPoint) sapt).getRelay().getName(); - } assert(false): "unexpectd sub type"; return null; } private String caseSPPointShort(SPPoint sppt) { - if (sppt==null || sppt.getRef()==null || sppt.getService()==null) { - return "<not_resolved>"; - } return sppt.getRef().getName()+EP_SEP+sppt.getService().getName(); } } diff --git a/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/scoping/RoomScopeProvider.java b/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/scoping/RoomScopeProvider.java index 972e58a51..11fcad7e7 100644 --- a/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/scoping/RoomScopeProvider.java +++ b/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/scoping/RoomScopeProvider.java @@ -415,7 +415,7 @@ public class RoomScopeProvider extends FSMScopeProvider { * @param ref * @return a list of scopes */ - public IScope scope_SPPoint_ref(SPPoint pt, EReference ref) { + public IScope scope_SPPoint_actorRef(SPPoint pt, EReference ref) { final List<IEObjectDescription> scopes = new ArrayList<IEObjectDescription>(); ActorContainerClass acc = getActorContainerClass(pt); diff --git a/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/validation/RoomJavaValidator.java b/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/validation/RoomJavaValidator.java index c82a1c43b..5945e2342 100644 --- a/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/validation/RoomJavaValidator.java +++ b/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/validation/RoomJavaValidator.java @@ -222,6 +222,7 @@ public class RoomJavaValidator extends AbstractRoomJavaValidator { if (ar.getMultiplicity()>1) { for (Port p : ac.getInterfacePorts()) { if (p.getMultiplicity()<0) { + int idx = ((ActorContainerClass)ar.eContainer()).getActorRefs().indexOf(ar); error("replicated actor must not have replicated port with arbitrary multiplicity", null); } } @@ -231,7 +232,7 @@ public class RoomJavaValidator extends AbstractRoomJavaValidator { @Check public void checkLayerConnectiontarget(LayerConnection lc) { - if (lc!=null && lc.getTo()!=null && lc.getTo().getRef() instanceof ActorRef) + if (lc.getTo().getRef() instanceof ActorRef) if (((ActorRef)lc.getTo().getRef()).getMultiplicity()>1) error("layer connection must not connect to replicated actor", null); } @@ -424,7 +425,7 @@ public class RoomJavaValidator extends AbstractRoomJavaValidator { public void checkServiceCompatibility(LayerConnection conn) { Result result = validationUtil.isValid(conn); if (!result.isOk()) - error(result.getMsg(), result.getSource(), result.getFeature()); + error(result.getMsg(), RoomPackage.eINSTANCE.getLayerConnection_From()); } @Check diff --git a/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/validation/ValidationUtil.java b/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/validation/ValidationUtil.java index 1cb69b5f7..a14c16057 100644 --- a/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/validation/ValidationUtil.java +++ b/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/validation/ValidationUtil.java @@ -41,7 +41,6 @@ import org.eclipse.etrice.core.room.RefSAPoint; import org.eclipse.etrice.core.room.ReferenceType; import org.eclipse.etrice.core.room.RelaySAPoint; import org.eclipse.etrice.core.room.RoomModel; -import org.eclipse.etrice.core.room.RoomPackage; import org.eclipse.etrice.core.room.SPP; import org.eclipse.etrice.core.room.SPPoint; import org.eclipse.etrice.core.room.ServiceImplementation; @@ -491,18 +490,10 @@ public class ValidationUtil extends FSMValidationUtil { } public Result isValid(LayerConnection lc) { - if (lc.getFrom() instanceof RelaySAPoint) { - if (((RelaySAPoint)lc.getFrom())!=null && lc.getTo()!=null && lc.getTo().getService()!=null) - return isConnectable(lc, ((RelaySAPoint)lc.getFrom()).getRelay(), null, lc.getTo().getService(), lc.getTo().getRef(), (StructureClass)lc.eContainer(), lc); - else - return Result.error("incomplete layer connection"); - } - else if (lc.getFrom() instanceof RefSAPoint) { - if (((RefSAPoint)lc.getFrom())!=null && ((RefSAPoint)lc.getFrom()).getRef()!=null && lc.getTo()!=null && lc.getTo().getService()!=null && lc.getTo().getRef()!=null) - return isConnectable(lc, null, ((RefSAPoint)lc.getFrom()).getRef(), lc.getTo().getService(), lc.getTo().getRef(), (StructureClass)lc.eContainer(), lc); - else - return Result.error("incomplete layer connection"); - } + if (lc.getFrom() instanceof RelaySAPoint) + return isConnectable(((RelaySAPoint)lc.getFrom()).getRelay(), null, lc.getTo().getService(), lc.getTo().getRef(), (StructureClass)lc.eContainer(), lc); + else if (lc.getFrom() instanceof RefSAPoint) + return isConnectable(null, ((RefSAPoint)lc.getFrom()).getRef(), lc.getTo().getService(), lc.getTo().getRef(), (StructureClass)lc.eContainer(), lc); else { assert(false): "unexpected sub type"; return Result.error("internal error"); @@ -511,10 +502,10 @@ public class ValidationUtil extends FSMValidationUtil { public Result isConnectable(SPP src, ActorContainerRef srcRef, SPP tgt, ActorContainerRef tgtRef, StructureClass ac) { - return isConnectable(null, src, srcRef, tgt, tgtRef, ac, null); + return isConnectable(src, srcRef, tgt, tgtRef, ac, null); } - public Result isConnectable(LayerConnection lc, SPP src, ActorContainerRef srcRef, + public Result isConnectable(SPP src, ActorContainerRef srcRef, SPP dst, ActorContainerRef dstRef, StructureClass sc, LayerConnection exclude) { if (sc==null) { @@ -522,13 +513,13 @@ public class ValidationUtil extends FSMValidationUtil { } if ((src==null && srcRef==null) || (src!=null && srcRef!=null)) - return Result.error("source can be an own SPP _or_ a ref", lc, RoomPackage.Literals.LAYER_CONNECTION__FROM); + return Result.error("source can be an own SPP _or_ a ref"); if (dst==null || dstRef==null) - return Result.error("destination must be an SPP on a ref", lc, RoomPackage.Literals.LAYER_CONNECTION__TO); + return Result.error("destination must be an SPP on a ref"); if (src!=null && isConnectedSrc(src, sc, exclude)) - return Result.error("source SPP is already connected", lc, RoomPackage.Literals.LAYER_CONNECTION__FROM); + return Result.error("source SPP is already connected"); // the destination may be connected several times, so don't check this // if (isConnectedDst(dst, dstRef, sc, exclude)) diff --git a/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/ActorClassGen.xtend b/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/ActorClassGen.xtend index 8251fcec9..e1228095b 100644 --- a/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/ActorClassGen.xtend +++ b/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/ActorClassGen.xtend @@ -16,7 +16,6 @@ import com.google.inject.Inject import com.google.inject.Singleton import java.util.Map import org.eclipse.etrice.core.fsm.fSM.ComponentCommunicationType -import org.eclipse.etrice.core.genmodel.builder.GenmodelConstants import org.eclipse.etrice.core.genmodel.etricegen.ExpandedActorClass import org.eclipse.etrice.core.genmodel.etricegen.Root import org.eclipse.etrice.core.genmodel.etricegen.WiredActorClass @@ -73,6 +72,7 @@ class ActorClassGen extends GenericActorClassGenerator { #include "common/etDatatypesCpp.hpp" #include "common/messaging/IRTObject.h" #include "common/modelbase/PortBase.h" + #include "common/modelbase/ReplicatedActorClassBase.h" #include "common/modelbase/InterfaceItemBase.h" #include "common/modelbase/SubSystemClassBase.h" #include "common/messaging/Address.h" @@ -92,6 +92,9 @@ class ActorClassGen extends GenericActorClassGenerator { «ELSE» #include "«ac.actorBase.path»«ac.actorBase.name».h" «ENDIF» + «FOR ar : ac.actorRefs» + #include "«ar.type.actorIncludePath»" + «ENDFOR» «ac.userCode1.userCode» @@ -108,6 +111,15 @@ class ActorClassGen extends GenericActorClassGenerator { «ep.getPortClassName» «ep.name»; «ENDFOR» + //--------------------- sub actors + «FOR sub : ac.actorRefs» + «IF sub.multiplicity > 1» + Replicated«sub.type.implementationClassName» «sub.name»; + «ELSE» + «sub.type.implementationClassName» «sub.name»; + «ENDIF» + «ENDFOR» + //--------------------- saps «FOR sap : ac.serviceAccessPoints» «sap.getPortClassName» «sap.name»; @@ -128,6 +140,10 @@ class ActorClassGen extends GenericActorClassGenerator { public: //--------------------- construction «ac.name»(etRuntime::IRTObject* parent, const std::string& name); + void initialize(void); + «IF Main::settings.generateMSCInstrumentation» + void setProbesActive(bool recursive, bool active); + «ENDIF» ««« TODO: check whether attribute setters/getters are necessary at all, if yes own cpp implementation is needed for *,[],& variables ««« «attributeSettersGettersImplementation(ac.attributes, ac.name)» @@ -162,6 +178,17 @@ class ActorClassGen extends GenericActorClassGenerator { }; + class Replicated«clsname» : public ReplicatedActorClassBase { + public: + Replicated«clsname»(IRTObject* parent, const std::string& name) : + ReplicatedActorClassBase(parent, name) {} + + protected: + ActorClassBase* createActor(IRTObject* parent, const std::string& name) { + return new «clsname»(parent, name); + } + }; + «ac.generateNamespaceEnd» «generateIncludeGuardEnd(ac, '')» @@ -176,6 +203,8 @@ class ActorClassGen extends GenericActorClassGenerator { initList += '''«ac.actorBase?.name ?: 'ActorClassBase'»(parent, name)''' // own ports initList += ac.endPorts.map['''«name»(this, "«name»", IFITEM_«name»)'''] + // own sub actors + initList += ac.actorRefs.map['''«name»(this, "«name»")'''] // own saps initList += ac.serviceAccessPoints.map['''«name»(this, "«name»", IFITEM_«name»)'''] // own service implementations @@ -205,10 +234,8 @@ class ActorClassGen extends GenericActorClassGenerator { #include "common/messaging/RTObject.h" #include "common/messaging/RTServices.h" - - «FOR ar : ac.actorRefs» - #include "«ar.type.actorIncludePath»" - «ENDFOR» + #include "common/debugging/DebuggingService.h" + #include "common/debugging/MSCFunctionObject.h" using namespace etRuntime; @@ -217,6 +244,10 @@ class ActorClassGen extends GenericActorClassGenerator { «clsname»::«clsname»(etRuntime::IRTObject* parent, const std::string& name) «ac.generateConstructorInitalizerList» { + «IF Main::settings.generateMSCInstrumentation» + MSCFunctionObject mscFunctionObject(getInstancePathName(), "Constructor"); + «ENDIF» + «IF ac.hasNonEmptyStateMachine» for (int i = 0; i < s_numberOfStates; i++) { history[i] = NO_STATE; @@ -227,20 +258,34 @@ class ActorClassGen extends GenericActorClassGenerator { // sub actors «FOR sub : ac.actorRefs» «IF sub.multiplicity>1» - for (int i=0; i<«sub.multiplicity»; ++i) { - «IF Main::settings.generateMSCInstrumentation» - DebuggingService::getInstance().addMessageActorCreate(*this, "«sub.name»«GenmodelConstants::INDEX_SEP»"+i); - «ENDIF» - new «sub.type.implementationClassName»(this, "«sub.name»«GenmodelConstants::INDEX_SEP»"+i); - } - «ELSE» - «IF Main::settings.generateMSCInstrumentation» - DebuggingService::getInstance().addMessageActorCreate(*this, "«sub.name»"); - «ENDIF» - new «sub.type.implementationClassName»(this, "«sub.name»"); + «sub.name».createSubActors(«sub.multiplicity»); «ENDIF» «ENDFOR» + «initHelper.genExtraInitializers(ac.attributes)» + «ac.userStructorBody(true)» + } + + void «ac.name»::initialize() { + «IF Main::settings.generateMSCInstrumentation» + MSCFunctionObject mscFunctionObject(getInstancePathName(), "initialize()"); + «FOR sub : ac.actorRefs» + «IF sub.multiplicity > 1» + for (int i=0; i<«sub.multiplicity»; ++i) { + DebuggingService::getInstance().addMessageActorCreate(*this, «sub.name».getSubActor(i)->getName()); + } + «ELSE» + DebuggingService::getInstance().addMessageActorCreate(*this, "«sub.name»"); + «ENDIF» + «ENDFOR» + «ENDIF» + + ActorClassBase::initialize(); + + «FOR sub : ac.actorRefs» + «sub.name».initialize(); + «ENDFOR» + // wiring «FOR wire: wired.wires» «if (wire.dataDriven) "DataPortBase" else "InterfaceItemBase"»::connect(this, "«wire.path1.join('/')»", "«wire.path2.join('/')»"); @@ -250,12 +295,43 @@ class ActorClassGen extends GenericActorClassGenerator { // activate polling for data-driven communication RTServices::getInstance().getMsgSvcCtrl().getMsgSvc(getThread())->addPollingMessageReceiver(*this); «ENDIF» - - «initHelper.genExtraInitializers(ac.attributes)» - «ac.userStructorBody(true)» } + + «IF Main::settings.generateMSCInstrumentation» + void «ac.name»::setProbesActive(bool recursive, bool active) { + DebuggingService::getInstance().addPortInstance(m_RTSystemPort); + «IF ac.actorRefs.size > 0» + if(recursive) { + «FOR sub : ac.actorRefs» + «sub.name».setProbesActive(recursive, active); + «ENDFOR» + } + «ENDIF» + «FOR ep : ac.endPorts» + «IF !ep.dataDriven» + «IF ep.replicated» + for(int i = 0; i < «ep.name».getNInterfaceItems(); i++) + DebuggingService::getInstance().addPortInstance(*(«ep.name».getInterfaceItem(i))); + «ELSE» + DebuggingService::getInstance().addPortInstance(«ep.name»); + «ENDIF» + «ENDIF» + «ENDFOR» + «FOR sap : ac.serviceAccessPoints» + DebuggingService::getInstance().addPortInstance(«sap.name»); + «ENDFOR» + «FOR spp : ac.serviceProvisionPoints» + for(int i = 0; i < «spp.name».getNInterfaceItems(); i++) + DebuggingService::getInstance().addPortInstance(*(«spp.name».getInterfaceItem(i))); + «ENDFOR» + } + «ENDIF» void «ac.name»::destroy(){ + «IF Main::settings.generateMSCInstrumentation» + MSCFunctionObject mscFunctionObject(getInstancePathName(), "destroy()"); + «ENDIF» + «ac.userStructorBody(false)» «IF Main::settings.generateMSCInstrumentation» DebuggingService::getInstance().addMessageActorDestroy(*this); diff --git a/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/NodeGen.xtend b/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/NodeGen.xtend index eb071adf9..2635252f8 100644 --- a/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/NodeGen.xtend +++ b/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/NodeGen.xtend @@ -16,14 +16,13 @@ import com.google.inject.Inject import com.google.inject.Singleton import java.util.Collection import java.util.Map +import org.eclipse.etrice.core.common.converter.TimeConverter import org.eclipse.etrice.core.etmap.util.ETMapUtil import org.eclipse.etrice.core.etphys.eTPhys.ExecMode import org.eclipse.etrice.core.etphys.eTPhys.PhysicalThread -import org.eclipse.etrice.core.genmodel.builder.GenmodelConstants import org.eclipse.etrice.core.genmodel.etricegen.Root import org.eclipse.etrice.core.genmodel.etricegen.SubSystemInstance import org.eclipse.etrice.core.genmodel.etricegen.WiredSubSystemClass -import org.eclipse.etrice.core.genmodel.fsm.fsmgen.IDiagnostician import org.eclipse.etrice.core.room.SubSystemClass import org.eclipse.etrice.generator.cpp.Main import org.eclipse.etrice.generator.fsm.base.FileSystemHelpers @@ -32,7 +31,6 @@ import org.eclipse.etrice.generator.generic.ProcedureHelpers import org.eclipse.etrice.generator.generic.RoomExtensions import static extension org.eclipse.etrice.generator.fsm.base.Indexed.* -import org.eclipse.etrice.core.common.converter.TimeConverter @Singleton class NodeGen { @@ -41,9 +39,9 @@ class NodeGen { @Inject extension RoomExtensions @Inject extension ProcedureHelpers @Inject extension FileSystemHelpers - + @Inject IGeneratorFileIo fileIO - @Inject IDiagnostician diagnostician + @Inject Initialization initHelper def doGenerate(Root root) { val Map<SubSystemClass, WiredSubSystemClass> sscc2wired = newHashMap @@ -86,6 +84,9 @@ class NodeGen { «generateIncludeGuardBegin(cc, '')» #include "common/modelbase/SubSystemClassBase.h" + «FOR ai : comp.actorInstances» + #include "«ai.actorClass.actorIncludePath»" + «ENDFOR» ««« «FOR model : root.getReferencedModels(cc)» ««« ««« #include "«model.name».h" @@ -104,11 +105,25 @@ class NodeGen { static const int «thread.value.threadId»; «ENDFOR» + // sub actors + «FOR sub : cc.actorRefs» + «IF sub.multiplicity>1» + Replicated«sub.type.implementationClassName» «sub.name»; + «ELSE» + «sub.type.implementationClassName» «sub.name»; + «ENDIF» + «ENDFOR» + «clsname»(IRTObject* parent, const std::string& name); + ~«clsname»(); virtual void receiveEvent(etRuntime::InterfaceItemBase* ifitem, int evt, void* data); virtual void instantiateMessageServices(); - virtual void instantiateActors(); + virtual void mapThreads(void); + virtual void initialize(void); + «IF Main::settings.generateMSCInstrumentation» + virtual void setProbesActive(bool recursive, bool active); + «ENDIF» virtual void init(); @@ -134,6 +149,18 @@ class NodeGen { "THREAD_"+thread.name.toUpperCase } + def private generateConstructorInitalizerList(SubSystemClass cc) { + val extension initHelper = initHelper + var initList = <CharSequence>newArrayList + + // super class + initList += '''SubSystemClassBase(parent, name)''' + // own sub actors + initList += cc.actorRefs.map['''«name»(this, "«name»")'''] + + initList.generateCtorInitializerList + } + def generateSourceFile(Root root, SubSystemInstance comp, WiredSubSystemClass wired, Collection<PhysicalThread> usedThreads) { val cc = comp.subSystemClass val models = root.getReferencedModels(cc) @@ -152,16 +179,13 @@ class NodeGen { #include "«getCppHeaderFileName(nr, comp)»" #include "common/debugging/DebuggingService.h" + #include "common/debugging/MSCFunctionObject.h" #include "common/messaging/IMessageService.h" #include "common/messaging/MessageService.h" #include "common/messaging/MessageServiceController.h" #include "common/messaging/RTServices.h" #include "common/modelbase/InterfaceItemBase.h" - «FOR ai : comp.actorInstances» - #include "«ai.actorClass.actorIncludePath»" - «ENDFOR» - using namespace etRuntime; «cc.generateNamespaceBegin» @@ -170,9 +194,23 @@ class NodeGen { const int «clsname»::«thread.value.threadId» = «thread.index0»; «ENDFOR» - «clsname»::«clsname»(IRTObject* parent, const std::string& name) : - SubSystemClassBase(parent, name) + «clsname»::«clsname»(IRTObject* parent, const std::string& name) + «cc.generateConstructorInitalizerList» { + «IF Main::settings.generateMSCInstrumentation» + MSCFunctionObject mscFunctionObject(getInstancePathName(), "Constructor"); + «ENDIF» + «FOR sub : cc.actorRefs» + «IF sub.multiplicity>1» + «sub.name».createSubActors(«sub.multiplicity»); + «ENDIF» + «ENDFOR» + } + + «clsname»::~«clsname»() { + «IF Main::settings.generateMSCInstrumentation» + MSCFunctionObject mscFunctionObject(getInstancePathName(), "Destructor"); + «ENDIF» } void «clsname»::receiveEvent(InterfaceItemBase* ifitem, int evt, void* data){ @@ -180,6 +218,10 @@ class NodeGen { void «clsname»::instantiateMessageServices(){ + «IF Main::settings.generateMSCInstrumentation» + MSCFunctionObject mscFunctionObject(getInstancePathName(), "instantiateMessageServices()"); + «ENDIF» + IMessageService* msgService; «FOR thread: threads» { @@ -197,8 +239,7 @@ class NodeGen { «ENDFOR» } - void «clsname»::instantiateActors(){ - + void «clsname»::mapThreads() { // thread mappings «FOR ai : comp.allContainedInstances» «val mapped = ETMapUtil::getMappedThread(ai)» @@ -206,34 +247,47 @@ class NodeGen { addPathToThread("«ai.path»", «mapped.thread.threadId»); «ENDIF» «ENDFOR» + } - // sub actors - «FOR sub : cc.actorRefs» - «IF sub.multiplicity>1» - for (int i=0; i<«sub.multiplicity»; ++i) { - «IF Main::settings.generateMSCInstrumentation» - DebuggingService::getInstance().addMessageActorCreate(*this, "«sub.name»«GenmodelConstants::INDEX_SEP»"+i); - «ENDIF» - new «sub.type.implementationClassName»(this, "«sub.name»«GenmodelConstants::INDEX_SEP»"+i); - } - «ELSE» - «IF Main::settings.generateMSCInstrumentation» + void «clsname»::initialize() { + «IF Main::settings.generateMSCInstrumentation» + DebuggingService::getInstance().getSyncLogger().addVisibleComment("starting initialization"); + MSCFunctionObject mscFunctionObject(getInstancePathName(), "initialize()"); + «FOR sub : cc.actorRefs» + «IF sub.multiplicity>1» + for (int i=0; i<«sub.multiplicity»; ++i) { + DebuggingService::getInstance().addMessageActorCreate(*this, «sub.name».getSubActor(i)->getName()); + } + «ELSE» DebuggingService::getInstance().addMessageActorCreate(*this, "«sub.name»"); «ENDIF» - new «sub.type.implementationClassName»(this, "«sub.name»"); - «ENDIF» - «ENDFOR» - + «ENDFOR» + «ENDIF» + // wiring «FOR wire: wired.wires» «if (wire.dataDriven) "DataPortBase" else "InterfaceItemBase"»::connect(this, "«wire.path1.join('/')»", "«wire.path2.join('/')»"); «ENDFOR» + + // call initialize of sub actors + «FOR sub : cc.actorRefs» + «sub.name».initialize(); + «ENDFOR» } + + «IF Main::settings.generateMSCInstrumentation» + void «clsname»::setProbesActive(bool recursive, bool active) { + for(int i = 0; i < m_RTSystemPort.getNInterfaceItems(); i++) + DebuggingService::getInstance().addPortInstance(*(m_RTSystemPort.getInterfaceItem(i))); + if(recursive) { + «FOR sub : cc.actorRefs» + «sub.name».setProbesActive(recursive, active); + «ENDFOR» + } + } + «ENDIF» void «clsname»::init(){ - «IF Main::settings.generateMSCInstrumentation» - DebuggingService::getInstance().addVisibleComment("begin sub system initialization"); - «ENDIF» SubSystemClassBase::init(); «IF Main::settings.generateMSCInstrumentation» DebuggingService::getInstance().addVisibleComment("done sub system initialization"); @@ -242,9 +296,15 @@ class NodeGen { «IF Main::settings.generateMSCInstrumentation» void «clsname»::destroy() { - DebuggingService::getInstance().addVisibleComment("begin sub system destruction"); + «IF Main::settings.generateMSCInstrumentation» + DebuggingService::getInstance().getSyncLogger().addVisibleComment("starting destruction"); + MSCFunctionObject mscFunctionObject(getInstancePathName(), "destroy()"); + DebuggingService::getInstance().addVisibleComment("begin sub system destruction"); + «ENDIF» SubSystemClassBase::destroy(); - DebuggingService::getInstance().addVisibleComment("done sub system destruction"); + «IF Main::settings.generateMSCInstrumentation» + DebuggingService::getInstance().addVisibleComment("done sub system destruction"); + «ENDIF» } «ENDIF» diff --git a/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/ProtocolClassGen.xtend b/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/ProtocolClassGen.xtend index ca48d5106..b588e276e 100644 --- a/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/ProtocolClassGen.xtend +++ b/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/ProtocolClassGen.xtend @@ -62,7 +62,6 @@ class ProtocolClassGen extends GenericProtocolClassGenerator { case CommunicationType::SYNCHRONOUS: logger.logError("synchronous protocols not supported yet", pc) } - } } @@ -200,6 +199,7 @@ class ProtocolClassGen extends GenericProtocolClassGenerator { #include "«pc.getCppHeaderFileName»" #include "common/debugging/DebuggingService.h" + #include "common/debugging/MSCFunctionObject.h" #include "common/messaging/AbstractMessageReceiver.h" #include "common/messaging/Address.h" #include "common/messaging/Message.h" @@ -247,18 +247,12 @@ class ProtocolClassGen extends GenericProtocolClassGenerator { «portClassName»::«portClassName»(IInterfaceItemOwner* actor, const std::string& name, int localId) «pclass.generateConstructorInitalizerList('0')» { - «IF Main::settings.generateMSCInstrumentation» - DebuggingService::getInstance().addPortInstance(*this); - «ENDIF» } «portClassName»::«portClassName»(IInterfaceItemOwner* actor, const std::string& name, int localId, int idx) «pclass.generateConstructorInitalizerList('idx')» { «IF pclass != null»«initHelper.genExtraInitializers(pclass.attributes)»«ENDIF» - «IF Main::settings.generateMSCInstrumentation» - DebuggingService::getInstance().addPortInstance(*this); - «ENDIF» } «IF Main::settings.generateMSCInstrumentation» @@ -372,8 +366,10 @@ class ProtocolClassGen extends GenericProtocolClassGenerator { «FOR command : hdlr.detailCode.lines» «command» «ENDFOR» «ELSE» - DebuggingService::getInstance().addMessageAsyncOut(getAddress(), getPeerAddress(), - «portClassName»::getMessageString(«portClassName»::«dir»_«m.name»)); + «IF Main::settings.generateMSCInstrumentation» + DebuggingService::getInstance().addMessageAsyncOut(getAddress(), getPeerAddress(), + «portClassName»::getMessageString(«portClassName»::«dir»_«m.name»)); + «ENDIF» if (getPeerAddress().isValid()){ getPeerMsgReceiver()->receive(«message»); } diff --git a/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/ActorClassGen.java b/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/ActorClassGen.java index 03811a8a1..42c4a099a 100644 --- a/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/ActorClassGen.java +++ b/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/ActorClassGen.java @@ -21,7 +21,6 @@ import org.eclipse.emf.common.util.EList; import org.eclipse.etrice.core.fsm.fSM.ComponentCommunicationType; import org.eclipse.etrice.core.fsm.fSM.DetailCode; import org.eclipse.etrice.core.fsm.fSM.StateGraph; -import org.eclipse.etrice.core.genmodel.builder.GenmodelConstants; import org.eclipse.etrice.core.genmodel.etricegen.ExpandedActorClass; import org.eclipse.etrice.core.genmodel.etricegen.Root; import org.eclipse.etrice.core.genmodel.etricegen.Wire; @@ -194,6 +193,8 @@ public class ActorClassGen extends GenericActorClassGenerator { _builder.newLine(); _builder.append("#include \"common/modelbase/PortBase.h\""); _builder.newLine(); + _builder.append("#include \"common/modelbase/ReplicatedActorClassBase.h\""); + _builder.newLine(); _builder.append("#include \"common/modelbase/InterfaceItemBase.h\""); _builder.newLine(); _builder.append("#include \"common/modelbase/SubSystemClassBase.h\""); @@ -250,6 +251,17 @@ public class ActorClassGen extends GenericActorClassGenerator { _builder.newLineIfNotEmpty(); } } + { + EList<ActorRef> _actorRefs = ac.getActorRefs(); + for(final ActorRef ar : _actorRefs) { + _builder.append("#include \""); + ActorClass _type = ar.getType(); + String _actorIncludePath = this._cppExtensions.getActorIncludePath(_type); + _builder.append(_actorIncludePath, ""); + _builder.append("\""); + _builder.newLineIfNotEmpty(); + } + } _builder.newLine(); DetailCode _userCode1 = ac.getUserCode1(); CharSequence _userCode = this._procedureHelpers.userCode(_userCode1); @@ -292,6 +304,41 @@ public class ActorClassGen extends GenericActorClassGenerator { } _builder.newLine(); _builder.append("\t\t"); + _builder.append("//--------------------- sub actors"); + _builder.newLine(); + { + EList<ActorRef> _actorRefs_1 = ac.getActorRefs(); + for(final ActorRef sub : _actorRefs_1) { + { + int _multiplicity = sub.getMultiplicity(); + boolean _greaterThan = (_multiplicity > 1); + if (_greaterThan) { + _builder.append("\t\t"); + _builder.append("Replicated"); + ActorClass _type_1 = sub.getType(); + String _implementationClassName = this._cppExtensions.getImplementationClassName(_type_1); + _builder.append(_implementationClassName, "\t\t"); + _builder.append(" "); + String _name_6 = sub.getName(); + _builder.append(_name_6, "\t\t"); + _builder.append(";"); + _builder.newLineIfNotEmpty(); + } else { + _builder.append("\t\t"); + ActorClass _type_2 = sub.getType(); + String _implementationClassName_1 = this._cppExtensions.getImplementationClassName(_type_2); + _builder.append(_implementationClassName_1, "\t\t"); + _builder.append(" "); + String _name_7 = sub.getName(); + _builder.append(_name_7, "\t\t"); + _builder.append(";"); + _builder.newLineIfNotEmpty(); + } + } + } + } + _builder.newLine(); + _builder.append("\t\t"); _builder.append("//--------------------- saps"); _builder.newLine(); { @@ -301,8 +348,8 @@ public class ActorClassGen extends GenericActorClassGenerator { String _portClassName_1 = this._roomExtensions.getPortClassName(sap); _builder.append(_portClassName_1, "\t\t"); _builder.append(" "); - String _name_6 = sap.getName(); - _builder.append(_name_6, "\t\t"); + String _name_8 = sap.getName(); + _builder.append(_name_8, "\t\t"); _builder.append(";"); _builder.newLineIfNotEmpty(); } @@ -319,8 +366,8 @@ public class ActorClassGen extends GenericActorClassGenerator { _builder.append(_portClassName_2, "\t\t"); _builder.append(" "); SPP _spp = svc.getSpp(); - String _name_7 = _spp.getName(); - _builder.append(_name_7, "\t\t"); + String _name_9 = _spp.getName(); + _builder.append(_name_9, "\t\t"); _builder.append(";"); _builder.newLineIfNotEmpty(); } @@ -342,8 +389,8 @@ public class ActorClassGen extends GenericActorClassGenerator { _builder.newLine(); _builder.append("\t\t"); EList<StandardOperation> _operations = ac.getOperations(); - String _name_8 = ac.getName(); - CharSequence _operationsDeclaration = this._procedureHelpers.operationsDeclaration(_operations, _name_8); + String _name_10 = ac.getName(); + CharSequence _operationsDeclaration = this._procedureHelpers.operationsDeclaration(_operations, _name_10); _builder.append(_operationsDeclaration, "\t\t"); _builder.newLineIfNotEmpty(); _builder.newLine(); @@ -354,10 +401,22 @@ public class ActorClassGen extends GenericActorClassGenerator { _builder.append("//--------------------- construction"); _builder.newLine(); _builder.append("\t\t"); - String _name_9 = ac.getName(); - _builder.append(_name_9, "\t\t"); + String _name_11 = ac.getName(); + _builder.append(_name_11, "\t\t"); _builder.append("(etRuntime::IRTObject* parent, const std::string& name);"); _builder.newLineIfNotEmpty(); + _builder.append("\t\t"); + _builder.append("void initialize(void);"); + _builder.newLine(); + { + GlobalGeneratorSettings _settings = Main.getSettings(); + boolean _isGenerateMSCInstrumentation = _settings.isGenerateMSCInstrumentation(); + if (_isGenerateMSCInstrumentation) { + _builder.append("\t\t"); + _builder.append("void setProbesActive(bool recursive, bool active);"); + _builder.newLine(); + } + } _builder.newLine(); _builder.append("\t\t"); _builder.append("//--------------------- port getters"); @@ -479,6 +538,38 @@ public class ActorClassGen extends GenericActorClassGenerator { _builder.append("};"); _builder.newLine(); _builder.newLine(); + _builder.append("class Replicated"); + _builder.append(clsname, ""); + _builder.append(" : public ReplicatedActorClassBase {"); + _builder.newLineIfNotEmpty(); + _builder.append("public:"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("Replicated"); + _builder.append(clsname, "\t"); + _builder.append("(IRTObject* parent, const std::string& name) :"); + _builder.newLineIfNotEmpty(); + _builder.append("\t\t"); + _builder.append("ReplicatedActorClassBase(parent, name) {}"); + _builder.newLine(); + _builder.append("\t"); + _builder.newLine(); + _builder.append("protected:"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("ActorClassBase* createActor(IRTObject* parent, const std::string& name) {"); + _builder.newLine(); + _builder.append("\t\t"); + _builder.append("return new "); + _builder.append(clsname, "\t\t"); + _builder.append("(parent, name);"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("}"); + _builder.newLine(); + _builder.append("};"); + _builder.newLine(); + _builder.newLine(); String _generateNamespaceEnd = this._cppExtensions.generateNamespaceEnd(ac); _builder.append(_generateNamespaceEnd, ""); _builder.newLineIfNotEmpty(); @@ -530,8 +621,23 @@ public class ActorClassGen extends GenericActorClassGenerator { }; List<String> _map = ListExtensions.<Port, String>map(_endPorts, _function); Iterables.<CharSequence>addAll(initList, _map); + EList<ActorRef> _actorRefs = ac.getActorRefs(); + final Function1<ActorRef, String> _function_1 = new Function1<ActorRef, String>() { + public String apply(final ActorRef it) { + StringConcatenation _builder = new StringConcatenation(); + String _name = it.getName(); + _builder.append(_name, ""); + _builder.append("(this, \""); + String _name_1 = it.getName(); + _builder.append(_name_1, ""); + _builder.append("\")"); + return _builder.toString(); + } + }; + List<String> _map_1 = ListExtensions.<ActorRef, String>map(_actorRefs, _function_1); + Iterables.<CharSequence>addAll(initList, _map_1); EList<SAP> _serviceAccessPoints = ac.getServiceAccessPoints(); - final Function1<SAP, String> _function_1 = new Function1<SAP, String>() { + final Function1<SAP, String> _function_2 = new Function1<SAP, String>() { public String apply(final SAP it) { StringConcatenation _builder = new StringConcatenation(); String _name = it.getName(); @@ -546,10 +652,10 @@ public class ActorClassGen extends GenericActorClassGenerator { return _builder.toString(); } }; - List<String> _map_1 = ListExtensions.<SAP, String>map(_serviceAccessPoints, _function_1); - Iterables.<CharSequence>addAll(initList, _map_1); + List<String> _map_2 = ListExtensions.<SAP, String>map(_serviceAccessPoints, _function_2); + Iterables.<CharSequence>addAll(initList, _map_2); EList<ServiceImplementation> _serviceImplementations = ac.getServiceImplementations(); - final Function1<ServiceImplementation, String> _function_2 = new Function1<ServiceImplementation, String>() { + final Function1<ServiceImplementation, String> _function_3 = new Function1<ServiceImplementation, String>() { public String apply(final ServiceImplementation it) { StringConcatenation _builder = new StringConcatenation(); SPP _spp = it.getSpp(); @@ -567,10 +673,10 @@ public class ActorClassGen extends GenericActorClassGenerator { return _builder.toString(); } }; - List<String> _map_2 = ListExtensions.<ServiceImplementation, String>map(_serviceImplementations, _function_2); - Iterables.<CharSequence>addAll(initList, _map_2); + List<String> _map_3 = ListExtensions.<ServiceImplementation, String>map(_serviceImplementations, _function_3); + Iterables.<CharSequence>addAll(initList, _map_3); EList<Attribute> _attributes = ac.getAttributes(); - final Function1<Attribute, String> _function_3 = new Function1<Attribute, String>() { + final Function1<Attribute, String> _function_4 = new Function1<Attribute, String>() { public String apply(final Attribute it) { StringConcatenation _builder = new StringConcatenation(); String _name = it.getName(); @@ -582,8 +688,8 @@ public class ActorClassGen extends GenericActorClassGenerator { return _builder.toString(); } }; - List<String> _map_3 = ListExtensions.<Attribute, String>map(_attributes, _function_3); - Iterables.<CharSequence>addAll(initList, _map_3); + List<String> _map_4 = ListExtensions.<Attribute, String>map(_attributes, _function_4); + Iterables.<CharSequence>addAll(initList, _map_4); _xblockexpression = initHelper.generateCtorInitializerList(initList); } return _xblockexpression; @@ -644,18 +750,10 @@ public class ActorClassGen extends GenericActorClassGenerator { _builder.newLine(); _builder.append("#include \"common/messaging/RTServices.h\""); _builder.newLine(); + _builder.append("#include \"common/debugging/DebuggingService.h\""); + _builder.newLine(); + _builder.append("#include \"common/debugging/MSCFunctionObject.h\""); _builder.newLine(); - { - EList<ActorRef> _actorRefs = ac.getActorRefs(); - for(final ActorRef ar : _actorRefs) { - _builder.append("#include \""); - ActorClass _type = ar.getType(); - String _actorIncludePath = this._cppExtensions.getActorIncludePath(_type); - _builder.append(_actorIncludePath, ""); - _builder.append("\""); - _builder.newLineIfNotEmpty(); - } - } _builder.newLine(); _builder.append("using namespace etRuntime;"); _builder.newLine(); @@ -676,6 +774,17 @@ public class ActorClassGen extends GenericActorClassGenerator { _builder.append("{"); _builder.newLine(); { + GlobalGeneratorSettings _settings = Main.getSettings(); + boolean _isGenerateMSCInstrumentation = _settings.isGenerateMSCInstrumentation(); + if (_isGenerateMSCInstrumentation) { + _builder.append("\t"); + _builder.append("MSCFunctionObject mscFunctionObject(getInstancePathName(), \"Constructor\");"); + _builder.newLine(); + } + } + _builder.append("\t"); + _builder.newLine(); + { boolean _hasNonEmptyStateMachine = this._roomHelpers.hasNonEmptyStateMachine(ac); if (_hasNonEmptyStateMachine) { _builder.append("\t"); @@ -701,74 +810,103 @@ public class ActorClassGen extends GenericActorClassGenerator { _builder.append("// sub actors"); _builder.newLine(); { - EList<ActorRef> _actorRefs_1 = ac.getActorRefs(); - for(final ActorRef sub : _actorRefs_1) { + EList<ActorRef> _actorRefs = ac.getActorRefs(); + for(final ActorRef sub : _actorRefs) { { int _multiplicity = sub.getMultiplicity(); boolean _greaterThan = (_multiplicity > 1); if (_greaterThan) { _builder.append("\t"); - _builder.append("for (int i=0; i<"); + String _name_4 = sub.getName(); + _builder.append(_name_4, "\t"); + _builder.append(".createSubActors("); int _multiplicity_1 = sub.getMultiplicity(); _builder.append(_multiplicity_1, "\t"); - _builder.append("; ++i) {"); + _builder.append(");"); _builder.newLineIfNotEmpty(); + } + } + } + } + _builder.newLine(); + _builder.append("\t"); + EList<Attribute> _attributes = ac.getAttributes(); + CharSequence _genExtraInitializers = this.initHelper.genExtraInitializers(_attributes); + _builder.append(_genExtraInitializers, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + String _userStructorBody = this._procedureHelpers.userStructorBody(ac, true); + _builder.append(_userStructorBody, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append("void "); + String _name_5 = ac.getName(); + _builder.append(_name_5, ""); + _builder.append("::initialize() {"); + _builder.newLineIfNotEmpty(); + { + GlobalGeneratorSettings _settings_1 = Main.getSettings(); + boolean _isGenerateMSCInstrumentation_1 = _settings_1.isGenerateMSCInstrumentation(); + if (_isGenerateMSCInstrumentation_1) { + _builder.append("\t"); + _builder.append("MSCFunctionObject mscFunctionObject(getInstancePathName(), \"initialize()\");"); + _builder.newLine(); + { + EList<ActorRef> _actorRefs_1 = ac.getActorRefs(); + for(final ActorRef sub_1 : _actorRefs_1) { { - GlobalGeneratorSettings _settings = Main.getSettings(); - boolean _isGenerateMSCInstrumentation = _settings.isGenerateMSCInstrumentation(); - if (_isGenerateMSCInstrumentation) { + int _multiplicity_2 = sub_1.getMultiplicity(); + boolean _greaterThan_1 = (_multiplicity_2 > 1); + if (_greaterThan_1) { _builder.append("\t"); + _builder.append("for (int i=0; i<"); + int _multiplicity_3 = sub_1.getMultiplicity(); + _builder.append(_multiplicity_3, "\t"); + _builder.append("; ++i) {"); + _builder.newLineIfNotEmpty(); _builder.append("\t"); - _builder.append("DebuggingService::getInstance().addMessageActorCreate(*this, \""); - String _name_4 = sub.getName(); - _builder.append(_name_4, "\t\t"); - _builder.append(GenmodelConstants.INDEX_SEP, "\t\t"); - _builder.append("\"+i);"); + _builder.append("\t"); + _builder.append("DebuggingService::getInstance().addMessageActorCreate(*this, "); + String _name_6 = sub_1.getName(); + _builder.append(_name_6, "\t\t"); + _builder.append(".getSubActor(i)->getName());"); _builder.newLineIfNotEmpty(); - } - } - _builder.append("\t"); - _builder.append("\t"); - _builder.append("new "); - ActorClass _type_1 = sub.getType(); - String _implementationClassName = this._cppExtensions.getImplementationClassName(_type_1); - _builder.append(_implementationClassName, "\t\t"); - _builder.append("(this, \""); - String _name_5 = sub.getName(); - _builder.append(_name_5, "\t\t"); - _builder.append(GenmodelConstants.INDEX_SEP, "\t\t"); - _builder.append("\"+i);"); - _builder.newLineIfNotEmpty(); - _builder.append("\t"); - _builder.append("}"); - _builder.newLine(); - } else { - { - GlobalGeneratorSettings _settings_1 = Main.getSettings(); - boolean _isGenerateMSCInstrumentation_1 = _settings_1.isGenerateMSCInstrumentation(); - if (_isGenerateMSCInstrumentation_1) { + _builder.append("\t"); + _builder.append("}"); + _builder.newLine(); + } else { _builder.append("\t"); _builder.append("DebuggingService::getInstance().addMessageActorCreate(*this, \""); - String _name_6 = sub.getName(); - _builder.append(_name_6, "\t"); + String _name_7 = sub_1.getName(); + _builder.append(_name_7, "\t"); _builder.append("\");"); _builder.newLineIfNotEmpty(); } } - _builder.append("\t"); - _builder.append("new "); - ActorClass _type_2 = sub.getType(); - String _implementationClassName_1 = this._cppExtensions.getImplementationClassName(_type_2); - _builder.append(_implementationClassName_1, "\t"); - _builder.append("(this, \""); - String _name_7 = sub.getName(); - _builder.append(_name_7, "\t"); - _builder.append("\");"); - _builder.newLineIfNotEmpty(); } } } } + _builder.append("\t"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("ActorClassBase::initialize();"); + _builder.newLine(); + _builder.append("\t"); + _builder.newLine(); + { + EList<ActorRef> _actorRefs_2 = ac.getActorRefs(); + for(final ActorRef sub_2 : _actorRefs_2) { + _builder.append("\t"); + String _name_8 = sub_2.getName(); + _builder.append(_name_8, "\t"); + _builder.append(".initialize();"); + _builder.newLineIfNotEmpty(); + } + } + _builder.append("\t"); _builder.newLine(); _builder.append("\t"); _builder.append("// wiring"); @@ -818,32 +956,139 @@ public class ActorClassGen extends GenericActorClassGenerator { _builder.newLine(); } } - _builder.newLine(); - _builder.append("\t"); - EList<Attribute> _attributes = ac.getAttributes(); - CharSequence _genExtraInitializers = this.initHelper.genExtraInitializers(_attributes); - _builder.append(_genExtraInitializers, "\t"); - _builder.newLineIfNotEmpty(); - _builder.append("\t"); - String _userStructorBody = this._procedureHelpers.userStructorBody(ac, true); - _builder.append(_userStructorBody, "\t"); - _builder.newLineIfNotEmpty(); _builder.append("}"); _builder.newLine(); _builder.newLine(); + { + GlobalGeneratorSettings _settings_2 = Main.getSettings(); + boolean _isGenerateMSCInstrumentation_2 = _settings_2.isGenerateMSCInstrumentation(); + if (_isGenerateMSCInstrumentation_2) { + _builder.append("void "); + String _name_9 = ac.getName(); + _builder.append(_name_9, ""); + _builder.append("::setProbesActive(bool recursive, bool active) {"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("DebuggingService::getInstance().addPortInstance(m_RTSystemPort);"); + _builder.newLine(); + { + EList<ActorRef> _actorRefs_3 = ac.getActorRefs(); + int _size = _actorRefs_3.size(); + boolean _greaterThan_2 = (_size > 0); + if (_greaterThan_2) { + _builder.append("\t"); + _builder.append("if(recursive) {"); + _builder.newLine(); + { + EList<ActorRef> _actorRefs_4 = ac.getActorRefs(); + for(final ActorRef sub_3 : _actorRefs_4) { + _builder.append("\t"); + _builder.append("\t"); + String _name_10 = sub_3.getName(); + _builder.append(_name_10, "\t\t"); + _builder.append(".setProbesActive(recursive, active);"); + _builder.newLineIfNotEmpty(); + } + } + _builder.append("\t"); + _builder.append("}"); + _builder.newLine(); + } + } + { + List<Port> _endPorts = this._roomHelpers.getEndPorts(ac); + for(final Port ep : _endPorts) { + { + boolean _isDataDriven_1 = this._roomHelpers.isDataDriven(ep); + boolean _not = (!_isDataDriven_1); + if (_not) { + { + boolean _isReplicated = ep.isReplicated(); + if (_isReplicated) { + _builder.append("\t"); + _builder.append("for(int i = 0; i < "); + String _name_11 = ep.getName(); + _builder.append(_name_11, "\t"); + _builder.append(".getNInterfaceItems(); i++)"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("\t"); + _builder.append("DebuggingService::getInstance().addPortInstance(*("); + String _name_12 = ep.getName(); + _builder.append(_name_12, "\t\t"); + _builder.append(".getInterfaceItem(i)));"); + _builder.newLineIfNotEmpty(); + } else { + _builder.append("\t"); + _builder.append("DebuggingService::getInstance().addPortInstance("); + String _name_13 = ep.getName(); + _builder.append(_name_13, "\t"); + _builder.append(");"); + _builder.newLineIfNotEmpty(); + } + } + } + } + } + } + { + EList<SAP> _serviceAccessPoints = ac.getServiceAccessPoints(); + for(final SAP sap : _serviceAccessPoints) { + _builder.append("\t"); + _builder.append("DebuggingService::getInstance().addPortInstance("); + String _name_14 = sap.getName(); + _builder.append(_name_14, "\t"); + _builder.append(");"); + _builder.newLineIfNotEmpty(); + } + } + { + EList<SPP> _serviceProvisionPoints = ac.getServiceProvisionPoints(); + for(final SPP spp : _serviceProvisionPoints) { + _builder.append("\t"); + _builder.append("for(int i = 0; i < "); + String _name_15 = spp.getName(); + _builder.append(_name_15, "\t"); + _builder.append(".getNInterfaceItems(); i++)"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("\t\t"); + _builder.append("DebuggingService::getInstance().addPortInstance(*("); + String _name_16 = spp.getName(); + _builder.append(_name_16, "\t\t\t"); + _builder.append(".getInterfaceItem(i)));"); + _builder.newLineIfNotEmpty(); + } + } + _builder.append("}"); + _builder.newLine(); + } + } + _builder.newLine(); _builder.append("void "); - String _name_8 = ac.getName(); - _builder.append(_name_8, ""); + String _name_17 = ac.getName(); + _builder.append(_name_17, ""); _builder.append("::destroy(){"); _builder.newLineIfNotEmpty(); + { + GlobalGeneratorSettings _settings_3 = Main.getSettings(); + boolean _isGenerateMSCInstrumentation_3 = _settings_3.isGenerateMSCInstrumentation(); + if (_isGenerateMSCInstrumentation_3) { + _builder.append("\t"); + _builder.append("MSCFunctionObject mscFunctionObject(getInstancePathName(), \"destroy()\");"); + _builder.newLine(); + } + } + _builder.append("\t"); + _builder.newLine(); _builder.append("\t"); String _userStructorBody_1 = this._procedureHelpers.userStructorBody(ac, false); _builder.append(_userStructorBody_1, "\t"); _builder.newLineIfNotEmpty(); { - GlobalGeneratorSettings _settings_2 = Main.getSettings(); - boolean _isGenerateMSCInstrumentation_2 = _settings_2.isGenerateMSCInstrumentation(); - if (_isGenerateMSCInstrumentation_2) { + GlobalGeneratorSettings _settings_4 = Main.getSettings(); + boolean _isGenerateMSCInstrumentation_4 = _settings_4.isGenerateMSCInstrumentation(); + if (_isGenerateMSCInstrumentation_4) { _builder.append("\t"); _builder.append("DebuggingService::getInstance().addMessageActorDestroy(*this);"); _builder.newLine(); @@ -874,8 +1119,8 @@ public class ActorClassGen extends GenericActorClassGenerator { _builder.newLine(); _builder.newLine(); EList<StandardOperation> _operations = ac.getOperations(); - String _name_9 = ac.getName(); - CharSequence _operationsImplementation = this._procedureHelpers.operationsImplementation(_operations, _name_9); + String _name_18 = ac.getName(); + CharSequence _operationsImplementation = this._procedureHelpers.operationsImplementation(_operations, _name_18); _builder.append(_operationsImplementation, ""); _builder.newLineIfNotEmpty(); _builder.newLine(); @@ -890,8 +1135,8 @@ public class ActorClassGen extends GenericActorClassGenerator { boolean _equals_4 = Objects.equal(_commType_4, ComponentCommunicationType.DATA_DRIVEN); if (_equals_4) { _builder.append("void "); - String _name_10 = ac.getName(); - _builder.append(_name_10, ""); + String _name_19 = ac.getName(); + _builder.append(_name_19, ""); _builder.append("::receiveEvent(InterfaceItemBase* ifitem, int evt, void* generic_data) {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); @@ -914,8 +1159,8 @@ public class ActorClassGen extends GenericActorClassGenerator { } if (_or_2) { _builder.append("void "); - String _name_11 = ac.getName(); - _builder.append(_name_11, ""); + String _name_20 = ac.getName(); + _builder.append(_name_20, ""); _builder.append("::receive(const Message* msg) {"); _builder.newLineIfNotEmpty(); { @@ -942,8 +1187,8 @@ public class ActorClassGen extends GenericActorClassGenerator { _builder.append("//--------------------- no state machine"); _builder.newLine(); _builder.append("void "); - String _name_12 = ac.getName(); - _builder.append(_name_12, ""); + String _name_21 = ac.getName(); + _builder.append(_name_21, ""); _builder.append("::receiveEvent(InterfaceItemBase* ifitem, int evt, void* data) {"); _builder.newLineIfNotEmpty(); _builder.append("\t"); diff --git a/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/NodeGen.java b/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/NodeGen.java index b50a808e8..dcf3e7180 100644 --- a/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/NodeGen.java +++ b/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/NodeGen.java @@ -14,6 +14,7 @@ import com.google.common.base.Objects; import com.google.common.collect.Iterables; import com.google.inject.Inject; import com.google.inject.Singleton; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; @@ -26,7 +27,6 @@ import org.eclipse.etrice.core.etphys.eTPhys.NodeClass; import org.eclipse.etrice.core.etphys.eTPhys.NodeRef; import org.eclipse.etrice.core.etphys.eTPhys.PhysicalThread; import org.eclipse.etrice.core.fsm.fSM.DetailCode; -import org.eclipse.etrice.core.genmodel.builder.GenmodelConstants; import org.eclipse.etrice.core.genmodel.etricegen.ActorInstance; import org.eclipse.etrice.core.genmodel.etricegen.Root; import org.eclipse.etrice.core.genmodel.etricegen.StructureInstance; @@ -34,7 +34,6 @@ import org.eclipse.etrice.core.genmodel.etricegen.SubSystemInstance; import org.eclipse.etrice.core.genmodel.etricegen.Wire; import org.eclipse.etrice.core.genmodel.etricegen.WiredStructureClass; import org.eclipse.etrice.core.genmodel.etricegen.WiredSubSystemClass; -import org.eclipse.etrice.core.genmodel.fsm.fsmgen.IDiagnostician; import org.eclipse.etrice.core.room.ActorClass; import org.eclipse.etrice.core.room.ActorRef; import org.eclipse.etrice.core.room.RoomModel; @@ -42,6 +41,7 @@ import org.eclipse.etrice.core.room.SubSystemClass; import org.eclipse.etrice.generator.base.GlobalGeneratorSettings; import org.eclipse.etrice.generator.cpp.Main; import org.eclipse.etrice.generator.cpp.gen.CppExtensions; +import org.eclipse.etrice.generator.cpp.gen.Initialization; import org.eclipse.etrice.generator.fsm.base.FileSystemHelpers; import org.eclipse.etrice.generator.fsm.base.IGeneratorFileIo; import org.eclipse.etrice.generator.fsm.base.Indexed; @@ -52,6 +52,7 @@ import org.eclipse.xtext.xbase.lib.CollectionLiterals; import org.eclipse.xtext.xbase.lib.Extension; import org.eclipse.xtext.xbase.lib.Functions.Function1; import org.eclipse.xtext.xbase.lib.IterableExtensions; +import org.eclipse.xtext.xbase.lib.ListExtensions; import org.eclipse.xtext.xbase.lib.Procedures.Procedure1; @Singleton @@ -77,7 +78,7 @@ public class NodeGen { private IGeneratorFileIo fileIO; @Inject - private IDiagnostician diagnostician; + private Initialization initHelper; public void doGenerate(final Root root) { final Map<SubSystemClass, WiredSubSystemClass> sscc2wired = CollectionLiterals.<SubSystemClass, WiredSubSystemClass>newHashMap(); @@ -173,6 +174,17 @@ public class NodeGen { _builder.newLine(); _builder.append("#include \"common/modelbase/SubSystemClassBase.h\""); _builder.newLine(); + { + EList<ActorInstance> _actorInstances = comp.getActorInstances(); + for(final ActorInstance ai : _actorInstances) { + _builder.append("#include \""); + ActorClass _actorClass = ai.getActorClass(); + String _actorIncludePath = this._cppExtensions.getActorIncludePath(_actorClass); + _builder.append(_actorIncludePath, ""); + _builder.append("\""); + _builder.newLineIfNotEmpty(); + } + } _builder.newLine(); DetailCode _userCode1 = cc.getUserCode1(); CharSequence _userCode = this._procedureHelpers.userCode(_userCode1); @@ -212,9 +224,49 @@ public class NodeGen { } _builder.newLine(); _builder.append("\t\t"); + _builder.append("// sub actors"); + _builder.newLine(); + { + EList<ActorRef> _actorRefs = cc.getActorRefs(); + for(final ActorRef sub : _actorRefs) { + { + int _multiplicity = sub.getMultiplicity(); + boolean _greaterThan = (_multiplicity > 1); + if (_greaterThan) { + _builder.append("\t\t"); + _builder.append("Replicated"); + ActorClass _type_1 = sub.getType(); + String _implementationClassName = this._cppExtensions.getImplementationClassName(_type_1); + _builder.append(_implementationClassName, "\t\t"); + _builder.append(" "); + String _name = sub.getName(); + _builder.append(_name, "\t\t"); + _builder.append(";"); + _builder.newLineIfNotEmpty(); + } else { + _builder.append("\t\t"); + ActorClass _type_2 = sub.getType(); + String _implementationClassName_1 = this._cppExtensions.getImplementationClassName(_type_2); + _builder.append(_implementationClassName_1, "\t\t"); + _builder.append(" "); + String _name_1 = sub.getName(); + _builder.append(_name_1, "\t\t"); + _builder.append(";"); + _builder.newLineIfNotEmpty(); + } + } + } + } + _builder.newLine(); + _builder.append("\t\t"); _builder.append(clsname, "\t\t"); _builder.append("(IRTObject* parent, const std::string& name);"); _builder.newLineIfNotEmpty(); + _builder.append("\t\t"); + _builder.append("~"); + _builder.append(clsname, "\t\t"); + _builder.append("();"); + _builder.newLineIfNotEmpty(); _builder.newLine(); _builder.append("\t\t"); _builder.append("virtual void receiveEvent(etRuntime::InterfaceItemBase* ifitem, int evt, void* data);"); @@ -223,18 +275,30 @@ public class NodeGen { _builder.append("virtual void instantiateMessageServices();"); _builder.newLine(); _builder.append("\t\t"); - _builder.append("virtual void instantiateActors();"); - _builder.newLine(); + _builder.append("virtual void mapThreads(void);"); _builder.newLine(); _builder.append("\t\t"); - _builder.append("virtual void init();"); - _builder.newLine(); + _builder.append("virtual void initialize(void);"); _builder.newLine(); { GlobalGeneratorSettings _settings = Main.getSettings(); boolean _isGenerateMSCInstrumentation = _settings.isGenerateMSCInstrumentation(); if (_isGenerateMSCInstrumentation) { _builder.append("\t\t"); + _builder.append("virtual void setProbesActive(bool recursive, bool active);"); + _builder.newLine(); + } + } + _builder.newLine(); + _builder.append("\t\t"); + _builder.append("virtual void init();"); + _builder.newLine(); + _builder.newLine(); + { + GlobalGeneratorSettings _settings_1 = Main.getSettings(); + boolean _isGenerateMSCInstrumentation_1 = _settings_1.isGenerateMSCInstrumentation(); + if (_isGenerateMSCInstrumentation_1) { + _builder.append("\t\t"); _builder.append("etBool hasGeneratedMSCInstrumentation() const { return true; }"); _builder.newLine(); _builder.append("\t\t"); @@ -284,6 +348,35 @@ public class NodeGen { return ("THREAD_" + _upperCase); } + private CharSequence generateConstructorInitalizerList(final SubSystemClass cc) { + CharSequence _xblockexpression = null; + { + @Extension + final Initialization initHelper = this.initHelper; + ArrayList<CharSequence> initList = CollectionLiterals.<CharSequence>newArrayList(); + StringConcatenation _builder = new StringConcatenation(); + _builder.append("SubSystemClassBase(parent, name)"); + initList.add(_builder.toString()); + EList<ActorRef> _actorRefs = cc.getActorRefs(); + final Function1<ActorRef, String> _function = new Function1<ActorRef, String>() { + public String apply(final ActorRef it) { + StringConcatenation _builder = new StringConcatenation(); + String _name = it.getName(); + _builder.append(_name, ""); + _builder.append("(this, \""); + String _name_1 = it.getName(); + _builder.append(_name_1, ""); + _builder.append("\")"); + return _builder.toString(); + } + }; + List<String> _map = ListExtensions.<ActorRef, String>map(_actorRefs, _function); + Iterables.<CharSequence>addAll(initList, _map); + _xblockexpression = initHelper.generateCtorInitializerList(initList); + } + return _xblockexpression; + } + public CharSequence generateSourceFile(final Root root, final SubSystemInstance comp, final WiredSubSystemClass wired, final Collection<PhysicalThread> usedThreads) { CharSequence _xblockexpression = null; { @@ -327,6 +420,8 @@ public class NodeGen { _builder.newLine(); _builder.append("#include \"common/debugging/DebuggingService.h\""); _builder.newLine(); + _builder.append("#include \"common/debugging/MSCFunctionObject.h\""); + _builder.newLine(); _builder.append("#include \"common/messaging/IMessageService.h\""); _builder.newLine(); _builder.append("#include \"common/messaging/MessageService.h\""); @@ -338,18 +433,6 @@ public class NodeGen { _builder.append("#include \"common/modelbase/InterfaceItemBase.h\""); _builder.newLine(); _builder.newLine(); - { - EList<ActorInstance> _actorInstances = comp.getActorInstances(); - for(final ActorInstance ai : _actorInstances) { - _builder.append("#include \""); - ActorClass _actorClass = ai.getActorClass(); - String _actorIncludePath = this._cppExtensions.getActorIncludePath(_actorClass); - _builder.append(_actorIncludePath, ""); - _builder.append("\""); - _builder.newLineIfNotEmpty(); - } - } - _builder.newLine(); _builder.append("using namespace etRuntime;"); _builder.newLine(); _builder.newLine(); @@ -377,13 +460,59 @@ public class NodeGen { _builder.append(clsname, ""); _builder.append("::"); _builder.append(clsname, ""); - _builder.append("(IRTObject* parent, const std::string& name) :"); + _builder.append("(IRTObject* parent, const std::string& name)"); _builder.newLineIfNotEmpty(); _builder.append("\t\t"); - _builder.append("SubSystemClassBase(parent, name)"); - _builder.newLine(); + CharSequence _generateConstructorInitalizerList = this.generateConstructorInitalizerList(cc); + _builder.append(_generateConstructorInitalizerList, "\t\t"); + _builder.newLineIfNotEmpty(); _builder.append("{"); _builder.newLine(); + { + GlobalGeneratorSettings _settings = Main.getSettings(); + boolean _isGenerateMSCInstrumentation = _settings.isGenerateMSCInstrumentation(); + if (_isGenerateMSCInstrumentation) { + _builder.append("\t"); + _builder.append("MSCFunctionObject mscFunctionObject(getInstancePathName(), \"Constructor\");"); + _builder.newLine(); + } + } + { + EList<ActorRef> _actorRefs = cc.getActorRefs(); + for(final ActorRef sub : _actorRefs) { + { + int _multiplicity = sub.getMultiplicity(); + boolean _greaterThan = (_multiplicity > 1); + if (_greaterThan) { + _builder.append("\t"); + String _name = sub.getName(); + _builder.append(_name, "\t"); + _builder.append(".createSubActors("); + int _multiplicity_1 = sub.getMultiplicity(); + _builder.append(_multiplicity_1, "\t"); + _builder.append(");"); + _builder.newLineIfNotEmpty(); + } + } + } + } + _builder.append("}"); + _builder.newLine(); + _builder.newLine(); + _builder.append(clsname, ""); + _builder.append("::~"); + _builder.append(clsname, ""); + _builder.append("() {"); + _builder.newLineIfNotEmpty(); + { + GlobalGeneratorSettings _settings_1 = Main.getSettings(); + boolean _isGenerateMSCInstrumentation_1 = _settings_1.isGenerateMSCInstrumentation(); + if (_isGenerateMSCInstrumentation_1) { + _builder.append("\t"); + _builder.append("MSCFunctionObject mscFunctionObject(getInstancePathName(), \"Destructor\");"); + _builder.newLine(); + } + } _builder.append("}"); _builder.newLine(); _builder.newLine(); @@ -399,6 +528,16 @@ public class NodeGen { _builder.append("::instantiateMessageServices(){"); _builder.newLineIfNotEmpty(); _builder.newLine(); + { + GlobalGeneratorSettings _settings_2 = Main.getSettings(); + boolean _isGenerateMSCInstrumentation_2 = _settings_2.isGenerateMSCInstrumentation(); + if (_isGenerateMSCInstrumentation_2) { + _builder.append("\t"); + _builder.append("MSCFunctionObject mscFunctionObject(getInstancePathName(), \"instantiateMessageServices()\");"); + _builder.newLine(); + } + } + _builder.newLine(); _builder.append("\t"); _builder.append("IMessageService* msgService;"); _builder.newLine(); @@ -444,14 +583,14 @@ public class NodeGen { _builder.append("\t"); _builder.append("msgService = new MessageService(this, IMessageService::"); ExecMode _execmode_2 = thread_1.getExecmode(); - String _name = _execmode_2.getName(); - _builder.append(_name, "\t\t"); + String _name_1 = _execmode_2.getName(); + _builder.append(_name_1, "\t\t"); _builder.append(", interval, 0, "); String _threadId_1 = this.getThreadId(thread_1); _builder.append(_threadId_1, "\t\t"); _builder.append(", \"MessageService_"); - String _name_1 = thread_1.getName(); - _builder.append(_name_1, "\t\t"); + String _name_2 = thread_1.getName(); + _builder.append(_name_2, "\t\t"); _builder.append("\", "); long _prio = thread_1.getPrio(); _builder.append(_prio, "\t\t"); @@ -462,14 +601,14 @@ public class NodeGen { _builder.append("\t"); _builder.append("msgService = new MessageService(this, IMessageService::"); ExecMode _execmode_3 = thread_1.getExecmode(); - String _name_2 = _execmode_3.getName(); - _builder.append(_name_2, "\t\t"); + String _name_3 = _execmode_3.getName(); + _builder.append(_name_3, "\t\t"); _builder.append(", 0, "); String _threadId_2 = this.getThreadId(thread_1); _builder.append(_threadId_2, "\t\t"); _builder.append(", \"MessageService_"); - String _name_3 = thread_1.getName(); - _builder.append(_name_3, "\t\t"); + String _name_4 = thread_1.getName(); + _builder.append(_name_4, "\t\t"); _builder.append("\", "); long _prio_1 = thread_1.getPrio(); _builder.append(_prio_1, "\t\t"); @@ -491,17 +630,16 @@ public class NodeGen { _builder.newLine(); _builder.append("void "); _builder.append(clsname, ""); - _builder.append("::instantiateActors(){"); + _builder.append("::mapThreads() {"); _builder.newLineIfNotEmpty(); - _builder.newLine(); _builder.append("\t"); _builder.append("// thread mappings"); _builder.newLine(); { EList<ActorInstance> _allContainedInstances = comp.getAllContainedInstances(); - for(final ActorInstance ai_1 : _allContainedInstances) { + for(final ActorInstance ai : _allContainedInstances) { _builder.append("\t"); - final ETMapUtil.MappedThread mapped = ETMapUtil.getMappedThread(ai_1); + final ETMapUtil.MappedThread mapped = ETMapUtil.getMappedThread(ai); _builder.newLineIfNotEmpty(); { boolean _or_1 = false; @@ -516,7 +654,7 @@ public class NodeGen { if (_not) { _builder.append("\t"); _builder.append("addPathToThread(\""); - String _path = ai_1.getPath(); + String _path = ai.getPath(); _builder.append(_path, "\t"); _builder.append("\", "); PhysicalThread _thread = mapped.getThread(); @@ -528,79 +666,60 @@ public class NodeGen { } } } + _builder.append("}"); _builder.newLine(); - _builder.append("\t"); - _builder.append("// sub actors"); _builder.newLine(); + _builder.append("void "); + _builder.append(clsname, ""); + _builder.append("::initialize() {"); + _builder.newLineIfNotEmpty(); { - EList<ActorRef> _actorRefs = cc.getActorRefs(); - for(final ActorRef sub : _actorRefs) { + GlobalGeneratorSettings _settings_3 = Main.getSettings(); + boolean _isGenerateMSCInstrumentation_3 = _settings_3.isGenerateMSCInstrumentation(); + if (_isGenerateMSCInstrumentation_3) { + _builder.append("\t"); + _builder.append("DebuggingService::getInstance().getSyncLogger().addVisibleComment(\"starting initialization\");"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("MSCFunctionObject mscFunctionObject(getInstancePathName(), \"initialize()\");"); + _builder.newLine(); { - int _multiplicity = sub.getMultiplicity(); - boolean _greaterThan = (_multiplicity > 1); - if (_greaterThan) { - _builder.append("\t"); - _builder.append("for (int i=0; i<"); - int _multiplicity_1 = sub.getMultiplicity(); - _builder.append(_multiplicity_1, "\t"); - _builder.append("; ++i) {"); - _builder.newLineIfNotEmpty(); + EList<ActorRef> _actorRefs_1 = cc.getActorRefs(); + for(final ActorRef sub_1 : _actorRefs_1) { { - GlobalGeneratorSettings _settings = Main.getSettings(); - boolean _isGenerateMSCInstrumentation = _settings.isGenerateMSCInstrumentation(); - if (_isGenerateMSCInstrumentation) { + int _multiplicity_2 = sub_1.getMultiplicity(); + boolean _greaterThan_1 = (_multiplicity_2 > 1); + if (_greaterThan_1) { + _builder.append("\t"); + _builder.append("for (int i=0; i<"); + int _multiplicity_3 = sub_1.getMultiplicity(); + _builder.append(_multiplicity_3, "\t"); + _builder.append("; ++i) {"); + _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("\t"); - _builder.append("DebuggingService::getInstance().addMessageActorCreate(*this, \""); - String _name_4 = sub.getName(); - _builder.append(_name_4, "\t\t"); - _builder.append(GenmodelConstants.INDEX_SEP, "\t\t"); - _builder.append("\"+i);"); + _builder.append("DebuggingService::getInstance().addMessageActorCreate(*this, "); + String _name_5 = sub_1.getName(); + _builder.append(_name_5, "\t\t"); + _builder.append(".getSubActor(i)->getName());"); _builder.newLineIfNotEmpty(); - } - } - _builder.append("\t"); - _builder.append("\t"); - _builder.append("new "); - ActorClass _type_1 = sub.getType(); - String _implementationClassName = this._cppExtensions.getImplementationClassName(_type_1); - _builder.append(_implementationClassName, "\t\t"); - _builder.append("(this, \""); - String _name_5 = sub.getName(); - _builder.append(_name_5, "\t\t"); - _builder.append(GenmodelConstants.INDEX_SEP, "\t\t"); - _builder.append("\"+i);"); - _builder.newLineIfNotEmpty(); - _builder.append("\t"); - _builder.append("}"); - _builder.newLine(); - } else { - { - GlobalGeneratorSettings _settings_1 = Main.getSettings(); - boolean _isGenerateMSCInstrumentation_1 = _settings_1.isGenerateMSCInstrumentation(); - if (_isGenerateMSCInstrumentation_1) { + _builder.append("\t"); + _builder.append("}"); + _builder.newLine(); + } else { _builder.append("\t"); _builder.append("DebuggingService::getInstance().addMessageActorCreate(*this, \""); - String _name_6 = sub.getName(); + String _name_6 = sub_1.getName(); _builder.append(_name_6, "\t"); _builder.append("\");"); _builder.newLineIfNotEmpty(); } } - _builder.append("\t"); - _builder.append("new "); - ActorClass _type_2 = sub.getType(); - String _implementationClassName_1 = this._cppExtensions.getImplementationClassName(_type_2); - _builder.append(_implementationClassName_1, "\t"); - _builder.append("(this, \""); - String _name_7 = sub.getName(); - _builder.append(_name_7, "\t"); - _builder.append("\");"); - _builder.newLineIfNotEmpty(); } } } } + _builder.append("\t"); _builder.newLine(); _builder.append("\t"); _builder.append("// wiring"); @@ -629,29 +748,70 @@ public class NodeGen { _builder.newLineIfNotEmpty(); } } + _builder.append("\t"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("// call initialize of sub actors"); + _builder.newLine(); + { + EList<ActorRef> _actorRefs_2 = cc.getActorRefs(); + for(final ActorRef sub_2 : _actorRefs_2) { + _builder.append("\t"); + String _name_7 = sub_2.getName(); + _builder.append(_name_7, "\t"); + _builder.append(".initialize();"); + _builder.newLineIfNotEmpty(); + } + } _builder.append("}"); _builder.newLine(); _builder.newLine(); - _builder.append("void "); - _builder.append(clsname, ""); - _builder.append("::init(){"); - _builder.newLineIfNotEmpty(); { - GlobalGeneratorSettings _settings_2 = Main.getSettings(); - boolean _isGenerateMSCInstrumentation_2 = _settings_2.isGenerateMSCInstrumentation(); - if (_isGenerateMSCInstrumentation_2) { + GlobalGeneratorSettings _settings_4 = Main.getSettings(); + boolean _isGenerateMSCInstrumentation_4 = _settings_4.isGenerateMSCInstrumentation(); + if (_isGenerateMSCInstrumentation_4) { + _builder.append("void "); + _builder.append(clsname, ""); + _builder.append("::setProbesActive(bool recursive, bool active) {"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("for(int i = 0; i < m_RTSystemPort.getNInterfaceItems(); i++)"); + _builder.newLine(); + _builder.append("\t\t"); + _builder.append("DebuggingService::getInstance().addPortInstance(*(m_RTSystemPort.getInterfaceItem(i)));"); + _builder.newLine(); _builder.append("\t"); - _builder.append("DebuggingService::getInstance().addVisibleComment(\"begin sub system initialization\");"); + _builder.append("if(recursive) {"); + _builder.newLine(); + { + EList<ActorRef> _actorRefs_3 = cc.getActorRefs(); + for(final ActorRef sub_3 : _actorRefs_3) { + _builder.append("\t\t"); + String _name_8 = sub_3.getName(); + _builder.append(_name_8, "\t\t"); + _builder.append(".setProbesActive(recursive, active);"); + _builder.newLineIfNotEmpty(); + } + } + _builder.append("\t"); + _builder.append("}"); + _builder.newLine(); + _builder.append("}"); _builder.newLine(); } } + _builder.newLine(); + _builder.append("void "); + _builder.append(clsname, ""); + _builder.append("::init(){"); + _builder.newLineIfNotEmpty(); _builder.append("\t"); _builder.append("SubSystemClassBase::init();"); _builder.newLine(); { - GlobalGeneratorSettings _settings_3 = Main.getSettings(); - boolean _isGenerateMSCInstrumentation_3 = _settings_3.isGenerateMSCInstrumentation(); - if (_isGenerateMSCInstrumentation_3) { + GlobalGeneratorSettings _settings_5 = Main.getSettings(); + boolean _isGenerateMSCInstrumentation_5 = _settings_5.isGenerateMSCInstrumentation(); + if (_isGenerateMSCInstrumentation_5) { _builder.append("\t"); _builder.append("DebuggingService::getInstance().addVisibleComment(\"done sub system initialization\");"); _builder.newLine(); @@ -660,23 +820,41 @@ public class NodeGen { _builder.append("}"); _builder.newLine(); { - GlobalGeneratorSettings _settings_4 = Main.getSettings(); - boolean _isGenerateMSCInstrumentation_4 = _settings_4.isGenerateMSCInstrumentation(); - if (_isGenerateMSCInstrumentation_4) { + GlobalGeneratorSettings _settings_6 = Main.getSettings(); + boolean _isGenerateMSCInstrumentation_6 = _settings_6.isGenerateMSCInstrumentation(); + if (_isGenerateMSCInstrumentation_6) { _builder.newLine(); _builder.append("void "); _builder.append(clsname, ""); _builder.append("::destroy() {"); _builder.newLineIfNotEmpty(); - _builder.append("\t"); - _builder.append("DebuggingService::getInstance().addVisibleComment(\"begin sub system destruction\");"); - _builder.newLine(); + { + GlobalGeneratorSettings _settings_7 = Main.getSettings(); + boolean _isGenerateMSCInstrumentation_7 = _settings_7.isGenerateMSCInstrumentation(); + if (_isGenerateMSCInstrumentation_7) { + _builder.append("\t"); + _builder.append("DebuggingService::getInstance().getSyncLogger().addVisibleComment(\"starting destruction\");"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("MSCFunctionObject mscFunctionObject(getInstancePathName(), \"destroy()\");"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("DebuggingService::getInstance().addVisibleComment(\"begin sub system destruction\");"); + _builder.newLine(); + } + } _builder.append("\t"); _builder.append("SubSystemClassBase::destroy();"); _builder.newLine(); - _builder.append("\t"); - _builder.append("DebuggingService::getInstance().addVisibleComment(\"done sub system destruction\");"); - _builder.newLine(); + { + GlobalGeneratorSettings _settings_8 = Main.getSettings(); + boolean _isGenerateMSCInstrumentation_8 = _settings_8.isGenerateMSCInstrumentation(); + if (_isGenerateMSCInstrumentation_8) { + _builder.append("\t"); + _builder.append("DebuggingService::getInstance().addVisibleComment(\"done sub system destruction\");"); + _builder.newLine(); + } + } _builder.append("}"); _builder.newLine(); } diff --git a/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/ProtocolClassGen.java b/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/ProtocolClassGen.java index 74878fd49..66fc7250f 100644 --- a/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/ProtocolClassGen.java +++ b/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/ProtocolClassGen.java @@ -512,6 +512,8 @@ public class ProtocolClassGen extends GenericProtocolClassGenerator { _builder.newLine(); _builder.append("#include \"common/debugging/DebuggingService.h\""); _builder.newLine(); + _builder.append("#include \"common/debugging/MSCFunctionObject.h\""); + _builder.newLine(); _builder.append("#include \"common/messaging/AbstractMessageReceiver.h\""); _builder.newLine(); _builder.append("#include \"common/messaging/Address.h\""); @@ -638,15 +640,6 @@ public class ProtocolClassGen extends GenericProtocolClassGenerator { _builder.newLineIfNotEmpty(); _builder.append("{"); _builder.newLine(); - { - GlobalGeneratorSettings _settings = Main.getSettings(); - boolean _isGenerateMSCInstrumentation = _settings.isGenerateMSCInstrumentation(); - if (_isGenerateMSCInstrumentation) { - _builder.append("\t"); - _builder.append("DebuggingService::getInstance().addPortInstance(*this);"); - _builder.newLine(); - } - } _builder.append("}"); _builder.newLine(); _builder.newLine(); @@ -671,21 +664,12 @@ public class ProtocolClassGen extends GenericProtocolClassGenerator { } } _builder.newLineIfNotEmpty(); - { - GlobalGeneratorSettings _settings_1 = Main.getSettings(); - boolean _isGenerateMSCInstrumentation_1 = _settings_1.isGenerateMSCInstrumentation(); - if (_isGenerateMSCInstrumentation_1) { - _builder.append("\t"); - _builder.append("DebuggingService::getInstance().addPortInstance(*this);"); - _builder.newLine(); - } - } _builder.append("}"); _builder.newLine(); { - GlobalGeneratorSettings _settings_2 = Main.getSettings(); - boolean _isGenerateMSCInstrumentation_2 = _settings_2.isGenerateMSCInstrumentation(); - if (_isGenerateMSCInstrumentation_2) { + GlobalGeneratorSettings _settings = Main.getSettings(); + boolean _isGenerateMSCInstrumentation = _settings.isGenerateMSCInstrumentation(); + if (_isGenerateMSCInstrumentation) { _builder.newLine(); _builder.append("void "); _builder.append(portClassName, ""); @@ -731,9 +715,9 @@ public class ProtocolClassGen extends GenericProtocolClassGenerator { _builder.newLine(); _builder.newLine(); { - GlobalGeneratorSettings _settings_3 = Main.getSettings(); - boolean _isGenerateMSCInstrumentation_3 = _settings_3.isGenerateMSCInstrumentation(); - if (_isGenerateMSCInstrumentation_3) { + GlobalGeneratorSettings _settings_1 = Main.getSettings(); + boolean _isGenerateMSCInstrumentation_1 = _settings_1.isGenerateMSCInstrumentation(); + if (_isGenerateMSCInstrumentation_1) { _builder.append("\t"); _builder.append("DebuggingService::getInstance().addMessageAsyncIn(getPeerAddress(), getAddress(), "); String _name_1 = pc.getName(); @@ -1115,21 +1099,27 @@ public class ProtocolClassGen extends GenericProtocolClassGenerator { } } } else { - _builder_2.append("\t"); - _builder_2.append("DebuggingService::getInstance().addMessageAsyncOut(getAddress(), getPeerAddress(),"); - _builder_2.newLine(); - _builder_2.append("\t"); - _builder_2.append("\t"); - _builder_2.append(portClassName, "\t\t"); - _builder_2.append("::getMessageString("); - _builder_2.append(portClassName, "\t\t"); - _builder_2.append("::"); - _builder_2.append(dir, "\t\t"); - _builder_2.append("_"); - String _name_3 = m.getName(); - _builder_2.append(_name_3, "\t\t"); - _builder_2.append("));"); - _builder_2.newLineIfNotEmpty(); + { + GlobalGeneratorSettings _settings = Main.getSettings(); + boolean _isGenerateMSCInstrumentation = _settings.isGenerateMSCInstrumentation(); + if (_isGenerateMSCInstrumentation) { + _builder_2.append("\t"); + _builder_2.append("DebuggingService::getInstance().addMessageAsyncOut(getAddress(), getPeerAddress(),"); + _builder_2.newLine(); + _builder_2.append("\t"); + _builder_2.append("\t"); + _builder_2.append(portClassName, "\t\t"); + _builder_2.append("::getMessageString("); + _builder_2.append(portClassName, "\t\t"); + _builder_2.append("::"); + _builder_2.append(dir, "\t\t"); + _builder_2.append("_"); + String _name_3 = m.getName(); + _builder_2.append(_name_3, "\t\t"); + _builder_2.append("));"); + _builder_2.newLineIfNotEmpty(); + } + } _builder_2.append("\t"); _builder_2.append("if (getPeerAddress().isValid()){"); _builder_2.newLine(); diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src-gen/common/modelbase/RTSystemServicesProtocol.cpp b/runtime/org.eclipse.etrice.runtime.cpp/src-gen/common/modelbase/RTSystemServicesProtocol.cpp index 55276e76f..0f201c20f 100644 --- a/runtime/org.eclipse.etrice.runtime.cpp/src-gen/common/modelbase/RTSystemServicesProtocol.cpp +++ b/runtime/org.eclipse.etrice.runtime.cpp/src-gen/common/modelbase/RTSystemServicesProtocol.cpp @@ -7,14 +7,13 @@ #include "RTSystemServicesProtocol.h" -#include <common/debugging/DebuggingService.h> -#include <common/messaging/AbstractMessageReceiver.h> -#include <common/messaging/Address.h> -#include <common/messaging/Message.h> -#include <common/modelbase/IEventReceiver.h> -#include <iostream> +#include "common/debugging/DebuggingService.h" +#include "common/debugging/MSCFunctionObject.h" +#include "common/messaging/AbstractMessageReceiver.h" +#include "common/messaging/Address.h" +#include "common/messaging/Message.h" +#include "common/modelbase/IEventReceiver.h" #include <iterator> -#include <string> #include <vector> using namespace etRuntime; @@ -38,16 +37,14 @@ const std::string& RTSystemServicesProtocol::getMessageString(int msg_id) { // port class //------------------------------------------------------------------------------------------------------------ -RTSystemServicesProtocolPort::RTSystemServicesProtocolPort(IInterfaceItemOwner* actor, const std::string& name, int localId) : - PortBase(actor, name, localId, 0) +RTSystemServicesProtocolPort::RTSystemServicesProtocolPort(IInterfaceItemOwner* actor, const std::string& name, int localId) + : PortBase(actor, name, localId, 0) { - DebuggingService::getInstance().addPortInstance(*this); } -RTSystemServicesProtocolPort::RTSystemServicesProtocolPort(IInterfaceItemOwner* actor, const std::string& name, int localId, int idx) : - PortBase(actor, name, localId, idx) +RTSystemServicesProtocolPort::RTSystemServicesProtocolPort(IInterfaceItemOwner* actor, const std::string& name, int localId, int idx) + : PortBase(actor, name, localId, idx) { - DebuggingService::getInstance().addPortInstance(*this); } void RTSystemServicesProtocolPort::destroy() { @@ -82,16 +79,14 @@ RTSystemServicesProtocolReplPort::RTSystemServicesProtocolReplPort(IInterfaceIte // conjugated port class //------------------------------------------------------------------------------------------------------------ -RTSystemServicesProtocolConjPort::RTSystemServicesProtocolConjPort(IInterfaceItemOwner* actor, const std::string& name, int localId) : - PortBase(actor, name, localId, 0) +RTSystemServicesProtocolConjPort::RTSystemServicesProtocolConjPort(IInterfaceItemOwner* actor, const std::string& name, int localId) + : PortBase(actor, name, localId, 0) { - DebuggingService::getInstance().addPortInstance(*this); } -RTSystemServicesProtocolConjPort::RTSystemServicesProtocolConjPort(IInterfaceItemOwner* actor, const std::string& name, int localId, int idx) : - PortBase(actor, name, localId, idx) +RTSystemServicesProtocolConjPort::RTSystemServicesProtocolConjPort(IInterfaceItemOwner* actor, const std::string& name, int localId, int idx) + : PortBase(actor, name, localId, idx) { - DebuggingService::getInstance().addPortInstance(*this); } void RTSystemServicesProtocolConjPort::destroy() { @@ -159,3 +154,4 @@ void RTSystemServicesProtocolConjReplPort::stopDebugging(){ } } + diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src-gen/common/modelbase/RTSystemServicesProtocol.h b/runtime/org.eclipse.etrice.runtime.cpp/src-gen/common/modelbase/RTSystemServicesProtocol.h index 69c914db8..7682e9359 100644 --- a/runtime/org.eclipse.etrice.runtime.cpp/src-gen/common/modelbase/RTSystemServicesProtocol.h +++ b/runtime/org.eclipse.etrice.runtime.cpp/src-gen/common/modelbase/RTSystemServicesProtocol.h @@ -5,15 +5,15 @@ * */ -#ifndef _RTSYSTEMSERVICESPROTOCOL_H_ -#define _RTSYSTEMSERVICESPROTOCOL_H_ +#ifndef _COMMON_MODELBASE_RTSYSTEMSERVICESPROTOCOL_H_ +#define _COMMON_MODELBASE_RTSYSTEMSERVICESPROTOCOL_H_ + +#include "common/modelbase/InterfaceItemBase.h" +#include "common/modelbase/PortBase.h" +#include "common/modelbase/ReplicatedInterfaceItemBase.h" +#include "common/modelbase/ReplicatedPortBase.h" +#include "common/etDatatypesCpp.hpp" -#include <common/modelbase/InterfaceItemBase.h> -#include <common/modelbase/PortBase.h> -#include <common/modelbase/ReplicatedInterfaceItemBase.h> -#include <common/modelbase/ReplicatedPortBase.h> -#include <etDatatypes.h> -#include <string> @@ -43,7 +43,6 @@ class RTSystemServicesProtocol { private: static const std::string s_messageStrings[]; - }; //------------------------------------------------------------------------------------------------------------ @@ -124,4 +123,6 @@ class RTSystemServicesProtocolConjReplPort : public etRuntime::ReplicatedPortBas } }; -#endif /* _RTSYSTEMSERVICESPROTOCOL_H_ */ + + +#endif /* _COMMON_MODELBASE_RTSYSTEMSERVICESPROTOCOL_H_ */ diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/debugging/DebuggingService.cpp b/runtime/org.eclipse.etrice.runtime.cpp/src/common/debugging/DebuggingService.cpp index 89a8bc6dd..b2dedc349 100644 --- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/debugging/DebuggingService.cpp +++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/debugging/DebuggingService.cpp @@ -14,7 +14,7 @@ #include "common/modelbase/ActorClassBase.h" #include "common/modelbase/SubSystemClassBase.h" -#include "common/modelbase/PortBase.h" +#include "common/modelbase/InterfaceItemBase.h" #include <iostream> namespace etRuntime { @@ -31,8 +31,8 @@ DebuggingService::DebuggingService() : m_portInstances() { } -const PortBase* DebuggingService::getPort(const Address& address) const { - std::map<Address, const PortBase*>::const_iterator it = m_portInstances.find(address); +const InterfaceItemBase* DebuggingService::getPort(const Address& address) const { + std::map<Address, const InterfaceItemBase*>::const_iterator it = m_portInstances.find(address); if (it != m_portInstances.end()) return it->second; @@ -40,8 +40,8 @@ const PortBase* DebuggingService::getPort(const Address& address) const { } void DebuggingService::addMessageAsyncOut(const Address& source, const Address& target, const std::string& msg) { - const PortBase* srcPort = getPort(source); - const PortBase* tgtPort = getPort(target); + const InterfaceItemBase* srcPort = getPort(source); + const InterfaceItemBase* tgtPort = getPort(target); if (srcPort != 0 && tgtPort != 0) m_asyncLogger.addMessageAsyncOut(srcPort->getActor()->getInstancePath(), tgtPort->getActor()->getInstancePath(), msg); @@ -49,24 +49,24 @@ void DebuggingService::addMessageAsyncOut(const Address& source, const Address& } void DebuggingService::addMessageAsyncIn(const Address& source, const Address& target, const std::string& msg) { - const PortBase* srcPort = getPort(source); - const PortBase* tgtPort = getPort(target); + const InterfaceItemBase* srcPort = getPort(source); + const InterfaceItemBase* tgtPort = getPort(target); if (srcPort != 0 && tgtPort != 0) m_asyncLogger.addMessageAsyncIn(srcPort->getActor()->getInstancePath(), tgtPort->getActor()->getInstancePath(), msg); } void DebuggingService::addMessageSyncCall(const Address& source, const Address& target, const std::string& msg) { - const PortBase* srcPort = getPort(source); - const PortBase* tgtPort = getPort(target); + const InterfaceItemBase* srcPort = getPort(source); + const InterfaceItemBase* tgtPort = getPort(target); if (srcPort != 0 && tgtPort != 0) m_asyncLogger.addMessageSyncCall(srcPort->getActor()->getInstancePath(), tgtPort->getActor()->getInstancePath(), msg); } void DebuggingService::addMessageSyncReturn(const Address& source, const Address& target, const std::string& msg) { - const PortBase* srcPort = getPort(source); - const PortBase* tgtPort = getPort(target); + const InterfaceItemBase* srcPort = getPort(source); + const InterfaceItemBase* tgtPort = getPort(target); if (srcPort != 0 && tgtPort != 0) m_asyncLogger.addMessageSyncReturn(srcPort->getActor()->getInstancePath(), tgtPort->getActor()->getInstancePath(), msg); @@ -95,11 +95,11 @@ void DebuggingService::addVisibleComment(const std::string& comment) { m_asyncLogger.addVisibleComment(comment); } -void DebuggingService::addPortInstance(const PortBase& port) { +void DebuggingService::addPortInstance(const InterfaceItemBase& port) { m_portInstances[port.getAddress()] = &port; } -void DebuggingService::removePortInstance(const PortBase& port) { +void DebuggingService::removePortInstance(const InterfaceItemBase& port) { m_portInstances.erase(port.getAddress()); } diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/debugging/DebuggingService.h b/runtime/org.eclipse.etrice.runtime.cpp/src/common/debugging/DebuggingService.h index c7ef3e6fe..0ac9e6354 100644 --- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/debugging/DebuggingService.h +++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/debugging/DebuggingService.h @@ -16,6 +16,7 @@ #include "common/debugging/MSCLogger.h" #include "common/messaging/Address.h" #include "etDatatypes.h" +#include "common/modelbase/InterfaceItemBase.h" #include <string> #include <map> @@ -41,8 +42,8 @@ public: void addMessageActorCreate(const ActorClassBase& parent, const std::string& refName); void addMessageActorDestroy(const ActorClassBase& inst); void addVisibleComment(const std::string& comment); - void addPortInstance(const PortBase& port); - void removePortInstance(const PortBase& port); + void addPortInstance(const InterfaceItemBase& port); + void removePortInstance(const InterfaceItemBase& port); MSCLogger& getSyncLogger() { return m_syncLogger; } MSCLogger& getAsyncLogger() { return m_asyncLogger; } @@ -51,9 +52,9 @@ private: MSCLogger m_asyncLogger; MSCLogger m_syncLogger; - std::map<Address, const PortBase*> m_portInstances; + std::map<Address, const InterfaceItemBase*> m_portInstances; - const PortBase* getPort(const Address& address) const; + const InterfaceItemBase* getPort(const Address& address) const; DebuggingService(); DebuggingService(DebuggingService const&); diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/RTObject.cpp b/runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/RTObject.cpp index 19e146ab0..6c3182ecc 100644 --- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/RTObject.cpp +++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/RTObject.cpp @@ -33,12 +33,6 @@ RTObject::RTObject(IRTObject* parent, const std::string& name) : } } -RTObject::~RTObject() { - for (std::vector<IRTObject*>::iterator it = m_children.begin(); it != m_children.end(); ++it) { - delete *it; - } -} - void RTObject::destroy() { for (std::vector<IRTObject*>::iterator it = m_children.begin(); it != m_children.end(); ++it) { RTObject* child = dynamic_cast<RTObject*>(*it); diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/RTObject.h b/runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/RTObject.h index a4bb6cd66..ceb2b6c93 100644 --- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/RTObject.h +++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/RTObject.h @@ -23,7 +23,7 @@ class RTObject: public virtual IRTObject { public: RTObject(IRTObject* parent, const std::string& name); - virtual ~RTObject(); + virtual ~RTObject() {} virtual const std::string& getName() const { return m_name; diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ActorClassBase.cpp b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ActorClassBase.cpp index 931449b55..5f67b8ac5 100644 --- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ActorClassBase.cpp +++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ActorClassBase.cpp @@ -33,6 +33,17 @@ ActorClassBase::~ActorClassBase() { m_state = 0; } +void ActorClassBase::initialize() { + // since we have no mapping for the system ports we connect them directly here + IReplicatedInterfaceItem* systemPort = getSystemPort(); + if (systemPort != 0) { + InterfaceItemBase* peer = systemPort->createSubInterfaceItem(); + m_RTSystemPort.connectWith(peer); + } +} + + + //SubSystemClassBase* ActorClassBase::getSubSystem() const { // return 0; // TODO JH //} diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ActorClassBase.h b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ActorClassBase.h index 7bd002ca9..52d876b17 100644 --- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ActorClassBase.h +++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ActorClassBase.h @@ -23,7 +23,6 @@ namespace etRuntime { - class ActorClassBase: public SystemPortOwner, public virtual IMessageReceiver { public: @@ -42,6 +41,9 @@ public: return Address::EMPTY; } + virtual void initialize(void); + virtual void setProbesActive(bool recursive, bool active) {} + //SubSystemClassBase* getSubSystem() const; //--------------------- lifecycle functions diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/InterfaceItemBase.cpp b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/InterfaceItemBase.cpp index 2834ff487..498137c69 100644 --- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/InterfaceItemBase.cpp +++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/InterfaceItemBase.cpp @@ -44,8 +44,16 @@ InterfaceItemBase::InterfaceItemBase(IInterfaceItemOwner* owner, const std::stri m_replicator(0) { m_replicator = dynamic_cast<IReplicatedInterfaceItem*>(owner); +} + +InterfaceItemBase::~InterfaceItemBase() { + m_peerAddress = Address::EMPTY; + m_ownMsgReceiver = 0; + m_peerMsgReceiver = 0; +} - int thread = owner->getEventReceiver()->getThread(); +void InterfaceItemBase::init() { + int thread = dynamic_cast<IEventReceiver*> (getParent())->getThread(); if (thread >= 0) { IMessageService* msgSvc = RTServices::getInstance().getMsgSvcCtrl().getMsgSvc(thread); Address addr = msgSvc->getFreeAddress(); @@ -56,12 +64,6 @@ InterfaceItemBase::InterfaceItemBase(IInterfaceItemOwner* owner, const std::stri } } -InterfaceItemBase::~InterfaceItemBase() { - m_peerAddress = Address::EMPTY; - m_ownMsgReceiver = 0; - m_peerMsgReceiver = 0; -} - IInterfaceItem* InterfaceItemBase::connectWith(IInterfaceItem* peer) { if (peer != 0) { m_peer = peer; @@ -78,6 +80,10 @@ IInterfaceItem* InterfaceItemBase::connectWith(IInterfaceItem* peer) { InterfaceItemBase* ifItemPeer = dynamic_cast<InterfaceItemBase*>(m_peer); if (ifItemPeer != 0) { + // initialize Ports + this->init(); + ifItemPeer->init(); + // connect with each other m_peerAddress = ifItemPeer->getAddress(); ifItemPeer->m_peerAddress = getAddress(); @@ -121,8 +127,10 @@ void InterfaceItemBase::destroy() { m_replicator->removeItem(*this); } - m_ownMsgReceiver->removeMessageReceiver(*this); - m_ownMsgReceiver->freeAddress(getAddress()); + if(m_ownMsgReceiver) { + m_ownMsgReceiver->removeMessageReceiver(*this); + m_ownMsgReceiver->freeAddress(getAddress()); + } AbstractMessageReceiver::destroy(); } diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/InterfaceItemBase.h b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/InterfaceItemBase.h index 0cc5de218..cdb12d99d 100644 --- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/InterfaceItemBase.h +++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/InterfaceItemBase.h @@ -61,6 +61,7 @@ protected: return m_peerMsgReceiver; } + void init(void); virtual void destroy(); diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/RTSystemProtocol.cpp b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/RTSystemProtocol.cpp index 91eb0e865..9a9f930b0 100644 --- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/RTSystemProtocol.cpp +++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/RTSystemProtocol.cpp @@ -20,13 +20,6 @@ const std::string RTSystemProtocol::RT_SYSTEM_PORT_NAME = "RTSystemPort"; RTSystemPort::RTSystemPort(IInterfaceItemOwner* actor, int localId) : RTSystemServicesProtocolPort(actor, RTSystemProtocol::RT_SYSTEM_PORT_NAME, localId) { - - // since we have no mapping for the system ports we connect them directly here - IReplicatedInterfaceItem* systemPort = actor->getSystemPort(); - if (systemPort != 0) { - InterfaceItemBase* peer = systemPort->createSubInterfaceItem(); - connectWith(peer); - } } RTSystemConjPort::RTSystemConjPort(IInterfaceItemOwner* actor, int localId) : diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedActorClassBase.cpp b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedActorClassBase.cpp new file mode 100644 index 000000000..52be7ecc7 --- /dev/null +++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedActorClassBase.cpp @@ -0,0 +1,45 @@ +/******************************************************************************* + * Copyright (c) 2016 protos software gmbh (http://www.protos.de). + * 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: + * Jan Belle (initial contribution) + * + *******************************************************************************/ + +#include "ReplicatedActorClassBase.h" + +namespace etRuntime { + +ReplicatedActorClassBase::ReplicatedActorClassBase(IRTObject* parent, const std::string& name) : + RTObject(parent, name), m_items() { +} + +ReplicatedActorClassBase::~ReplicatedActorClassBase() { + for(std::vector<ActorClassBase*>::iterator it = m_items.begin(); it != m_items.end(); it++) + delete *it; +} + +void ReplicatedActorClassBase::createSubActors(int number) { + for (int i = 0; i < number; i++) { + std::stringstream itemName; + itemName << getName() << SEP << i; + ActorClassBase* item = createActor(getParent(), itemName.str()); + m_items.push_back(item); + } +} + +void ReplicatedActorClassBase::initialize() { + for(std::vector<ActorClassBase*>::iterator it = m_items.begin(); it != m_items.end(); it++) + (*it)->initialize(); +} + +void ReplicatedActorClassBase::setProbesActive(bool recursive, bool active) { + for(std::vector<ActorClassBase*>::iterator it = m_items.begin(); it != m_items.end(); it++) + (*it)->setProbesActive(recursive, active); +} + +} // namespace etRuntime diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedActorClassBase.h b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedActorClassBase.h new file mode 100644 index 000000000..6a1eba38d --- /dev/null +++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedActorClassBase.h @@ -0,0 +1,43 @@ +/******************************************************************************* + * Copyright (c) 2016 protos software gmbh (http://www.protos.de). + * 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: + * Jan Belle (initial contribution) + * + *******************************************************************************/ + +#ifndef SRC_COMMON_MODELBASE_REPLICATEDACTORCLASSBASE_H_ +#define SRC_COMMON_MODELBASE_REPLICATEDACTORCLASSBASE_H_ + +#include "common/messaging/RTObject.h" +#include "common/modelbase/ActorClassBase.h" + +namespace etRuntime { + +class ReplicatedActorClassBase : public RTObject { + +public: + static const char SEP = ':'; + + ReplicatedActorClassBase(IRTObject* parent, const std::string& name); + virtual ~ReplicatedActorClassBase(void); + void createSubActors(int number); + void initialize(void); + void setProbesActive(bool recursive, bool active); + int getNSubActors(void) { return m_items.size(); } + ActorClassBase* getSubActor(int index) { return m_items.at(index); } + +protected: + virtual ActorClassBase* createActor(IRTObject* parent, const std::string& name) = 0; + +private: + std::vector<ActorClassBase*> m_items; +}; + +} // namespace et Runtime + +#endif /* SRC_COMMON_MODELBASE_REPLICATEDACTORCLASSBASE_H_ */ diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedInterfaceItemBase.cpp b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedInterfaceItemBase.cpp index 9b716f9c4..6e5b536d2 100644 --- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedInterfaceItemBase.cpp +++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedInterfaceItemBase.cpp @@ -25,7 +25,12 @@ ReplicatedInterfaceItemBase::ReplicatedInterfaceItemBase(IInterfaceItemOwner* ow m_localId(localId), m_items(), m_releasedIndices() { +} +ReplicatedInterfaceItemBase::~ReplicatedInterfaceItemBase() { + for(std::vector<InterfaceItemBase*>::iterator it = m_items.begin(); it != m_items.end(); ++it) { + delete *it; + } } InterfaceItemBase* ReplicatedInterfaceItemBase::createSubInterfaceItem() { diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedInterfaceItemBase.h b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedInterfaceItemBase.h index e1460d13e..4738382da 100644 --- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedInterfaceItemBase.h +++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedInterfaceItemBase.h @@ -28,7 +28,7 @@ class ReplicatedInterfaceItemBase: public RTObject, public: static const char SEP = ':'; - virtual ~ReplicatedInterfaceItemBase(){} + virtual ~ReplicatedInterfaceItemBase(); virtual InterfaceItemBase* createSubInterfaceItem(); virtual void removeItem(InterfaceItemBase& item); diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/SubSystemClassBase.cpp b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/SubSystemClassBase.cpp index 854d6ed8f..d7e33a04a 100644 --- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/SubSystemClassBase.cpp +++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/SubSystemClassBase.cpp @@ -33,6 +33,7 @@ SubSystemClassBase::SubSystemClassBase(IRTObject* parent, std::string name) : DebuggingService::getInstance().getAsyncLogger().open(); DebuggingService::getInstance().getSyncLogger().setMSC(name + "_Sync", "log/"); DebuggingService::getInstance().getSyncLogger().open(); + DebuggingService::getInstance().getSyncLogger().setObjectName("main"); RTServices::getInstance().setSubSystem(this); } @@ -48,8 +49,9 @@ void SubSystemClassBase::init() { // normaly the ports will address the correct target message service directly // it is just for test purposes // RTServices::getInstance().getMsgSvcCtrl().connectAll(); - - instantiateActors(); + mapThreads(); + initialize(); + setProbesActive(true, true); // std::cout << toStringRecursive() << std::endl; // initialize all actor instances diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/SubSystemClassBase.h b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/SubSystemClassBase.h index bc80bede3..11bd28c61 100644 --- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/SubSystemClassBase.h +++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/SubSystemClassBase.h @@ -32,7 +32,9 @@ public: virtual void init(); virtual void instantiateMessageServices() = 0; - virtual void instantiateActors() = 0; + virtual void mapThreads(void) = 0; + virtual void initialize(void) = 0; + virtual void setProbesActive(bool recursive, bool active) {} void start(); void stop(); |