support event stimuli without enabling mode list, support InterProcessStimulus with enabling mode list, revised CustomEventTriggerTransformer (consolidation with changes made my interProcessStimulus)
Signed-off-by: Sebastain Reiser <sebastian.reiser@de.bosch.com>
diff --git a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/stimuli/StimuliTransformer.xtend b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/stimuli/StimuliTransformer.xtend
index d7962e4..dbf3e6a 100644
--- a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/stimuli/StimuliTransformer.xtend
+++ b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/stimuli/StimuliTransformer.xtend
@@ -30,6 +30,9 @@
import org.eclipse.app4mc.amalthea.model.InterProcessStimulus
import templates.m2m.utils.CounterUtils
import org.eclipse.app4mc.amalthea.model.EventStimulus
+import templates.m2m.sw.ModeValueDisjunctionTransformer
+import templates.m2m.sw.CallGraphTransformer
+import com.inchron.realtime.root.model.ActivationItem
@Singleton
class StimuliTransformer extends AbstractAmaltheaInchronTransformer {
@@ -38,6 +41,8 @@
@Inject TimeTransformer timeUtilsTransformer
@Inject FrequencyDomainTransformer frequencyDomainTransformer
+ @Inject ModeValueDisjunctionTransformer modeValueDisjunctionTransformer
+ @Inject CallGraphTransformer callGraphTransformer
def create inchronStimulationFactory.createStimulationScenario createStimulationScenario(StimuliModel amltStimuliModel, Model inchronModel){
@@ -64,6 +69,10 @@
inchronStimulationScenario.generators.add(inchronRandomStimuliGenerator)
}
+ def create inchronModelFactory.createActivationItem createActivationItem(Stimulus stimulus){
+
+ }
+
def create inchronStimulationFactory.createRandomStimuliGenerator createRandomStimuliGenerator(
PeriodicStimulus amltStimulus) {
@@ -81,9 +90,9 @@
inchronCallGraph.graphEntries.add(inchronCallSequence)
var inchronActivationItem = inchronModelFactory.createActivationItem
- inchronActivationItem.name = "ActivationItem"
- inchronCallSequence.calls.add(inchronActivationItem)
+ inchronActivationItem.name = "ActivationItem_"+ amltStimulus.name
inchronActivationItem.connection = inchronActivationConnection
+ inchronCallSequence.calls.add(inchronActivationItem)
it.targets = inchronCallGraph
// TODO: check if the right frequency can be fetched (below solution is good at present. In long run clarify this topic in detail)
@@ -131,4 +140,51 @@
inchronActivationConnection.activations.add(it)
}
-}
+ def create inchronModelFactory.createFunction createDummyFunction(Stimulus amltStimulus, ActivationItem inchronActivationItem){
+ it.name="Dummy_"+ getStimulusName(amltStimulus)
+ val inchronCallGraph=inchronModelFactory.createCallGraph
+ it.callGraph=inchronCallGraph
+
+ var amltCondition= getEnableValueList(amltStimulus)
+ if(amltCondition!==null){
+ val inchronModeSwitch = inchronModelFactory.createModeSwitch
+ inchronModeSwitch.name ="EventStimulusCondition"
+ val inchronModeSwitchEntry=inchronModelFactory.createModeSwitchEntry
+
+ // Adding entry with condition
+ inchronModeSwitch.entries.add(inchronModeSwitchEntry)
+ var inchronConditon=modeValueDisjunctionTransformer.createModeCondition(amltCondition)
+ inchronModeSwitchEntry.condition = inchronConditon
+
+ //add activation item to call sequence within mode switch's call sequence
+ val inchronCallSequence_ActivationItem=inchronModelFactory.createCallSequence
+ inchronCallSequence_ActivationItem.calls.add(inchronActivationItem)
+ it.callGraph.graphEntries.add(inchronCallSequence_ActivationItem)
+ inchronModeSwitchEntry.graphEntries.add(inchronCallSequence_ActivationItem)
+
+ //add ModeCondition to the Inchron Model: at root --> global condition
+ if(inchronConditon.eContainer===null){
+ getInchronRoot().globalModeConditions.add(inchronConditon)
+ }
+ //add mode evaluation item before mode switch
+ callGraphTransformer.createDummyCallSequenceWithModeSwitchEvaluation(inchronModeSwitch, it.callGraph);
+
+ //add mode switch to dummy function call graph
+ it.callGraph.graphEntries.add(inchronModeSwitch)
+
+ } else {
+ val inchronCallSequence_ActivationItem=inchronModelFactory.createCallSequence
+ it.callGraph.graphEntries.add(inchronCallSequence_ActivationItem)
+ }
+ }
+
+ private def dispatch getStimulusName(Stimulus stimulus){return "Stimulus"}
+ private def dispatch getStimulusName(EventStimulus stimulus){return stimulus.name}
+ private def dispatch getStimulusName(InterProcessStimulus stimulus){return stimulus.name}
+
+
+ private def dispatch getEnableValueList(Stimulus stimulus){return null}
+ private def dispatch getEnableValueList(EventStimulus stimulus){return stimulus.enablingModeValueList}
+ private def dispatch getEnableValueList(InterProcessStimulus stimulus){return stimulus.enablingModeValueList}
+
+}
\ No newline at end of file
diff --git a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/CallGraphTransformer.xtend b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/CallGraphTransformer.xtend
index 02485c8..c623c8a 100644
--- a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/CallGraphTransformer.xtend
+++ b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/CallGraphTransformer.xtend
@@ -29,54 +29,49 @@
@Inject GraphEntryBaseTransformer graphEntryBaseTransformer
- def void transformCallGraph(CallGraph amltGraph, Process amltTask,
+ def void transformCallGraph(CallGraph amltGraph, Process amltTask,
Map<Process, com.inchron.realtime.root.model.Process> amltProcess_inchronProcessMap) {
val com.inchron.realtime.root.model.Process inchronProcess = amltProcess_inchronProcessMap.get(amltTask)
-
val inchronCallGraph = inchronModelFactory.createCallGraph
inchronProcess.callGraph = inchronCallGraph
- amltGraph?.graphEntries?.forEach[amltGraphEntry|
-
- var inchronGraphEntryBase= graphEntryBaseTransformer.transformGraphEntryBase(amltGraphEntry, amltTask,
- amltProcess_inchronProcessMap)
-
- /*
- * Based on the requirement from Inchron to use the latest Mode values:
- * -- it is required to create a "Dummy CallSequence" and associate ModeConditionEvaluation of each ModeSwitchEntry object
- */
- if(inchronGraphEntryBase instanceof ModeSwitch){
- createDummyCallSequenceWitchModeSwitchEvaluation(inchronGraphEntryBase, inchronCallGraph)
- }
- //Adding ModeSwitch
- inchronCallGraph.graphEntries.add(inchronGraphEntryBase)
- ]
-
+ amltGraph?.graphEntries?.forEach[amltGraphEntry|{
+ var inchronGraphEntryBase= graphEntryBaseTransformer.transformGraphEntryBase(amltGraphEntry, amltTask,
+ amltProcess_inchronProcessMap)
+ /*
+ * Based on the requirement from Inchron to use the latest Mode values:
+ * -- it is required to create a "Dummy CallSequence" and associate ModeConditionEvaluation of each ModeSwitchEntry object
+ */
+ if(inchronGraphEntryBase instanceof ModeSwitch){
+ createDummyCallSequenceWithModeSwitchEvaluation(inchronGraphEntryBase, inchronCallGraph)
+ }
+ //Adding ModeSwitch
+ inchronCallGraph.graphEntries.add(inchronGraphEntryBase)
+ }]
+ }
- }
-
- public def void createDummyCallSequenceWitchModeSwitchEvaluation(ModeSwitch inchronModeSwitch, com.inchron.realtime.root.model.CallGraph inchronCallGraph) {
+ public def void createDummyCallSequenceWithModeSwitchEvaluation(ModeSwitch inchronModeSwitch, com.inchron.realtime.root.model.CallGraph inchronCallGraph) {
- var dummyCallSequence=inchronModelFactory.createCallSequence
- dummyCallSequence.name = "CallSequence_For_ModeConditionEvaluation"
+ var dummyCallSequence=inchronModelFactory.createCallSequence
+ dummyCallSequence.name = "CallSequence_For_ModeConditionEvaluation"
+
+ val dummyCallSequenceItems=new ArrayList
+
+ inchronModeSwitch.entries.forEach[inchronModeSwitchEntry|
+ val inchronModeCondition=inchronModeSwitchEntry.condition
- val dummyCallSequenceItems=new ArrayList
-
- inchronModeSwitch.entries.forEach[inchronModeSwitchEntry|
- val inchronModeCondition=inchronModeSwitchEntry.condition
+ var inchronModeConditionEvaluation=inchronModelFactory.createModeConditionEvaluation
+ inchronModeConditionEvaluation.condition=inchronModeCondition
+ dummyCallSequenceItems.add(inchronModeConditionEvaluation)
+ ]
+
+ if(dummyCallSequenceItems.size>0){
+ dummyCallSequence.calls.addAll(dummyCallSequenceItems)
+ //Adding DummyCallSequence containing ModeConditionEvaluation
+ inchronCallGraph.graphEntries.add(dummyCallSequence);
+ }
- var inchronModeConditionEvaluation=inchronModelFactory.createModeConditionEvaluation
- inchronModeConditionEvaluation.condition=inchronModeCondition
- dummyCallSequenceItems.add(inchronModeConditionEvaluation)
- ]
-
- if(dummyCallSequenceItems.size>0){
- dummyCallSequence.calls.addAll(dummyCallSequenceItems)
- //Adding DummyCallSequence containing ModeConditionEvaluation
- inchronCallGraph.graphEntries.add(dummyCallSequence);
- }
-
- }
+ }
}
\ No newline at end of file
diff --git a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/CustomEventTriggerTransformer.xtend b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/CustomEventTriggerTransformer.xtend
deleted file mode 100644
index f3c93c0..0000000
--- a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/CustomEventTriggerTransformer.xtend
+++ /dev/null
@@ -1,152 +0,0 @@
-/**
- ********************************************************************************
- * Copyright (c) 2018-2019 Robert Bosch GmbH.
- *
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Robert Bosch GmbH - initial API and implementation
- ********************************************************************************
- */
-
-package templates.m2m.sw
-
-import com.google.inject.Inject
-import com.inchron.realtime.root.model.ActivationConnection
-import com.inchron.realtime.root.model.Component
-import com.inchron.realtime.root.model.FunctionCall
-import java.util.LinkedHashMap
-import org.eclipse.app4mc.amalthea.model.CustomEventTrigger
-import org.eclipse.app4mc.amalthea.model.EventStimulus
-import org.eclipse.app4mc.amalthea.model.Process
-import templates.AbstractAmaltheaInchronTransformer
-import templates.utils.AmaltheaModelNagivationUtils
-import templates.utils.AmltCacheModel
-import com.google.inject.Singleton
-
-@Singleton
-class CustomEventTriggerTransformer extends AbstractAmaltheaInchronTransformer {
-
- var AmltCacheModel cacheModel
-
- @Inject ModeValueDisjunctionTransformer modeValueDisjunctionTransformer
- @Inject CallGraphTransformer callGraphTransformer
-
- public def FunctionCall transformCustomEventTrigger(Component inchronComponent, Process amltTask,
- CustomEventTrigger amltCustomEventTrigger){
-
- cacheModel = customObjsStore.getInstance(AmltCacheModel)
-
- val amltCustomEvent= amltCustomEventTrigger.event
-
- val amltStimulusInchronActivationConnectionsMap=new LinkedHashMap<EventStimulus, ActivationConnection>
-
- if(amltCustomEvent !==null){
- val amltCustomEventBackReferences=AmaltheaModelNagivationUtils.getBackReferences(amltCustomEvent,true);
-
- for (amltCustomEventBackReference : amltCustomEventBackReferences) {
-
- if(amltCustomEventBackReference instanceof EventStimulus){
- //listing the tasks which are stimulated by EventStimulus
- val inchronActivationConnection=createActivationConnection(amltCustomEventBackReference)
-
- amltStimulusInchronActivationConnectionsMap.put(amltCustomEventBackReference, inchronActivationConnection)
-
- }
- }
- }
-
-
- val inchronDummyFunction=inchronModelFactory.createFunction
-
- inchronDummyFunction.name="Dummy_CustomEventTriggerFunction_"+amltCustomEventTrigger.hashCode
- //Adding Function to Inchron Component
- inchronComponent.functions.add(inchronDummyFunction)
-
- val inchronCallGraph=inchronModelFactory.createCallGraph
-
- inchronDummyFunction.callGraph=inchronCallGraph
-
- val inchronModeSwitch=inchronModelFactory.createModeSwitch
-
-
-
- //Transforming mode entries with condition
- //############# now creating ActivationItem and associating ActivationConnection objects
-
- amltStimulusInchronActivationConnectionsMap.forEach[amltEventStimulus, inchronActivationConnection|{
-
- val inchronModeSwitchEntry=inchronModelFactory.createModeSwitchEntry
-
- //Adding entry with condition
- inchronModeSwitch.entries.add(inchronModeSwitchEntry)
-
- var amltCondition=amltEventStimulus.enablingModeValueList
-
- if(amltCondition!==null){
- var inchronConditon=modeValueDisjunctionTransformer.createModeCondition(amltCondition,amltTask)
-
- inchronModeSwitchEntry.condition = inchronConditon
-
- if(inchronConditon.eContainer===null){
- //Adding ModeCondition to the Inchron Model
- getInchronRoot().globalModeConditions.add(inchronConditon)
- }
- }
-
- val inchronCallSequence=inchronModelFactory.createCallSequence
-
- val inchronActivationItem=inchronModelFactory.createActivationItem
-
- inchronActivationItem.connection=inchronActivationConnection
-
- inchronCallSequence.calls.add(inchronActivationItem)
-
- //Adding callSequence to default entry
- inchronModeSwitchEntry.graphEntries.add(inchronCallSequence)
-
- }]
- /*
- * Based on the requirement from Inchron to use the latest Mode values:
- * -- it is required to create a "Dummy CallSequence" and associate ModeConditionEvaluation of each ModeSwitchEntry object
- */
- callGraphTransformer.createDummyCallSequenceWitchModeSwitchEvaluation(inchronModeSwitch, inchronCallGraph);
-
- //Adding ModeSwitch
- inchronCallGraph.graphEntries.add(inchronModeSwitch)
-
- var FunctionCall inchronFunctionCall=inchronModelFactory.createFunctionCall
-
- inchronFunctionCall.function=inchronDummyFunction
-
- inchronFunctionCall.name="call_"+inchronDummyFunction.name
-
- return inchronFunctionCall
-
- }
-
- protected def create inchronModelFactory.createActivationConnection createActivationConnection(EventStimulus amltCustomEventBackReference) {
-
- val amltTasks=amltCustomEventBackReference.affectedProcesses
-
- it.name = "EventStimulus_"+amltCustomEventBackReference.name
-
- getInchronRoot().connections.add(it)
-
- amltTasks.forEach[amltStimulatedTask|{
- var inchronActivateProcess = inchronModelFactory.createActivateProcess
-
- inchronActivateProcess.target = cacheModel.amltProcess_inchronProcessMap.get(amltStimulatedTask)
-
- it.activations.add(inchronActivateProcess)
- }]
- }
-
-
-
-
-}
\ No newline at end of file
diff --git a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/GraphEntryBaseTransformer.xtend b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/GraphEntryBaseTransformer.xtend
index a5998a3..be89ced 100644
--- a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/GraphEntryBaseTransformer.xtend
+++ b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/GraphEntryBaseTransformer.xtend
@@ -30,6 +30,7 @@
import templates.m2m.stimuli.StimuliTransformer
import templates.m2m.utils.CounterUtils
import templates.utils.AmltCacheModel
+import org.eclipse.app4mc.amalthea.model.Stimulus
@Singleton
class GraphEntryBaseTransformer extends AbstractAmaltheaInchronTransformer {
@@ -41,6 +42,8 @@
@Inject ModeSwitchTransformer modeSwitchTransformer
@Inject StimuliTransformer stimuliTransformer
+
+ @Inject ModeValueDisjunctionTransformer modeValueDisjunctionTransformer
def create inchronModelFactory.createFunction createFunction(java.lang.Process amltProcess, Runnable amltRunnable) {
@@ -73,20 +76,13 @@
}
protected def create inchronModelFactory.createCallSequence createCallSequence(CallSequence amltGraphEntry, org.eclipse.app4mc.amalthea.model.Process amltTask, Process inchronProcess, Map<org.eclipse.app4mc.amalthea.model.Process, Process> amltProcess_inchronProcessMap) {
-
+
it.name = "CS"
-
-
amltGraphEntry.calls.forEach [ amltCallSequenceItem |
-
if (amltCallSequenceItem instanceof TaskRunnableCall) {
-
var amltRunnable = amltCallSequenceItem.runnable
-
var inchronComponent = cacheModel.getInchronComponent(amltTask)
-
var inchronFunction = runnableTransformer.createFunction(inchronComponent, amltTask, amltRunnable)
-
var inchronFunctionCall = inchronModelFactory.createFunctionCall
inchronFunctionCall.function = inchronFunction
inchronFunctionCall.name = "call_" + inchronFunction.name
@@ -98,29 +94,38 @@
}
it.calls.add(inchronFunctionCall)
-
} else if (amltCallSequenceItem instanceof InterProcessTrigger) {
-
+ // in the call sequence of the process, create ActivateProcess
+ // create ActivationItem -> ActivationConnection -> ActivationAction (ActivateProcess)
+ // In Amalthea -> It is handled with InterProcessStimulus being refered by InterProcessTrigger -> Stimulus is referred inside a Task
+
+ val amltInterProcessTrigger = (amltCallSequenceItem as InterProcessTrigger)
+ val amltModeValueDisjunction = amltInterProcessTrigger.stimulus?.enablingModeValueList
var inchronActivationItem = inchronModelFactory.createActivationItem
-
- inchronActivationItem.name = "ActivationItem"
-
- if (amltCallSequenceItem.counter !== null){
- inchronActivationItem.period = CounterUtils.getPrescalerAsInteger(amltCallSequenceItem.counter)
- inchronActivationItem.offset = CounterUtils.getOffsetAsInteger(amltCallSequenceItem.counter)
+ inchronActivationItem.name = "ActivationItem_" + amltInterProcessTrigger.stimulus.name
+ if (amltModeValueDisjunction !== null){
+ modeValueDisjunctionTransformer.createModeCondition(amltModeValueDisjunction)
+ val inchronDummyFunction=stimuliTransformer.createDummyFunction(amltInterProcessTrigger.stimulus as Stimulus, inchronActivationItem)
+ var inchronComponent = cacheModel.getInchronComponent(amltTask)
+ inchronComponent.functions.add(inchronDummyFunction)
+ if (amltCallSequenceItem.counter !== null){
+ inchronActivationItem.period = CounterUtils.getPrescalerAsInteger(amltCallSequenceItem.counter)
+ inchronActivationItem.offset = CounterUtils.getOffsetAsInteger(amltCallSequenceItem.counter)
+ }
+ var dummyFunctionCall = inchronModelFactory.createFunctionCall
+ dummyFunctionCall.function = inchronDummyFunction
+ it.calls.add(dummyFunctionCall)
+ } else {
+ if (amltCallSequenceItem.counter !== null){
+ inchronActivationItem.period = CounterUtils.getPrescalerAsInteger(amltCallSequenceItem.counter)
+ inchronActivationItem.offset = CounterUtils.getOffsetAsInteger(amltCallSequenceItem.counter)
+ }
+ it.calls.add(inchronActivationItem)
}
-
-
- it.calls.add(inchronActivationItem)
- val inchronActivationConnection = stimuliTransformer.createActivationConnection((amltCallSequenceItem as InterProcessTrigger).stimulus)
-
+ val inchronActivationConnection = stimuliTransformer.createActivationConnection(amltInterProcessTrigger.stimulus as Stimulus)
inchronActivationItem.connection = inchronActivationConnection
-
- // in the call sequence of the process, create ActivateProcess
- // create ActivationItem -> ActivationConnection -> ActivationAction (ActivateProcess)
- // In Amalthea -> It is handled with InterProcessStimulus being refered by InterProcessTrigger -> Stimulus is referred inside a Task
} else if (amltCallSequenceItem instanceof SchedulePoint) {
}
diff --git a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/ModeLabelTransformer.xtend b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/ModeLabelTransformer.xtend
index 83b3895..ceae20d 100644
--- a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/ModeLabelTransformer.xtend
+++ b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/ModeLabelTransformer.xtend
@@ -44,6 +44,12 @@
}]
+ if (amltModeLabel.initialValue !== null){
+ it.initialMode = createMode(amltModeLabel.initialValue, it)
+ } else if (amltModeLabel?.mode?.literals.get(0) !==null) {
+ it.initialMode = createMode(amltModeLabel.mode.literals.get(0), it)
+ }
+
cacheModel.addInchronModeGroup(it)
}
diff --git a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/ModeSwitchTransformer.xtend b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/ModeSwitchTransformer.xtend
index 39046d0..5dc97fa 100644
--- a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/ModeSwitchTransformer.xtend
+++ b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/ModeSwitchTransformer.xtend
@@ -78,7 +78,7 @@
var amltCondition=amltModeSwitchEntry.condition
if(amltCondition!==null){
- var inchronConditon=modeValueDisjunctionTransformer.createModeCondition(amltCondition,amltTask)
+ var inchronConditon=modeValueDisjunctionTransformer.createModeCondition(amltCondition)
inchronModeSwitchEntry.condition = inchronConditon
@@ -105,7 +105,7 @@
* Based on the requirement from Inchron to use the latest Mode values:
* -- it is required to create a "Dummy CallSequence" and associate ModeConditionEvaluation of each ModeSwitchEntry object
*/
- callGraphTransformer.createDummyCallSequenceWitchModeSwitchEvaluation(inchronModeSwitch, inchronCallGraph);
+ callGraphTransformer.createDummyCallSequenceWithModeSwitchEvaluation(inchronModeSwitch, inchronCallGraph);
//Adding ModeSwitch
inchronCallGraph.graphEntries.add(inchronModeSwitch)
@@ -155,7 +155,7 @@
var amltCondition=amltEntry.condition
if(amltCondition!==null){
- var inchronConditon=modeValueDisjunctionTransformer.createModeCondition(amltCondition,amltTask)
+ var inchronConditon=modeValueDisjunctionTransformer.createModeCondition(amltCondition)
inchronModeSwitchEntry.condition = inchronConditon
diff --git a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/ModeValueDisjunctionTransformer.xtend b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/ModeValueDisjunctionTransformer.xtend
index 6ca919b..9dc2939 100644
--- a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/ModeValueDisjunctionTransformer.xtend
+++ b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/ModeValueDisjunctionTransformer.xtend
@@ -15,29 +15,25 @@
package templates.m2m.sw;
+import com.google.inject.Inject
+import com.google.inject.Singleton
import com.inchron.realtime.root.model.Mode
import org.eclipse.app4mc.amalthea.model.ModeLiteral
import org.eclipse.app4mc.amalthea.model.ModeValue
import org.eclipse.app4mc.amalthea.model.ModeValueConjunction
import org.eclipse.app4mc.amalthea.model.ModeValueDisjunction
-import org.eclipse.app4mc.amalthea.model.Process
import templates.AbstractAmaltheaInchronTransformer
import templates.utils.AmltCacheModel
-import com.google.inject.Inject
-import com.google.inject.Singleton
@Singleton
public class ModeValueDisjunctionTransformer extends AbstractAmaltheaInchronTransformer {
-var AmltCacheModel cacheModel
+ @Inject ModeLabelTransformer modeLabelTransformer
+ var AmltCacheModel cacheModel
-@Inject ModeLabelTransformer modeLabelTransformer
-
- public def create inchronModelFactory.createModeCondition createModeCondition(ModeValueDisjunction amltModeValueDisjunction,Process amltTask ){
+ public def create inchronModelFactory.createModeCondition createModeCondition(ModeValueDisjunction amltModeValueDisjunction){
cacheModel = customObjsStore.getInstance(AmltCacheModel)
-
- it.name="ModeCondition_"+amltTask.name+"_"+it.hashCode
-
+ it.name="ModeCondition_"+"_"+it.hashCode
amltModeValueDisjunction?.entries?.forEach[amltModeValueDisjunctionEntry|{
val inchronModeConjunction=inchronModelFactory.createModeConjunction
@@ -58,10 +54,10 @@
}]
}
}]
+ inchronRoot.globalModeConditions.add(it)
}
-
public def Mode getInchronMode(ModeLiteral amltModeLiteral ){
val amltModeName=amltModeLiteral?.containingMode?.name
diff --git a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/RunnableItemTransformer.xtend b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/RunnableItemTransformer.xtend
index 559d810..cb779fa 100644
--- a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/RunnableItemTransformer.xtend
+++ b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/RunnableItemTransformer.xtend
@@ -34,6 +34,7 @@
import templates.m2m.sw.runnableItem.ChannelAccessTransformer
import templates.m2m.sw.runnableItem.RunnableCallTransformer
import templates.m2m.sw.runnableItem.TicksTransformer
+import templates.m2m.sw.runnableItem.CustomEventTriggerTransformer
@Singleton
class RunnableItemTransformer extends AbstractAmaltheaInchronTransformer{
@@ -60,8 +61,8 @@
var inchronFunctionCall = modeSwitchTransformer.transformRunnableModeSwitch(inchronComponent, amltTask,amltRunnableItem)
list.add(inchronFunctionCall)
} else if(amltRunnableItem instanceof CustomEventTrigger){
- var inchronFunctionCall = customEventTriggerTransformer.transformCustomEventTrigger(inchronComponent, amltTask,amltRunnableItem)
- list.add(inchronFunctionCall)
+ val inchronCallSequenceItems = customEventTriggerTransformer.transformCustomEventTrigger(inchronComponent, amltRunnableItem)
+ inchronCallSequenceItems.forEach[inchronCallSequenceItem | list.add(inchronCallSequenceItem)]
} else if(amltRunnableItem instanceof ModeLabelAccess){
if(amltRunnableItem.access.equals(LabelAccessEnum.WRITE)){
var inchronModeSwitchPoint=inchronModelFactory.createModeSwitchPoint
diff --git a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/runnableItem/CustomEventTriggerTransformer.xtend b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/runnableItem/CustomEventTriggerTransformer.xtend
index 469fe3b..b233bf4 100644
--- a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/runnableItem/CustomEventTriggerTransformer.xtend
+++ b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.m2m/src/templates/m2m/sw/runnableItem/CustomEventTriggerTransformer.xtend
@@ -15,9 +15,81 @@
package templates.m2m.sw.runnableItem
-import templates.AbstractAmaltheaInchronTransformer
+import com.google.inject.Inject
import com.google.inject.Singleton
+import com.inchron.realtime.root.model.ActivationConnection
+import com.inchron.realtime.root.model.CallSequenceItem
+import com.inchron.realtime.root.model.Component
+import com.inchron.realtime.root.model.FunctionCall
+import java.util.LinkedHashMap
+import java.util.LinkedList
+import java.util.List
+import org.eclipse.app4mc.amalthea.model.CustomEventTrigger
+import org.eclipse.app4mc.amalthea.model.EventStimulus
+import templates.AbstractAmaltheaInchronTransformer
+import templates.m2m.stimuli.StimuliTransformer
+import templates.utils.AmaltheaModelNagivationUtils
+import templates.utils.AmltCacheModel
@Singleton
class CustomEventTriggerTransformer extends AbstractAmaltheaInchronTransformer {
-}
+
+ var AmltCacheModel cacheModel
+
+ @Inject StimuliTransformer stimuliTransformer
+
+ public def List<CallSequenceItem> transformCustomEventTrigger(Component inchronComponent, CustomEventTrigger amltCustomEventTrigger){
+
+ cacheModel = customObjsStore.getInstance(AmltCacheModel)
+
+ val inchronCallSequenceItems = new LinkedList<CallSequenceItem>
+ val amltCustomEvent= amltCustomEventTrigger.event
+ val amltStimulusInchronActivationConnectionsMap=new LinkedHashMap<EventStimulus, ActivationConnection>
+
+ if(amltCustomEvent !==null){
+ val amltCustomEventBackReferences=AmaltheaModelNagivationUtils.getBackReferences(amltCustomEvent,true);
+ for (amltCustomEventBackReference : amltCustomEventBackReferences) {
+ if(amltCustomEventBackReference instanceof EventStimulus){
+ val inchronActivationConnection = stimuliTransformer.createActivationConnection(amltCustomEventBackReference as EventStimulus)
+ amltStimulusInchronActivationConnectionsMap.put(amltCustomEventBackReference, inchronActivationConnection)
+ }
+ }
+ }
+
+
+ //Transforming mode entries with condition
+ //############# now creating ActivationItem and associating ActivationConnection objects
+ amltStimulusInchronActivationConnectionsMap.forEach[amltEventStimulus, inchronActivationConnection|{
+
+ val inchronActivationItem=inchronModelFactory.createActivationItem
+ inchronActivationItem.name = "ActivationItem_"+ amltEventStimulus.name
+ inchronActivationItem.connection=inchronActivationConnection;
+
+ if (amltEventStimulus.enablingModeValueList !== null){
+ /*
+ * Based on the requirement from Inchron to use the latest Mode values:
+ * -- it is required to create a "Dummy CallSequence" and associate ModeConditionEvaluation of each ModeSwitchEntry object
+ */
+ val inchronDummyFunction=stimuliTransformer.createDummyFunction(amltEventStimulus, inchronActivationItem)
+ inchronComponent.functions.add(inchronDummyFunction)
+
+ var FunctionCall inchronFunctionCall=inchronModelFactory.createFunctionCall
+ inchronFunctionCall.function=inchronDummyFunction
+ inchronFunctionCall.name="call_"+inchronDummyFunction.name
+ inchronCallSequenceItems.add(inchronFunctionCall)
+ } else {
+ inchronCallSequenceItems.add(inchronActivationItem)
+ }
+
+
+ }]
+
+ return inchronCallSequenceItems
+
+ }
+
+
+
+
+
+}
\ No newline at end of file
diff --git a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.product/testModels/CustomEventTrigger/input/CustomEventTrigger.amxmi b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.product/testModels/CustomEventTrigger/input/CustomEventTrigger.amxmi
new file mode 100644
index 0000000..20c3409
--- /dev/null
+++ b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.product/testModels/CustomEventTrigger/input/CustomEventTrigger.amxmi
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<am:Amalthea xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:am="http://app4mc.eclipse.org/amalthea/0.9.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <swModel>
+ <tasks name="TaskLauncher" stimuli="PeriodicStimulus1ms?type=PeriodicStimulus" preemption="preemptive" multipleTaskActivationLimit="0">
+ <callGraph>
+ <graphEntries xsi:type="am:CallSequence" name="">
+ <calls xsi:type="am:TaskRunnableCall" runnable="RunnableLauncher?type=Runnable"/>
+ </graphEntries>
+ </callGraph>
+ </tasks>
+ <tasks name="TaskWorkerConditional" stimuli="EventStimulus_Conditional?type=EventStimulus" preemption="preemptive" multipleTaskActivationLimit="0">
+ <callGraph>
+ <graphEntries xsi:type="am:CallSequence" name="">
+ <calls xsi:type="am:TaskRunnableCall" runnable="RunnableWorker?type=Runnable"/>
+ </graphEntries>
+ </callGraph>
+ </tasks>
+ <tasks name="TaskWorkerUnconditional" stimuli="EventStimulus_Unconditional?type=EventStimulus" preemption="preemptive" multipleTaskActivationLimit="0">
+ <callGraph>
+ <graphEntries xsi:type="am:CallSequence" name="">
+ <calls xsi:type="am:TaskRunnableCall" runnable="RunnableWorker?type=Runnable"/>
+ </graphEntries>
+ </callGraph>
+ </tasks>
+ <runnables name="RunnableWorker" callback="false" service="false">
+ <runnableItems xsi:type="am:Ticks">
+ <default xsi:type="am:DiscreteValueConstant" value="100"/>
+ </runnableItems>
+ </runnables>
+ <runnables name="RunnableLauncher" callback="false" service="false">
+ <runnableItems xsi:type="am:Ticks">
+ <default xsi:type="am:DiscreteValueConstant" value="10"/>
+ </runnableItems>
+ <runnableItems xsi:type="am:CustomEventTrigger" event="CustomEvent_2_to_3?type=CustomEvent"/>
+ <runnableItems xsi:type="am:Ticks">
+ <default xsi:type="am:DiscreteValueConstant" value="10"/>
+ </runnableItems>
+ </runnables>
+ <modes name="modeCondition">
+ <literals name="State1"/>
+ <literals name="State2"/>
+ </modes>
+ <modeLabels name="ModeLabelA" displayName="" initialValue="modeCondition/State1?type=ModeLiteral"/>
+ <modeLabels name="ModeLabelB" displayName="" initialValue="modeCondition/State2?type=ModeLiteral"/>
+ </swModel>
+ <hwModel>
+ <definitions xsi:type="am:ProcessingUnitDefinition" name="C0_Type" puType="CPU"/>
+ <structures name="System" structureType="System">
+ <structures name="ECU" structureType="ECU">
+ <structures name="mC" structureType="Microcontroller">
+ <modules xsi:type="am:ProcessingUnit" name="C0" frequencyDomain="clock_C0?type=FrequencyDomain" definition="C0_Type?type=ProcessingUnitDefinition"/>
+ </structures>
+ </structures>
+ </structures>
+ <domains xsi:type="am:FrequencyDomain" name="clock_C0" clockGating="false">
+ <defaultValue value="240.0" unit="MHz"/>
+ </domains>
+ </hwModel>
+ <osModel>
+ <operatingSystems name="OS">
+ <taskSchedulers name="SchedC0">
+ <schedulingAlgorithm xsi:type="am:OSEK"/>
+ </taskSchedulers>
+ </operatingSystems>
+ </osModel>
+ <stimuliModel>
+ <stimuli xsi:type="am:PeriodicStimulus" name="PeriodicStimulus1ms">
+ <offset value="0" unit="ms"/>
+ <recurrence value="1" unit="ms"/>
+ </stimuli>
+ <stimuli xsi:type="am:EventStimulus" name="EventStimulus_Unconditional" triggeringEvents="CustomEvent_2_to_3?type=CustomEvent"/>
+ <stimuli xsi:type="am:EventStimulus" name="EventStimulus_Conditional" triggeringEvents="CustomEvent_2_to_3?type=CustomEvent">
+ <enablingModeValueList>
+ <entries xsi:type="am:ModeValueConjunction">
+ <entries valueProvider="ModeLabelA?type=ModeLabel" value="modeCondition/State1?type=ModeLiteral"/>
+ <entries valueProvider="ModeLabelB?type=ModeLabel" value="modeCondition/State2?type=ModeLiteral"/>
+ </entries>
+ </enablingModeValueList>
+ </stimuli>
+ </stimuliModel>
+ <eventModel>
+ <events xsi:type="am:CustomEvent" name="CustomEvent_2_to_3" description="" eventType=""/>
+ </eventModel>
+ <mappingModel>
+ <schedulerAllocation scheduler="SchedC0?type=TaskScheduler" responsibility="C0?type=ProcessingUnit"/>
+ <taskAllocation task="TaskLauncher?type=Task" scheduler="SchedC0?type=TaskScheduler"/>
+ <taskAllocation task="TaskWorkerConditional?type=Task" scheduler="SchedC0?type=TaskScheduler"/>
+ <taskAllocation task="TaskWorkerUnconditional?type=Task" scheduler="SchedC0?type=TaskScheduler"/>
+ </mappingModel>
+</am:Amalthea>
diff --git a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.product/testModels/CustomEventTrigger/output/CustomEventTrigger.iprx b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.product/testModels/CustomEventTrigger/output/CustomEventTrigger.iprx
new file mode 100644
index 0000000..4f14587
--- /dev/null
+++ b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.product/testModels/CustomEventTrigger/output/CustomEventTrigger.iprx
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="ASCII"?>
+<root:Root xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:model="http://inchron.com/realtime/root/2.98.5/model" xmlns:root="http://inchron.com/realtime/root/2.98.5" xmlns:stimulation="http://inchron.com/realtime/root/2.98.5/model/stimulation">
+ <model xsi:type="model:Model" name="Model" defaultScenario="//@model/@stimulationScenarios.0">
+ <clocks name="clock_C0" users="//@model/@cpus.0 //@model/@stimulationScenarios.0/@generators.0">
+ <frequency value="240.0"/>
+ <range value="1" unit="s"/>
+ <startTimeFixed/>
+ <startTimeMin/>
+ <startTimeMax/>
+ <startValue/>
+ </clocks>
+ <cpus name="mC" clock="//@model/@clocks.0" cpuModel="generic">
+ <cores name="C0">
+ <connectedSlave/>
+ </cores>
+ <memoryRegions name="ram" base="16777216" flags="290" pages="1" sections="data:bss:stack:heap"/>
+ <memoryRegions name="rom" base="33554432" flags="275" pages="1" sections="text"/>
+ </cpus>
+ <connections xsi:type="model:ActivationConnection" name="EventStimulus_Unconditional" activators="//@model/@systems.0/@components.0/@functions.0/@callGraph/@graphEntries.0/@calls.1">
+ <activations xsi:type="model:ActivateProcess" target="//@model/@systems.0/@rtosConfig/@schedulables.0/@schedulables.0/@schedulables.2"/>
+ </connections>
+ <connections xsi:type="model:ActivationConnection" name="EventStimulus_Conditional" activators="//@model/@systems.0/@components.0/@functions.1/@callGraph/@graphEntries.1/@entries.0/@graphEntries.0/@calls.0">
+ <activations xsi:type="model:ActivateProcess" target="//@model/@systems.0/@rtosConfig/@schedulables.0/@schedulables.0/@schedulables.1"/>
+ </connections>
+ <generalInfo creator="Amlt2Inchron 0.9.3 Wed May 08 09:10:35 CEST 2019" version="1"/>
+ <globalModeConditions name="ModeCondition__1266224518">
+ <conjunctions modes="//@model/@globalModeGroups.0/@modes.0 //@model/@globalModeGroups.1/@modes.1"/>
+ </globalModeConditions>
+ <globalModeGroups name="ModeLabelA" initialMode="//@model/@globalModeGroups.0/@modes.0">
+ <modes name="State1"/>
+ <modes name="State2" value="1"/>
+ </globalModeGroups>
+ <globalModeGroups name="ModeLabelB" initialMode="//@model/@globalModeGroups.1/@modes.1">
+ <modes name="State1"/>
+ <modes name="State2" value="1"/>
+ </globalModeGroups>
+ <stimulationScenarios name="DefaultScenario">
+ <generators xsi:type="stimulation:RandomStimuliGenerator" name="PeriodicStimulus1ms" clock="//@model/@clocks.0">
+ <connections xsi:type="model:ActivationConnection" name="PeriodicStimulus1ms" activators="//@model/@stimulationScenarios.0/@generators.0/@targets/@graphEntries.0/@calls.0">
+ <activations xsi:type="model:ActivateProcess" target="//@model/@systems.0/@rtosConfig/@schedulables.0/@schedulables.0/@schedulables.0"/>
+ </connections>
+ <targets>
+ <graphEntries xsi:type="model:CallSequence" name="CS">
+ <calls xsi:type="model:ActivationItem" name="ActivationItem_PeriodicStimulus1ms" connection="//@model/@stimulationScenarios.0/@generators.0/@connections.0"/>
+ </graphEntries>
+ </targets>
+ <minInterArrivalTime/>
+ <period value="1" unit="ms"/>
+ <startOffset unit="ms"/>
+ <startOffsetVariation/>
+ <variation/>
+ </generators>
+ </stimulationScenarios>
+ <systems xsi:type="model:GenericSystem" name="OS_SYSTEM">
+ <components name="OS_SWC">
+ <functions name="RunnableLauncher-TaskLauncher">
+ <callGraph>
+ <graphEntries xsi:type="model:CallSequence" name="CS">
+ <calls xsi:type="model:ResourceConsumption" name="RC">
+ <timeDistribution alpha="0.0" beta="0.0">
+ <min value="10" unit="T"/>
+ <max value="10" unit="T"/>
+ <mean value="10" unit="T"/>
+ <sigma unit="T"/>
+ </timeDistribution>
+ </calls>
+ <calls xsi:type="model:ActivationItem" name="ActivationItem_EventStimulus_Unconditional" connection="//@model/@connections.0"/>
+ <calls xsi:type="model:FunctionCall" name="call_Dummy_EventStimulus_Conditional" function="//@model/@systems.0/@components.0/@functions.1"/>
+ <calls xsi:type="model:ResourceConsumption" name="RC">
+ <timeDistribution alpha="0.0" beta="0.0">
+ <min value="10" unit="T"/>
+ <max value="10" unit="T"/>
+ <mean value="10" unit="T"/>
+ <sigma unit="T"/>
+ </timeDistribution>
+ </calls>
+ </graphEntries>
+ </callGraph>
+ </functions>
+ <functions name="Dummy_EventStimulus_Conditional">
+ <callGraph>
+ <graphEntries xsi:type="model:CallSequence" name="CallSequence_For_ModeConditionEvaluation">
+ <calls xsi:type="model:ModeConditionEvaluation" condition="//@model/@globalModeConditions.0"/>
+ </graphEntries>
+ <graphEntries xsi:type="model:ModeSwitch" name="EventStimulusCondition">
+ <entries condition="//@model/@globalModeConditions.0">
+ <graphEntries xsi:type="model:CallSequence">
+ <calls xsi:type="model:ActivationItem" name="ActivationItem_EventStimulus_Conditional" connection="//@model/@connections.1"/>
+ </graphEntries>
+ </entries>
+ </graphEntries>
+ </callGraph>
+ </functions>
+ <functions name="RunnableWorker-TaskWorkerUnconditional">
+ <callGraph>
+ <graphEntries xsi:type="model:CallSequence" name="CS">
+ <calls xsi:type="model:ResourceConsumption" name="RC">
+ <timeDistribution alpha="0.0" beta="0.0">
+ <min value="100" unit="T"/>
+ <max value="100" unit="T"/>
+ <mean value="100" unit="T"/>
+ <sigma unit="T"/>
+ </timeDistribution>
+ </calls>
+ </graphEntries>
+ </callGraph>
+ </functions>
+ <functions name="RunnableWorker-TaskWorkerConditional">
+ <callGraph>
+ <graphEntries xsi:type="model:CallSequence" name="CS">
+ <calls xsi:type="model:ResourceConsumption" name="RC">
+ <timeDistribution alpha="0.0" beta="0.0">
+ <min value="100" unit="T"/>
+ <max value="100" unit="T"/>
+ <mean value="100" unit="T"/>
+ <sigma unit="T"/>
+ </timeDistribution>
+ </calls>
+ </graphEntries>
+ </callGraph>
+ </functions>
+ </components>
+ <rtosModel name="generic" returnType="void"/>
+ <rtosConfig name="OS">
+ <schedulables xsi:type="model:Scheduler" name="OS_ISRDummy" cpuCores="//@model/@cpus.0/@cores.0">
+ <schedulables xsi:type="model:Scheduler" name="SchedC0" cpuCores="//@model/@cpus.0/@cores.0">
+ <schedulables xsi:type="model:Process" name="TaskLauncher">
+ <callGraph>
+ <graphEntries xsi:type="model:CallSequence" name="CS">
+ <calls xsi:type="model:FunctionCall" name="call_RunnableLauncher-TaskLauncher" function="//@model/@systems.0/@components.0/@functions.0"/>
+ </graphEntries>
+ </callGraph>
+ </schedulables>
+ <schedulables xsi:type="model:Process" name="TaskWorkerConditional">
+ <callGraph>
+ <graphEntries xsi:type="model:CallSequence" name="CS">
+ <calls xsi:type="model:FunctionCall" name="call_RunnableWorker-TaskWorkerConditional" function="//@model/@systems.0/@components.0/@functions.3"/>
+ </graphEntries>
+ </callGraph>
+ </schedulables>
+ <schedulables xsi:type="model:Process" name="TaskWorkerUnconditional">
+ <callGraph>
+ <graphEntries xsi:type="model:CallSequence" name="CS">
+ <calls xsi:type="model:FunctionCall" name="call_RunnableWorker-TaskWorkerUnconditional" function="//@model/@systems.0/@components.0/@functions.2"/>
+ </graphEntries>
+ </callGraph>
+ </schedulables>
+ <timeSlice/>
+ <period/>
+ <maxRetard/>
+ <maxAdvance/>
+ </schedulables>
+ <timeSlice/>
+ <period/>
+ <maxRetard/>
+ <maxAdvance/>
+ </schedulables>
+ </rtosConfig>
+ </systems>
+ </model>
+ <settings>
+ <editor/>
+ <model/>
+ <tool/>
+ </settings>
+</root:Root>
diff --git a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.product/testModels/CustomEventTrigger/output/CustomEventTrigger2.iprx b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.product/testModels/CustomEventTrigger/output/CustomEventTrigger2.iprx
new file mode 100644
index 0000000..293442b
--- /dev/null
+++ b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.product/testModels/CustomEventTrigger/output/CustomEventTrigger2.iprx
@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="ASCII"?>
+<root:Root xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:model="http://inchron.com/realtime/root/2.98.5/model" xmlns:root="http://inchron.com/realtime/root/2.98.5" xmlns:stimulation="http://inchron.com/realtime/root/2.98.5/model/stimulation">
+ <model xsi:type="model:Model" name="Model" defaultScenario="//@model/@stimulationScenarios.0">
+ <clocks name="clock_C0" users="//@model/@cpus.0 //@model/@stimulationScenarios.0/@generators.0">
+ <frequency value="240.0"/>
+ <range value="1" unit="s"/>
+ <startTimeFixed/>
+ <startTimeMin/>
+ <startTimeMax/>
+ <startValue/>
+ </clocks>
+ <cpus name="mC" clock="//@model/@clocks.0" cpuModel="generic">
+ <cores name="C0">
+ <connectedSlave/>
+ </cores>
+ <memoryRegions name="ram" base="16777216" flags="290" pages="1" sections="data:bss:stack:heap"/>
+ <memoryRegions name="rom" base="33554432" flags="275" pages="1" sections="text"/>
+ </cpus>
+ <connections xsi:type="model:ActivationConnection" name="EventStimulus_Unconditional" activators="//@model/@systems.0/@components.0/@functions.1/@callGraph/@graphEntries.0/@calls.1">
+ <activations xsi:type="model:ActivateProcess" target="//@model/@systems.0/@rtosConfig/@schedulables.0/@schedulables.0/@schedulables.2"/>
+ </connections>
+ <connections xsi:type="model:ActivationConnection" name="EventStimulus_Conditional" activators="//@model/@systems.0/@components.0/@functions.2/@callGraph/@graphEntries.2/@calls.0">
+ <activations xsi:type="model:ActivateProcess" target="//@model/@systems.0/@rtosConfig/@schedulables.0/@schedulables.0/@schedulables.1"/>
+ </connections>
+ <generalInfo creator="Amlt2Inchron 0.9.3 Mon Apr 29 15:57:09 CEST 2019" version="1"/>
+ <globalModeConditions name="ModeCondition_1026506187">
+ <conjunctions modes="//@model/@globalModeGroups.0/@modes.0 //@model/@globalModeGroups.1/@modes.1"/>
+ </globalModeConditions>
+ <globalModeGroups name="ModeLabelA" initialMode="//@model/@globalModeGroups.0/@modes.0">
+ <modes name="State1"/>
+ <modes name="State2" value="1"/>
+ </globalModeGroups>
+ <globalModeGroups name="ModeLabelB" initialMode="//@model/@globalModeGroups.1/@modes.1">
+ <modes name="State1"/>
+ <modes name="State2" value="1"/>
+ </globalModeGroups>
+ <stimulationScenarios name="DefaultScenario">
+ <generators xsi:type="stimulation:RandomStimuliGenerator" name="PeriodicStimulus1ms" clock="//@model/@clocks.0">
+ <connections xsi:type="model:ActivationConnection" name="PeriodicStimulus1ms" activators="//@model/@stimulationScenarios.0/@generators.0/@targets/@graphEntries.0/@calls.0">
+ <activations xsi:type="model:ActivateProcess" target="//@model/@systems.0/@rtosConfig/@schedulables.0/@schedulables.0/@schedulables.0"/>
+ </connections>
+ <targets>
+ <graphEntries xsi:type="model:CallSequence" name="CS">
+ <calls xsi:type="model:ActivationItem" name="ActivationItem_PeriodicStimulus1ms" connection="//@model/@stimulationScenarios.0/@generators.0/@connections.0"/>
+ </graphEntries>
+ </targets>
+ <minInterArrivalTime/>
+ <period value="1" unit="ms"/>
+ <startOffset unit="ms"/>
+ <startOffsetVariation/>
+ <variation/>
+ </generators>
+ </stimulationScenarios>
+ <systems xsi:type="model:GenericSystem" name="OS_SYSTEM">
+ <components name="OS_SWC">
+ <functions name="RunnableWorker-TaskWorkerUnconditional">
+ <callGraph>
+ <graphEntries xsi:type="model:CallSequence" name="CS">
+ <calls xsi:type="model:ResourceConsumption" name="RC">
+ <timeDistribution alpha="0.0" beta="0.0">
+ <min value="100" unit="T"/>
+ <max value="100" unit="T"/>
+ <mean value="100" unit="T"/>
+ <sigma unit="T"/>
+ </timeDistribution>
+ </calls>
+ </graphEntries>
+ </callGraph>
+ </functions>
+ <functions name="RunnableLauncher-TaskLauncher">
+ <callGraph>
+ <graphEntries xsi:type="model:CallSequence" name="CS">
+ <calls xsi:type="model:ResourceConsumption" name="RC">
+ <timeDistribution alpha="0.0" beta="0.0">
+ <min value="10" unit="T"/>
+ <max value="10" unit="T"/>
+ <mean value="10" unit="T"/>
+ <sigma unit="T"/>
+ </timeDistribution>
+ </calls>
+ <calls xsi:type="model:ActivationItem" name="ActivationItem_EventStimulus_Unconditional" connection="//@model/@connections.0"/>
+ <calls xsi:type="model:FunctionCall" name="call_Dummy_EventStimulus_Conditional" function="//@model/@systems.0/@components.0/@functions.2"/>
+ <calls xsi:type="model:ResourceConsumption" name="RC">
+ <timeDistribution alpha="0.0" beta="0.0">
+ <min value="10" unit="T"/>
+ <max value="10" unit="T"/>
+ <mean value="10" unit="T"/>
+ <sigma unit="T"/>
+ </timeDistribution>
+ </calls>
+ </graphEntries>
+ </callGraph>
+ </functions>
+ <functions name="Dummy_EventStimulus_Conditional">
+ <callGraph>
+ <graphEntries xsi:type="model:CallSequence" name="CallSequence_For_ModeConditionEvaluation">
+ <calls xsi:type="model:ModeConditionEvaluation" condition="//@model/@globalModeConditions.0"/>
+ </graphEntries>
+ <graphEntries xsi:type="model:ModeSwitch" name="EventStimulusCondition">
+ <entries condition="//@model/@globalModeConditions.0"/>
+ </graphEntries>
+ <graphEntries xsi:type="model:CallSequence">
+ <calls xsi:type="model:ActivationItem" name="ActivationItem_EventStimulus_Conditional" connection="//@model/@connections.1"/>
+ </graphEntries>
+ </callGraph>
+ </functions>
+ <functions name="RunnableWorker-TaskWorkerConditional">
+ <callGraph>
+ <graphEntries xsi:type="model:CallSequence" name="CS">
+ <calls xsi:type="model:ResourceConsumption" name="RC">
+ <timeDistribution alpha="0.0" beta="0.0">
+ <min value="100" unit="T"/>
+ <max value="100" unit="T"/>
+ <mean value="100" unit="T"/>
+ <sigma unit="T"/>
+ </timeDistribution>
+ </calls>
+ </graphEntries>
+ </callGraph>
+ </functions>
+ </components>
+ <rtosModel name="generic" returnType="void"/>
+ <rtosConfig name="OS">
+ <schedulables xsi:type="model:Scheduler" name="OS_ISRDummy" cpuCores="//@model/@cpus.0/@cores.0">
+ <schedulables xsi:type="model:Scheduler" name="SchedC0" cpuCores="//@model/@cpus.0/@cores.0">
+ <schedulables xsi:type="model:Process" name="TaskLauncher">
+ <callGraph>
+ <graphEntries xsi:type="model:CallSequence" name="CS">
+ <calls xsi:type="model:FunctionCall" name="call_RunnableLauncher-TaskLauncher" function="//@model/@systems.0/@components.0/@functions.1"/>
+ </graphEntries>
+ </callGraph>
+ </schedulables>
+ <schedulables xsi:type="model:Process" name="TaskWorkerConditional">
+ <callGraph>
+ <graphEntries xsi:type="model:CallSequence" name="CS">
+ <calls xsi:type="model:FunctionCall" name="call_RunnableWorker-TaskWorkerConditional" function="//@model/@systems.0/@components.0/@functions.3"/>
+ </graphEntries>
+ </callGraph>
+ </schedulables>
+ <schedulables xsi:type="model:Process" name="TaskWorkerUnconditional">
+ <callGraph>
+ <graphEntries xsi:type="model:CallSequence" name="CS">
+ <calls xsi:type="model:FunctionCall" name="call_RunnableWorker-TaskWorkerUnconditional" function="//@model/@systems.0/@components.0/@functions.0"/>
+ </graphEntries>
+ </callGraph>
+ </schedulables>
+ <timeSlice/>
+ <period/>
+ <maxRetard/>
+ <maxAdvance/>
+ </schedulables>
+ <timeSlice/>
+ <period/>
+ <maxRetard/>
+ <maxAdvance/>
+ </schedulables>
+ </rtosConfig>
+ </systems>
+ </model>
+ <settings>
+ <editor/>
+ <model/>
+ <tool/>
+ </settings>
+</root:Root>
diff --git a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.product/testModels/InterProcessTrigger/input/InterProcessTrigger.amxmi b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.product/testModels/InterProcessTrigger/input/InterProcessTrigger.amxmi
new file mode 100644
index 0000000..713b761
--- /dev/null
+++ b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.product/testModels/InterProcessTrigger/input/InterProcessTrigger.amxmi
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<am:Amalthea xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:am="http://app4mc.eclipse.org/amalthea/0.9.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <swModel>
+ <tasks name="TaskLauncher" stimuli="PeriodicStimulus1ms?type=PeriodicStimulus" preemption="preemptive" multipleTaskActivationLimit="0">
+ <callGraph>
+ <graphEntries xsi:type="am:CallSequence" name="">
+ <calls xsi:type="am:InterProcessTrigger" stimulus="InterProcessStimulus_Unconditional?type=InterProcessStimulus"/>
+ <calls xsi:type="am:InterProcessTrigger" stimulus="InterProcessStimulus_Conditional?type=InterProcessStimulus"/>
+ </graphEntries>
+ </callGraph>
+ </tasks>
+ <tasks name="TaskWorkerUnconditional" stimuli="InterProcessStimulus_Unconditional?type=InterProcessStimulus" preemption="preemptive" multipleTaskActivationLimit="0">
+ <callGraph>
+ <graphEntries xsi:type="am:CallSequence" name="">
+ <calls xsi:type="am:TaskRunnableCall" runnable="RunnableWorker?type=Runnable"/>
+ </graphEntries>
+ </callGraph>
+ </tasks>
+ <tasks name="TaskWorkerUnconditional2" stimuli="InterProcessStimulus_Unconditional?type=InterProcessStimulus" preemption="preemptive" multipleTaskActivationLimit="0">
+ <callGraph>
+ <graphEntries xsi:type="am:CallSequence" name="">
+ <calls xsi:type="am:TaskRunnableCall" runnable="RunnableWorker?type=Runnable"/>
+ </graphEntries>
+ </callGraph>
+ </tasks>
+ <tasks name="TaskWorkerConditional" stimuli="InterProcessStimulus_Conditional?type=InterProcessStimulus" preemption="preemptive" multipleTaskActivationLimit="0">
+ <callGraph>
+ <graphEntries xsi:type="am:CallSequence" name="">
+ <calls xsi:type="am:TaskRunnableCall" runnable="RunnableWorker?type=Runnable"/>
+ </graphEntries>
+ </callGraph>
+ </tasks>
+ <runnables name="RunnableWorker" callback="false" service="false">
+ <runnableItems xsi:type="am:Ticks">
+ <default xsi:type="am:DiscreteValueConstant" value="100"/>
+ </runnableItems>
+ </runnables>
+ <modes name="myMode">
+ <literals name="State1"/>
+ <literals name="State2"/>
+ </modes>
+ <modeLabels name="ModeLabelA" displayName="" initialValue="myMode/State1?type=ModeLiteral"/>
+ </swModel>
+ <hwModel>
+ <definitions xsi:type="am:ProcessingUnitDefinition" name="C0_Type" puType="CPU"/>
+ <structures name="System" structureType="System">
+ <structures name="ECU" structureType="ECU">
+ <structures name="mC" structureType="Microcontroller">
+ <modules xsi:type="am:ProcessingUnit" name="C0" frequencyDomain="clock_C0?type=FrequencyDomain" definition="C0_Type?type=ProcessingUnitDefinition"/>
+ </structures>
+ </structures>
+ </structures>
+ <domains xsi:type="am:FrequencyDomain" name="clock_C0" clockGating="false">
+ <defaultValue value="240.0" unit="MHz"/>
+ </domains>
+ </hwModel>
+ <osModel>
+ <operatingSystems name="OS">
+ <taskSchedulers name="SchedC0">
+ <schedulingAlgorithm xsi:type="am:OSEK"/>
+ </taskSchedulers>
+ </operatingSystems>
+ </osModel>
+ <stimuliModel>
+ <stimuli xsi:type="am:PeriodicStimulus" name="PeriodicStimulus1ms">
+ <offset value="0" unit="ms"/>
+ <recurrence value="1" unit="ms"/>
+ </stimuli>
+ <stimuli xsi:type="am:InterProcessStimulus" name="InterProcessStimulus_Unconditional"/>
+ <stimuli xsi:type="am:InterProcessStimulus" name="InterProcessStimulus_Conditional">
+ <enablingModeValueList>
+ <entries xsi:type="am:ModeValueConjunction">
+ <entries valueProvider="ModeLabelA?type=ModeLabel" value="myMode/State1?type=ModeLiteral"/>
+ </entries>
+ </enablingModeValueList>
+ </stimuli>
+ </stimuliModel>
+ <eventModel/>
+ <mappingModel>
+ <schedulerAllocation scheduler="SchedC0?type=TaskScheduler" responsibility="C0?type=ProcessingUnit"/>
+ <taskAllocation task="TaskLauncher?type=Task" scheduler="SchedC0?type=TaskScheduler"/>
+ <taskAllocation task="TaskWorkerUnconditional?type=Task" scheduler="SchedC0?type=TaskScheduler"/>
+ <taskAllocation task="TaskWorkerUnconditional2?type=Task" scheduler="SchedC0?type=TaskScheduler"/>
+ <taskAllocation task="TaskWorkerConditional?type=Task" scheduler="SchedC0?type=TaskScheduler"/>
+ </mappingModel>
+</am:Amalthea>
diff --git a/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.product/testModels/InterProcessTrigger/output/InterProcessTrigger.iprx b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.product/testModels/InterProcessTrigger/output/InterProcessTrigger.iprx
new file mode 100644
index 0000000..7bb93d1
--- /dev/null
+++ b/eclipse-tools/model-transformation/examples/amlt2inchron/org.eclipse.app4mc.transform.to.inchron.product/testModels/InterProcessTrigger/output/InterProcessTrigger.iprx
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="ASCII"?>
+<root:Root xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:model="http://inchron.com/realtime/root/2.98.5/model" xmlns:root="http://inchron.com/realtime/root/2.98.5" xmlns:stimulation="http://inchron.com/realtime/root/2.98.5/model/stimulation">
+ <model xsi:type="model:Model" name="Model" defaultScenario="//@model/@stimulationScenarios.0">
+ <clocks name="clock_C0" users="//@model/@cpus.0 //@model/@stimulationScenarios.0/@generators.0">
+ <frequency value="240.0"/>
+ <range value="1" unit="s"/>
+ <startTimeFixed/>
+ <startTimeMin/>
+ <startTimeMax/>
+ <startValue/>
+ </clocks>
+ <cpus name="mC" clock="//@model/@clocks.0" cpuModel="generic">
+ <cores name="C0">
+ <connectedSlave/>
+ </cores>
+ <memoryRegions name="ram" base="16777216" flags="290" pages="1" sections="data:bss:stack:heap"/>
+ <memoryRegions name="rom" base="33554432" flags="275" pages="1" sections="text"/>
+ </cpus>
+ <connections xsi:type="model:ActivationConnection" name="InterProcessStimulus_Conditional" activators="//@model/@systems.0/@components.0/@functions.2/@callGraph/@graphEntries.1/@entries.0/@graphEntries.0/@calls.0">
+ <activations xsi:type="model:ActivateProcess" target="//@model/@systems.0/@rtosConfig/@schedulables.0/@schedulables.0/@schedulables.3"/>
+ </connections>
+ <connections xsi:type="model:ActivationConnection" name="InterProcessStimulus_Unconditional" activators="//@model/@systems.0/@rtosConfig/@schedulables.0/@schedulables.0/@schedulables.0/@callGraph/@graphEntries.0/@calls.0">
+ <activations xsi:type="model:ActivateProcess" target="//@model/@systems.0/@rtosConfig/@schedulables.0/@schedulables.0/@schedulables.2"/>
+ <activations xsi:type="model:ActivateProcess" target="//@model/@systems.0/@rtosConfig/@schedulables.0/@schedulables.0/@schedulables.1"/>
+ </connections>
+ <generalInfo creator="Amlt2Inchron 0.9.3 Wed May 08 09:03:28 CEST 2019" version="1"/>
+ <globalModeConditions name="ModeCondition__233309087">
+ <conjunctions modes="//@model/@globalModeGroups.0/@modes.0"/>
+ </globalModeConditions>
+ <globalModeGroups name="ModeLabelA" initialMode="//@model/@globalModeGroups.0/@modes.0">
+ <modes name="State1"/>
+ <modes name="State2" value="1"/>
+ </globalModeGroups>
+ <stimulationScenarios name="DefaultScenario">
+ <generators xsi:type="stimulation:RandomStimuliGenerator" name="PeriodicStimulus1ms" clock="//@model/@clocks.0">
+ <connections xsi:type="model:ActivationConnection" name="PeriodicStimulus1ms" activators="//@model/@stimulationScenarios.0/@generators.0/@targets/@graphEntries.0/@calls.0">
+ <activations xsi:type="model:ActivateProcess" target="//@model/@systems.0/@rtosConfig/@schedulables.0/@schedulables.0/@schedulables.0"/>
+ </connections>
+ <targets>
+ <graphEntries xsi:type="model:CallSequence" name="CS">
+ <calls xsi:type="model:ActivationItem" name="ActivationItem_PeriodicStimulus1ms" connection="//@model/@stimulationScenarios.0/@generators.0/@connections.0"/>
+ </graphEntries>
+ </targets>
+ <minInterArrivalTime/>
+ <period value="1" unit="ms"/>
+ <startOffset unit="ms"/>
+ <startOffsetVariation/>
+ <variation/>
+ </generators>
+ </stimulationScenarios>
+ <systems xsi:type="model:GenericSystem" name="OS_SYSTEM">
+ <components name="OS_SWC">
+ <functions name="RunnableWorker-TaskWorkerConditional">
+ <callGraph>
+ <graphEntries xsi:type="model:CallSequence" name="CS">
+ <calls xsi:type="model:ResourceConsumption" name="RC">
+ <timeDistribution alpha="0.0" beta="0.0">
+ <min value="100" unit="T"/>
+ <max value="100" unit="T"/>
+ <mean value="100" unit="T"/>
+ <sigma unit="T"/>
+ </timeDistribution>
+ </calls>
+ </graphEntries>
+ </callGraph>
+ </functions>
+ <functions name="RunnableWorker-TaskWorkerUnconditional2">
+ <callGraph>
+ <graphEntries xsi:type="model:CallSequence" name="CS">
+ <calls xsi:type="model:ResourceConsumption" name="RC">
+ <timeDistribution alpha="0.0" beta="0.0">
+ <min value="100" unit="T"/>
+ <max value="100" unit="T"/>
+ <mean value="100" unit="T"/>
+ <sigma unit="T"/>
+ </timeDistribution>
+ </calls>
+ </graphEntries>
+ </callGraph>
+ </functions>
+ <functions name="Dummy_InterProcessStimulus_Conditional">
+ <callGraph>
+ <graphEntries xsi:type="model:CallSequence" name="CallSequence_For_ModeConditionEvaluation">
+ <calls xsi:type="model:ModeConditionEvaluation" condition="//@model/@globalModeConditions.0"/>
+ </graphEntries>
+ <graphEntries xsi:type="model:ModeSwitch" name="EventStimulusCondition">
+ <entries condition="//@model/@globalModeConditions.0">
+ <graphEntries xsi:type="model:CallSequence">
+ <calls xsi:type="model:ActivationItem" name="ActivationItem_InterProcessStimulus_Conditional" connection="//@model/@connections.0"/>
+ </graphEntries>
+ </entries>
+ </graphEntries>
+ </callGraph>
+ </functions>
+ <functions name="RunnableWorker-TaskWorkerUnconditional">
+ <callGraph>
+ <graphEntries xsi:type="model:CallSequence" name="CS">
+ <calls xsi:type="model:ResourceConsumption" name="RC">
+ <timeDistribution alpha="0.0" beta="0.0">
+ <min value="100" unit="T"/>
+ <max value="100" unit="T"/>
+ <mean value="100" unit="T"/>
+ <sigma unit="T"/>
+ </timeDistribution>
+ </calls>
+ </graphEntries>
+ </callGraph>
+ </functions>
+ </components>
+ <rtosModel name="generic" returnType="void"/>
+ <rtosConfig name="OS">
+ <schedulables xsi:type="model:Scheduler" name="OS_ISRDummy" cpuCores="//@model/@cpus.0/@cores.0">
+ <schedulables xsi:type="model:Scheduler" name="SchedC0" cpuCores="//@model/@cpus.0/@cores.0">
+ <schedulables xsi:type="model:Process" name="TaskLauncher">
+ <callGraph>
+ <graphEntries xsi:type="model:CallSequence" name="CS">
+ <calls xsi:type="model:ActivationItem" name="ActivationItem_InterProcessStimulus_Unconditional" connection="//@model/@connections.1"/>
+ <calls xsi:type="model:FunctionCall" function="//@model/@systems.0/@components.0/@functions.2"/>
+ </graphEntries>
+ </callGraph>
+ </schedulables>
+ <schedulables xsi:type="model:Process" name="TaskWorkerUnconditional">
+ <callGraph>
+ <graphEntries xsi:type="model:CallSequence" name="CS">
+ <calls xsi:type="model:FunctionCall" name="call_RunnableWorker-TaskWorkerUnconditional" function="//@model/@systems.0/@components.0/@functions.3"/>
+ </graphEntries>
+ </callGraph>
+ </schedulables>
+ <schedulables xsi:type="model:Process" name="TaskWorkerUnconditional2">
+ <callGraph>
+ <graphEntries xsi:type="model:CallSequence" name="CS">
+ <calls xsi:type="model:FunctionCall" name="call_RunnableWorker-TaskWorkerUnconditional2" function="//@model/@systems.0/@components.0/@functions.1"/>
+ </graphEntries>
+ </callGraph>
+ </schedulables>
+ <schedulables xsi:type="model:Process" name="TaskWorkerConditional">
+ <callGraph>
+ <graphEntries xsi:type="model:CallSequence" name="CS">
+ <calls xsi:type="model:FunctionCall" name="call_RunnableWorker-TaskWorkerConditional" function="//@model/@systems.0/@components.0/@functions.0"/>
+ </graphEntries>
+ </callGraph>
+ </schedulables>
+ <timeSlice/>
+ <period/>
+ <maxRetard/>
+ <maxAdvance/>
+ </schedulables>
+ <timeSlice/>
+ <period/>
+ <maxRetard/>
+ <maxAdvance/>
+ </schedulables>
+ </rtosConfig>
+ </systems>
+ </model>
+ <settings>
+ <editor/>
+ <model/>
+ <tool/>
+ </settings>
+</root:Root>